NodeJS:什么是需要模块的最佳实践?

时间:2014-11-02 17:42:30

标签: javascript node.js

目前我已经按照以下结构创建了一个NodeJS项目:

   /(root)
   ----> controller
       ----> aController.js
   ----> model
   ----> module
       ----> aModule.js
   ----> util
       ----> util.js
   app.js

问题是示例,在controller/aController.js我使用模块fs,所以我fs = require('fs')包含fs模块。

问题出在module/aModule.js我还想使用fs,如果我做另一个fs=require('fs')它是否正确使用“Node.js方式”?

与上述问题相同,我也想在模块和控制器中require('util/util.js')。在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:3)

只需执行var fs = require("fs")(或var myLib = require("path/to/my/lib"))您需要的次数(在不同的文件中)。

require有一个内部缓存(require.cache),因此将使用相同的内存。

来自文档:

  

require.cache

     

模块在需要时缓存在此对象中。通过删除此对象的键值,下一个require将重新加载模块。


实施例

拥有以下文件:

.
├── a.js
├── b.js
└── u.js

u.js

this.say = "Hello World!";

a.js

var u = require("./u");
u.say = "Hello Mars!"; // change `say` property value
require("./b");        // load b.js file

b.js

console.log(require("./u").say); // output `say` property

输出:"Hello Mars!"为什么?因为从u.js加载的b.js已加载require.cacheu.say设置为"Hello Mars!" a.js })。

要阻止从缓存加载,您可以使用require.cachedelete require.cache[<absolute-path-to-file>]删除文件。让我们更改b.js内容如下:

 delete require.cache[require.resolve("./u")];
 console.log(require("./u").say); // output `say` property

输出:"Hello World!"因为文件未从缓存加载而是从磁盘加载。