Javascript Node.js同步加载js变量的最佳方式
我想在server.js文件中加载一些数据,该文件存储在/data/projects.js(或.json,具体取决于问题的答案)中 我认为有两种可能性: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
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;
}
};