Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Babel 处理过的代码到底是什么样子的?当 Presets 遇到了 transfrom-runtime…… #46

Open
lmk123 opened this issue Jul 5, 2016 · 0 comments
Labels

Comments

@lmk123
Copy link
Owner

lmk123 commented Jul 5, 2016

自 Babel 6 以后,Babel 将语法转换功能全都拆分成了一个个小模块。这些模块让人眼花缭乱,但官方贴心的提供了 Presets,用的最多的大概就是 ES2015 preset 了吧。再加上大多数项目为了减小项目体积,所以差不多都用了 transform-runtime

大家的 .babelrc 文件可能就跟我下面这个一样:

{
  "presets": ["es2015"],
  "plugins": ["transform-runtime"]
}

可是,你真的看过 Bebel 处理过的代码吗?

之所以我会关注这个问题,是因为我有一个项目,明明没有用 babel-polyfill,可 Babel 处理后还是加入了 Symbol shim,而我根本没有在代码里使用过它。

我很好奇到底是哪个模块调用了这个函数,于是我在 Babel 生成的 js 文件里顺着模块 id 一路往上找,最后找到了 typeof

typeof + Symbol,我一下子就想到了 ES2015 preset 里包含的这个插件:ES2015 typeof symbol transform

文档上说,转换后的代码是长这个样子的:

// In
typeof Symbol() === "symbol";

// Out
var _typeof = function (obj) {
  return obj && obj.constructor === Symbol ? "symbol" : typeof obj;
};

_typeof(Symbol()) === "symbol";

但事实上,当你结合前面提到的 transform-runtime 一起使用时,它就会把整个 Symbol shim 给打包进去,即使你只是用 typeof 检测一个字符串而已。

transform-runtime 提供了配置可以选择要不要使用 polyfill:

{
  "plugins": [
    ["transform-runtime", {
      "polyfill": false,
      "regenerator": false
    }]
  ]
}

但是一点用也没有 😂

所以,为了代码里不要带上根本没有用到过的功能,最好的办法就是——不要偷懒使用 Presets,应该挨个评估项目里到底实际用到了哪些插件,并单独安装。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant