目前我已经按照以下结构创建了一个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')
。在这种情况下,最佳做法是什么?
答案 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.cache
(u.say
设置为"Hello Mars!"
a.js
})。
要阻止从缓存加载,您可以使用require.cache
从delete require.cache[<absolute-path-to-file>]
删除文件。让我们更改b.js
内容如下:
delete require.cache[require.resolve("./u")];
console.log(require("./u").say); // output `say` property
输出:"Hello World!"
因为文件未从缓存加载而是从磁盘加载。