なっく日報

技術やら生活やらのメモ

npmのローカルモジュールの問題をlinklocalで解決する

現在担当のプロジェクトでのお話です。

ローカルモジュールとは何ぞや?という人はnpm 2.0.0でローカルモジュールを使ってrequire('../../../')を回避する | Web Scratchをご参考に。

クライアントとサーバのモジュールを同じリポジトリに置きつつ、キレイに分割するためにnpmのローカルモジュールの機能を使おうとしています。

下記みたいなイメージ(serverだけローカルモジュールにしている)

package.json
client/client.js # ビルドしてpublicに吐く、≠ローカルモジュール
server.js
server/package.json
         /lib
         /test
public/

が、分割するにあたり、1つ問題がでてきました。

ローカルモジュール内のファイルを変更した場合、手動で再インストールしないと、反映されないのです。 (変更の度にファイルをnode_modulesにコピーしないといけない)

解決策1

最初に考えた正統派な方法はこれです(local-serverがローカルモジュールと考えてください)

npm version patch && npm update local-server

が、めんどいので却下。

解決策2

次に考えた方法はこれ。

npm install --force local-server

が、遅いので、ちょっと開発には厳しい。。

解決策3(これに決定)

仕方なく、../../../問題で有名なgist Better local require() paths for Node.js · GitHub の議論を追っていたところ、

github.com

というモジュールの存在を知りました。

要はローカルモジュールをnode_modulesにコピーするのではなく、シンボリックリンクを自動的に貼ってくれるというもの。

package.json

"scripts": {
  "linklocal": "rm -rf ./node_modules/local-* && linklocal"
}

みたいなタスクを定義して、いい感じに扱えるようになりました。