次のようなディレクトリがあります。
_-- app/
|- models/
|- user.js
|- config.json
_
_user.js
_ファイルに_config.json
_を必須にしたい。現在、私はrequire('/config')
を使用していますが、これは機能しません。何が悪いのですか? require('../config')
の使用は避けたいです。
簡単な答えは、あなたは何も悪いことをしていないということです。少し調べた結果、require関数は次のいずれかを探します。
参照: http://www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm And: http ://nodejs.org/api/modules.html#loading_from_node_modules_Folders
上記の両方のリソースは、NODE_PATH環境変数も変更する機能を参照していますが、これは非常に悪い習慣のように聞こえ、少なくともコードの移植性が低くなります。また、config.jsonのようなファイルに対しても機能しない可能性があります。これまで行ったことはありませんが、NODE_PATH変数を変更すると、require()が実際のモジュールに対応するpackage.jsonファイルを探す場所のみが変更されると考えます。
要約すると、以下を参照してください。 node.jsでrequireを常にプロジェクトのルートフォルダーに対して相対的にする方法 上記でPiotr Kowalczukによって参照されています。その投稿によると、2つの実際のオプションがあります。
最後に、あなたがしようとしていることは、あなたが使用しているプログラムの粒度に反することを覚えておいてください。これは、Nodeの粒度を使用して、設計の意図どおりに相対ファイルパスを使用することで、最終的には(そして共同編集者も!)生活を楽にする1つのケースだと思います。
私は自分のモジュールを書くよりも良い解決策を見つけることができませんでした????.
だから、私はクリーンなコードが好きで、require
内のそのような醜いパスが私を殺していました。私はそれを修正する方法を多くの解決策を見つけましたが、私が気に入ったのはLinuxシステムでは完璧でしたが、Windowsでは完璧ではありませんでした。それから私はそれを修正することにしました。
いくつかのプロジェクトでテストした後、私は it open source ????にすることにしました。
_const user = require('../../../database/user'); // ???? what you have
// OR
const user = require('$db/user'); // ???? no matter how deep you are
const product = require('/database/product'); // ???? alias or pathing from root directory
_
それを使用するための3つの簡単なステップ。
パッケージをインストールします:_npm install sexy-require --save
_
メインアプリケーションファイルの先頭にrequire('sexy-require')
を1回含めます。
_require('sexy-require');
const routers = require('/routers');
const api = require('$api');
...
_
オプションのステップ。パス構成は、プロジェクトのルートディレクトリにある_.paths
_ファイルで定義できます。
_$db = /server/database
$api-v1 = /server/api/legacy
$api-v2 = /server/api/v2
_
プロジェクトのどこでも、定義されたショートカットパスを取得できます。
_ const path = require(`sexy-require`);
console.log(path.$db); // -> '/full/path/to/app/server/database'
_
モジュール読み込み機能が引数の前にnode_modules/
を付加しているようです。たとえば、次のスクリプトを/tmp/t.js
に配置します。
meow = require('meow/meow.js');
(mkdir
)/tmp/node_modules/
を作成し、BSDのktrace
(またはLinuxのstrace
、同等の機能を提供する)で実行してみます。 Nodeは以下を開こうとします:
/tmp/node_modules/meow/meow.js
/tmp/node_modules/meow/meow.js.js
/tmp/node_modules/meow/meow.js.json
/tmp/node_modules/meow/meow.js.node
/tmp/node_modules/meow/meow.js/package.json
/tmp/node_modules/meow/meow.js/index.js
/tmp/node_modules/meow/meow.js/index.json
/tmp/node_modules/meow/meow.js/index.node
スクリプトの横にnode_modules/
サブディレクトリがない場合、スクリプトに関連する場所はまったく検索されません。
この問題について話し合う必要はないと思います。開発しやすいようにこのように設計しています。
/config.jsonが必要な場合、サブフォルダにconfig.jsonがたくさんあるため、通常はさらに理解しにくくなります。
-- app/
|- controller
|- config.json(2)
|- models/
|- user.js
|- config.json(3)
|- config.json(1)
ここで、選択する必要がある1つの構成ファイルを知る方法を教えてください。
解決策:user.js
var config1 = require('../config.json');
var config2 = require('../controller/config.json');
var config3 = require('./config.json');
configが1つしかない場合は、グローバル変数に入れて、そこから使用することをお勧めします。
_global.__require = function (file) {
return require(__dirname + '/' + file)
}
_
これをエントリポイントファイルの先頭に配置します(例:_index.js
_)。その後、あなたはただ使うことができます
const foo = __require('src/foo')
。
私は___dirname
_のオデとして二重下線を使用していますが、名前は何でも変更できます!