如何将CJS导入/导出语法转为ESM?含具体代码转换问询
正确转换CommonJS导出为ESM的方案
问题根源
你之前的导出写法都没抓住核心:原来的module.exports = model('users', userSchema)是把**model调用后的结果(也就是User模型)**作为模块的默认导出,而你要么写错了语法,要么导出了错误的对象(model函数本身)。
正确的两种导出方式
1. 默认导出(对应原CJS写法的直接转换)
先把模型赋值给变量,再用export default导出:
// 导出文件示例(比如 user.model.js) const User = model('users', userSchema); export default User;
对应导入写法:
// 导入文件 import User from '../user.model.js';
2. 命名导出
如果想明确用命名导出,直接导出带名称的变量:
// 导出文件示例 export const User = model('users', userSchema);
对应导入写法:
// 导入文件 import { User } from '../user.model.js';
为什么你之前的写法失败?
- 第一种导出
export { model('users', userSchema) }:语法错误,export {}的大括号里只能放已定义的变量名,不能直接写函数调用表达式,必须先把结果存到变量里再导出。 - 第二种导出
model('users', userSchema); export { model }:这里导出的是model函数本身,不是你要的User模型,所以导入时找User自然找不到。
额外:用import * as的导入方式
如果用通配符导入,对应不同导出方式的获取逻辑:
- 针对默认导出:
import * as UserModule from '../user.model.js'; const User = UserModule.default;
- 针对命名导出:
import * as UserModule from '../user.model.js'; const User = UserModule.User;
内容的提问来源于stack exchange,提问作者D. Koshkarev
相关产品推荐
相关产品推荐

