如何安装babel-polyfill库?


140

我刚刚开始使用Babel将我的ES6 javascript代码编译成ES5。当我开始使用Promises时,它似乎无法正常工作。Babel网站声明了通过polyfills支持承诺的支持。

没有运气,我尝试添加:

require("babel/polyfill");

要么

import * as p from "babel/polyfill";

这样,我将在应用程序引导时收到以下错误:

找不到模块“ babel / polyfill”

我搜索了模块,但似乎这里缺少一些基本的东西。我还尝试添加了旧的和好的蓝鸟NPM,但看起来好像没有用。

如何使用Babel的polyfills?


1
npm install _name_
dandavis

1
注意:Babel现在为此具有单独的NPM软件包:babel-polyfill
Stijn de Witt

1
@StijndeWitt只是为了节省您的时间,这是完整版本的完整README.md文件:
gurghet 2016年

1
@gurghet是的,我可以在那添加一些更多信息:)但是,您真正需要知道的是npm install --save babel-polyfilland require('babel-polyfill)
Stijn de Witt

1
由于使用的是ES6,因此也可以使用导入“ babel-polyfill”。
Love Hasija '17

Answers:


66

这在babel v6中有所改变。

从文档:

polyfill将模拟完整的ES6环境。使用babel-node时会自动加载此polyfill。

安装:
$ npm install babel-polyfill

在Node / Browserify / Webpack中的用法:
要包含polyfill,您需要在应用程序入口点的顶部要求它。
require("babel-polyfill");

在浏览器中的用法:在npm版本中
dist/polyfill.js文件中可用babel-polyfill。必须在所有已编译的Babel代码之前将其包括在内。您可以将其添加到已编译的代码<script>之前,也可以将其包含在之前。

注意:请勿require通过browserify等使用babel-polyfill


6
我仍然不确定何时需要使用polyfill。为什么ES6模块仅可与babel.js一起使用,而Array.protorype.findIndex()没有polyfill 则无法工作,而babel在转译时不会引发异常?这是Polyfill™的本质吗?
2015年

5
基本上,Babel polyfill只是github.com/facebook/regeneratorgithub.com/zloirock/core-js的结合。查看这两个存储库,以了解您是否确实需要使用polyfills。
vdclouis

7
我认为一个可行的原因而另一个不可行的原因是Babel在转译时将目标假想的JS引擎提供了一定程度的支持。实际的浏览器最终可能会比该假想引擎支持更多或更少的支持。实际上,我认为他们针对的假设浏览器位于IE10级别,因此较旧的浏览器可能会出现一些问题。通过将针对此问题的修复程序放在单独的polyfill中,他们可以决定是否要支持这样的较旧的浏览器。有点像jQuery,它具有1.0分支,而2.0分支不支持IE8。@RemEmber
Stijn de Witt

2
@dougmacklin如果findIndex是您唯一需要的polyfill,则可以在代码中的某个位置包含它。检查MDN中是否有
polyfills

1
@vdclouis,您将如何通过webpack包含该polyfill代码,以使其在项目中的任何地方都可用?
dougmacklin

48

巴贝尔文档描述了这个漂亮的简洁:

Babel包含一个polyfill,其中包括一个自定义的再生器运行时和core.js。

这将模拟完整的ES6环境。使用babel-node和babel / register时会自动加载此polyfill。

在调用其他任何内容之前,请确保在应用程序的入口点需要它。如果您使用的是webpack之类的工具,这将变得非常简单(您可以告诉webpack将其包含在包中)。

如果您使用gulp-babel或这类工具babel-loader,则还需要安装babel软件包本身才能使用polyfill。

还要注意,对于影响全局范围的模块(polyfill等),可以使用简洁的导入来避免模块中使用未使用的变量:

import 'babel/polyfill';

4
只是要添加一个注释,我不确定100%是否完全正确,但是我尝试import 'babel-core/polyfill'不安装就使用babel,效果很好。
内森·卢特曼

2
Zaemz,我想您已经安装了babel,所以import 'babel-core/polifyll'可以使用。我没有安装babel就尝试了,它对我不起作用。顺便说一句:ssube建议工作。
WebBrother

4
使用webpack时,您将其包含在哪里?
theptrk

2
@theptrk使用webpack,您可以简单地将其作为模块导入,因为webpack允许导入npm软件包。对于Karma,您将其设置为要包含的文件,然后再进行测试。
ssube

3
谢谢,也许我有一个不同的版本,但是我不得不改用babel-core =>“
import'babel

22

对于Babel版本7,如果您使用的是@ babel / preset-env,则要包括polyfill,您要做的就是在babel配置中添加一个标记“ useBuiltIns”,其值为“ usage”。您无需在应用程序的入口处要求或导入polyfill。

指定此标志后,babel @ 7将进行优化,仅包含您需要的polyfills。

要在安装后使用此标志:

npm install --save-dev  @babel/core @babel/cli @babel/preset-env
npm install --save @babel/polyfill

只需添加标志:

useBuiltIns: "usage" 

在您的babel配置文件“ babel.config.js”(也是Babel @ 7的新内容)下的“ @ babel / env”部分中:

// file: babel.config.js

module.exports = () => {
   const presets = [
      [
         "@babel/env", 
         { 
             targets: { /* your targeted browser */ },
             useBuiltIns: "usage"  // <-----------------*** add this
         }
      ]
   ];

   return { presets };
};

参考:


2019年8月更新:

随着Babel 7.4.0的发布(2019年3月19日),@ babel / polyfill已被弃用。您将安装core-js而不是安装@ babe / polyfill:

npm install --save core-js@3

新条目corejs将添加到babel.config.js中

// file: babel.config.js

module.exports = () => {
   const presets = [
      [
         "@babel/env", 
         { 
             targets: { /* your targeted browser */ },
             useBuiltIns: "usage",
             corejs: 3  // <----- specify version of corejs used
         }
      ]
   ];

   return { presets };
};

参见示例:https : //github.com/ApolloTang/stackoverflow-eg--babel-v7.4.0-polyfill-w-core-v3

参考:


1
您在生产环境中使用它吗?有风险吗?
罗伊

useBuiltIns: "usage"在我这边不起作用。它只是在捆绑软件中不包含任何polyfils(例如:我使用生成器并收到错误“未定义regeneratorRuntime”)。有任何想法吗?
WebBrother '19

@WebBrother,为我工作...请参见例如:github.com/ApolloTang/stackoverflow-eg--babel-polyfill
apollo

@Roy,实际上我正在将企业项目从babel @ 6迁移到babel @ 7,以便可以使用@ babel / preset-typescript。这项工作仍在进行中,但是我正在遵循babel官方文件中的指示(请参阅答案中的参考链接)。到目前为止,一切似乎都正常,但是我还没有将我的迁移/升级工作发送给质量检查人员,如果出现任何问题,我将在此处发布。
阿波罗

19

如果您的package.json如下所示:

  ...
  "devDependencies": {
    "babel": "^6.5.2",
    "babel-eslint": "^6.0.4",
    "babel-polyfill": "^6.8.0",
    "babel-preset-es2015": "^6.6.0",
    "babelify": "^7.3.0",
  ...

并且您收到Cannot find module 'babel/polyfill'错误消息,那么您可能只需要更改导入语句,即可:

import "babel/polyfill";

至:

import "babel-polyfill";

并确保它import位于其他任何语句之前(不一定在应用程序的入口点之前)。

参考:https : //babeljs.io/docs/usage/polyfill/


3
在这个答案中,babel-polyfill软件包在“ devDependencies”下列出。这样做将导致babel-polyfill不包含在部署中。您不应该使用-D标志而是-S标志安装babel-polyfill,这样它会列在'dependencies'下,因此包含在您的部署中。
阿波罗

9

首先,没有人提供的明显答案,您需要将Babel安装到您的应用程序中:

npm install babel --save

(或者babel-core如果您想这样做require('babel-core/polyfill'))。

除此之外,我还有一个艰巨的任务来将我的es6和jsx转换为构建步骤(即,我不想使用babel/register,这就是为什么我首先尝试babel/polyfill直接使用的原因),所以我想更加强调@ssube的答案的这一部分:

在调用其他任何内容之前,请确保在应用程序的入口点需要它

我遇到了一个奇怪的问题,我试图babel/polyfill从某个共享环境启动文件中进行请求,但出现了用户引用的错误-我认为这可能与babel订单导入与需求的方式有关,但我无法复制现在。无论如何,将其import 'babel/polyfill'作为客户端和服务器启动脚本中的第一行来解决此问题。

请注意,如果您改为使用,require('babel/polyfill')我将确保所有其他模块加载器语句也都需要并且不使用导入-避免将两者混用。换句话说,如果启动脚本中有任何import语句,请在脚本import babel/polyfill的第一行而不是require('babel/polyfill')



8

babel-polyfill允许您使用语法更改之外的全部ES6功能。这包括诸如新的内置对象(如Promises和WeakMap)以及新的静态方法(如Array.from或Object.assign)之类的功能。

如果没有babel-polyfill,babel仅允许您使用诸如箭头功能,解构,默认参数以及ES6中引入的其他特定于语法的功能之类的功能。

https://www.quora.com/What-does-babel-polyfill-do

https://hackernoon.com/polyfills-everything-you-ever-wanted-to-know-or-maybe-a-bit-less-7c8de164e423


0

就像Babel在文档中说的那样,对于Babel> 7.4.0,建议使用@ babel / polyfill模块,因此建议直接使用@ babel / polyfill中包含的core-jsregenerator-runtime库。

所以这对我有用:

npm install --save core-js@3.6.5
npm install regenerator-runtime

然后将其添加到初始js文件的顶部:

import 'core-js/stable';
import 'regenerator-runtime/runtime';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.