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

    喜欢的话,请点赞,转发、收藏、评论,谢谢!
  • 相关阅读:
    JAVA 单例模式
    CodeForces Round #563 Div.2
    拓扑排序 JAVA
    初识 Dubbo
    CodeForces Round #567 Div.2
    Educational Codeforces Round 65 (Rated for Div. 2)
    最短路径问题
    C++使用fixed和precision控制小数和有效位数的输出以及setw()设置输出宽度
    poj3684(弹性碰撞模型)
    集合的整数表示
  • 原文地址:https://www.cnblogs.com/johnjackson/p/14472635.html
Copyright © 2011-2022 走看看