Dzień dobry (это польский приветствие англ. «Доброе утро») JS-разработчикам! Это моя первая статья на платформе блога Medium. В этой серии я сосредоточусь на настройке современного JS-приложения и попытаюсь представить свой подход к таким инструментам, как Webpack и Babel. В этой статье мы попытаемся создать базовое приложение, целью которого является демонстрация компонента React. Проект будет создан с использованием таких инструментов, как Webpack 4,Babel 7, React 16.6, мы также будем использовать SASS. > — (препроцессор CSS с улучшениями синтаксиса). Кроме того, мы будем использовать webpack-dev-server — сервер разработки, обеспечивающий перезагрузку в реальном времени. В последующих статьях я попытаюсь объяснить более продвинутые методы, которые помогут вам использовать ваше приложение в производственной среде.
Итак, начнем.
Создайте проект, используя следующие команды:
Затем добавьте недостающие файлы в свой проект на основе приведенного ниже снимка экрана.
Для простоты я создал минималистическую структуру каталогов.
На основе приведенного ниже файла package.json вам необходимо добавить библиотеки в свой проект.
{ "name": "MyApp", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "@babel/core": "^7.2.2", "@babel/plugin-proposal-class-properties": "^7.2.3", "@babel/polyfill": "^7.2.5", "@babel/preset-react": "^7.0.0", "babel-loader": "^8.0.5", "html-webpack-plugin": "^3.2.0", "webpack": "^4.28.4", "webpack-cli": "^3.2.1" }, "dependencies": { "react": "^16.7.0", "react-dom": "^16.7.0" } }
Вы можете установить библиотеку, используя команду ниже:
$ yarn add --dev <library_name>
(необходимо использовать флаг — dev, чтобы добавить запись в раздел devDependencies)
Если вы хотите установить все необходимые зависимости одной командой, вы можете просто скопировать указанный выше файл package.json и запустить:
$ yarn install
Приведенная выше команда должна сгенерировать файл yarn.lock и каталог node_modules с библиотеками.
Итак, вопрос: «Когда мне следует добавить пакет в раздел devDependencies?» — если вы чувствуете, что данная библиотека полезна только в процессе разработки, т.е. тестовой библиотеки, то вы должны добавить ее в devDependecies.
Добавьте приведенный ниже HTML-код в файл index.html.
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>My App</title> <meta name="description" content="Example Webpack config"> </head> <body> </body> </html>
Затем добавьте следующую строку в файл app.js.
console.log('It works!');
Мы только что создали базовую структуру каталогов и заполнили файлы кодом. Пришло время описать библиотеки, включенные в файл package.json.
Что такое Вавилон?
Это компилятор, который преобразует код ES6+ в обратно совместимый код JS. (Это означает, что вы даже можете использовать функции javascript, которые еще не поддерживаются браузерами!) Взгляните на скриншот ниже.
Как видите, инструмент преобразует функцию стрелки, представленную в ES6, в стандартную функцию JS. Очень рекомендую потратить немного времени и поиграться со всеми возможными вариантами в официальном онлайн-репле Бабеля.
Плагины Babel и пресеты Babel
Важно отметить, что Babel из коробки ничего не делает. Согласно документам, он действует как
const babel = code => code
Однако есть способ добавить некоторые функции к инструменту. Вы можете добавить выбранный плагин или группу плагинов — пресет. Поэтому, если вы хотите добавить поддержку синтаксиса класса, вам нужно включить @babel/plugin-proposal-class-properties, но если вы хотите использовать реактивный синтаксис JSX, вам нужно добавить @babel/ предустановленная реакция на ваш файл package.json.
Ядро Babel и полифилл Babel
Babel — это компилятор, поэтому он анализирует, преобразовывает и выводит преобразованный код. Babel core — это базовый пакет babel (в npm нет ничего похожего на пакет babel), поэтому этот пакет отвечает за этапы синтаксического анализа и вывода. Пакет Polyfill отвечает за эмуляцию среды ES6+. (вы можете использовать, например, промисы или статический метод — Object.assign)
Загрузчик Babel
Этот пакет позволяет транспилировать файлы JavaScript с помощью Babel и Webpack.
Прежде чем мы запустим наше приложение, нам нужно настроить Webpack. Для этого создайте файл webpack.config.json и заполните его следующим содержимым:
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'main.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } } ] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', filename: './index.html' }) ] };
Основываясь на приведенном выше файле, Webpack знает, как проходить код и какой загрузчик ему нужно использовать для создания нашего приложения. В этом файле мы определили точку входа и путь выхода. Также есть возможность включать модули (в нашем случае babel-loader, отвечающий за компиляцию кода javascript) и плагины, расширяющие возможности Webpack.
Прежде чем мы создадим наше приложение, нам нужно связать Webpack с нашим приложением. Для этого добавьте ключ "script" в файл package.json.
“scripts”: { “build”: “webpack” }
Давайте создадим наше приложение
$ yarn build
Приведенная выше команда должна создать каталог dist.
Теперь пришло время открыть браузер Chrome и проверить результат:
$ open -a “Google Chrome” ./dist/index.html
Вы также можете открыть Chrome стандартным способом и ввести путь к файлу index.html в адресной строке.
Откройте консоль браузера ([MacOS] Option+Command+i).
Как видите, все работает так, как мы и ожидали. Теперь вы можете просмотреть сгенерированные файлы index.html и main.js.
Как показано, Webpack автоматически включает сценарий main.js в файл index.html. (По сути, за это действие отвечает HtmlWebpackPlugin.)
В инструментах браузера мы также можем просмотреть файл main.js. Как видите, его содержимое сильно отличается от того, что вы поместили в файл app.js. Как было показано, базовая конфигурация Webpack/Babel непроста.
Пришло время начать настройку нашего проекта для поддержки синтаксиса JSX.
Измените содержимое файла app.js:
import React from 'react'; import ReactDOM from 'react-dom'; class App extends React.Component { render() { return ( <div>Hello World App!</div> ); } } ReactDOM.render(<App/>, document.getElementById('app'));
и создайте файл .babelrc в главном каталоге вашего проекта со следующим содержимым:
{ "presets": [ "@babel/preset-react" ], "plugins": [ "@babel/plugin-proposal-class-properties" ] }
Мы только что удалили строку, отвечающую за вывод сообщения в консоль браузера, и добавили наш первый компонент React, написанный на JSX с использованием синтаксиса класса.
Добавьте div с id в файл index.html.
<div id=”app”></div>
Благодаря @babel/preset-react и @babel/plugin-proposal-class-properties (которые мы добавили в наш файл .babelrc ранее ) ошибок нет.
В нашем приложении явно не хватает одного важного элемента — CSS. Начнем с заполнения файла styles.scss.
body { color: green; font-size: 20px; }
Импортируйте файл styles.scss в файл app.js.
Затем добавьте следующие зависимости:
$ yarn add --dev mini-css-extract-plugin css-loader sass-loader node-sass
Определено новое правило в файле webpack.config
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'main.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.scss$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader' ] } ] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', filename: './index.html' }), new MiniCssExtractPlugin() ] };
Скомпилируем наш проект:
$ yarn build
Легко видеть, что определенные стили были успешно применены к нашему приложению. (цвет шрифта изменен на зеленый). Кроме того, был создан новый файл — main.css. (плагин mini-css-extract)
Вы, наверное, согласитесь со мной, что компилировать проект каждый раз, когда нужно проверить результат, надоедает. Но есть способ автоматизировать этот процесс:
yarn add --dev webpack-dev-server
Добавьте новый ключ в файл package.json. (раздел «скрипты»)
“start”: “webpack-dev-server”
Вам также необходимо добавить подключаемый модуль HotModuleReplacement, который отвечает за перезагрузку веб-страницы при обнаружении изменения.
const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { mode: 'development', entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'main.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.scss$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader' ] } ] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', filename: './index.html' }), new MiniCssExtractPlugin(), new webpack.HotModuleReplacementPlugin() ] };
Пришло время построить и запустить ваш проект:
yarn build yarn start
Как вы только что видели, базовая настройка Webpack не так проста. К счастью, у обоих инструментов есть отличная документация, вы также можете найти множество примеров конфигурации Webpack на таких платформах, как github. Я действительно призываю вас погрузиться в этот материал. Я уверен, что это сослужит вам хорошую службу в будущем. Здесь вы можете найти ссылку на репозиторий Github с рабочим кодом этого руководства. Если у вас есть животрепещущие вопросы, не стесняйтесь комментировать! Для более продвинутых в Webpack готовлю вторую часть статьи.
Делайте usłyszenia wkrótce. (англ. До скорой встречи! ;-))