0

/data/projects.js(または質問の回答によっては.json)に保存されているserver.jsファイルにデータをロードしたいと思います。

2つの可能性があります。

  1. readFileSyncの使用:

    function readJsonFileSync() {
        var file = fs.readFileSync(__dirname + '/data/projects.json', 'utf8');
        return JSON.parse(file);
    }
    

    およびprojects.jsonは従来のjsonファイルです

  2. requireの使用:

    function readJsonFileReq() {
        return require('./data/projects.js')['projects'] ;
    }
    

    projects.jsに含まれるもの:

    exports.projects = {
         // My variable
    };
    

質問はどれが一番良いかです:

  • パフォーマンスの面で?
  • ノードの書き込み可能性/哲学の観点から?(例:require()はモジュール用に予約されています)

require()はおそらくJSコードの読み取り用に最適化されているので、ソリューション2の方が優れていると思いますが、ソリューション1はファイルを読み取ってから解析する必要がありますが、実行するよりも解析する方が安価な場合があります。

4

2 に答える 2

3

node.jsでsyncfs関数を使用する主な理由は、アプリが起動する前にファイルを読み込むことです。最も一般的な理由は、構成ファイルをロードすることです。この場合、パフォーマンスは重要ではありません。

readFileSyncそうは言っても、との主な違いrequireは、requireがファイルのコンテンツをキャッシュすることです。jsonファイルのロードに何度requireも使用されているので、モジュール用に予約されているとは思いません(.jsonただし、ファイルパスに必ず含めてください)。

module.exports = {..}最後に、を書きたい場合に使用できることを忘れないでくださいvar projects = require('./data/projects.js');

編集:参考までに、node.jsのソースコードを確認しました。疑わしいと思いますが、内部でrequire使用しています。readFileSync

https://github.com/joyent/node/blob/master/lib/module.js#L472

//.jsのネイティブ拡張子
Module._extensions['。js']=function(module、filename){
  var content = NativeModule.require('fs')。readFileSync(filename、'utf8');
  module._compile(stripBOM(content)、filename);
};
于 2013-03-27T08:45:51.627 に答える
1

http://nodejs.org/api/modules.html#modules_file_modulesによると、

.jsファイルはJavaScriptテキストファイルとして解釈され、.jsonファイルはJSONテキストファイルとして解析されます。.nodeファイルは、dlopenでロードされたコンパイル済みアドオンモジュールとして解釈されます。

require("./data/projects.json")最短で、おそらくかなりうまく最適化されているので、私はそうします。

Laurentは良い発言をしています:requireの結果はキャッシュされます。これは、長所または短所になる可能性があります。アプリの起動時にファイルを1回だけ読み取る場合は、問題ありません。

これは、ノードがそれを行う方法です(結果のキャッシュは別として):

Module._extensions['.json'] = function(module, filename) {
 var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
 try {
  module.exports = JSON.parse(stripBOM(content));
 } catch (err) {
   err.message = filename + ': ' + err.message;
   throw err;
 }
};

https://github.com/joyent/node/blob/master/lib/module.js#L479

于 2013-03-27T09:01:27.553 に答える