」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 修正「無法在模組外部使用導入語句」錯誤

修正「無法在模組外部使用導入語句」錯誤

發佈於2024-11-18
瀏覽:296

Fixing “Cannot Use Import Statement Outside a Module” Error

作为 JavaScript 和 TypeScript 开发人员,我们在使用不同的模块系统时经常会遇到意外的错误。一个常见问题是“无法在模块外部使用 import 语句”错误。它通常在使用现代 ES 模块 (ESM) 或处理涉及 Webpack、Babel 或 Node.js 环境等捆绑程序的设置时出现。在这篇博客中,我们将探讨导致此错误的原因、发生的原因以及解决该错误的实用解决方案。

这个错误是什么意思?

无法在模块外部使用 import 语句”错误是不言自明的:当 JavaScript 遇到有效 ES 模块外部的 import 语句时,就会发生这种情况。在 JavaScript 中,模块系统决定如何拆分代码到多个文件以及它们如何相互交互 ES 模块(导入/导出)和 CommonJS(require/module.exports)是两个主要的模块系统。

如果 JavaScript 无法将您的代码识别为 ES 模块,则会抛出此错误。

是什么原因导致“无法在模块外部使用导入语句”错误?

这通常发生在 JavaScript/TypeScript 遇到模块上下文之外的 import 语句时。这意味着您尝试导入的文件未被识别为 ES 模块。

以下是可能发生此错误的一些更常见的原因:

  • Node.js 默认使用 CommonJS:默认情况下,Node.js 使用 CommonJS (CJS) 模块,而不是 ES 模块。这意味着除非指定,否则本机不支持导入/导出语法。

  • Babel/Webpack 配置错误:捆绑代码时,Babel 或 Webpack 等工具可能无法配置为正确处理 ES 模块,特别是在目标环境本身不支持它们的情况下。

  • package.json 中缺少 "type": "module":如果您在 Node.js 项目中使用 ES 模块,则需要通过添加 "type" 来显式指定它:package.json中的“模块”。

  • 文件扩展名不匹配:有时,对于 ES 模块使用 .js 而不是 .mjs,反之亦然可能会导致此错误。

分步解决方案

以下是修复“无法在模块外部使用 import 语句”错误的一些解决方案:

  • 在 Node.js 中启用 ES 模块:

最常见的情况是当您使用 Node.js 时,它默认为 CommonJS 模块。要启用 ES 模块,请执行以下操作:

方法一:修改package.json:

{
  "type": "module"
}

通过在 package.json 中添加 "type": "module" ,您可以告诉 Node.js 将所有 .js 文件视为 ES 模块。

方法2:将文件重命名为.mjs:

如果您不想修改 package.json,可以将文件重命名为 .mjs(例如,index.mjs)以明确表明它们是 ES 模块。

  • 更新 Babel/Webpack 配置:

如果您使用 Babel 或 Webpack,请确保它们配置为正确处理 ES 模块。对于 Babel,您可以使用 @babel/preset-modules 插件。对于 Webpack,请在配置中将 module 设置为 false。

对于 Babel:更新 .babelrc 或 babel.config.json 文件:

{
  "presets": ["@babel/preset-modules"]
}

对于 Webpack:更新 webpack.config.js 文件:

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
};
  • 检查导入路径和语法:

确保您的导入路径正确并且使用正确的语法。例如,相对路径应以 ./ 或 ../.

开头

如果您从node_modules导入模块,请确保该包支持ES模块。如果没有,您可能需要使用像 Webpack 这样的捆绑器来处理它。

  • 仔细检查文件扩展名

如果您使用 ES 模块,请确保您的文件扩展名与模块类型匹配。 ES 模块使用 .mjs,CommonJS 模块使用 .js。

  • .mjs:ES模块
  • .cjs:CommonJS 模块

ES 模块和 CommonJS 模块有什么区别?

所以我想到的一件事是 ES 模块和 CommonJS 模块有什么区别?为什么 JavaScript 中有两种不同的模块系统?

ES模块

