babel 編譯后的在 node 環境中運行提示 "regeneratorRuntime is not defined"


babel 使用 @babel/preset-env 預設 編譯后的代碼在 node 環境中運行提示 "regeneratorRuntime is not defined",這個錯誤是 bableasync/await 轉換時產生的。

babel@babel/preset-env 有這樣一句話

Since one of the original goals of preset-env was to help users easily transition from using preset-latest, 
it behaves similarly when no targets are specified: preset-env will transform all ES2015-ES2020 code to be ES5 compatible.

如果我們沒有指定目標運行環境的話,會將我們所有的代碼都轉換成 ES5, 所有我們代碼中如果使用了 async/await 就會進行ES5轉換,經 google 之后,
發現 babel 轉換 async/await 主要時通過 @babel/plugin-transform-async-to-generator
插件來實現的。打開這個插件介紹可以看到:

NOTE: This plugin is included in @babel/preset-env In Babel 7, transform-async-to-module-method was merged into this plugin

這個插件在 Babel 7 中已經內置到了 @babel/preset-env, 那么我們是不是可以告訴 @babel/preset-env 不要使用 @babel/plugin-transform-async-to-generator 插件幫
我們編譯就好了。

解決方法一

修改 babel 的配置 .babelrc.json 為:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "exclude": ["@babel/plugin-transform-regenerator"]
      }
    ]
  ],
  "plugins": []
}

這樣配置后重新打包就會發現不會有 'regeneratorRuntime is not defined' 的錯誤了。

這可以解決,但是我去看 @babel/preset-env 的文檔可以發現 Optionstargets
可以指定 目標環境 那么我就可以把 targets 指定為高一些即可。

解決方法二

指定代碼的運行環境,修個 .babelrc.json 為:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "chrome": "80",
          "node": "14"
        }
      }
    ]
  ]
}

我這里把 chrome 環境指定到了 80 以上,node 環境指定到了 14 以上,
這樣根據自己的項目實際情況來指定,進而解決了這個問題。

建議使用方法二來解決這個問題。

參考

@babel/preset-env

@babel/preset-env Options

@babel/plugin-transform-async-to-generator

avoiding the import “regenerator-runtime/runtime”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM