zoukankan      html  css  js  c++  java
  • babel 编译后导致_typeof无限递归调用 Maximum call stack size exceeded

    问题:

    项目使用的babel (版本 @babel/core 7.13.8),在我引用一个第三方JS库时,程序执行时会报Maximum call stack size exceeded错误。断点调试发现babel会将typeof 编译为_typeof(一个babel实现的辅助函数),而这个_typeof函数的代码有问题,导致无限递归调用自身。

    之后在 node_modules/@babel/helpers/lib/helpers.js中找到了相关的源码,发现babel的代码并没有错,如下:

    helpers.typeof = helper("7.0.0-beta.0")`
      export default function _typeof(obj) {
        "@babel/helpers - typeof";
    
        if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
          _typeof = function (obj) { return typeof obj; };
        } else {
          _typeof = function (obj) {
            return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype
              ? "symbol"
              : typeof obj;
          };
        }
    
        return _typeof(obj);
      }
    `;

    如果代码中有typeof的话,这段代码会被加到编译后的代码中。

    注意上面代码中的红字,我用到的js库在编译后这个typeof会变成 “_typeof”(或_typeof2, _typeof3之类的),也就是如下:

    function _typeof(obj) {
        "@babel/helpers - typeof";
        if (typeof Symbol === "function" && _typeof(Symbol.iterator) === "symbol") {
        ...
        } else {
        ...
        }
        return _typeof(obj);
    }
     

    所以,代码只要执行到这里就会导致无限递归了。

    解决方法:

    最后发现是 .babelrc的配置有问题,改成下面就好了:

    {
      "presets": [
          [
              "@babel/preset-env",
              {
                  "targets": "> 0.5%, not dead"
              }
          ]
      ],
      "comments": false,
      "ignore": []
    }

    BABEL官方相关问题的贴子

    https://github.com/babel/babel/issues/3836,

    https://github.com/babel/babel/issues/9127

    喜欢的话,请点赞,转发、收藏、评论,谢谢!
  • 相关阅读:
    第一章—v-text和v-html
    第一章—v-for
    第一章—v-show
    react_9
    【软件工程】
    【软件工程】网页设计基础 第一章
    【软件工程】psp四则运算
    【python】网络爬虫与信息提取
    【python】数据库学习笔记,设计自己的大学排名
    【python】用python玩微信跳一跳小游戏
  • 原文地址:https://www.cnblogs.com/johnjackson/p/14472635.html
Copyright © 2011-2022 走看看