为何NestJS原生支持ES导入却不支持外部ES模块?
NestJS中ES模块使用疑惑解答
首先要明确:你在新项目里看到的import/export是TypeScript语法,不是原生Node.js的ES模块语法。
NestJS默认以TypeScript开发,TypeScript的模块语法会被编译器转译为Node.js默认支持的CommonJS模块(也就是require/module.exports)。所以你写的TS代码里用ES模块语法没问题,但最终运行的是编译后的CommonJS代码,并非原生ES模块。
你自行创建模块时报错“export不是合法关键字”,大概率是这两个原因:
- 你直接创建了
.js文件并使用ES模块的export语法,但项目默认是CommonJS环境,Node.js会把.js文件当作CommonJS模块解析,这时export属于非法语法。 - 你的TypeScript配置或构建流程有问题,导致部分代码没有被正确转译,比如引入了未经过TS编译的外部ES模块文件。
至于“NestJS不支持ES模块”的说法已经过时,现在NestJS完全支持原生ES模块,但需要手动切换项目配置:
- 在
package.json中添加"type": "module" - 修改
tsconfig.json:设置"module": "ESNext"、"target": "ES2020"或更高版本、"moduleResolution": "NodeNext" - 使用支持ES模块的工具启动项目,比如
ts-node-esm替代ts-node
内容的提问来源于stack exchange,提问作者Dimitri Borgers
相关产品推荐
相关产品推荐

