предисловие
Чтобы поддержать небольшое количество расширенных функций es6+ в бизнесе, я недавно исследовал прокладки babel, которые теперь организованы в виде текста следующим образом. (Эта статья призвана объяснить взаимосвязь и использование babel и связанных с ним пакетов, а также сценарии приложений.)
13.02.2020 Первое обновление: Babel-polyfill против Babel-плагинов
Отношения между Babel и Babel ployfill
1. Давайте сначала разберемся, что делает Babel?
просто говоря,babelрешитьграмматические проблемы. дляРасширенный синтаксис ES6+ для ES5.
2. Что делает babel polyfill?
Если вы хотите решитьПроблемы на уровне API, нужны шайбы. такие как общиеbabel-polyfill,babel-runtimeа такжеbabel-plugin-transform-runtime.
Выяснив отношения между ними, давайте поговорим об этом формально.polyfillдве-три вещи.
Типы полифиллов
Есть три полифилла babel
* babel-polyfill
* babel-runtime
* babel-plugin-transform-runtime
babel-polyfill
babel-polyfillЭто достигается путем добавления методов к прототипам глобальных объектов и встроенных объектов. Так что это вызоветглобальное космическое загрязнение.
babel-polyfillДва способа использования
1. В webpack.config.js:
настроитьwebpack.config.jsвнутреннийentryУстановить какentry: ['babel-polyfill',path.join(__dirname, 'index.js')]
2. В бизнес-js:
существуетwebpack.config.jsНастроена основная записьindex.jsтип файла верхнего уровня
import 'babel-polyfill'
Оба распечатывают один и тот же размер, а упакованный размер280KB, если не используетсяbabel-polyfill, размер3.43kb. Разница между двумя81,6 раза. Причина в том,webpackПучокbabel-polyfillВсе дело упаковано. а такжеbabel-polyfillопределенно добился всегоES6新APIПрокладка, файл не должен быть маленьким.
Так есть ли способ, в соответствии с фактическим используемым кодомES6新增API ,来使用对应的垫片,而不是全部加载进去呢?
Да, есть. То естьbabel-runtime & babel-plugin-transform-runtime, они могут быть загружены по запросу.
babel-runtime
Проще говоря, babel-runtime больше похож на реализацию загрузки по требованию, например, там, где вам нужно использовать Promise, просто добавьте заголовок этого файла
import Promise from 'babel-runtime/core-js/promise'
Вот и все.
Но если вы используете промисы для многих файлов, разве вам не нужно использовать промисы для каждого файла?importна мгновение? Конечно нет, Babel официально рассматривал эту ситуацию, просто используйтеbabel-plugin-transform-runtimeможно решить вручнуюimportбедствия.
babel-plugin-transform-runtime
babel-plugin-transform-runtimeНет необходимости устанавливатьbabel-runtime, так как первое зависит от второго.
В основном,babel-plugin-transform-runtimeэто когда мы используем новый APIАвтоматически импортировать полифиллы в среде выполнения Babel, конкретный подключаемый модуль выполняет следующие три функции:
- Когда мы используем async/await, автоматически вводится babel-runtime/regenerator
- Когда мы используем статические события или встроенные объекты ES6, автоматически импортируется babel-runtime/core-js.
- Удалите встроенные помощники babel и замените на babel-runtime/helpers.
babel-plugin-transform-runtimeпреимущество:
- Не загрязняет глобальные переменные
- Многократное использование будет упаковано только один раз
- Зависимость равномерно импортируется по запросу, без повторного импорта, без избыточного импорта
- Избегайте повторения служебных функций, скомпилированных с помощью Babel, в каждом модуле, уменьшая размер библиотек и наборов инструментов.
Как использовать
Настройте в .babelrc:
plugins: ["tranform-runtime"]
После упаковки размер17.4kb, чем предыдущий280kbзначительно меньше.
Плагин
1. Официальные пресеты
Если вы не хотите сами настраивать кучу плагинов, у официалов естьenv,react,flowТри предустановки. То есть конфигурация с предустановленными плагинами.
Атрибут Presets рассказывает Babel, какие новые функции синтаксиса используются в исходном коде для преобразования. Предустановки - это коллекция плагинов. Такие как:
babel-preset-es2015: может компилировать код es6 в es5
babel-preset-es2016: может компилировать код es7 в es6
babel-preset-es2017: может компилировать код es8 в es7
babel-preset-latest: поддерживает новые функции во всех существующих версиях ECMAScript.
Когда нам нужно преобразовать синтаксис es6, мы можем добавить следующие плагины по мере необходимости в плагины .babelrc, например:check-es2015-constants,es2015-arrow-functions,es2015-block-scoped-functionsИ так далее десятки плагинов с разными функциями..babelrcЭлементы конфигурации могут быть следующими:
{
"plugins": [
"check-es2015-constants",
"es2015-arrow-functions",
"es2015-block-scoped-functions",
// ...
]
}
Но для удобства команда Babel собрала десятки плагинов Transform, принадлежащих ES2015, вbabel-preset-es2015Предустановка, поэтому нам нужно только.babelrcПредустановки ES2015 можно добавить в конфигурацию ES2015, чтобы завершить поддержку всего синтаксиса ES2015..babelrcКонфигурация выглядит следующим образом:
{
"presets": [
"es2015"
]
}
2. Stage-X (экспериментальные пресеты)
Это легко понять, это пресеты, разработанные для поддержки TC39 для последних функций ES на стадии драфта.
- Этап 0 — Черновик: просто идея может быть плагином для Babel
- Этап 1. Предложение: что-то стоящее продвижения вперед
- Этап 2 — черновик: спецификация инициализации
- Этап 3 — кандидат: полная спецификация и начальная реализация браузера
- Этап 4 - Завершение: будет добавлено в следующую версию
3. Плагин конвертации
Официальные лица и люди предоставляют множество плагинов для преобразования, чтобы указать синтаксический анализ и преобразование определенных расширенных функций ES, таких как функции стрелок. Официально см.:Babel находится в .IO/docs/en/run...
это полифилл с бабелемразницаДа:
4. Плагин грамматики
Этот плагин позволяетBabelдля разбора специальных типов грамматик.
{
"parserOpts": {
"plugins": ["jsx", "flow"]
}
}
5. Разработка плагинов
См. документацию:GitHub.com/Джейми строит…
В разработке используется абстрактное синтаксическое дерево AST, аналогичное разработке плагинов Eslint.
export default function () {
return {
visitor: {
Identifier(path) {
const name = path.node.name;
// reverse the name: JavaScript -> tpircSavaJ
path.node.name = name.split("").reverse().join("");
}
}
};
}
Примечания по использованию babel в webpack
Цель Babel - это синтаксическое преобразование, поэтому его необходимо использовать в WebPackbabel-loader. а такжеbabel-coreявляется ядром компилятора Babel, поэтому это означает, что если нам нужно использоватьbabel-loaderДля транскодирования es6 нам сначала нужно установитьbabel-core.
Суммировать
Предлагаемые сценарии использования:
- Для разработки приложений рекомендуется использовать babel-polyfill, который добавит соответствующие методы глобально
- Среда разработки рекомендует, чтобы локальные переменные babel-plugin-transform-runtime не загрязняли глобальные и использовали функции или методы es6 локально.
Если вышеуказанное неверно или у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение.
Продолжение следует, эта статья продолжит обновлять знания о Babel.