Node.jsの相対パス地獄の

2019-04-15 11:32:41

 Node.jsで自分が作ったモジュールをimportする場合、目的のパスを延々と記述しなければなりません。機能ごとにディレクトリを分けていたりすると、だんだんえらいことになっていきます。


 しかしNode.jsには、簡単にモジュールの検索パスを設定する方法がありません。package.jsonあたりに項目を用意しておいてほしいところですが、無いものは仕方がないので別の解決方法を考えます。

 一番無難なのはnode_modulesに入れてしまうことです。ただし普通に直接放り込むと、「npm install」をやった時に消されます。ということでローカルモジュールとしてインストールする必要があります。

 ローカルモジュールの仕様自体は別に良いのですが、モジュールファイルが複数ある時に困るという仕様になっていました。package.jsonに指定できるファイルは一つだけです。typescriptだとモジュールタイプをamdにすれば統合可能ですが、形式が変わってしまうためnode_modulesで使用できません。

 ということでさらに解決方法を考えた結果、統合するのをやめようという結論に達しました。

local_module
 パッケージ名
  dist
   package.json
   *.js
   *.d.ts
  src
   *.ts
    tsconfig.json

 という構造を作り、srcに入っている.tsをトランスコンパイルしてdistに出力。distの中にpackage.jsonを入れておき、そこをローカルモジュールとして登録します。統合用のindex.jsは作りません。

 ローカルモジュールとしてインストールするには以下のコマンドを使います。
npm i ./local_modules/パッケージ名/dist
 パッケージ名は別の名前でも特に問題はありません。package.jsonで指定した名前が、実際のパッケージ名になります。
 ちなみにnode8以降はシンボリックリンクが張られる形なので、ローカルモジュールのコード修正をしても再インストールはいりません。

 利用するときは
import * as 名前 from 'パッケージ名/モジュール名'
 とすれば、問題なくインポート可能です。パッケージ名を指定する形なので、相対パス地獄からは抜け出すことができました。

 Node.jsこういう仕様になっているのは、同一のモジュールパッケージに複数の機能を詰め込むのを前提にしていないからなのでしょう。