Node.js - require()d 模块的作用域是什么?

6

我正在尝试整理一个使用Express 4开发的Node.js应用程序,并且对于使用require()导入的模块的范围感到困惑。

假设我在routes/user.js这样的模块中使用require('./services/user')来导入服务:

var userService = require('./services/user');

然后我在另一个模块routes/department.js中执行相同的require('./services/user')

我的问题是:userService在user.js和department.js中是同一实例还是每个模块都有自己的userService对象?也就是说,一旦通过module.exports = XXX导出某个元素,如果你要求相同的文件,你总是会得到相同的实例吗?能否告诉我在Node.js文档中哪里指定了这一点?


路由/user.js和路由/department.js是否被同一段代码所需? - DrakaSAN
是的,在 Express 的 app.js 模块中:app.use('/users', userRoutes); app.use('/departments', departmentRoutes); - codependent
1个回答

5
如果我理解你的问题正确,你有这些文件:
.
|_. app.js
|_. routes/
  |_. user.js
  |_. department.js
  |_. services/
    |_. user

你的代码执行以下操作:
app.js call user.js
    user.js call user
app.js call department.js
    department.js

在这种情况下,当用户首次需要时,它会被放置在require.cache中进行缓存。
然后第二次调用时,调用方获取require.cache['./service/user'],其中存储了你的对象。
因此,在department.js和user.js中都有相同的对象。
来源: 编辑:
其他有用的链接:

node.js require() cache - possible to invalidate?


谢谢!完美的答案。所以如果我理解正确,只要有一个共同的祖先模块,所有导入的模块都会被捕获并在它们之间共享? - codependent
没错,只要是启动了同一个node实例,所需的模块就会在所有模块之间共享。 - DrakaSAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接