「このパスでこのファイルのインポートをさせたくない、、、」をESLintでルール化する


Webエンジニアのhikaeです。
皆さんは「SOLID原則」についてどの程度知っているでしょうか?

ソフトウェア開発においてメンテナンスしやすいコードを書くことは、とても重要な要素です。
今回はD(Dependency inversion principle)「依存性逆転の原則」にあたる内容で、
対象のパスで対象のファイルをインポートするのを禁止する仕組みを整えてみました。

日本語の記事が見当たらなかったので、始めてみたい人はこの記事を参考にプロジェクトに導入してみてはいかかでしょうか?

今回の実装PRは以下に含まれています。

https://github.com/twin-te/twinte-front/pull/523

インストール

依存性逆転の原則に関しては以下の記事を参考にしてください。ここではルールの設定方法について説明します。

https://zenn.dev/chida/articles/e46a66cd9d89d1

使用するライブラリはeslint-plugin-importです。メンテナの方、ありがとうございます。

npm install --save-dev eslint eslint-plugin-import
npm install --save-dev eslint-import-resolver-typescript # TypeScriptのimport構文を対応させるためのもの

.eslintrcはこちら

module.exports = {
  extends: [
    "plugin:import/recommended",
    "plugin:import/typescript",
  ],
  // TypeScriptの場合は以下も追加
  settings: {
    "import/resolver": {
      typescript: {},
    },
  },
}

import/no-restricted-pathsの設定

importプラグインにあるimport/no-restricted-pathsでインポートできるパスを制限します。

"import/no-restricted-paths": [
    "warn", // "error"
    {
        zones: [
            {
                from: "node_modules/vue", // 対象の依存パス
                target: "./src/(usecases|entities|adapter)", // 禁止するパス(正規表現可)
                message: // エラーメッセージ
                    "フレームワーク非依存な層です。hooks層での実装を検討してください。",
            },
            {
                from: "./src/api/@types",
                target: "./src/!(entities)/**/*", // ./src/entities以外のパスでは禁止する
                message: "APIの型定義はアプリケーション内でそのまま利用することはできません。",
            },
        ],
    },
],

さいごに

機械的に検知可能なレビューはルール化する人がいると生産性が上がると思います。
面白いと思った方は他の原則もルール化できないか調べてみてください!

自分がかかわっている時間割アプリ「Twin:te」は寄付のみで運営している完全無料の学生サービスです。
MITライセンスのOSSとして公開しているのでぜひスターしていってください。

https://www.twinte.net/

https://github.com/twin-te/twinte-front