You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Node.js中的import仅支持.js文件扩展名?

为什么Node.js中使用ES模块的import时必须用.js扩展名?

核心原因分为三点:

  1. ES模块标准的硬性要求
    ECMAScript官方的ES模块规范明确要求,导入模块时必须指定完整的文件扩展名(内置模块除外)。这和Node.js传统的CommonJS模块系统不同——CommonJS允许省略扩展名,Node会自动尝试补全.js、.json、.node等。而ES模块为了和浏览器端的模块行为保持一致,严格遵循了标准中的扩展名要求。

  2. Node.js ESM加载器的扩展名白名单限制
    Node.js的ES模块加载器只预定义了少数几种可识别的文件扩展名:

    • .js:当package.json中指定"type":"module",或Node自动检测到文件内有ESM语法时,会作为ES模块处理
    • .mjs:明确标记为ES模块的文件
    • .cjs:明确标记为CommonJS的文件
    • .json、.node:特殊用途的模块文件

像.blah这种自定义扩展名不在白名单内,加载器无法确定该用哪种模块系统解析它,直接抛出ERR_UNKNOWN_FILE_EXTENSION错误。而.ts文件本身也不是Node原生支持的ES模块格式,必须通过TypeScript编译器转译,或者配置--loader参数让Node加载对应的处理工具才能运行,原生Node不会自动识别.ts作为ES模块。

  1. ESM语法自动检测仅针对.js文件
    你遇到的“因检测到模块语法,重新解析为ES模块”的警告,是Node.js针对.js文件的特殊兼容机制:当.js文件未在package.json中指定模块类型时,Node会先尝试按CommonJS解析,若发现文件内存在import/export等ESM语法,就会重新以ES模块的方式加载。但这个兼容机制只适用于.js文件,其他扩展名的文件不会触发这个语法检测流程,Node会直接因无法识别扩展名而报错。

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:52:46