1. Что такое Вавилон
«Компилятор для написания JavaScript следующего поколения»
Простой перевод — «Компилятор для написания JavaScript следующего поколения». Со временем JavaScript также медленно развивается, появляются новые функции и синтаксис, но у каждого производителя браузеров нет полной поддержки, поэтому есть инструмент, транслирующий новые функции и синтаксис в браузер для распознавания стандартной грамматики, появился Babel, это этот инструмент, ES6/ES7/ES8 => Babel => ES5.
babel-compile
2.Babel preset & plugin & stage-x
Preset и stage-x являются категориями плагинов, но их охват различен. Если вы хотите использовать синтаксис ES2015 (ES6), вот различные способы импорта плагина и пресета.
(1)plugin
// .babelrc
{
plugins: [
'transform-class-properties',
'es2015-arrow-functions',
'transform-decorators-legacy'
]
}
(2)preset
Для удобства внедрения команда Babel интегрировала многие плагины преобразования ES2015 в babel-preset-es2015, поэтому вам необходимо ввести es2015, что значительно снижает стоимость внедрения.
// .babelrc
{
"presets": [ "es2015" ]
}
(3)stage-x
stage-x представляет четыре этапа перед тем, как этап-0, этап-1, этап-2 и этап-3 войдут в стандарт EMAC.
(4) Плагин и заданный порядок работы
- плагин запустится перед пресетом
- плагины будут выполняться последовательно, начиная с первого
- Порядок пресетов прямо противоположный (выполнять с последнего обратного порядка)
3.babel-preset-es2015/es2016/es2017
(1)es2015(ES6)
- check-es2015-constants
- transform-es2015-arrow-functions
- transform-es2015-block-scoped-functions
- transform-es2015-block-scoping
- transform-es2015-classes
- transform-es2015-computed-properties
- transform-es2015-destructuring
- transform-es2015-duplicate-keys
- transform-es2015-for-of
- transform-es2015-function-name
- transform-es2015-literals
- transform-es2015-modules-commonjs
- transform-es2015-object-super
- transform-es2015-parameters
- transform-es2015-shorthand-properties
- transform-es2015-spread
- transform-es2015-sticky-regex
- transform-es2015-template-literals
- transform-es2015-typeof-symbol
- transform-es2015-unicode-regex
-
transform-regenerator
(2)es2016(ES7)
-
transform-exponentiation-operator
(3)es2017(ES8)
- syntax-trailing-function-commas
- transform-async-to-generator
4.babel-preset-stage-x
Для изменения языка требуется процесс разработки, этап-x содержит рекомендации по превращению идеи в полную спецификацию, этап-0 содержит этапы-1/2/3, этап-1 содержит этапы-2/3, этап-2 содержит этапы. -3,TC39Рабочий процесс:Переключение между заданиями 39.GitHub.IO/process-doc…
TC39
Process
(1)stage-0
- transform-do-expressions
- transform-function-bind
В дополнение к вышеперечисленным плагинам он также включает плагины stage-1, stage-2, stage-3.(2)stage-1
- transform-class-constructor-call (Deprecated)
- transform-export-extensions
В дополнение к вышеперечисленным плагинам, он также включает в себя плагины stage-2, stage-3.(3)stage-2
- syntax-dynamic-import
- transform-class-properties
- transform-decorators disabled pending proposal update (can use the legacy transform in the meantime)
Помимо вышеперечисленных плагинов, есть еще плагины для stage-3(4)stage-3
- transform-object-rest-spread
- transform-async-generator-functions
5.babel-polyfill
При компиляции Babel компилирует только синтаксис и не компилирует API-интерфейсы, несовместимые со спецификацией, такие как: async, Set, Symbol, Promise и т. д. babel-polyfill смонтирует все эти API-интерфейсы, недоступные для глобального предмет, который представляет собой так называемую «площадку».
(1) Преимущества
Если в вашем коде много отсылок к вышеуказанным API, внедрение babel-polyfill будет сделано раз и навсегда
(2) Недостатки
Babel-polyfill относительно прост и груб, при его внедрении он также загрязняет глобальный объект, что приводит к недопустимому добавлению большого количества неиспользуемых полифиллов, а также может загрязнять ссылки на переменные подмодулей, что может привести к ненужным конфликты.
- Если вы хотите использовать babel-polyfill, вам необходимо импортировать другой код или модули до того, как на них будет сделана ссылка, в верхней части записи JS (в настоящее время в большинстве случаев используется в Node):
// ES5
require("babel-polyfill");
// ES6
import "babel-polyfill";
6. Babel-tuntime и babel-plugin-transform-runtime
(1)babel-runtime
Babel-runtime немного похож на babel-polyfill, оба являются «прокладками» для совместимости с новым API.Самая большая разница между ним и babel-polyfill заключается в том, что на него можно ссылаться по запросу, а то, что необходимо, можно используется везде, например, мне нужен Promise. Как правило, в производственной среде сначала устанавливаются зависимости, а затем импортируются:
npm install --save babel-runtime
import Promise from 'babel-runtime/core-js/promise';
(2)babel-plugin-transform-runtime
Вопрос в том, если я использую Babel-runtime, если я хочу сослаться на Promise в 10 файлах, нужно ли мне писать Promise of babel-runtime для импорта каждого файла, что, очевидно, очень хлопотно. Затем для решения этой проблемы используется babel-plugin-transform-runtime.Независимо от того, сколько файлов вы вводите связанных новых API, будет только одна копия.babel-plugin-transform-runtime по существу зависит от core-js babel-runtime, он автоматически обработает это для вас при компиляции и установит зависимости в среде разработки:
npm install --save-dev babel-plugin-transform-runtime
Вам просто нужно настроить .babelrc:
// .babelrc
{
"plugins": [
"transform-runtime"
]
}
7.babel-preset-env
Я полагаю, что те, кто не обновил babel-preset-env, столкнутся со следующими подсказками при установке babel-preset-es2015/es2016/es2017.
babel-preset-env
babel-preset-env автоматически определит плагины и полифилы babel на основе вашего браузера и операционной среды, а также скомпилирует языки ES2015 и выше. то же самое (или, можно сказать, в сочетании с babel-preset-es2015, babel-preset-es2016 и babel-preset-es2017, и производительность одинакова).Детальная конфигурация babel-preset-env
npm install babel-preset-env --save-dev
(1) Не используйте babel-preset-env
{
"presets": ["react", "es2015", "stage-1"],
"plugins": [
"transform-remove-strict-mode",
"transform-class-properties",
"transform-flow-strip-types",
]
}
(2) Используйте babel-preset-env
Вам больше не нужно импортировать соответствующий плагин в соответствии с совместимым синтаксисом и API, babel-preset-env поможет вам автоматически импортировать зависимые плагины в соответствии с вашей соответствующей конфигурацией.
{
"presets": ["react", "env", "stage-1"]
}
8. webpack настроить babel-preset-env
Конфигурация webpack совместима с chrome версии 44 и выше, например IE 9 и выше, конфигурация следующая:
- файл webpack.config.js
// webpack v3.x module配置
module: {
rules: [{
test: /\.html$/,
loader: 'html-loader?minimize=false'
}, {
test: /\.json$/,
loader: 'json-loader'
}, {
test: /\.(?:jpg|gif|png)$/,
loader: 'url-loader?limit=10240&name=../images/[name]-[hash:10].[ext]'
}, {
test: /\.js$|\.jsx$/,
exclude: /(node_modules|bower_components)/,
use: [{
loader: 'babel-loader'
}]
}]
}
- файл .babelrc
{ "presets": [ [ "env", { "targets": { "browsers": [ "last 2 versions", "chrome >= 44", "ie >= 9" ] } } ], "react", "stage-1" ] }