Як встановити бібліотеку babel-polyfill?


140

Я щойно почав використовувати Babel для компіляції свого коду JavaScript ES6 в ES5. Коли я починаю використовувати Обіцянки, то здається, що це не працює. Веб-сайт Babel заявляє про підтримку обіцянок через поліфіли.

Не пощастивши, я спробував додати:

require("babel/polyfill");

або

import * as p from "babel/polyfill";

З цим я отримаю таку помилку під час завантаження програми:

Неможливо знайти модуль 'babel / polyfill'

Я шукав модуль, але, здається, тут я пропускаю якусь фундаментальну річ. Я також спробував додати старий і хороший синій птах NPM, але, схоже, це не працює.

Як користуватися поліфілами від Babel?


1
npm install _name_
dandavis

1
ПРИМІТКА. Зараз для Babel є окремий пакет NPM для цього: babel-polyfill
Stijn de Witt

1
@StijndeWitt лише для того, щоб заощадити вас, ось повний файл README.md у повній версії:
gurghet

1
@gurghet Так, вони могли б там додати трохи більше інформації, я згоден :) Але все, що вам потрібно знати, це npm install --save babel-polyfillі є require('babel-polyfill).
Штійн де Вітт

1
Оскільки ви використовуєте ES6, ви також можете використовувати імпорт "babel-polyfill".
Кохання Хасія

Відповіді:


66

Це трохи змінилося в babel v6.

З документів:

Поліфол буде імітувати повне середовище ES6. Ця поліфазова заповнення автоматично завантажується при використанні бабеля-вузла.

Установка:
$ npm install babel-polyfill

Використання в Node / Browserify / Webpack:
Щоб включити полі-заповнення, вам потрібно його в верхній частині точки входу до вашої програми.
require("babel-polyfill");

Використання в браузері:
Доступно з dist/polyfill.jsфайлу в межах babel-polyfillnpm випуску. Це потрібно включити перед усім вашим компільованим кодом Babel. Ви можете або додати його до зібраного коду, або включити його <script>до а.

ПРИМІТКА. Не робіть requireце за допомогою перегляду веб-адрес тощо babel-polyfill.


6
Я все ще не зовсім впевнений, коли поліфіл потрібен. Чому модулі ES6 просто працюють з babel.js, але Array.protorype.findIndex()не працює без поліфазу та babel не створюватиме виключення під час трансляції? Це природа Polyfill ™?
RemEmber

5
По суті, поліетилен Babel - це просто github.com/facebook/regenerator та github.com/zloirock/core-js . Перегляньте ці 2 репости, щоб знати, чи справді вам потрібні поліфіли.
vdclouis

7
Я думаю, що причина одного працює, а інша - це те, що Бабел під час трансляції націлює на гіпотетичний двигун JS з певним рівнем підтримки. Реальні браузери можуть підтримувати більш-менш ніж цей гіпотетичний механізм. На практиці я думаю, гіпотетичний браузер, на який вони націлені, знаходиться десь на рівні IE10, тому у старих браузерів можуть виникнути проблеми. Помістивши виправлення для цього в окремий поліфайл, вони залишають рішення про те, чи бажаєте ви підтримувати такі старі веб-переглядачі. Трохи схожий на jQuery з його 1,0 відділенням, що це робить, і 2.0 гілкою, яка не підтримує IE8. @RemEmber
де Вітт

2
@dougmacklin, якщо findIndex є єдиною необхідною для вас заповненням, ви можете просто включити її десь у свій код. Перевірте MDN на полісистему: developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
vdclouis

1
@vdclouis, як би ви взяли участь у включенні коду polyfill через webpack, щоб він був доступний скрізь у проекті?
догмаклін

48

Документи Вавилона описують це досить стисло:

Babel включає поліфіл, який включає в себе користувальницьку програму регенерації та core.js.

Це імітуватиме повне середовище ES6. Ця поліфазова заповнення автоматично завантажується при використанні babel-вузла та babel / register.

Переконайтеся, що вам потрібно це в точці входу до вашої заявки, перш ніж щось інше буде викликано. Якщо ви використовуєте такий інструмент, як webpack, це стає досить простим (ви можете сказати webpack включити його в комплект).

Якщо ви використовуєте такий інструмент, як, gulp-babelабо babel-loaderвам потрібно також встановити сам babelпакет, щоб використовувати полі-заливку.

Також зауважте, що для модулів, які впливають на глобальну сферу дії (поліфауни тощо), ви можете використовувати короткий імпорт, щоб уникнути невикористаних змінних у своєму модулі:

import 'babel/polyfill';

4
Просто додати примітку, і я не на 100% впевнений, що це цілком правильно, але я намагався просто використовувати import 'babel-core/polyfill'без встановлення, babelі це спрацювало чудово.
Натан Луттерман

2
Заемз , я думаю, у вас уже встановлена ​​джебла, так що import 'babel-core/polifyll'працює. Я спробував це без встановлення, babelі це не спрацювало для мене. До речі: ssube консультує роботи.
WebBrother

4
Коли ви використовуєте веб-пакет, де його включити?
theptrk

2
@theptrk Використовуючи webpack, ви можете просто імпортувати його як модуль, оскільки webpack дозволяє імпортувати npm-пакети. Для Карми ви налаштували її як файл, який потрібно включити перед тестуванням.
ssube

3
Дякую, можливо, у мене була інша версія, але мені довелося замість цього використовувати babel-core => "імпортувати" babel-core / polyfill ";
theptrk

22

Для Babel версії 7, якщо ви використовуєте @ babel / preset-env, для включення polyfill все, що вам потрібно зробити, це додати прапор 'useBuiltIns' зі значенням 'використання' у вашій конфігурації babel. Немає необхідності вимагати або імпортувати поліфіл у точці входу вашої програми.

Якщо вказаний цей прапор, babel @ 7 оптимізуватиме та включить лише необхідні вам поліфіли.

Щоб використовувати цей прапор після встановлення:

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 року:

З виходом Babel 7.4.0 (19 березня 2019 р.) @ Babel / polyfill застаріло. Замість встановлення @ babe / polyfill ви встановите core-js:

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
Чи використовуєте ви це у виробництві env? якийсь ризик?
Рой

useBuiltIns: "usage"не працює на моєму боці. Він просто не включає жодних поліфілів у пакеті (наприклад: я використовую генератори та отримую помилку "regeneratorRuntime is not known"). Будь-які ідеї?
WebBrother

@WebBrother, працює для мене ... дивись , наприклад: github.com/ApolloTang/stackoverflow-eg--babel-polyfill
Аполлон

@ Рой, я фактично переношу проект підприємства з babel @ 6 на babel @ 7, щоб я міг використовувати @ babel / preset-typecript. Це ще триває робота, але я дотримуюсь інструкції з офіційного документа бабеля (див. Посилання у моїй відповіді). Поки все, здається, працює, але я ще не надсилав свою роботу з міграції / оновлення до QA, я опублікую тут повідомлення, якщо виникне якась проблема.
аполлон

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 вказаний у розділі "devDependitions". Це призведе до того, що babel-polyfill не включений до розгортання. Ви не повинні встановлювати babel-polyfill зі значком -D, а зі значком -S, щоб він був вказаний у розділі "залежності" і тому включений у ваше розгортання.
аполлон

9

По-перше, очевидну відповідь, яку ніхто не надав, вам потрібно встановити Babel у вашу програму:

npm install babel --save

(або babel-coreякщо ви натомість хочете require('babel-core/polyfill')).

Крім цього, у мене є бурхлива задача перевести свої es6 і jsx як етап складання (тобто я не хочу використовувати babel/register, саме тому я намагаюся використовуватиbabel/polyfill безпосередньо в першу чергу), тому я хотів би приділіть більше уваги цій частині відповіді @ ssube:

Переконайтеся, що вам потрібно це в точці входу до вашої заявки, перш ніж щось інше буде викликано

Я зіткнувся з якоюсь дивною проблемою, де я намагався вимагати babel/polyfillвід якогось файлу запуску спільного середовища, і я отримав помилку, на яку посилається користувач - я думаю, що це могло мати щось спільне з тим, як наказовий замовлення імпортує проти потрібного, але я не можу відтворити зараз. У будь-якому разі, переміщення import 'babel/polyfill'як перший рядок у моєму клієнтському та серверному сценаріях запуску вирішило проблему.

Зауважте, що якщо ви замість цього хочете використовувати, require('babel/polyfill')я б переконався, що всі ваші інші заяви завантажувача модулів також потрібні, а не використовувати імпорт - уникайте змішування двох. Іншими словами, якщо у вашому сценарії запуску є будь-які заяви про імпорт, import babel/polyfillзамість цього зробіть перший рядок у своєму сценарії require('babel/polyfill').


9
вам не потрібно запускати sudonpm docs.npmjs.com/getting-started/fixing-npm-permissions
Володимир Старков

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> 7.4.0 модуль @ babel / polyfill застарілий , тому рекомендується використовувати безпосередньо core-js та regenerator-runtime бібліотеки які раніше були включені в @ babel / polyfill.

Отже, це працювало для мене:

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

потім додайте до самого верху початкового файлу js:

import 'core-js/stable';
import 'regenerator-runtime/runtime';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.