LoginSignup
3
1

1. 結論

package privateを実現する手法としては
eslint-plugin-strict-dependenciesが以下の理由で妥当だと思いました。

  • エディタ上で不正なimportをした場合にすぐ検知される
  • 設定が簡単(eslintの設定ファイルでディレクトリごとの依存関係を丸々指定できる)

ただし、コミュニティの規模を考えるのであれば、dependency-cruiserで実現する方が妥当だと思いました。

ライブラリ 2024/3/10週 Download数
dependency-cruiser 310,506
eslint-plugin-strict-dependencies 18,340
eslint-plugin-import-access 18,715

2. 背景

最近の業務ではfeaturesディレクトリで開発しています。
TypeScirptではexport宣言した変数や関数は全てのファイルからimportできてしまいます。

これにpackage-privateの機能を組み合わせれば外部のディレクトリからimportを制限できたり、モジュール管理がしやすくなると思い調査しました。

3. package privateを実現する方法

3.1. dependency-cruieser

以前こちらの「4.2 package private のような設計を作る」で紹介しましたのでご覧ください。

使い方

例:_から始まるファイルは同階層に置かれたファイルからのみimport可能

fromがimport(require)する側で、toがexportする側です。
pathがルールを適用するファイルパスで、pathNotが適用されないファイルパスです。

.dependency-cruiser.js
module.exports = {
  forbidden: [
    {
      name: `'_'から始まるファイルは同階層に置かれたファイルからのみimport可能`,
      severity: 'error',
      from: { path: ['(.*)\\/.*\\.ts$'], pathNot: ['.*\\.spec\\.ts$'] },
      to: {
        path: ['.*\\/_\\w+.ts$'],
        pathNot: ['$1\\/_\\w+.ts$'],
      },
    },
]

3.2. eslint-plugin-import-access

uhyoさんが作られたライブラリです。

使い方

export宣言されているものにJSDoc@packageとアノテートする

/**
 * @package
 */
export const fooPackageVariable = "I am package-private export";

以下弊社のtechブログでも使い方を取り上げてますので良かったらご覧ください。

3.3. eslint-plugin-strict-dependencies

ナレッジワークさんが作られたライブラリです

使い方

src/domains/sample 配下のpackage privateを実現する例です。

'strict-dependencies/strict-dependencies': [
      'error',
      [
        {
          module: 'src/domains/sample',
          allowReferenceFrom: ['src/domains/sample'],
        },
      ],
    ],

4. 3つのライブラリを比較する

package-privateを実現するという最低限の目的を満たすのには

eslint-plugin-strict-dependenciesが以下の理由で妥当だと思いました。

理由

エディタ上で不正なimportをした場合にすぐ検知されます

dependency-cruiserだとコマンドで実行してから検知されます
ここまではeslint-plugin-import-accessも同様のメリットです。

設定が簡単

  • eslintの設定ファイルでディレクトリごとの依存関係を丸々指定できます
  • eslint-plugin-import-accessはpackage-privateに特化しています
    しかし、ディレクトリごとカプセル化したい場合にはやや手間かなと思いました
    各ファイル、各export宣言の箇所にコメントをつけることを忘れずにする必要があります

コミュニティの規模を考えるのであれば、dependency-cruiserで実現する方が妥当

ライブラリ 2024/3/10週 Download数
dependency-cruiser 310,506
eslint-plugin-strict-dependencies 18,340
eslint-plugin-import-access 18,715

今後のeslint-plugin-strict-dependenciesの更なる普及を期待します!

参考

最後に

  • package-privateを実現すれば、依存関係を整理しやすくしてデグレリスク解消や、開発効率の向上につながるのでおすすめです
  • dependency-cruiserかeslint-plugin-strict-dependenciesかは社内でも検討したいと思います(コメントで助言いただけると助かります😂)
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1