- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于 ECMAScript 文档中的以下引用和最小的可重现代码示例,
为什么使用 .js
Javascript ES 模块导入的文件扩展名导致 ERR_MDOULE_NOT_FOUND
package.json
时出错有 "type": "module"
?
来自 Node.js v16.3.0 documentation - Determining module system (强调我的)
Determining module system
Node.js will treat the following as ES modules when passed to node as the initial input, or when referenced by import statements within ES module code:
- Files ending in .mjs.
- Files ending in .js when the nearest parent package.json file contains a top-level "type" field with a value of "module".
.js
只要我们将包的类型声明为
module
,文件扩展名就被视为 ES 模块.
.js
除非重命名为
.mjs
,否则文件不会被视为 ES 模块.
package.json
{
"type": "module"
}
foo.js
export default 'foo module';
index.js
import foo from './foo';
console.log("Hello", foo);
$ node index.js
node:internal/process/esm_loader:74
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/georgep/nodemodulestest/foo' imported from /Users/georgep/nodemodulestest/index.js
Did you mean to import ../foo.js?
at new NodeError (node:internal/errors:363:5)
at finalizeResolution (node:internal/modules/esm/resolve:307:11)
at moduleResolve (node:internal/modules/esm/resolve:742:10)
at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:853:11)
at Loader.resolve (node:internal/modules/esm/loader:89:40)
at Loader.getModuleJob (node:internal/modules/esm/loader:242:28)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:73:40)
at link (node:internal/modules/esm/module_job:72:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
但是,如果我改变以下
foo.js
至foo.mjs
, 和 import
在 index.js
反射(reflect)foo.mjs
=> import foo from './foo.mjs';
.mjs
在这种情况下文件结尾是必要的,当文档明确指出设置
"type": "module"
在
package.json
应该意味着 Node 对待常规
.js
像 ES 模块这样的文件?
$ node -v
v16.3.0
最佳答案
正如 @ASDFGerte in their comment 所指出的那样,并且在 this answer to "Omit the file extension, ES6 module NodeJS" 中也有充分的解释。 :
在 ES 模块中,file extension is mandatory , 所以你不能省略 .js
像在 CommonJS 中一样的文件扩展名。
这是我困惑的根源。一旦我包含了文件扩展名,ES Modules 就可以工作了。例如,这有效。index.js
import foo from './foo.js';
解决方案感觉很明显,但在不知道确切原因的情况下,CommonJS 约定和 ES 模块之间的这种差异无论如何都会感觉像是一个错误,所以我很高兴了解每个模块系统如何处理其文件扩展名。
关于javascript - 为什么在导入时找不到具有 ".js"文件扩展名的 Javascript 模块,除非文件扩展名是 .mjs,尽管包 "type"是 "module"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67851875/
我是 JS 和 Node.js 的新手。从我读到的似乎是ES6 import is not supported in Node所以我被迫使用experiment mode (renaming my f
我在 Google Cloud Run 上部署了一个简单的 Nuxt(第 3 版)应用程序,并使用 Lighthouse 测试了性能。分数非常糟糕,但它提供的最有影响力的改进之一是启用文本压缩(gzi
我已经开始研究基于 Node.js 的现有项目。我只是想了解执行流程,我遇到了一些 *.mjs文件。我搜索了网页,发现这些是基于模块的 JS 文件。 我想知道它与 *.js 有何不同文件(它有什么好处
客户端在JavaScript中导入模块时,模块扩展名应该是.js还是.mjs? import {myFunction, myVar} from './my_module.js' // Or impor
我似乎无法在任何地方找到这个答案。 SonarQube 目前是否支持 ES 模块(.mjs)文件? 这是一个 Node.js (v9.11.1) 项目。 截至目前,我不确定这是我这边的配置问题,还是只
背景: 假设我的文件夹结构是这样的: project/ -- package.json -- index.mjs -- lib/ -- config/
我们正在尝试使用节点 14.15.0 将 Angular 从 12 升级到 13,并在启动 npm 时遇到以下错误 ERROR in ./node_modules/@angular/platform-
我的Rollup项目是这样的... // rollup.config.js import pkg from "./package.json"; import {getRollupServerConfi
突然我的 react 是应用程序抛出这个错误 ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js Attempted
在最新的 Chrome 浏览器中 import foo from '../dist/foo.mjs' 失败 Failed to load module script: The server respo
我通常使用 nyc为我的单元测试提供覆盖。所有用于 ES6 之前的 require('myModule') 测试的 honkey dorey。我无法让它与使用 ES6 导入的单元测试一起使用。 没有覆
由于 --experimental-modules CLI 开关(即 node --experimental-modules),我的基于 Node 的项目是在 Node 上使用原生 ES 模块支持实现
我在新的 Nuxt3 应用程序之上设置了 Pinia 并启动了开发服务器,并按顺序使用这些命令: npx nuxi init nuxt-app cd nuxt-app npm install npm
我正在尝试使用这个 twitch npm 包( https://www.npmjs.com/package/twitch ),并且在通过 creat-react-app/react-scripts 部
我正在为我的项目使用 graphql 订阅,它是一个 instagram 克隆,我正在执行喜欢或不喜欢帖子的功能,我使用 npx create-react-app创建我的客户,我使用 express做
我想在 Jest 26.1.0 中使用 ES6 模块的导入/导出功能(因为我的整个项目都使用它)。 我为我的测试用例创建了一个名为 testCases/ 的目录其中包含 math.mjs文件。现在我正
有没有办法将 ecmascript 模块文件用作使用 package.json bin 条目导出的 cli 的主要条目文件? 我想我需要以某种方式提供 --experimental-modules 标
很抱歉,如果这个问题得到了回答,我尝试搜索但找不到我要找的东西。 我想构建一个 .mjs 文件,其中包含一个我可以在浏览器和 Node.js 上使用的库类代码。我不想使用 browsify 或任何第
鉴于 ECMAScript 文档中的以下引用和最小的可重现代码示例, 为什么使用 .js Javascript ES 模块导入的文件扩展名导致 ERR_MDOULE_NOT_FOUND package
Uncaught promise when registering a custom element using the latest sapper, svelte, nodeJS, and roll
我是一名优秀的程序员,十分优秀!