0

我想在存储在 /data/projects.js (或 .json 取决于问题的答案)中的 server.js 文件中加载一些数据。

我看到两种可能性:

  1. 使用 readFileSync:

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

    和 projects.json 是一个传统的 json 文件

  2. 使用要求:

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

    与 projects.js 包含:

    exports.projects = {
         // My variable
    };
    

问题是哪一个是最好的:

  • 在性能方面?
  • 在节点可写性/哲学方面?(例如 require() 为模块保留)

我猜解决方案 2 更好,因为 require() 可能针对读取 JS 代码进行了优化,而解决方案 1 必须读取文件,然后解析它,但解析它可能比执行它便宜。

4

2 回答 2

3

在 node.js 中使用同步 fs 函数的主要原因是在应用启动之前加载文件。最常见的原因是加载配置文件。在这种情况下,性能并不重要。

readFileSync话虽如此,和之间的主要区别在于requirerequire 将缓存文件的内容。我见过无数次require用于加载 json 文件,所以我不认为它是保留给模块的(不过,请务必包含.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(内容), 文件名);
};
于 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 的结果被缓存了。这可能是一个优点或缺点。如果您在应用程序启动时只读取一次文件,那没关系。

这就是节点的工作方式(除了缓存结果):

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 回答