ES 模块是 ES6 (ES2015) 中引入的官方 JavaScript 模块系统。他们使用 import 和 export 关键字来定义模块之间的依赖关系。 ES 模块是可静态分析的,这意味着依赖关系在编译时就已解决,从而更容易优化代码。

ES模块是异步加载的,这样可以实现更好的性能和模块的并行加载。它们还支持命名导出、默认导出和循环依赖。 ES 模块在现代浏览器和 Node.js 中得到广泛支持(带有“type”:“module”标志)。

CommonJS 模块

CommonJS 是在 ES 模块引入之前在 Node.js 和其他环境中使用的模块系统。 CommonJS 模块使用 require 函数导入模块并使用 module.exports 或导出来导出值。 CommonJS 模块是同步加载的,这可能会导致性能问题。

浏览器本身不支持 CommonJS 模块,但可以使用 Babel 或 Webpack 等工具将它们转译为 ES 模块。 CommonJS 模块在 Node.js 项目中仍然广泛使用,但 ES 模块由于其更好的性能和静态可分析性而变得越来越流行。

这两个模块系统存在的原因是由于 JavaScript 的发展以及对更现代、标准化的模块系统的需求。 ES 模块是 JavaScript 模块的未来,但 CommonJS 模块仍在现有项目和环境中广泛使用。

调试技巧

如果您已尝试上述所有解决方案,但仍然遇到错误,这里有一些额外的调试技巧:

  • 检查 Node.js 版本:确保您运行的是 Node.js 版本 12.x 或更高版本,因为 ES 模块支持是在 Node.js 12 中原生引入的。在旧版本上,ES 模块将无法工作。通过访问 Node.js 网站更新您的版本。

  • 检查浏览器支持:如果您在浏览器环境中工作,请确保您的浏览器支持 ES 模块。大多数现代浏览器都可以,但旧版本可能不会。

  • 检查拼写错误:有时,代码中的简单拼写错误可能会导致此错误。仔细检查您的代码是否有任何拼写错误或不正确的语法。

  • 使用 npx tsc for TypeScript:如果您使用 TypeScript 并遇到此错误,请运行 npx tsc 将 TypeScript 代码编译为 JavaScript,这可能有助于发现问题。

结论

“无法在模块外部使用 import 语句”错误是 JavaScript/TypeScript 开发人员在使用 ES 模块时面临的常见问题。通过了解发生此错误的原因并遵循本博客中提供的分步解决方案,您可以快速解决该错误并继续构建模块化、可维护的代码。

