繁体   English   中英

NodeJS --> SyntaxError: 不能在模块外使用 import 语句

[英]NodeJS --> SyntaxError: Cannot use import statement outside a module

我是 NodeJS 的初学者。 我试图导入一个模块fs.readFileSync我使用 import { readFileSync } from 'fs' 根据 NodeJS 文档,但我不断收到以下错误,

错误----->> SyntaxError: Cannot use import statement outside a module

我的研究

-> 我发现在package.json文件中添加type:module可以解决这个问题。

我的怀疑

->我想知道为什么不能按照文档导入??

代码

import { readFileSync } from 'fs';
fs.writeFileSync('notes.txt','This was read by NodeJS')

完全错误

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

默认情况下,对于.js文件,nodejs 首先在 package.json 文件中查找模块类型。 如果在那里没有找到模块类型,那么它会按照文件的文件扩展名进行。 它是一个.js文件,然后它假定它是一个 CommonJS 模块(您使用require() ,而不是import )。 如果它是一个.mjs文件,那么它假定它是一个 ESM 文件(您使用import的地方)。

正如您所发现的,您可以通过在package.json文件中将type指定为module来覆盖文件扩展名的处理,以便.js文件可以使用import

您可以在堆栈跟踪中知道文件加载是通过以下方式完成的: internal/modules/cjs/loader其中cjs表示CommonJS ,因此它肯定会尝试将文件作为 CommonJS 模块加载。


如果您想知道为什么会这样设置,那是因为 nodejs 的历史。 最初,只有 CommonJS 文件——这是多年来唯一的模块类型。 因此,为了向后兼容,如果package.json文件或通过特殊文件扩展名中未指定模块类型,则 nodejs 假定为 CommonJS 文件,以便它与旧模块保持兼容,这些模块对新模块一无所知类型。

至于为什么不能在 CommonJS 文件中使用import ,这显然是 nodejs 架构师可能仔细考虑过的决定。 挑战在于 ESM 模块规范的某些部分与 CommonJS 模块格式中的某些内容不兼容。 因此,他们没有尝试将两个模块的功能塞进一种格式,而是决定采用两种完全独立的格式。 这避免了两种架构之间的冲突,但需要确定正在使用的模块类型。


这是关于 nodejs 如何选择模块类型的 nodejs 文档:

https://nodejs.org/api/packages.html#determining-module-system

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM