ES6+ в старых браузерах
Mithril.js написан на ES5, но он полностью совместим с ES6 и более поздними версиями. Все современные браузеры поддерживают его изначально, вплоть до синтаксиса нативных модулей. (Они не поддерживают магическое разрешение модулей Node, поэтому вы не можете использовать import * as _ from "lodash-es" или что-то подобное. Они поддерживают только относительные и URL-пути.) Поэтому смело используйте стрелочные функции для ваших компонентов-замыканий и классы для ваших компонентов, написанных с использованием классов.
Но если вам все еще нужно поддерживать старые браузеры, такие как Internet Explorer, потребуется транспилировать код до ES5. На этой странице мы расскажем об использовании Babel для обеспечения работы современного кода ES6+ в старых браузерах.
Настройка
Прежде всего, убедитесь, что у вас установлен Node.js. Он включает в себя предустановленный npm, который потребуется далее.
После установки Node.js откройте терминал и выполните следующие команды:
# Замените это фактическим путем к вашему проекту. Заключите его в кавычки, если он содержит пробелы,
# а если вы используете Linux/Mac и путь содержит `$$`, используйте одинарные кавычки.
cd "/path/to/your/project"
# Если у вас уже есть `package.json`, пропустите эту команду.
npm initТеперь вы можете выбрать один из нескольких способов:
Использование Babel автономно
Сначала необходимо установить несколько зависимостей.
@babel/cliустанавливает основную логику Babel, а также командуbabel.@babel/preset-envпомогает Babel определить, что и как транспилировать, основываясь на целевых браузерах.
npm install @babel/cli @babel/preset-env --save-devТеперь создайте файл .babelrc (или babel.config.js) и настройте его с помощью @babel/preset-env.
{
"presets": ["@babel/preset-env"],
"sourceMaps": true
}И, наконец, если у вас есть особые требования к поддерживаемым браузерам, вы можете настроить Browserslist, чтобы Babel (и другие инструменты) знали, на какие функции ориентироваться.
По умолчанию, если вы ничего не настраиваете, Browserslist использует довольно разумный запрос: > 0.5%, last 2 versions, Firefox ESR, not dead. Если у вас нет очень специфических обстоятельств, требующих изменения этого, например, если вам нужно поддерживать IE 8 с большим количеством полифилов, не беспокойтесь об этом шаге.
Чтобы скомпилировать проект, выполните следующую команду:
babel src --out-dir distЧтобы не запоминать и не вводить команду каждый раз, удобно создать npm-скрипт. Добавьте поле "build" в объект "scripts" в вашем package.json:
{
"scripts": {
"build": "babel src --out-dir dist"
}
}Теперь эту команду легче запомнить и использовать.
npm run buildИспользование Babel с Webpack
Если вы хотите использовать Webpack для сборки проекта, потребуется выполнить несколько дополнительных шагов для настройки. Во-первых, необходимо установить все зависимости, необходимые как для Babel, так и для Webpack.
webpack- это основной пакет Webpack, аwebpack-cliпредоставляет командуwebpack.@babel/core- это ядро Babel, которое является peer-зависимостью дляbabel-loader.babel-loaderпозволяет настроить Webpack для использования Babel для транспиляции файлов.@babel/preset-envпомогает Babel определить, что и как транспилировать.
npm install webpack webpack-cli @babel/core babel-loader @babel/preset-env --save-devТеперь создайте файл .babelrc (или babel.config.js) и настройте его с помощью @babel/preset-env.
{
"presets": ["@babel/preset-env"],
"sourceMaps": true
}Далее, если у вас есть особые требования к поддерживаемым браузерам, вы можете настроить Browserslist, чтобы Babel (и другие инструменты) знали, на какие функции ориентироваться.
По умолчанию, если вы ничего не настраиваете, Browserslist использует довольно разумный запрос: > 0.5%, last 2 versions, Firefox ESR, not dead. Если у вас нет очень специфических обстоятельств, требующих изменения этого, например, если вам нужно поддерживать IE 8 с большим количеством полифилов, не беспокойтесь об этом шаге.
И, наконец, настройте Webpack, создав файл с именем webpack.config.js.
const path = require('path');
module.exports = {
entry: path.resolve(__dirname, 'src/index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.js',
},
module: {
rules: [
{
test: /\.js$/,
exclude: /\/node_modules\//,
use: {
loader: 'babel-loader',
},
},
],
},
};В этой конфигурации предполагается, что файл точки входа приложения находится в src/index.js, а собранный бандл будет помещен в dist/app.js.
Теперь, чтобы запустить сборку, просто выполните эту команду:
webpack -d --watchЧтобы не запоминать и не вводить команду каждый раз, удобно создать npm-скрипт. Добавьте поле "start" в объект "scripts" в вашем package.json:
{
"scripts": {
"start": "webpack -d --watch"
}
}Теперь эту команду легче запомнить и использовать.
npm startДля финальной сборки проекта потребуется минифицировать скрипты. К счастью, это тоже довольно просто: достаточно запустить Webpack с другой опцией.
webpack -pВы также можете добавить это в свои npm-скрипты, чтобы вы могли быстро и легко собрать проект для продакшена.
{
"scripts": {
"start": "webpack -d --watch",
"build": "webpack -p"
}
}Тогда эту команду будет легче запомнить.
npm run buildИ, конечно, это можно автоматизировать в скриптах финальной сборки. Вот как это может выглядеть, если вы используете Heroku, например:
{
"scripts": {
"start": "webpack -d --watch",
"build": "webpack -p",
"heroku-postbuild": "webpack -p"
}
}