同步加载JS变量的最佳方式
Node.js Best way to load JS variable synchronously
我想在服务器.js文件中加载一些数据,该文件存储在/data/projects.js(或.json取决于问题的答案)。
我看到两种可能性:
- 使用readFileSync:
function readJsonFileSync() { var file = fs.readFileSync(__dirname + '/data/projects.json', 'utf8'); return JSON.parse(file); }
和项目。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
:
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
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 链接两个网页或网络应用程序的最佳方式
- 什么's是连接供应商js文件的最佳方式
- 什么's是在javascript中迭代项的最佳方式
- 在node.js中编写单元测试的最佳方式是什么
- 在页面上记录数据并实现pushstate()的最佳方式
- 使用AJAX在Rails中提交动态表单的最佳方式是什么
- 什么'这是加载jQuery的最佳方式
- 将大数组(字符串和类型数组的混合物)存储到blob或文件中/从blob或文件检索大数组的最佳方式
- 在网站上显示.mov作为加载屏幕的最佳方式
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 以角度渲染表中数据的最佳方式
- 删除集合中旧邮件/帖子的最佳方式
- 显示全屏Ajax加载程序的最佳方式
- PHP和JS中表单验证的最佳方式