правильноBabel
Роль элементов конфигурации не так хорошо изучена, повлияет ли это на ежедневную разработку? Честно говоря, в большинстве случаев это не имеет большого значения (в конце концов, есть поисковые системы).
Тем не менее, я все еще хочу узнать о нем больше, поэтому недавно внимательно прочитал его.Babel
Документ, а также непрерывная компиляция и проверка, выводят эту статью для лучшего чтения, модифицируют и модифицируют и, наконец, продвигают каждую точку знаний так, как я лично предпочитаю (введение каждой конфигурации не просто так), надеюсь, что это поможет вамBabel
Есть более четкое представление о различных конфигурациях (вы это уже хорошо знаете, игнорируйте эту статью).
Babel — это JS-компилятор.
Babel — это цепочка инструментов, в основном используемая для преобразования кода версии ECMAScript 2015+ в обратно совместимый синтаксис JavaScript, чтобы его можно было запускать в текущих и более старых браузерах или других средах.
давайте сначала посмотримBabel
Что может быть сделано:
- Преобразование синтаксиса
- пройти через
Polyfill
способ добавить отсутствующие функции в целевой среде (@babel/polyfill模块
) - Преобразование исходного кода (codemods)
Цель этой статьи — понятьBabel
использование и настройка, выяснить@babel/runtime
,@babel/polyfill
,@babel/plugin-transform-runtime
Что они делают, для чего нужны плагины и пресеты, зачем их настраивать, а не какAST
конвертируй, если ты правAST
преобразование представляет большой интерес, добро пожаловать, чтобы прочитать нашРН к движку апплета АлитаИсходный код , в котором большое количествоAST
конвертировать.
Больше статей можно проштамповать (типа Звезда, спасибо): https://github.com/YvetteLau/Blog
Чтобы получить более четкое представление о каждом шаге, сначала создайте новый проект, например.babelTemp
(назовите его как хотите), используйтеnpm init -y
инициализировать, создатьsrc/index.js
, содержимое файла следующее (можно написать и что угодно):
const fn = () => {
console.log('a');
};
Хорошо, сначала отложите созданный проект, а сначала разберитесь с теоретическими знаниями:
Базовая библиотека @babel/core
Основная функциональность Babel содержится в@babel/core
в модуле. Видетьcore
слово, значитосновной, без него, вbabel
Миру суждено быть трудным в движении. не устанавливайте@babel/core
,Недоступноbabel
компилировать.
Инструмент командной строки CLI @babel/cli
babel
Предоставленные инструменты командной строки, в основном для предоставленияbabel
Эта команда подходит для установки в проект.
@babel/node
при условииbabel-node
команда, но@babel/node
Больше подходит для глобальной установки, не подходит для установки в проекте.
npm install --save-dev @babel/core @babel/cli
Теперь вы можете использовать в своем проектеbabel
Скомпилируйте его (если не установлен@babel/core
, сообщит об ошибке)
настроить команду вpackage.json
документscripts
В поле:
//...
"scripts": {
"compiler": "babel src --out-dir lib --watch"
}
использоватьnpm run compiler
Для выполнения компиляции сейчас мы не настраивали никаких плагинов, код до и после компиляции абсолютно одинаковый.
потому чтоBabel
Хоть и работает из коробки, но ничего не делает, если хотитеBabel
Чтобы сделать какую-то реальную работу, вам нужно добавить к нему плагин (plugin
).
плагин
Babel
Построенный поверх плагинов канал конверсии может быть сформирован с использованием существующих или самописных плагинов,Babel
Существует два типа плагинов: плагины синтаксиса и плагины преобразования.
плагин синтаксиса
Эти плагины позволяют толькоBabel
РазобратьОпределенный тип синтаксиса (не конвертировать), вы можетеAST
Используется при преобразовании для поддержки синтаксического анализа новых грамматик, например:
import * as babel from "@babel/core";
const code = babel.transformFromAstSync(ast, {
//支持可选链
plugins: ["@babel/plugin-proposal-optional-chaining"],
babelrc: false
}).code;
плагин преобразования
Подключаемый модуль преобразования активирует соответствующий подключаемый модуль грамматики (поэтому нет необходимости указывать оба подключаемых модуля одновременно).
Использование плагинов
Если плагин опубликован вnpm
, вы можете напрямую ввести название плагина,Babel
автоматически проверит, установлен ли он уже вnode_modules
каталог, создайте новый проект в каталоге проекта.babelrc
файл (файл конфигурации будет подробно описан ниже), конфигурация выглядит следующим образом:
//.babelrc
{
"plugins": ["@babel/plugin-transform-arrow-functions"]
}
Вы также можете указать относительные/абсолютные пути к плагинам
{
"plugins": ["./node_modules/@babel/plugin-transform-arrow-functions"]
}
воплощать в жизньnpm run compiler
, вы можете видеть, что стрелочная функция скомпилирована нормально,lib/index.js
Содержание следующее:
const fn = function () {
console.log('a');
};
Теперь мы поддерживаем только преобразование стрелочных функций.Если вы хотите преобразовать другие новые функции JS в более ранние версии, вам нужно использовать другие соответствующиеplugin
. Если настраивать по одному, то будет очень громоздко, т.к. может понадобиться настраивать десятки плагинов, что заведомо очень неудобно, так есть ли способ упростить эту настройку?
имеют! По умолчанию! (Благодаря могучемуBabel
)
предустановка
с помощью или созданияpreset
Только чтолегкийИспользуйте набор плагинов.
Официальный пресет
- @babel/preset-env
- @babel/preset-flow
- @babel/preset-react
- @babel/preset-typescript
Примечание:Начиная с Babel v7, все предварительные настройки этапа, написанные для стандартных функций этапа предложения, устарели и официально удалены.@babel/preset-stage-x
.
@babel/preset-env
@babel/preset-env
Основная роль заключается в перекодировании и загрузке функций, которые мы используем и которых нет в целевом браузере.polyfill
, без какой-либо настройки,@babel/preset-env
Включенный плагин будет поддерживать все последние функции JS (ES2015, ES2016 и т. д., за исключением этапа stage), преобразуя его в код ES5. Например, если вы используете необязательную цепочку в своем коде (в настоящее время все еще на стадии), то настройте только@babel/preset-env
, то при конвертации будет выдаваться ошибка, и соответствующий плагин нужно устанавливать отдельно.
//.babelrc
{
"presets": ["@babel/preset-env"]
}
Следует отметить,@babel/preset-env
В соответствии с настроенной вами целевой средой будет создан список подключаемых модулей для компиляции. для браузера илиElectron
, официальная рекомендация - использовать.browserslistrc
файл, чтобы указать целевую среду. По умолчанию, если вы не находитесь вBabel
Настройки файла конфигурации (например, .babelrc)targets
илиignoreBrowserslistConfig
,@babel/preset-env
Будет использованоbrowserslist
Настройте источник.
Если вы не хотите быть совместимым со всеми браузерами и средами, рекомендуется указать целевую среду, чтобы ваш скомпилированный код был сведен к минимуму.
Например, включите только то, что требуется для пользователей с долей браузера на рынке более 0,25%.polyfill
и транскодирование (игнорируйте браузеры без обновлений безопасности, такие как IE10 и BlackBerry):
//.browserslistrc
> 0.25%
not dead
Проверитьbrowserslist
дополнительная конфигурация
Например, вы будете.browserslistrc
Конфигурация контента:
last 2 Chrome versions
затем выполнитьnpm run compiler
, вы обнаружите, что стрелочные функции не будут скомпилированы в ES5, потому чтоchrome
Последние 2 версии обоих могут поддерживать функции стрелок. Теперь мы будем.browserslistrc
Все равно измените на предыдущую конфигурацию.
Что касается нашего текущего кода, текущая конфигурация выглядит нормально.
Давайте изменимsrc/index.js
.
const isHas = [1,2,3].includes(2);
const p = new Promise((resolve, reject) => {
resolve(100);
});
Скомпилированный результат:
"use strict";
var isHas = [1, 2, 3].includes(2);
var p = new Promise(function (resolve, reject) {
resolve(100);
});
Если этот скомпилированный код используется в браузере более ранней версии, очевидно, есть проблема, потому что в браузере более ранней версии нет экземпляра массива.includes
метод, ниPromise
Конструктор.
Почему это? Поскольку преобразование синтаксиса преобразует только синтаксис более высокой версии в более низкую версию, но новые встроенные функции и методы экземпляра не могут быть преобразованы. В этом случае нужно использоватьpolyfill
Давай, как следует из названия,polyfill
Китайское значение shim заключается в том, чтобы сгладить различия между разными браузерами или разными средами, чтобы новые встроенные функции, методы экземпляров и т. д. также можно было использовать в браузерах более ранних версий.
Polyfill
@babel/polyfill
модули включаютcore-js
и обычайregenerator runtime
Модуль, имитирующий полную среду ES2015+ (за исключением предложений, предшествующих этапу 4).
Это означает, что вы можете использоватьPromise
а такжеWeakMap
новые встроенные компоненты, такие какArray.from
илиObject.assign
статические методы, такие какArray.prototype.includes
такие как методы экземпляра и функции генератора (при условии, что вы используете@babel/plugin-transform-regenerator
плагин). Чтобы добавить эти функции,polyfill
будут добавлены в глобальную область видимости и аналогичныеString
В таком встроенном прототипе (который будет загрязнять глобальную среду, методы, не загрязняющие глобальную среду, мы введем позже).
Дополнительное примечание (07.01.2020):Начиная с версии V7.4.0,@babel/polyfill
Был заброшен (front-end разработка меняется с каждым днем), нужно устанавливать отдельноcore-js
а такжеregenerator-runtime
модуль.
Сначала установите@babel/polyfill
полагаться:
npm install --save @babel/polyfill
Примечание: не используйте--save-dev
, так как это прокладка, которую необходимо запустить перед исходным кодом.
Нам нужно поставить полныйpolyfill
загрузите перед кодом, измените нашsrc/index.js
:
import '@babel/polyfill';
const isHas = [1,2,3].includes(2);
const p = new Promise((resolve, reject) => {
resolve(100);
});
@babel/polyfill
Необходимо ввести перед другим кодом, мы также можемwebpack
в конфигурации.
Например:
entry: [
require.resolve('./polyfills'),
path.resolve('./index')
]
polyfills.js
Содержимое файла следующее:
//当然,还可能有一些其它的 polyfill,例如 stage 4之前的一些 polyfill
import '@babel/polyfill';
Теперь наш код отлично работает как в браузерах с низкой, так и с высокой версией (или в средах узлов). Однако во многих случаях нам не обязательно нужен полный@babel/polyfill
, что увеличит размер нашего окончательного пакета,@babel/polyfill
Размер пакета 89K (на данный момент@babel/polyfill
версия 7.7.0).
Чего мы ожидаем больше, так это того, что если я использую новую функцию, то добавлю соответствующуюpolyfill
, чтобы не создавать бесполезный код.
К счастью,Babel
Это было принято во внимание.
@babel/preset-env
предоставилuseBuiltIns
параметр, установленное значениеusage
, он будет включать только то, что нужно кодуpolyfill
. Одно замечание: настройте этот параметр на значениеusage
, должны быть установлены одновременноcorejs
(Если не установлено, выдаст предупреждение, по умолчанию "corejs": 2), примечание: его все равно нужно установить здесь@babel/polyfill
(ток@babel/polyfill
Версия установит "corejs" по умолчанию: 2):
Сначала поговорим об использованииcore-js@3
причина,core-js@2
В ветку не будут добавлены новые функции, новые функции будут добавлены вcore-js@3
. Например, вы использовалиArray.prototype.flat()
, если вы используетеcore-js@2
, то он не содержит этой новой функции. Чтобы использовать больше новых функций, рекомендуется использоватьcore-js@3
.
Установите зависимости:
npm install --save core-js@3
core-js (нажмите, чтобы узнать больше): модульная стандартная библиотека для JavaScript, включающая
Promise
,Symbol
,Iterator
и многие другие функции, он позволяет загружать только необходимые функции.
Теперь изменитеBabel
Файл конфигурации выглядит следующим образом:
//.babelrc
const presets = [
[
"@babel/env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
]
Babel
Весь код проверяется на отсутствующую функциональность в целевой среде, и только необходимаяpolyfill
включены.
Например,src/index.js
Код остается прежним:
const isHas = [1,2,3].includes(2);
const p = new Promise((resolve, reject) => {
resolve(100);
});
Посмотрим на скомпилированный файл (lib/index
):
"use strict";
require("core-js/modules/es.array.includes");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.promise");
var isHas = [1, 2, 3].includes(2);
var p = new Promise(function (resolve, reject) {
resolve(100);
});
Тот же код, который мы используемwebpack
строить (production
mode), вы можете видеть, что окончательный размер кода составляет всего 20 КБ. а если представить всю@babel/polyfill
Если это так, размер собранного пакета: 89 КБ.
Как упоминалось ранее, вuseBuiltIns
Значение параметраusage
, еще нужно установить@babel/polyfill
, хотя он, кажется, не используется в нашем преобразовании кода выше, но если мы используем его в исходном кодеasync/await
, то скомпилированный код долженrequire("regenerator-runtime/runtime")
,существует@babel/polyfill
, конечно, вы также можете просто установитьregenerator-runtime/runtime
замена установки@babel/polyfill
.
В этот момент уже здорово, хочешь подпрыгнуть и повернуться?
Вот что я скажу, может быть, вы уже знаете, может быть, нет, это не имеет значения, но с этого момента вам нужно знать:Babel
будет использовать небольшую вспомогательную функцию для достижения чего-то вроде_createClass
и другие общедоступные методы. По умолчанию он будет добавлен (inject
) в каждый файл, который в этом нуждается.
Если нашsrc/index.js
Такова, что:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
};
getX() {
return this.x;
}
}
let cp = new ColorPoint(25, 8);
составленоlib/index.js
,Следующим образом:
"use strict";
require("core-js/modules/es.object.define-property");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var Point =
/*#__PURE__*/
function () {
function Point(x, y) {
_classCallCheck(this, Point);
this.x = x;
this.y = y;
}
_createClass(Point, [{
key: "getX",
value: function getX() {
return this.x;
}
}]);
return Point;
}();
var cp = new ColorPoint(25, 8);
Вроде проблем нет, но если подумать, если у вас 10 файлов с помощью этогоclass
, Означает ли это, что_classCallCheck
,_defineProperties
,_createClass
Эти методыinject
10 раз. Это, очевидно, приводит к большему размеру пакета, и самое главное, нам это не нужно.inject
неоднократно.
В это время это@babel/plugin-transform-runtime
Пришло время плагинам вступить в игру, используйте@babel/plugin-transform-runtime
плагин, все хелперы будут ссылаться на модуль@babel/runtime
, что позволяет избежать повторения вспомогательных программ в скомпилированном коде и эффективно уменьшить размер пакета.
@babel/plugin-transform-runtime
@babel/plugin-transform-runtime
является многоразовымBabel
Добавлены помощники для сохранения плагинов размера кода.
Примечание: например
Array.prototype.flat()
и т. д. методы экземпляра не будут работать, так как это потребует модификации существующих встроенных функций (вы можете использовать@babel/polyfill
решить эту проблему) ——> Следует отметить, что если вы настраиваетеcorejs3
,core-js@3
Методы прототипа теперь поддерживаются без загрязнения прототипа..
Кроме того,@babel/plugin-transform-runtime
нужно и@babel/runtime
С использованием.
Сначала установите зависимости,@babel/plugin-transform-runtime
Обычно используется только во время разработки, но во время выполнения окончательный код должен зависеть от@babel/runtime
,так@babel/runtime
Он должен быть установлен как производственная зависимость следующим образом:
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
В дополнение к тому, что было сказано ранее,@babel/plugin-transform-runtime
Помимо уменьшения размера скомпилированного кода, у нас есть еще одно преимущество его использования — он может создать среду песочницы для кода.@babel/polyfill
и встроенные программы, которые он предоставляет (например.Promise
,Set
а такжеMap
), они будут загрязнять глобальную область видимости. Хотя это может быть хорошо для приложения или инструмента командной строки, это может быть проблемой, если ваш код представляет собой библиотеку, которую могут использовать другие, или если у вас нет полного контроля над средой, в которой работает ваш код.
@babel/plugin-transform-runtime
будут использовать эти встроенные псевдонимы какcore-js
псевдонимы, так что вы можете использовать их беспрепятственно безpolyfill
.
Исправлять.babelrc
Конфигурация выглядит следующим образом:
//.babelrc
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
]
]
}
перекомпилироватьnpm run compiler
, теперь скомпилированное содержимое (lib/index.js
):
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var Point =
/*#__PURE__*/
function () {
function Point(x, y) {
(0, _classCallCheck2.default)(this, Point);
this.x = x;
this.y = y;
}
(0, _createClass2.default)(Point, [{
key: "getX",
value: function getX() {
return this.x;
}
}]);
return Point;
}();
var cp = new ColorPoint(25, 8);
Видно, что вспомогательная функция теперь не напрямуюinject
в код, но из@babel/runtime
введено в. Как упоминалось ранее, используйте@babel/plugin-transform-runtime
Глобального загрязнения можно избежать, давайте посмотрим, как избежать загрязнения.
Исправлятьsrc/index.js
следующим образом:
let isHas = [1,2,3].includes(2);
new Promise((resolve, reject) => {
resolve(100);
});
Скомпилированный код выглядит следующим образом (lib/index.js
):
"use strict";
require("core-js/modules/es.array.includes");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.promise");
var isHas = [1, 2, 3].includes(2);
new Promise(function (resolve, reject) {
resolve(100);
});
Array.prototype
добавленоincludes
метод и новый глобальныйPromise
метод, загрязняет глобальную среду, что не то же самое, что использование@babel/plugin-transform-runtime
Нет никакой разницы.
если мы хотим@babel/plugin-transform-runtime
Не только обрабатывать вспомогательные функции, но и загружатьpolyfill
, нам нужно дать@babel/plugin-transform-runtime
Добавьте информацию о конфигурации.
Сначала добавьте зависимости@babel/runtime-corejs3
:
npm install @babel/runtime-corejs3 --save
Измените файл конфигурации следующим образом (удален@babel/preset-env
изuseBuiltIns
конфигурации, иначе повторится.Если не верите, можете использоватьasync/await
Скомпилируйте и попробуйте):
{
"presets": [
[
"@babel/preset-env"
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",{
"corejs": 3
}
]
]
}
Затем перекомпилируйте и посмотрите на скомпилированные результаты (lib/index.js
):
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
var _context;
var isHas = (0, _includes.default)(_context = [1, 2, 3]).call(_context, 2);
new _promise.default(function (resolve, reject) {
resolve(100);
});
Видно, что прямой модификации нет.Array.prototype
или добавитьPromise
способ избежать глобального загрязнения. если выше@babel/plugin-transform-runtime
настроенcore-js
"2", который не содержит экземпляраpolyfill
необходимо импортировать отдельно.
Фокус: если мы настроим
corejs
да3
версию, то независимо от того, является ли это методом экземпляра или глобальным методом, он больше не будет загрязнять глобальную среду.
Увидев это, я не знаю, есть ли у вас такой вопрос? Дать@babel/plugin-transform-runtime
настроитьcorejs
Он настолько совершенен, что может превратить вспомогательную функцию в ссылку и динамически импортировать ее.polyfill
, и не будет загрязнять глобальную окружающую среду. зачем давать@babel/preset-env
поставкаuseBuiltIns
Функция кажется ненужной.
Имея в виду этот вопрос, я создал несколько новых файлов (содержание простое и в основном такое же, с использованием некоторых новых функций), а затем использовалwebpack
Сборка, вот данные, которые я сравнил:
серийный номер | .babelrc конфигурация | webpack mode production |
---|---|---|
0 | Не используйте@babel/plugin-transform-runtime
|
36KB |
1 | использовать@babel/plugin-transform-runtime , и настроить параметрыcorejs : 3. Не загрязняет глобальную окружающую среду |
37KB |
2 | использовать@babel/plugin-transform-runtime , не настраиватьcorejs
|
22KB |
я догадываюсь@babel/runtime-corejs3/XXX
сам пакет, чемcore-js/modules/XXX
больше~
Дополнительные знания о плагинах/пресетах
Порядок, в котором перечислены плагины, важен! ! !
Если оба плагина преобразования будут обрабатывать определенный фрагмент кода из «Программы», то либо плагин преобразования, либоpreset
Порядок сортировки выполняется последовательно.
- Плагины запускаются перед пресетами.
- Плагины перечислены спереди назад.
- Порядок предустановок обратный (сзади наперед).
Например:
{
"plugins": ["@babel/plugin-proposal-class-properties", "@babel/plugin-syntax-dynamic-import"]
}
выполнить первым@babel/plugin-proposal-class-properties
, после выполнения@babel/plugin-syntax-dynamic-import
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
preset
Порядок выполнения такойобратныйДа, сначала выполнить@babel/preset-react
, после выполнения@babel/preset-env
.
Параметры плагина
плагины иpreset
Оба могут принимать параметры, и параметры состоят из массива имен плагинов и объектов параметров.preset
Настройка параметров также в этом формате.
Такие как:
{
"plugins": [
[
"@babel/plugin-proposal-class-properties",
{ "loose": true }
]
]
}
короткое название плагина
Если имя плагина@babel/plugin-XXX
, вы можете использовать короткие имена@babel/XXX
:
{
"plugins": [
"@babel/transform-arrow-functions" //同 "@babel/plugin-transform-arrow-functions"
]
}
Если имя плагинаbabel-plugin-XXX
, вы можете использовать короткие именаXXX
, то же правило применяется кscope
плагин:
{
"plugins": [
"newPlugin", //同 "babel-plugin-newPlugin"
"@scp/myPlugin" //同 "@scp/babel-plugin-myPlugin"
]
}
Создать пресет
Вы можете просто вернуть массив плагинов
module.exports = function() {
return {
plugins: [
"A",
"B",
"C"
]
}
}
preset
также может содержать другиеpreset
и плагины с параметрами.
module.exports = function() {
return {
presets: [
require("@babel/preset-env")
],
plugins: [
[require("@babel/plugin-proposal-class-properties"), { loose: true }],
require("@babel/plugin-proposal-object-rest-spread")
]
}
}
конфигурационный файл
Babel поддерживает файлы конфигурации в нескольких форматах. Эта часть содержания может быть дополнена и понятна, кого волнует, какой файл конфигурации вы используете, лишь бы ваша конфигурация была в порядке (формально)~
всеBabel
Параметры API можно настроить, но если параметр требует использования кода JS, вам может потребоваться использовать версию файла конфигурации с кодом JS.
Различные профили могут быть выбраны в соответствии со сценарием использования:
Если вы хотите создать файлы конфигурации программно или если вы хотите скомпилироватьnode_modules
Модули в каталоге: затемbabel.config.js
может удовлетворить ваши потребности.
Если вам просто нужна простая конфигурация для одного пакета: тогда.babelrc
для удовлетворения ваших потребностей.
babel.config.js
В корневом каталоге проекта создайте файл с именемbabel.config.js
документ.
module.exports = function(api) {
api.cache(true);
const presets = [...];
const plugins = [...];
return {
presets,
plugins
};
}
Конкретную конфигурацию можно посмотреть:документация babel.config.js
.babelrc
В корневом каталоге проекта создайте файл с именем.babelrc
документ:
{
"presets": [],
"plugins": []
}
Конкретная конфигурация может относиться к.babelrc документация
package.json
могу.babelrc
Информация о конфигурации в видеbabel
ключ (ключ) добавлен вpackage.json
В файле:
{
"name": "my-package",
"babel": {
"presets": [],
"plugins": []
}
}
.babelrc.js
а также.babelrc
Конфигурация такая же, но можно написать на JS.
//可以在其中调用 Node.js 的API
const presets = [];
const plugins = [];
module.exports = { presets, plugins };
Не знаю, исчерпывающий ли он, но я действительно не могу его написать (если он будет неполным, я добавлю его позже) ~ просто соус ~ Если есть какие-то ошибки, пожалуйста, поправьте меня.
Ссылка на ссылку