Gatsbyjs async/await 更新報錯解決方法

作者: Calpa Liu
字數:2124
出版日期:March 21, 2018
更新日期:December 7, 2023
分類: #前端開發
#GatsbyJS

當我在更新 gatsbyjs 本體和 `gatsbyjs-*` 插件後,就發現構建 JavaScript 代碼的時候失敗。解決問題的過程,需要多聯想關鍵字。但簡單來說,只要安裝正確的 babel 轉換插件,就可以解決這個問題。

問題

SyntaxError: Unexpected token operator «*», expected punc «(» [component---src-templates-blog-post-js-42473b53655caf4635a2.js:18311,43]

這裡是說在 uglifyjs 處理文本的時候,預期 ( 但出現 * 這一個符號,如果你是有用過 generator 的話,你就會發現這裡的線索跟 generator 有一點相似。

generator

function* a() {
  yield 1;
}

function

function a() {
  return 1;
}

解決方法

安裝額外的 babel 插件:

npm i babel-plugin-transform-decorators-legacy babel-plugin-transform-regenerator

安裝之後,babel 就可以把上面 generator 的代碼輸出為以下代碼:

var _marked = [a].map(regeneratorRuntime.mark);

function a() {
  return regeneratorRuntime.wrap(function a$(_context) {
    while (1) {
      switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return 1;

        case 2:
        case "end":
          return _context.stop();
      }
    }
  }, _marked[0], this);
}

轉換後,可以避免 * 這一個符號出現在 ( 之前。

可能你會遇到這樣的報錯信息,具體錯誤位於 async 的那一行代碼上:

Uncaught ReferenceError: regeneratorRuntime is not defined

透過 stackoverflow 的回答可以得知,這依然是跟 async/await 相關的問題,使用 babel-plugin-transform-runtime 就好了。

npm install --save-dev babel-plugin-transform-runtime

別忘記在gatsbyjs-node.js 文件裏面加入修改 babel 設置的 代碼

exports.modifyBabelrc = ({ babelrc }) => ({
  ...babelrc,
  plugins: babelrc.plugins.concat(['transform-decorators-legacy', 'transform-regenerator', 'transform-runtime']),
});

後記

果然我還是要學習一個,看著那兩個符號(*, (),也想不起居然跟 generator 有關。

參考資料

  1. gatsby build issues - likely async related
  2. loganfsmyth/babel-plugin-transform-decorators-legacy
  3. Regenerator transform - Babel
  4. Runtime transform
  5. Babel 6 regeneratorRuntime is not defined
感謝您閱讀我的文章。歡迎隨時分享你的想法。
關於 Calpa

Calpa 擅長使用 TypeScript、React.js 和 Vue.js 開發Responsive Web Design網站。

此外,Calpa 積極參與香港和台灣的開源社區,曾在2019年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過300顆星星和60個分支的支持。

更多前端開發技術文章:傳送門