Javascript Node.js同步加载js变量的最佳方式

Javascript Node.js同步加载js变量的最佳方式,javascript,json,performance,node.js,Javascript,Json,Performance,Node.js,我想在server.js文件中加载一些数据,该文件存储在/data/projects.js(或.json,具体取决于问题的答案)中 我认为有两种可能性: 使用readFileSync: function readJsonFileSync() { var file = fs.readFileSync(__dirname + '/data/projects.json', 'utf8'); return JSON.parse(file); } projects.json是一个传统的j

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

我认为有两种可能性:

  • 使用readFileSync:

    function readJsonFileSync() {
        var file = fs.readFileSync(__dirname + '/data/projects.json', 'utf8');
        return JSON.parse(file);
    }
    
    projects.json是一个传统的json文件

  • 使用要求:

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

    exports.projects = {
         // My variable
    };
    
  • 问题是哪一个是最好的:

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

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

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

    也就是说,
    readFileSync
    require
    之间的主要区别在于require将缓存文件的内容。我见过无数次使用
    require
    加载json文件,因此我认为它不是为模块保留的(不过,请确保在文件路径中包含
    .json

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

    EDIT:为了便于参考,我检查了node.js的源代码,并且怀疑,
    require
    在内部使用了
    readFileSync

    //js的本机扩展 模块。_扩展名['.js']=函数(模块,文件名){ var content=NativeModule.require('fs').readFileSync(文件名'utf8'); 模块编译(条带BOM(内容)、文件名); };
    在node.js中使用sync fs函数的主要原因是在应用程序启动之前加载文件。最常见的原因是加载配置文件。在这种情况下,性能并不重要

    也就是说,
    readFileSync
    require
    之间的主要区别在于require将缓存文件的内容。我见过无数次使用
    require
    加载json文件,因此我认为它不是为模块保留的(不过,请确保在文件路径中包含
    .json

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

    EDIT:为了便于参考,我检查了node.js的源代码,并且怀疑,
    require
    在内部使用了
    readFileSync

    //js的本机扩展 模块。_扩展名['.js']=函数(模块,文件名){ var content=NativeModule.require('fs').readFileSync(文件名'utf8'); 模块编译(条带BOM(内容)、文件名); }; 每

    .js文件被解释为JavaScript文本文件,.json文件被解析为json文本文件。节点文件被解释为加载了dlopen的已编译插件模块

    所以我需要(“./data/projects.json”)
    ,因为它是最短的,而且可能已经很好地优化了

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

    这是node的工作方式(除了缓存结果外):

    根据

    .js文件被解释为JavaScript文本文件,.json文件被解析为json文本文件。节点文件被解释为加载了dlopen的已编译插件模块

    所以我需要(“./data/projects.json”)
    ,因为它是最短的,而且可能已经很好地优化了

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

    这是node的工作方式(除了缓存结果外):


    我通常将每环境外部配置文件包装在管理默认值、系统变量等的模块中。因此,我同时使用
    require
    readFileSync
    我通常将每环境外部配置文件包装在管理默认值、系统变量、,因此我同时使用
    require
    readFileSync
    // Native extension for .js Module._extensions['.js'] = function(module, filename) { var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); module._compile(stripBOM(content), filename); };
    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;
     }
    };