web-dev-qa-db-ja.com

Node絶対パスが必要

次のようなディレクトリがあります。

_-- app/
   |- models/
      |- user.js
   |- config.json
_

_user.js_ファイルに_config.json_を必須にしたい。現在、私はrequire('/config')を使用していますが、これは機能しません。何が悪いのですか? require('../config')の使用は避けたいです。

23
user2066880

簡単な答えは、あなたは何も悪いことをしていないということです。少し調べた結果、require関数は次のいずれかを探します。

  • fsなどのコアモジュール
  • require呼び出しで指定する相対ファイルパス
  • require関数が呼び出されるファイルの親ディレクトリのどこかにあるnode_modulesフォルダ内の適切な名前のモジュールのディレクトリ検索。

参照: 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つの実際のオプションがあります。

  1. 相対ファイルパスを使用します。
  2. 希望のリソースを実際のモジュールとしてpackage.jsonファイルでパッケージ化し、node_modulesフォルダーにドロップします。

最後に、あなたがしようとしていることは、あなたが使用しているプログラムの粒度に反することを覚えておいてください。これは、Nodeの粒度を使用して、設計の意図どおりに相対ファイルパスを使用することで、最終的には(そして共同編集者も!)生活を楽にする1つのケースだと思います。

22
Owen

私は自分のモジュールを書くよりも良い解決策を見つけることができませんでした????.

だから、私はクリーンなコードが好きで、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つの簡単なステップ。

  1. パッケージをインストールします:_npm install sexy-require --save_

  2. メインアプリケーションファイルの先頭にrequire('sexy-require')を1回含めます。

    _require('sexy-require');
    const routers = require('/routers');
    const api = require('$api');
    ...
    _
  3. オプションのステップ。パス構成は、プロジェクトのルートディレクトリにある_.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'
_
15
sultan

モジュール読み込み機能が引数の前に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/サブディレクトリがない場合、スクリプトに関連する場所はまったく検索されません。

1
Mikhail T.

この問題について話し合う必要はないと思います。開発しやすいようにこのように設計しています。
/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つしかない場合は、グローバル変数に入れて、そこから使用することをお勧めします。

0
Vinayk93
_global.__require = function (file) {
  return require(__dirname + '/' + file)
}
_

これをエントリポイントファイルの先頭に配置します(例:_index.js_)。その後、あなたはただ使うことができます

const foo = __require('src/foo')

私は___dirname_のオデとして二重下線を使用していますが、名前は何でも変更できます!

0
Will