簡體   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