當我查看“路徑”模塊的 Node.JS 檔案時,它明確指出您必須通過執行以下操作來匯入模塊: const path = require('path');
當我查看檔案系統“fs”模塊的 Node.JS 檔案時,它沒有提到這樣做,const fs = require('fs);而是談論使用匯入方法,import { mkdir } from 'fs';但是當我嘗試使用匯入方法時,出現語法錯誤:SyntaxError: Cannot use import statement outside a module
使用const fs = require('fs');效果很好,但我想確保我的代碼一致/正確,所以我使用哪一個,為什么?如果不需要某些模塊對我很重要,我想弄清楚如何使其正常作業。
uj5u.com熱心網友回復:
概括
import 是 nodejs 和瀏覽器中 Javascript 語言的未來,在 ECMAScript 模塊(ESM 模塊)中用于靜態或動態加載其他模塊。
require()是 nodejs 加載模塊的原始方式,并在 CommonJS 模塊中使用。 require()在 nodejs 中原生支持,但在瀏覽器中不支持(盡管有一些 3rd 方庫為瀏覽器提供類似 require 的模塊加載器)。
選一個
您通常希望選擇一種機制并將其用于整個專案,因為它會使混合/匹配變得復雜。 import有一段時間在 nodejs 中有一些成長的痛苦,但現在實作已經相當完整了。無論哪種方式,您都可能會遇到一些不是您為專案選擇的型別的模塊,并且必須學習如何處理這些模塊。
如果我開始一個新專案,我預計會持續一段時間并在它上面作業多年,我會選擇 ESM 模塊,import因為這是 Javascript 模塊的當前/未來架構。
如果我正在撰寫一個依賴于一堆僅在 CommonJS 中可用的腳本的快速“完成”型別的腳本,我可能會使用 CommonJS require()。
如果我正在撰寫想要在 nodejs 和瀏覽器之間共享的模塊,我會選擇 ESM,因為兩者都支持它。
你的問題
當我查看檔案系統“fs”模塊的 Node.JS 檔案時,它沒有提到執行 const fs = require('fs); 相反,它談論使用匯入方法 import { mkdir } from 'fs'
當前版本的fs檔案允許您選擇是否希望代碼示例顯示 CJS 或 ESM 模塊語法。當它顯示 ESM 語法時,您顯然正在查看檔案。你可以切換它。要么會起作用。
當您
在檔案中看到此影像時,您可以將檔案中的示例代碼從 CJS 切換到 ESM 或回傳。
語法錯誤:不能在模塊外使用匯入陳述句
在 nodejs 中,你必須以某種方式告訴 nodejs 你的頂級模塊是 CJS 還是 ESM。默認情況下,.js檔案被視為 CJS,.mjs檔案被視為 ESM。如果 nodejs 認為您有 CJS 檔案,則不能使用import(僅適用于 ESM 模塊)。
您還可以修改package.json控制特定腳本"type": "module"的檔案(如果需要,可以將檔案添加并強制添加到 ESM 模塊中(這允許您將.js檔案用作 ESM 模塊)。
使用
const fs = require('fs');效果很好
是的,如果 nodejs 認為您正在使用 CJS 模塊。
我想確保我的代碼一致/正確,所以我使用哪一個,為什么?
請參閱我之前的解釋,了解何時選擇每種模塊型別。如果您只是在學習,我建議您學習如何告訴 nodejs 您正在使用 ESM 模塊并使用,import因為這是該語言的未來方向。 require()不會很快消失,但如果我們開始看到新的 NPM 包(可共享模塊)只支持較新的 ESM 語法并且只能從 ESM 模塊加載,我不會感到驚訝。有可能(通過一些仔細的作業)制作一個可以由 ESM 模塊或 CJS 模塊加載的可共享模塊。
此外,ESM 模塊正在獲得一些awaitCJS 模塊永遠不會獲得的功能(例如頂級)。
更多細節
有關更多詳細資訊,我建議閱讀這篇文章:
Node 模塊交戰 - 為什么 CommonJS 和 ESM 模塊不能相處
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/381514.html
標籤:节点.js
