dev*_*nil 3 javascript node.js
我是 NodeJS 的初学者。我试图导入一个模块,fs.readFileSync
我按照 NodeJS 文档使用 import { readFileSync } from 'fs' ,但我不断收到以下错误,
错误----->>SyntaxError: Cannot use import statement outside a module
我的研究
->我发现添加type:module文件package.json可以解决这个问题。
我的疑问
->我想知道为什么不能按照文档导入?
代码
import { readFileSync } from 'fs';
fs.writeFileSync('notes.txt','This was read by NodeJS')
Run Code Online (Sandbox Code Playgroud)
完全错误
SyntaxError: Cannot use import statement outside a module
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1031:15)
at Module._compile (node:internal/modules/cjs/loader:1065:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
Run Code Online (Sandbox Code Playgroud)
默认情况下,对于.js文件,nodejs 首先在 package.json 文件中查找模块类型。如果在那里找不到模块类型,那么它将按照文件的文件扩展名进行。如果它是一个.js文件,那么它假设它是一个 CommonJS 模块(您使用require(),而不是import)。如果它是一个.mjs文件,那么它假定它是一个 ESM 文件(在您使用 的地方import)。
正如您所发现的,您可以通过在文件中指定typeas来覆盖对文件扩展名的处理,以便文件可以使用.modulepackage.json.jsimport
您可以在堆栈跟踪中看出文件加载是通过以下方式完成的:方法internal/modules/cjs/loader在哪里,因此它肯定会尝试将文件作为 CommonJS 模块加载。cjsCommonJS
如果你想知道为什么要这样设置,那是因为 Nodejs 的历史。最初,所有的都是 CommonJS 文件 - 这是多年来唯一的模块类型。因此,为了向后兼容,如果文件中package.json或通过特殊文件扩展名未指定模块类型,则 NodeJS 会采用 CommonJS 文件,以便它与不了解新模块类型的旧模块保持兼容。
至于为什么不能import在CommonJS文件中使用,这显然是nodejs架构师可能仔细考虑的决定。挑战在于 ESM 模块规范的某些部分与 CommonJS 模块格式中的某些内容不兼容。因此,他们决定采用两种完全独立的格式,而不是尝试将两个模块的功能塞入一种格式。这避免了两种架构之间的冲突,但需要弄清楚正在使用哪种模块类型。
这是有关 NodeJS 如何选择模块类型的 NodeJS 文档:
https://nodejs.org/api/packages.html#defining-module-system
| 归档时间: |
|
| 查看次数: |
9307 次 |
| 最近记录: |