見出し画像

Node.js グローバルインストールでハマった

簡単にいうとNode.js グローバルインストールにハマりました。いわゆるパスを通すのに苦労した話です。

tl;dr

Node.jsでグローバルインストールしたモジュールが実行環境によって参照できない時の調査ポイント

 - npm root -g で、モジュールのパスを確認
 - NODE_PATH にモジュールのパスを追加
 - VSCode の場合は.vscode/launch.json に NODE_PATH を追加

問題 グローバルインストールしたモジュールが読み込めない

shell, サードパーティモジュールをインストールする。

npm i -g 3rd_party_module 

​index.js 呼び出しするも失敗。

const a = require('3rd_party_module')
// 読み込みに失敗する
// 🚨Error: Cannot find module '3rd_party_module'

解決方法

$NODE_PATHにグローバルインストールされたモジュールのパスを通せば良い。グローバルインストールのパスがNode.jsのrequire()メソッドから参照されるためには、そのパスがglobal.module.pathsに入っている必要がある。まずはそれを確認する。

shell, グローバルインストールされたモジュールの検索対象となるパス一覧を照会する。

$ node
> global.module.paths
[ '/opt/jarvis/repl/node_modules',
 '/opt/jarvis/node_modules',
 '/opt/node_modules',
 '/node_modules',
 '/root/.node_modules',
 '/root/.node_libraries',
 '/usr/lib/node' ]
> .exit # node を終了

shell, 次に先ほどグローバルインストールしたサードパーティモジュールのパスを確認する。

# モジュールがグローバルインストールされているパス確認
$ npm root -g
/usr/local/lib/node_modules

shell, global.module.pathsに入っていないので、追加する。そうするには$NODE_PATHという環境変数に追加する。

$ NODE_PATH="npm root -g"
# 確認
$ node 
> global.module.paths
[ '/usr/lib/node_modules/repl/node_modules', 
 '/usr/local/lib/node_modules', 🌟追加された!
 '/usr/node_modules',
# ・・・以下略

※ Macの場合は、ダブルクォーテーションだとNODE_PATH = npm root -gとなるのでで以下のようにすること。

// .bash_profileに設定
NODE_PATH=`npm root -g`
export NODE_PATH

shell, 環境変数を反映

$ source ~/.bash_profile
$ echo $NODE_PATH 
/usr/local/lib/node_modules... # O.K.

Dockerfile, Dockerを使う場合は、このパスをDockerfileに定義する。

ENV NODE_PATH /usr/lib/node_modules

VSCodeでパスが通らない

しかし、VS Codeから実行すると、グローバルインストールしたモジュールが読み込まれない...。色々調べたら、launch.json に 環境変数追加してやればいいみたい。

.vscode/launch.json

 ~~~~~ 中略 ~~~~~
 {
   "type": "node",
   "request": "launch",
   "name": "VSCodeでのデバッグ",
   "program": "${workspaceFolder}/nodejsproject/index_from_vscode.js",
   "env": {
       "NODE_PATH": "/usr/local/lib/node_modules" 🌟 ここ!
   }
 }
~~~~~ 中略 ~~~~~

いくつか変数っぽいのは使えるのかな〜と思って、"${npm root -g}" を設定してみたけど"npm root -g"がNODE_PATHとして設定されるだけだったので仕方なく直打ちです。


閑話 PWA始めました。ザクっと開発環境を整える記事を書いたのでどうぞ。無料で!Vue.js + Firebase Hosting + Github Actions でサクッとPWA開発環境を整える

この記事が気に入ったらサポートをしてみませんか?