Node.js中type:module模式下使用require报错,如何解决?
解决ES模块环境下
require is not defined错误的三种方案 你遇到的问题是因为项目里package.json设置了"type": "module",Node.js会把所有.js文件默认当作ES模块处理,而ES模块不支持CommonJS的require()语法,必须用ES模块的import/export规范。下面是三种直接的解决方法:
1. 改用ES模块的import语法替换require
把你的导入代码改成ES模块格式,同时确保导出的文件也用ES模块的export语法:
原代码:
let { controllerUser } = require('./router')修改为:
import { controllerUser } from './router.js';注意:ES模块里导入本地文件必须加上完整后缀(比如
.js),Node.js不会自动补全。对应的
router.js文件里,导出要改成ES模块格式:// 原来的CommonJS导出:module.exports = { controllerUser: ... } export const controllerUser = { // 你的代码逻辑 }
2. 将使用require的文件改为CommonJS格式
如果不想改用ES模块语法,直接把当前使用require()的文件后缀从.js改成.cjs。Node.js会自动识别.cjs后缀的文件为CommonJS模块,这样就能正常使用require(),不需要修改package.json的type配置。
3. 单独配置文件的模块类型(进阶)
如果需要保留.js后缀但又想用CommonJS语法,可以在package.json里通过exports字段单独指定某个文件的模块类型:
{ "type": "module", "exports": { "./your-file.js": { "require": "./your-file.cjs" } } }
把your-file.js换成你实际的文件名,然后把代码移到对应的.cjs文件里,这样外部导入时可以用.js路径,但实际执行的是CommonJS格式的.cjs文件。不过这种方法适合复杂场景,一般前两种就够用了。
内容的提问来源于stack exchange,提问作者sajiddev207
相关产品推荐
相关产品推荐

