Обзор статьи
Основное содержание этой статьи включает в себя: что такое babel-polyfill, как его использовать и как оптимизировать производительность за счет загрузки по требованию.
Все примеры в этой статье можно найти по адресуГитхаб автораоказаться.
что такое babel-polyfill
Babel отвечает только за преобразование синтаксиса, например преобразование синтаксиса ES6 в ES5. Но если некоторые объекты и методы не поддерживаются самим браузером, например:
- Глобальные объекты: Promise, WeakMap и т.д.
- Глобальные статические функции: Array.from, Object.assign и т. д.
- Методы экземпляра: например, Array.prototype.includes и т. д.
В этот момент необходимо представитьbabel-polyfill
Смоделировать и реализовать эти объекты и методы.
Пример начала работы
Сначала установите зависимости.
npm install babel-cli --save-dev
npm install webpack@2.7 --save-dev
npm install babel-polyfill --save
Создайте index.js и добавьте зависимости вверхуbabel-polyfill
, а затем упаковать в него зависимости через webpack.
// index.js
require('babel-polyfill');
var arr = Array.from('foo');
console.log(arr); // [ 'f', 'o', 'o' ]
Файл конфигурации веб-пакета выглядит следующим образом:
// webpack.config.js
var path = require('path');
module.exports = {
entry: path.resolve(__dirname, 'index.js'),
output: {
path: path.resolve(__dirname, 'build'),
filename: '[name].js'
}
};
Когда webpack упакован, вы можете примерно увидеть, какие зависимости вводятся из вывода.
$ `npm bin`/webpack
Hash: 723f2ccdfa0bd8736d3c
Version: webpack 2.7.0
Time: 1080ms
Asset Size Chunks Chunk Names
main.js 266 kB 0 [emitted] [big] main
[124] (webpack)/buildin/global.js 509 bytes {0} [built]
[125] ./~/babel-polyfill/lib/index.js 833 bytes {0} [built]
[126] ./index.js 96 bytes {0} [built]
[127] ./~/babel-polyfill/~/regenerator-runtime/runtime.js 24.4 kB {0} [built]
[128] ./~/core-js/fn/regexp/escape.js 108 bytes {0} [built]
[314] ./~/core-js/modules/es7.string.pad-start.js 499 bytes {0} [built]
[315] ./~/core-js/modules/es7.string.trim-left.js 219 bytes {0} [built]
[316] ./~/core-js/modules/es7.string.trim-right.js 219 bytes {0} [built]
[317] ./~/core-js/modules/es7.symbol.async-iterator.js 43 bytes {0} [built]
[318] ./~/core-js/modules/es7.symbol.observable.js 40 bytes {0} [built]
[319] ./~/core-js/modules/es7.system.global.js 144 bytes {0} [built]
[320] ./~/core-js/modules/es7.weak-map.from.js 113 bytes {0} [built]
[321] ./~/core-js/modules/es7.weak-map.of.js 109 bytes {0} [built]
[322] ./~/core-js/modules/es7.weak-set.from.js 113 bytes {0} [built]
[327] ./~/core-js/shim.js 8.18 kB {0} [built]
+ 313 hidden modules
существует[327] ./~/core-js/shim.js
В этой зависимости вводитсяArray.from()
Сюда.
require('./modules/es6.array.from');
нагрузка по требованию
В предыдущем примере index.js размером менее 100 байт после транскодирования становится main.js размером 259 КБ, что неприемлемо с точки зрения оптимизации производительности.
$ ll -h index.js build/main.js
-rw-r--r-- 1 a staff 259K 5 31 14:31 build/main.js
-rw-r--r-- 1 a staff 96B 5 31 14:25 index.js
Обходной путь: введение по запросу можно использовать для оптимизации производительности.
babel-polyfill
в основном включаетcore-js
а такжеregenerator
две части.
- babel-polyfill: предоставляет фиктивные реализации различных объектов и методов, недавно определенных в спецификациях, таких как ES5, ES6 и ES7.
- Регенератор: Предоставьте поддержку генератора, если в коде приложения используются генераторные и асинхронные функции.
Оптимизированный код выглядит следующим образом:
// index.js
require('core-js/modules/es6.array.from');
var arr = Array.from('foo');
console.log(arr); // [ 'f', 'o', 'o' ]
Эффект оптимизации следующий: (259K -> 17K)
$ ll -h index.js build/main.js
-rw-r--r-- 1 a staff 17K 5 31 15:01 build/main.js
-rw-r--r-- 1 a staff 112B 5 31 14:59 index.js
Если вы чувствуете, что загружать объекты и методы по запросу один за другим обременительно, вы также можете загружать их по запросу пакетами.
Например, загружать новые методы/объекты, определенные в ES6, по запросу.
require('core-js/es6'); // core-js/es6/index.js 中引入了es6相关的polyfill
В качестве альтернативы загрузите вновь определенные методы для объектов массива ES6 по требованию.
require('core-js/es6/array');