同步加载JS变量的最佳方式

Node.js Best way to load JS variable synchronously

本文关键字:最佳 方式 变量 加载 JS 同步      更新时间:2023-09-26

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

我看到两种可能性:

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

    和项目。json是传统的json文件

  2. 使用要求:
  3. function readJsonFileReq() {
        return require('./data/projects.js')['projects'] ;
    }
    

    与projects.js包含:

    exports.projects = {
         // My variable
    };
    

问题是哪一个是最好的:

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

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

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

也就是说,readFileSyncrequire之间的主要区别在于require将缓存文件的内容。我已经看到无数次require被用来加载json文件,所以我不认为它保留给模块(一定要包括.json在文件路径,虽然)。

最后,不要忘记,如果你想写var projects = require('./data/projects.js');,你可以使用module.exports = {..}

EDIT:作为参考,我检查了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(文件名,use utf8);module._compile (stripBOM(内容),文件名);};

Per http://nodejs.org/api/modules.html#modules_file_modules,

.js文件被解释为JavaScript文本文件,. JSON文件被解释为JSON文本文件,.node文件被解释为加载dlopen的编译插件模块。

所以我选择require("./data/projects.json"),因为它是最短的,并且可能优化得很好。

Laurent说得很好:require的结果是缓存的。这可能是一种优势,也可能是劣势。如果你在应用程序启动时只读取一次文件,那就没关系了。

node是这样做的(除了缓存结果):

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