【问题标题】:What are the advantages and disadvantages of using require vs using fs.readFile to get JSON from a file使用 require 与使用 fs.readFile 从文件中获取 JSON 的优缺点是什么
【发布时间】:2015-12-20 00:04:34
【问题描述】:

如果我在项目中使用 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 是异步

【问题讨论】:

  • 第一次使用时它是同步的这一事实仅在第一次使用发生在时间敏感的事情(例如 http 请求)期间才重要。否则我看不出有太多理由改为使用 readFile ,除非您希望能够在未来读取时看到对文件的更改。
  • 请注意,如果您决定使用 require,文件将被加载并缓存,直到您重新启动服务器。如果您从另一个文件中需要它,则将使用内存中的缓存版本,而不是再次读取该文件。另一方面,如果您使用 fs.readFile,则每次使用此方法时都会读取该文件。

标签: node.js


【解决方案1】:

两个主要区别:

  1. require() 缓存结果,因此在随后使用require() 读取 JSON 时将不会看到对 .json 文件的更改,除非从要求缓存中显式删除结果。

    李>
  2. require() 是同步的,fs.readFile() 是异步的。当然,如果您想要同步行为(但不确定为什么),您可以使用 fs.readFileSync()

除此之外,您可以随心所欲地做到这一点。

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

【讨论】:

    【解决方案2】:

    虽然require() 在本质上确实是同步的,但按照惯例,所有需求都应该在第一个滴答声中解决,这很好。

    也就是说,您不应该在回调中使用 require() 或作为制定响应的一部分,但在第一次应用程序启动时使用它是可以的,因为它只会发生一次。

    require 的优点是它更简单,更易读,并且可以方便地返回已经被 JavaScript 解析的对象。

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2016-05-25
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2010-09-08
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多