使用require()时整个JS文件被执行,原因是什么?
Node.js require模块时整文件代码执行的原因
这是Node.js模块加载的机制决定的:当你用require()引入一个模块时,Node会先把整个模块文件的代码从头到尾执行一遍,之后才把module.exports指向的内容返回给调用方。
你之前的误解在于,module.exports只是负责把指定的函数/对象暴露给外部,它管不了模块里哪些代码会执行。模块里所有不在函数、块级作用域内的顶级代码,在模块被第一次加载时都会自动执行——哪怕这些代码和你要导出的内容没关系。
拿你的代码举例:
当你在另一个文件里调用require('./module1.js')时,Node会先执行module1.js里的两行console.log,接着定义evening函数,最后把这个函数赋值给module.exports返回给你。所以你看到的打印结果是先输出Hello、Good Morning,再输出Good Evening。
如果只想让evening函数可以被外部调用,而其他代码不自动执行,你需要把那些不想自动运行的代码封装到函数里,比如修改module1.js:
// 把不需要自动执行的代码封装成函数 function morningGreet() { console.log("Hello"); console.log("Good Morning"); } function evening() { console.log("Good Evening"); } module.exports = evening;
这样引入模块时,只会执行函数定义(不会触发打印),只有当你主动调用morningGreet()时才会执行对应的代码。
内容的提问来源于stack exchange,提问作者Shailesh Kumar
相关产品推荐
相关产品推荐

