ฉันจะติดตั้งไลบรารี babel-polyfill ได้อย่างไร


140

ฉันเพิ่งเริ่มใช้ Babel เพื่อรวบรวมรหัสจาวาสคริปต์ของ ES6 ลงใน ES5 เมื่อฉันเริ่มใช้สัญญาดูเหมือนว่าจะไม่ทำงาน เว็บไซต์ของ Babel สนับสนุนสัญญาผ่าน polyfills

ไม่มีโชคฉันพยายามเพิ่ม:

require("babel/polyfill");

หรือ

import * as p from "babel/polyfill";

ฉันจะได้รับข้อผิดพลาดต่อไปนี้ในการบูตแอพของฉัน:

ไม่พบโมดูล 'babel / polyfill'

ฉันค้นหาโมดูล แต่ดูเหมือนว่าฉันขาดพื้นฐานบางอย่างที่นี่ ฉันยังพยายามเพิ่ม NPM ครามเก่าและดี แต่ดูเหมือนว่ามันไม่ทำงาน

จะใช้โพลีฟิลส์จากบาเบลได้อย่างไร?


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)
Stijn de Witt

1
เนื่องจากคุณใช้ ES6 คุณสามารถใช้การนำเข้า "babel-polyfill"
ความรัก Hasija

คำตอบ:


66

สิ่งนี้เปลี่ยนไปเล็กน้อยใน Babel v6

จากเอกสาร:

polyfill จะเลียนแบบสภาพแวดล้อม ES6 แบบเต็ม polyfill นี้ถูกโหลดโดยอัตโนมัติเมื่อใช้ babel-node

การติดตั้ง:
$ npm install babel-polyfill

การใช้งานใน Node / Browserify / Webpack:
หากต้องการรวม polyfill คุณจำเป็นต้องใช้ที่ด้านบนของจุดเข้าใช้งานของคุณ
require("babel-polyfill");

การใช้งานในเบราว์เซอร์:
พร้อมใช้งานจากdist/polyfill.jsไฟล์ภายในbabel-polyfillรุ่น npm ต้องรวมไว้ก่อนรหัสบาเบลที่รวบรวมไว้ทั้งหมดของคุณ คุณสามารถเติมมันลงในโค้ดที่คอมไพล์แล้วหรือรวมไว้ในโค้ด<script>ก่อนหน้าก็ได้

หมายเหตุ: อย่าrequireนี้ผ่าน browserify ฯลฯ babel-polyfillการใช้งาน


6
ฉันยังไม่แน่ใจอย่างสมบูรณ์ว่าต้องใช้โพลีฟิลล์เมื่อใด ทำไมโมดูล ES6 จึงใช้งานได้กับ babel.js แต่Array.protorype.findIndex()ไม่สามารถใช้งานได้หากไม่มีโปลิฟิลและบาเบลจะไม่เพิ่มข้อยกเว้นเมื่อทำการ transpiling? นั่นคือธรรมชาติของ Polyfill ™หรือไม่?
ธันวาคม

5
โดยทั่วไป Babel polyfill เป็นเพียงgithub.com/facebook/regeneratorและgithub.com/zloirock/core-jsรวม ลองดู 2 repos เหล่านั้นเพื่อดูว่าคุณต้องการ polyfills หรือไม่
vdclouis

7
ฉันคิดว่าเหตุผลที่ใช้งานได้และอีกข้อหนึ่งไม่ใช่ Babel เมื่อทำการ transpiling มีเป้าหมายที่เครื่องยนต์ JS สมมุติที่มีการรองรับในระดับหนึ่ง เบราว์เซอร์ที่แท้จริงสามารถสนับสนุนได้มากกว่าหรือน้อยกว่าเอนจิ้นสมมุตินี้ ในทางปฏิบัติฉันคิดว่าเบราว์เซอร์สมมุติฐานที่พวกเขาตั้งเป้าหมายนั้นอยู่ที่ระดับ IE10 ดังนั้นเบราว์เซอร์รุ่นเก่าอาจมีปัญหาบางอย่าง การใส่การแก้ไขสำหรับสิ่งนี้ใน polyfill แยกเป็นการตัดสินใจว่าคุณต้องการสนับสนุนเบราว์เซอร์รุ่นเก่าให้กับคุณหรือไม่ เหมือนกับ jQuery ที่มีสาขา 1.0 ที่ทำและ 2.0 สาขาที่ไม่รองรับ IE8 @RemEmber
Stijn de Witt

2
@dougmacklin ถ้า findIndex เป็นโพลีฟิลล์เดียวที่คุณต้องการคุณสามารถรวมอันนั้นไว้ที่ใดที่หนึ่งในรหัสของคุณ ตรวจสอบ MDN สำหรับ polyfills: developer.mozilla.org/en/docs/Web/JavaScript/Reference/
......

1
@vdclouis คุณจะรวมรหัสโพลีฟิลนั้นผ่าน webpack อย่างไรเพื่อให้สามารถใช้ได้ทุกที่ในโครงการ
dougmacklin

48

เอกสารบาเบลอธิบายเรื่องนี้สวยรัดกุม:

