使用require和使用fs.readFile从文件中获取JSON有哪些优点和缺点

时间:2015-09-22 20:45:06

标签: node.js

如果我在项目中使用JSON数据,最好像这样使用readFile:

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});

或只使用require

var config = require('./file.json');

我试过找到性能比较,但我找不到。在这个post by FredKSchott中,作者潜入了require函数,看起来它可以通过缓存提高性能,但看起来是同步的,而fs.readFile是异步

1 个答案:

答案 0 :(得分:4)

两个主要区别:

  1. /** * Checks if value is empty. Deep-checks arrays and objects * Note: isEmpty([]) == true, isEmpty({}) == true, isEmpty([{0:false},"",0]) == true, isEmpty({0:1}) == false * @param value * @returns {boolean} */ function isEmpty(value){ var isEmptyObject = function(a) { if (typeof a.length === 'undefined') { // it's an Object, not an Array var hasNonempty = Object.keys(a).some(function nonEmpty(element){ return !isEmpty(a[element]); }); return hasNonempty ? false : isEmptyObject(Object.keys(a)); } return !a.some(function nonEmpty(element) { // check if array is really not empty as JS thinks return !isEmpty(element); // at least one element should be non-empty }); }; return ( value == false || typeof value === 'undefined' || value == null || (typeof value === 'object' && isEmptyObject(value)) ); } 缓存结果,因此在使用require()的JSON的后续读取中将看不到对.json文件的更改,除非从require缓存中显式删除了结果。

  2. require()是同步的,require()是异步的。当然,如果你想要同步行为(但不确定原因),你可以使用fs.readFile()

  3. 除了那些,你可以按照你想要的方式做到。

    • 如果缓存存在问题(例如您不想缓存),那么我会使用fs.readFileSync()
    • 如果缓存是一种好处,那么我会使用fs.readFile()
    • 如果我明确地想要异步行为,因为这不仅仅是在启动时完成,而是在请求处理程序中完成,那么我将使用require()来保留服务器的异步响应。
    • 除了这两个,如果此代码在启动时运行,我会使用fs.readFile()因为它只是更少的代码,并且是node.js内置的行为。