9

状況は次のとおりです… そこで、いくつかの Node.js テンプレート エンジンShift.jsへのインターフェイスとして機能する Node.js モジュールを作成しました。これは、別の Node.js モジュールであるDesign.ioに含まれています (Design.io の package.jsondependenciesブロックに指定されています)。Design.io はファイルの変更を監視します。

次に、アプリとrequire('design.io'). たとえば、Less と Stylus もプロジェクトにインストールします。

このようにして、.lessまたは.stylファイルを保存すると、一連のメソッドが呼び出されます。

  1. require("design.io")ファイルシステム イベントの通知を受け取ります。次に Design.io が呼び出します
  2. require('shift').render(string, extension, callback). 次に、Shift.js が呼び出します
  3. require(moduleFor(extension)) # require("less"). 文字列がコンパイルされます。

アプリ (現在の作業ディレクトリ) に、less とスタイラスをインストールしました。

npm install less stylus

私が抱えている問題は、Shift.js モジュール内から呼び出されるステップ 3で、次のようなエラーが発生することです。

Error: Cannot find module 'less'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Less.engine (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:6:14)
    at Less.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift/less.js:18:21)
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:69:23
    at /Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:118:13
    at Object.forEachSeries (/Users/viatropos/Documents/git/plugins/design.io/node_modules/async/lib/async.js:134:9)
    at Object.render (/Users/viatropos/Documents/git/plugins/design.io/node_modules/shift/lib/shift.js:78:31)

私の質問は、なぜこれが起こっているのですか?ライブラリがどこかにインストールされている限り、モジュールからライブラリを動的に要求できると思いました...何が欠けていますか?

目標は、Shift.js のようなライブラリがすべての単一の依存関係を定義する必要がないことpackage.jsonです...「テンプレート エンジンへのインターフェイス」ライブラリの場合、アプリがおそらく決して使用しない依存関係が多すぎる必要があります。

助けてくれてありがとう、それが幾分明確だったことを願っています。

4

1 に答える 1

25

するとnpm install foofooモジュールはnode_modules現在の作業ディレクトリにある名前のディレクトリにインストールされます。

このライブラリをインストールすると、独自のディレクトリ内またはグローバル ディレクトリ検索のいずれかでshift必要なモジュールのみが検索されます。 node_modulesrequire.resolve()

そして、それはあなたの問題に対する簡単な解決策です:

npm install -g less

そして、ライブラリは、現在の作業ディレクトリ内のコードだけに表示されるのではなく、コンピューター上のすべての Node.js コードにグローバルに表示されます。

または、表示したいだけの場合はshift、次のようにします。

npm install shift
cd node_modules/shift
npm install less
于 2012-02-17T00:51:39.910 に答える