如何安装babel-polyfill库?

Shl*_*son 134 javascript node.js polyfills babeljs babel-polyfill

我刚刚开始使用Babel将我的ES6 javascript代码编译成ES5.当我开始使用Promises时,看起来它不起作用.Babel网站表示支持通过polyfill承诺.

没有运气,我试图添加:

require("babel/polyfill");
Run Code Online (Sandbox Code Playgroud)

要么

import * as p from "babel/polyfill";
Run Code Online (Sandbox Code Playgroud)

有了这个我将在我的应用程序引导上得到以下错误:

找不到模块'babel/polyfill'

我搜索了模块,但似乎我在这里缺少一些基本的东西.我也尝试添加旧的和好的蓝鸟NPM,但看起来它不起作用.

如何使用Babel的polyfills?

vdc*_*uis 65

这在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这不是通过浏览器等,使用babel-polyfill.

  • 我认为一个人工作的原因和另一个原因不是巴贝尔在进行转换时,会针对具有一定支持度的假设JS引擎.真正的浏览器最终可以支持比这个假设引擎更多或更少的支持.在实践中,我认为他们所针对的假设浏览器位于IE10级别,因此旧版浏览器可能存在一些问题.通过将修复程序放在单独的polyfill中,他们会决定是否要支持这些旧版浏览器.有点像jQuery,它有1.0分支,而2.0分支不支持IE8.@记得 (7认同)
  • 我还不完全确定何时需要填充料.为什么ES6模块只适用于babel.js,但是`Array.protorype.findIndex()`在没有polyfill的情况下不起作用,babel在转换时不会引发异常?这是Polyfill™的本质吗? (6认同)
  • 基本上Babel polyfill只是https://github.com/facebook/regenerator和https://github.com/zloirock/core-js的组合.看看那2个回收,知道你是否真的需要填充物. (5认同)
  • @dougmacklin如果findIndex是你需要的唯一的polyfill,你可以在代码中的某处包含那个.检查MDN的polyfill:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex (2认同)

ssu*_*ube 48

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

Babel包含一个polyfill,它包含一个自定义再生器运行时和core.js.

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

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

如果你使用像一个工具gulp-babel或者babel-loader,你还需要安装babel包本身使用填充工具.

另请注意,对于影响全局范围的模块(polyfills等),您可以使用简洁导入来避免模块中包含未使用的变量:

import 'babel/polyfill';
Run Code Online (Sandbox Code Playgroud)

  • 只是添加一个注释,我不是100%确定这是否完全正确,但我尝试使用`import'babel-core/polyfill'`而不安装`babel`并且它工作得很好. (4认同)
  • 使用webpack时,你在哪里加入它? (4认同)
  • 谢谢,也许我有一个不同的版本,但我不得不使用babel-core而不是"> import'babel-core/polyfill'; (3认同)
  • _Zaemz_,我猜你已经安装了babel,所以`import'babel-core/polifyll'`有效.我没有安装`babel`就尝试了它,它对我不起作用.顺便说一下:_ssube_ advise works. (2认同)
  • @theptrk使用webpack,您只需将其作为模块导入,因为webpack允许导入npm包.对于Karma,您将[设置为文件](https://github.com/ssube/web-template/blob/master/gulpfile.js#L77)包含在测试之前. (2认同)
  • 您是否应该将babel polyfill作为webpack配置中的入口点?那就是:`{entry:['babel-polyfill','./ app/entry.js']}` (2认同)

l3x*_*l3x 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",
  ...
Run Code Online (Sandbox Code Playgroud)

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

import "babel/polyfill";
Run Code Online (Sandbox Code Playgroud)

至:

import "babel-polyfill";
Run Code Online (Sandbox Code Playgroud)

并确保它出现在任何其他import声明之前(不一定在您的应用程序的入口点).

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

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

apo*_*llo 16

对于Babel版本7,如果你正在使用@ babel/preset-env,要包含polyfill所有你需要做的就是在你的babel配置中添加一个标记'useBuiltIns',其值为'usage'.无需在应用程序的入口点处要求或导入polyfill.

指定此标志后,babel @ 7将优化并仅包含您需要的polyfill.

要在安装后使用此标志:

npm install --save-dev  @babel/core @babel/cli @babel/preset-env
npm install --save @babel/polyfill
Run Code Online (Sandbox Code Playgroud)

只需添加标志:

useBuiltIns: "usage" 
Run Code Online (Sandbox Code Playgroud)

你的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 };
};
Run Code Online (Sandbox Code Playgroud)

参考:


Che*_*les 9

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

npm install babel --save
Run Code Online (Sandbox Code Playgroud)

(或者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').

  • 你不需要用npm https://docs.npmjs.com/getting-started/fixing-npm-permissions运行`sudo` (9认同)

zlo*_*ctb 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