在NodeJS中,`require`可以被视为在其词法位置加载文件吗?

3
< p >在NodeJS中,< code >require 可以被认为是在词法位置(lexical position)加载和运行文件,但受模块边界(module scope)的限制吗?

1: console.log('foo');
2: var bar = require('bar'); // Loaded and evaluated in after line 1 is evaluated?
3: console.log('bam'); // Run after the contents of bar has been loaded and evaluated?
1个回答

2

是的,在一个给定的Node进程中,对require("bar")的第一次调用。

随后对require("bar")的调用将返回缓存副本。

如果您的代码构成整个程序,您可以保证第1行在评估bar之前执行。

如果它是程序的一部分,您不能保证这一点,因为bar可能已经在先前对require("bar")的调用中被评估了。

无论哪种情况,您都可以保证第3行在bar被评估后执行。

进一步阅读:


1
请注意,require是一种阻塞调用,因此在加载模块时会阻塞事件循环。 - notion
不仅是缓存副本,而是真正的单例。当您需要单例时,您可以利用这个事实来“作弊” - 您不需要在node.js中实现单例,因为module.exports被实现为单例。 - slebetman

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