Node.js中require()的作用是什么?Express实例化相关疑问
嘿,刚接触Node.js和Express完全不用不好意思,这种写法一开始确实容易懵,我来给你掰扯清楚~
require('express')返回的是什么 首先,require('express')加载完模块后,返回的不是一个你以为的Express类,而是一个可以直接调用的函数,而且这个函数本身就帮你做好了实例化的脏活累活。
myApp()就能创建实例? Express的作者在设计模块的时候,把创建应用实例的逻辑封装成了一个函数。当你调用myApp()(也就是调用这个从require拿到的函数),它内部其实已经悄悄完成了类似new Express()的操作,直接给你返回一个现成的Express应用实例——也就是你代码里的myCode。
举个简化的模拟例子(不是真实源码,但逻辑一致):
// Express模块内部大概是这么设计的 function createExpressApp() { // 这里偷偷做初始化:创建实例、挂载路由/监听方法等 const app = { get: function(path, handler) {}, listen: function(port) {} // ...其他你熟悉的Express方法 }; return app; } // 把这个创建实例的函数导出,让require能拿到 module.exports = createExpressApp;
你看,var myApp = require('express')拿到的就是这个createExpressApp函数,调用它myApp()就得到了app实例,是不是和你熟悉的匿名函数调用var myCode = myApp()逻辑完全一致?
new Express()为啥不对? 其实早期的Express版本确实是用new Express()来创建实例的,但后来作者为了简化API,改成了直接调用函数的方式。现在去看Express源码会发现,那个导出的函数内部还是会用new去实例化核心类,但这个过程被封装起来了,不用我们自己写new了,用起来更省心。
require的作用 require是Node.js里用来加载模块的工具——不管是Node内置的模块(比如fs)、第三方包(比如express),还是你自己写的本地模块,都靠它加载。加载后会返回模块导出的内容:这个内容可以是函数、对象、类、字符串等等,完全看模块作者怎么设计。Express就选择导出一个创建实例的工厂函数,让我们调用起来更简单。
总结一下:
require('express')拿到的是一个创建Express应用的工厂函数- 调用这个函数
myApp(),就会返回一个配置好的Express应用实例 - 这种写法是Express为了简化使用做的设计,本质和你熟悉的匿名函数调用逻辑是通的
内容的提问来源于stack exchange,提问作者user7552709

