Node/Express中require语句执行逻辑及位置影响咨询
Node.js 里 require 语句的执行逻辑&位置影响
一、require 到底怎么运行
require()是 Node.js 加载模块的核心方法,只有代码执行到它的时候才会跑一次,跑完会把模块导出的内容存在缓存里,之后再调用同一个模块的require(),直接拿缓存,不会重复执行模块里的代码。- 执行
require('./xxx')时,Node.js 会同步读取目标文件的代码,从头到尾执行一遍,最后把模块里module.exports导出的内容返回给调用方。
二、放顶部和放中间的差别
1. 模块执行时间不一样
- 如果把
require('./db')、require('./routes')放文件最顶部,它们会在创建app实例、注册中间件之前就执行完毕。 - 像示例里放在中间,就得等
app实例建好、cors这些中间件注册完成后,才会执行这两个模块的代码。
2. 对依赖逻辑的影响
- 先说
./db模块:如果这个模块是初始化数据库连接的,放中间的话,数据库连接会在 Express 中间件配置好之后才建立。但其实大多时候早一点初始化也没问题,除非你的数据库连接逻辑非要依赖已经配置好的 Express 实例(这种情况极少)。 - 再看
./routes模块:路由模块一般要依赖app实例来注册路由(比如里面会写app.get('/user', ...)),所以必须等app实例创建好之后再require它。要是把require('./routes')放顶部,那时候app变量还没定义,直接就会报ReferenceError错误——这也是示例里把它放中间的核心原因。
3. 代码可读性和维护性
- 行业里默认把第三方依赖(比如
express、cors)放顶部,这样开发者一眼就能看到项目用了哪些外部包。 - 业务相关的模块(比如
./db、./routes)放在对应的逻辑节点,更符合代码执行的顺序,避免出现“依赖还没初始化就用了”的坑。
三、总结一下
require是同步执行且只跑一次,结果会缓存下来复用。- 第三方依赖建议统一放文件顶部;业务模块得看依赖关系:比如路由模块必须在
app实例创建后加载,不然报错;数据库模块只要不依赖未初始化的对象,放顶部或中间都行,但放顶部更符合规范。
内容的提问来源于stack exchange,提问作者CyberNancy
相关产品推荐
相关产品推荐

