You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Express主模块express.js同时使用exports和module.exports

问题解答

你之前对module.exports和exports的基础理解是对的:默认情况下两者指向同一个对象,如果单独给module.exports赋值新值而不同步更新exports的指向,后续给exports挂载的属性确实不会被导出。

express这么做的核心原因是它在给module.exports赋值的同时,同步更新了exports的指向,核心逻辑如下:

// 先同步修改两个变量的指向,让它们都指向同一个函数对象
exports = module.exports = createApplication;

// 后续给exports挂载属性,本质就是给导出的函数对象加属性
exports.Router = Router;
exports.Route = Route;
exports.application = proto;

函数本身也是JS中的对象类型,给函数对象挂载自定义属性是完全合法的操作。这种写法的好处是兼顾了两种使用场景:

  • 用户可以直接调用require('express')()创建应用实例
  • 也可以通过require('express').Router等方式调用挂载的工具方法,不需要额外嵌套一层导出对象,API设计更简洁。

内容的提问来源于stack exchange,提问作者kankan256

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:03