Babel มี polyfill ที่รวมรันไทม์และกำเนิดใหม่ที่กำหนดเอง

สิ่งนี้จะเลียนแบบสภาพแวดล้อม ES6 แบบเต็ม polyfill นี้ถูกโหลดโดยอัตโนมัติเมื่อใช้ babel-node และ babel / register

ตรวจสอบให้แน่ใจว่าคุณต้องการที่จุดเข้าสู่แอปพลิเคชันของคุณก่อนที่สิ่งอื่นใดจะถูกเรียก หากคุณใช้เครื่องมือเช่น webpack มันจะค่อนข้างง่าย (คุณสามารถบอก webpack ให้รวมไว้ในชุดข้อมูล)

หากคุณกำลังใช้เครื่องมือเช่นgulp-babelหรือbabel-loaderคุณต้องติดตั้งbabelแพคเกจเองเพื่อใช้งาน polyfill

โปรดทราบว่าสำหรับโมดูลที่มีผลต่อขอบเขตทั่วโลก (polyfills และสิ่งที่คล้ายกัน) คุณสามารถใช้การนำเข้า terse เพื่อหลีกเลี่ยงการใช้ตัวแปรที่ไม่ได้ใช้ในโมดูลของคุณ:

import 'babel/polyfill';

4
เพียงเพิ่มบันทึกและฉันไม่แน่ใจ 100% ว่าถูกต้องทั้งหมด แต่ฉันพยายามใช้import 'babel-core/polyfill'โดยไม่ต้องติดตั้งbabelและใช้งานได้ดี
Nathan Lutterman

2
Zaemzผมคิดว่าคุณ Babel ได้ติดตั้งเพื่อให้import 'babel-core/polifyll'งาน ฉันลองโดยไม่ได้ติดตั้งbabelและมันไม่ได้ผลสำหรับฉัน โดยวิธีการ: ssubeแนะนำการทำงาน
WebBrother

4
เมื่อใช้ webpack คุณรวมไว้ที่ไหน?
theptrk

2
@theptrk การใช้ webpack คุณสามารถนำเข้ามันเป็นโมดูลได้เนื่องจาก webpack อนุญาตให้นำเข้าแพคเกจ npm สำหรับกรรมคุณตั้งค่าเป็นไฟล์ที่จะรวมก่อนที่คุณจะทดสอบ
ssube

3
ขอบคุณบางทีฉันมีรุ่นที่แตกต่างกัน แต่ฉันต้องใช้ babel-core แทน => "นำเข้า 'babel-core / polyfill';
theptrk

22

สำหรับ Babel เวอร์ชัน 7 หากคุณใช้ @ babel / preset-env เพื่อรวม polyfill ทั้งหมดที่คุณต้องทำคือเพิ่มแฟล็ก 'useBuiltIns' ด้วยค่า 'การใช้งาน' ในการตั้งค่า babel ของคุณ ไม่จำเป็นต้องมีหรือต้องการนำเข้า polyfill ที่จุดเข้าใช้งานของแอพของคุณ

ด้วยการตั้งค่าสถานะนี้ 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 };
};

อ้างอิง:


อัปเดตเมื่อสิงหาคม 2562:

ด้วยการเปิดตัว 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") ความคิดใด ๆ
WebBrother

@ WebBrother ทำงานให้ฉัน ... ดูเช่น: github.com/ApolloTang/stackoverflow-eg--babel-polyfill
apollo

@ Roy ฉันจริง ๆ แล้วอยู่ระหว่างการย้ายข้อมูลโครงการองค์กรจาก babel @ 6 ไปยัง babel @ 7 เพื่อที่ฉันจะสามารถใช้ @ babel / preset-typescript ยังคงอยู่ในระหว่างดำเนินการ แต่ฉันกำลังทำตามคำแนะนำจากเอกสารทางการของ Babel (ดูลิงก์อ้างอิงในคำตอบของฉัน) จนถึงตอนนี้ดูเหมือนว่าทุกอย่างจะทำงานได้ แต่ฉันยังไม่ได้ส่งงานโยกย้าย / อัปเกรดเป็น QA เลยฉันจะโพสต์ที่นี่หากมีปัญหาใด ๆ เกิดขึ้น
apollo

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 ไม่รวมอยู่ในการปรับใช้ คุณไม่ควรติดตั้ง babel-polyfill ด้วยแฟล็ก -D แต่ใช้แฟล็ก -S เพื่อให้แสดงรายการภายใต้ 'การพึ่งพา' ดังนั้นจึงรวมอยู่ในการปรับใช้ของคุณ
apollo

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 babel/polyfillrequire('babel/polyfill')


9
คุณไม่จำเป็นต้องทำงานsudoกับ npm docs.npmjs.com/getting-started/fixing-npm-permissions
Vladimir Starkov

8

babel-polyfill ช่วยให้คุณใช้คุณสมบัติครบชุดของ ES6 นอกเหนือจากการเปลี่ยนแปลงทางไวยากรณ์ ซึ่งรวมถึงคุณสมบัติต่างๆเช่นวัตถุในตัวใหม่เช่นสัญญาและ 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 เลิกใช้ดังนั้นจึงแนะนำให้ใช้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';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.