4

私は現在、JavaScript を使用して Windows 8 アプリケーションを構築するチームの一員です。npm と browserify を使用して依存関係を管理し、モジュールを AMD ブラウザーに適した形式に変換します。

私たちが直面している問題の 1 つは、クレイジーなパスの要求です。これは、アプリケーションの「コンポーネント」内に最上位のフォルダーがあるためです。このフォルダーには、ネストされた ui コンポーネント/モジュールが多数含まれています。これらのモジュールは、lib ディレクトリに存在する lib ユーティリティとヘルパーを必要とする場合があります。

たとえば、「my/app/components/product/grid/item」にあるモジュールには、「my/app/lib/helpers/view」にあるヘルパー モジュールが必要になる場合があります。

必要なパスは少しクレイジーで非常に醜いです:

モジュール方式でアプリケーションを組み込むために最善を尽くしています。これにアプローチする適切な方法は、コンポーネント モジュールをこれらの util ヘルパー モジュールに依存させることだと思います。lib ヘルパーを独自の外部プライベート git リポジトリに配置することもできましたが、他のチームにアクセス権を与えるという点では苦労しました (さらに、git プライベート リポジトリは低速です)。さらに、これらのモジュールはアプリケーションでのみ使用されるため、変更を加えて変更をプッシュし、アプリケーションに戻って npm を更新するのは時間の無駄です。これは一部の人にとっては問題ありませんが、これを本当に分解すると、すぐに古くなる可能性があります.

コンポーネント package.json 内で npm install "my/app/lib/helpers/view" を実行できますか? しかし、npm install はこれを自動的に行いません。

私はこれを回避するいくつかの他の方法を知っています (NODE_PATH、おそらく npm install フックまたは npm preinstall スクリプトを使用します) が、他の誰かが同様の問題と適切な解決策を持っているかどうかを知りたいと思っていました.

4

3 に答える 3

7

"my/app/components/product/grid/item"ファイルを に配置するnode_modules/grid/item.jsrequire('grid/item')、アプリケーション コードで必要なファイルをより簡潔な require path 構文で取得できます。node_modules/grid/item.js他のファイルを git にチェックするだけです。node と browserify で使用される require アルゴリズムは、現在のパスから一致するモジュールが見つかるまでディレクトリを検索するため、ディレクトリは最node_modules/上位にある必要さえありません。node_modules//

package.json の配列に必ず追加"grid"して、"bundledDependencies"誤ってその上に何かをインストールしないようにしてください。

ノードモジュールを git にチェックインする方法について詳しく読むことができます。

詳細については、browserify ハンドブックの ../../../../../../ の回避に関するセクションをお読みください。

NODE_PATH は常に悪い考えであり、browserify はそれをサポートしていません。絶対に使わないでください。

于 2013-03-09T21:23:24.430 に答える
0

できることの 1 つは、必要な構成でヘルパーのエイリアスを作成することです...

require.config({
    paths: {
        "helpers": "my/app/lib/helpers"    
    }
});

それはあなたの長い道のりのいくつかを削減するでしょう.

于 2013-03-09T17:52:43.693 に答える
-1

require() 関数の問題は、パスが現在のファイルからの相対パスであることです。モジュールを node_modules ディレクトリ内に置くこともできますが、これは最悪のことです。node_modules は、すべてのサードパーティ モジュールが存在するディレクトリです。この単純なルールに従えば、常に最新の状態を維持するのは非常に簡単で便利です。すべての依存関係を削除 (node_modules を削除) して、npm install.

最善の解決策は、独自の require 関数を定義してグローバルにすることです。例えば:

プロジェクト構造は次のとおりです。

my-project
| tools
|- docs
|- logs
|- conf
`- src
   |- node_modules
   |- package.json
   |- mod.js
   |- a
   |  `- b
   |     `- c.js
   `- d
      `- app.js

mod.js

global.mod = function (file){
  return require ("./" + file);
};

app.js

//This should be the first line in your main script
require ("../mod");

//Now all the modules are relative from the `src` directory
//You want to use the a/b/c.js module
var c = mod ("a/b/c");

それだけです、簡単です。node_modules にあるサードパーティ モジュールを取得する場合は、require() を使用します。独自のモジュールを取得する場合は、mod() を使用します。

また、node_modules はサードパーティ モジュール専用であり、ルール nº1 であることを覚えておいてください。

于 2013-03-09T23:30:42.243 に答える