Node.js中module.exports与JavaScript export的适用场景及互用性咨询
关于Node.js中module.exports与ES export的使用指南(针对AWS Lambda场景)
1. 核心差异:CommonJS vs ES Modules
先明确两个模块系统的本质:
module.exports/require()是Node.js默认的CommonJS模块系统语法,Node.js早期就支持,至今仍是多数Node.js项目(包括大量Lambda部署包)的默认选择。export/import是ECMAScript(ES)标准模块系统语法,属于JS官方规范,Node.js从v12版本开始支持,但需要额外配置(比如在package.json中添加"type": "module")才能启用。
2. 二者能否互换?
不能直接互换,完全取决于你的项目模块系统配置:
- 若项目使用默认CommonJS(无
"type": "module"配置):只能用module.exports/require(),写export会直接报错。 - 若项目配置了ES Modules(
package.json中声明"type": "module"):只能用export/import,使用module.exports会报错。 - 补充:CommonJS里还有个小写的
exports,它是module.exports的引用,但如果直接给exports赋值(比如exports = {a:1})会断开引用,无法生效,必须用module.exports = {a:1}。
3. AWS Lambda中该用哪种?
取决于Lambda运行时配置和部署包的模块系统:
- 默认场景(多数情况):Lambda的Node.js运行时默认采用CommonJS,因此用
module.exports导出处理函数即可,示例:// Lambda处理函数(CommonJS) module.exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }; - 使用ES Modules的场景:需要在部署包的
package.json中添加"type": "module",同时Lambda运行时版本要选v14及以上(支持ES Modules的版本),之后用export导出处理函数:// Lambda处理函数(ES Modules) export async function handler(event) { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }
4. 何时选择module.exports?
- 你的项目是传统Node.js项目,未配置ES Modules(默认CommonJS环境)。
- 你不想额外修改
package.json,希望直接适配Lambda默认运行时配置,省心高效。 - 需要兼容较旧的Node.js环境(不过Lambda目前已淘汰v12以下版本,这个场景现在很少见)。
5. 常见误区澄清
那种“export用于JS文件间模块导出,module.exports用于Lambda文件”的说法是错误的:
- 不管是普通JS模块还是Lambda文件,选择哪种导出方式只看模块系统是CommonJS还是ES Modules,和文件用途无关。
- 比如在CommonJS的普通JS模块里,你同样用
module.exports导出;在ES Modules的Lambda文件里,你用export导出处理函数即可。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