版本聲明 本文轉載於:https://dev.to/codeparrot/fixing-cannot-use-import-statement-outside-a-module-error-43ch?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST數組:表單提交後使用var_dump檢查$_POST 陣列的內容。...
    程式設計 發佈於2024-11-19
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-19
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-19
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-19
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-19
  • 我可以開車嗎?編寫酒精測試儀的程式碼
    我可以開車嗎?編寫酒精測試儀的程式碼
    在我居住的丹麥,不幸的是,我們在歐洲保持著一項記錄:我們的孩子是歐洲大陸飲酒最多的人。正因為如此,人們非常關注減少青少年飲酒並教育孩子們了解酒精的影響。 我為當地學校編寫了一個 HTML 和 JavaScript 酒精計算器,向學生展示酒精如何影響身體以及如何計算血液酒精含量 (BAC)。 ...
    程式設計 發佈於2024-11-18
  • 為什麼我的 Python MySQL 插入功能不起作用?
    為什麼我的 Python MySQL 插入功能不起作用?
    Python MySQL 插入不起作用在 Python 中,利用 MySQL API 連接到 MySQL 資料庫是一種流行的方法。但是,嘗試將記錄插入資料庫時可能會出現困難。 遇到的一個此類問題是無法插入記錄。經檢查,插入操作涉及的程式碼如下:db = MySQLdb.connect("l...
    程式設計 發佈於2024-11-18
  • 修正「無法在模組外部使用導入語句」錯誤
    修正「無法在模組外部使用導入語句」錯誤
    作为 JavaScript 和 TypeScript 开发人员,我们在使用不同的模块系统时经常会遇到意外的错误。一个常见问题是“无法在模块外部使用 import 语句”错误。它通常在使用现代 ES 模块 (ESM) 或处理涉及 Webpack、Babel 或 Node.js 环境等捆绑程序的设置时出...
    程式設計 發佈於2024-11-18
  • 如何從本機主機連線到 Docker MySQL 容器?
    如何從本機主機連線到 Docker MySQL 容器?
    從本地主機連接到Docker MySQL 容器要直接從主機與Docker 容器中運行的MySQL 實例進行交互,請按照以下步驟操作步驟:使用docker-compose up由於您已經在Docker 主機上發布了連接埠3306,因此您可以從主機本身連接到它:$> mysql -h 127.0....
    程式設計 發佈於2024-11-18
  • 如何在具有不同範本參數的範本類別中定義好友關係?
    如何在具有不同範本參數的範本類別中定義好友關係?
    深入研究類別範本與Template Class Friends 深入研究類別範本與Template Class Friends定義二元樹類別(BT)及其元素類別(BE)時,BT 存取BE私人會員需要建立好友關係。然而,理解正確定義關係的底層機制至關重要。 最初,您嘗試將好友關係宣告為 templat...
    程式設計 發佈於2024-11-18
  • ## 建立強大的 CMS 後端:OOP 和 MVC 結構如何增強專案管理?
    ## 建立強大的 CMS 後端:OOP 和 MVC 結構如何增強專案管理?
    PHP OOP 核心架構:為CMS 後端實現堅實的基礎了解物件導向程式設計(OOP) 在開發時至關重要可靠的CMS 後端框架。結構良好的框架應遵循 OOP 原則並採用 MVC 設計來提高效率。 管理單一專案頁面上的多個部分處理一個專案上的多個部分時專案頁面,考慮使用不同的方法來管理每個部分。例如,索...
    程式設計 發佈於2024-11-18
  • std::string 是如何實現的以及它與 C 風格字串有何不同?
    std::string 是如何實現的以及它與 C 風格字串有何不同?
    對std::string 實現的探索對std::string 實現的探索神秘的std::string,C 標準庫的基本組件,引發了人們的關注對它的內部運作方式感到好奇。在本文中,我們深入研究其實現,揭示其複雜性,並將其與其前身、無處不在的 C 風格字串區分開來。 各種編譯器工具鏈提供對各自 std ...
    程式設計 發佈於2024-11-18
  • 為什麼 JavaScript 中 (0 < 5 < 3) 的計算結果為 true?
    為什麼 JavaScript 中 (0 < 5 < 3) 的計算結果為 true?
    JavaScript 的比較難題:破解(0 < 5 < 3) 中的真相在JavaScript 領域,出現了一個奇特的觀察結果:為什麼表達式(0 < 5 < 3) 的計算結果為true?這種神秘的行為源自於語言的求值規則,稱為操作順序。 要解開這個謎團,我們必須深入研究表達式執行的操作順序:Paren...
    程式設計 發佈於2024-11-18
  • 如何使用 mitmproxy 修復 Windows 上的「pip install Access Denied」錯誤?
    如何使用 mitmproxy 修復 Windows 上的「pip install Access Denied」錯誤?
    使用mitmproxy 解決Windows 上的「pip install Access Denied」錯誤當嘗試使用pip 在Windows 上安裝mitmproxy 時,使用者可能會遇到儘管以管理員身分執行cmd 或PowerShell,但仍出現「存取被拒絕」錯誤。此錯誤通常在嘗試安裝 crypt...
    程式設計 發佈於2024-11-18
  • 如何從針對 Go 二進位檔案的整合測試中擷取程式碼覆蓋率?
    如何從針對 Go 二進位檔案的整合測試中擷取程式碼覆蓋率?
    從 Go 二進位檔案擷取程式碼覆蓋率執行單元測試時,擷取程式碼覆蓋率非常簡單。然而,在針對二進位檔案本身的整合測試期間收集覆蓋率指標可能具有挑戰性。有沒有辦法克服這個障礙? 整合測試覆蓋率的需求整合測試提供了比單獨的單元測試更全面的程式碼覆蓋率視圖。透過針對真實世界的輸入運行二進位文件,我們可以評估...
    程式設計 發佈於2024-11-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3