Node Import语法报错:原因与解决方案全解析
如果你在Node.js开发中遇到过类似SyntaxError: Cannot use import statement outside a module的报错,不必感到困惑,这种问题通常源于模块系统的切换与配置不当,本文将深入分析问题根源,并提供一套可直接落地的解决方案,助你快速摆脱困扰。

**一、问题根源分析
Node.js默认使用CommonJS模块系统(通过require和module.exports),而import/export语法属于ES Modules(ESM)规范,两者虽然功能相似,但实现机制不同。
当你在未正确配置ESM的情况下直接使用import语法时,Node.js会因无法识别而抛出错误,常见触发场景包括:
1、文件扩展名未使用.mjs,且未在package.json中声明模块类型;
2、未通过命令行或环境变量启用ESM支持;
3、混合使用CommonJS与ESM语法导致冲突。
**二、解决方案详解
以下步骤可彻底解决import语法报错问题:

**1. 显式声明模块类型
在项目根目录的package.json中添加"type": "module"字段:
{
"name": "your-project",
"type": "module"
}此配置会强制所有.js文件使用ESM规范,若需保留部分CommonJS文件,可将其扩展名改为.cjs。
**2. 检查Node.js版本
ESM在Node.js v12及以上版本才得到稳定支持,可通过以下命令确认版本:
node -v
若版本低于v14,建议升级至LTS版本(如v18.x)。
**3. 调整文件扩展名
对于ESM模块文件,推荐使用.mjs扩展名。
// utils.mjs
export function hello() {
console.log("Hello ESM!");
}若已配置"type": "module",则.js文件默认按ESM解析。

**4. 解决第三方模块兼容性问题
部分npm包可能仅支持CommonJS,此时可通过动态导入(Dynamic Import)解决:
const { legacyFunction } = await import('legacy-package');**三、常见误区与注意事项
误区一:仅修改代码而不调整配置
仅将require改为import而不修改模块类型声明,必然导致报错,需同步更新package.json或文件扩展名。
误区二:忽略文件路径的完整性
EM要求导入路径必须包含完整扩展名(例如import './module.js'而非import './module')。
注意事项:全局变量差异
EM中不再默认提供__dirname变量,如需使用,可通过以下方式实现:
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));**四、个人观点
Node.js对ESM的支持虽已逐步完善,但在实际开发中仍需注意细节,建议团队统一模块规范:新项目优先使用ESM,存量项目逐步迁移,密切关注Node.js版本更新日志,及时适配新特性,遇到问题时,优先查阅[Node.js官方文档](https://nodejs.org/api/esm.html)(注:此处不添加链接),避免依赖非权威教程,模块系统的切换本质上是工程规范的升级,清晰的配置与严格的代码规范能大幅降低协作成本。
