Важно разделять JavaScript и CSS-код на маленькие по объему части. Этим мы упрощаем себе и другим понимание и поддержку проекта. Браузеры, с другой стороны, предпочитают работать с маленьким количеством файлов, пускай длинными и слабо читаемыми. Здесь на помощь приходит Webpack.
Webpack — инструмент веб-разработчика, который соединяет JavaScript- и CSS-файлы в единое целое — файл, который часто называется «bundle» (с англ. «пачка»). В этой статье представлена инструкция по настройке среды для проекта на JavaScript и Sass.
Устанавливаем Node и npm
Так как Webpack построен на Node.js, для его работы требуется запуск как Node, так и npm (node package manager — менеджер пакетов Node). Порядок действий:
- Скачиваем и устанавливаем Node.js с официального сайта.
- Для установки npm открываем командную строку (например, Терминал MacOS) и выполняем команду:
1 |
sudo npm install -g |
Sudo
и ключ -g
позволяют установить модуль для всех пользователей через учётную запись администратора, но для этого потребуется ввести пароль (для пользователей windows Sudo
прописывать не нужно).
3. Выполняем (но уже в локальной папке):
1 |
npm init |
Вы увидите процесс создания файла package.json.
Настройки по умолчанию вполне приемлемы, поэтому просто нажимайте «Enter». Кроме того, при необходимости вы всегда сможете изменить их позже.
Когда package.json
будет создан, вы увидите небольшой документ с настройками. В нём хранится всё, что нужно знать о себе проекту.
1 2 3 4 5 6 7 8 9 10 11 |
{ "name": "myproject", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } |
Добавляем Webpack
Выполняем следующий код, чтобы добавить Webpack к проекту.
1 |
npm install webpack -D |
После чего произойдут 3 вещи:
- Имя «Webpack» добавится в
package.json
в качествеdevDependency
(будет использоваться при разработке, но не в рабочей версии). Для этого указывается ключ-D
. - К проекту добавится новый каталог
node_modules
. - Webpack (файлы модуля) появится в каталоге
node_modules
.
Добавляем Webpack как скрипт
Добавляем следующий скрипт в package.json
:
1 2 3 4 |
"scripts": { "build": "webpack", "start": "webpack --watch" }, |
Теперь запускаем Webpack-версию проекта через npm, выполнив npm run build
и npm run start
в командной строке.
Согласно документации Webpack глобальная установка не рекомендуется. Она вынуждает разработчика использовать во всех проектах определенную версию Webpack и приводит к краху, если использовать другую версию.
Файловая структура
- Создадим новый каталог
src
в корне проекта. - Создадим файл
src/app.js
, в котором укажем путь к нашим .js и .scss файлам. - Создадим файл
index.html
в корне проекта. - Делаем ссылку на JavaScript-файл перед тегом
</body>
вindex.html
:
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript" src="dist/bundle.js"></script> </body> </html> |
Делайте ссылку только на dist\bundle.js
, а src\app.js
включать не требуется. Дело в том, что этого файла ещё нет. Webpack сделает его для нас.
Конфигурация Webpack
- Создаём файл
webpack.config.js
в корне проекта. - Копируем и вставляем следующий фрагмент кода, который подскажет Webpack, как мы хотим его использовать.
1 2 3 4 5 6 7 8 9 |
const path = require('path'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' } }; |
«Entry» и «Output»
«Entry» (входные данные): Входной файл называется app.js
и расположен в каталоге src
.
«Output» (выходные данные): Это место, куда Webpack будет размещать все готовые файлы. Он будет называться bundle.js
и размещаться в каталоге dist
(«distribution» — с англ. «размещение»).
Вы можете изменять имена, но при этом необходимо синхронизировать изменения в webpack.config.js
, файлах, каталогах и связанных скриптах в HTML.
Добавляем JavaScript
Теперь давайте напишем код для последующей обработки с помощью Webpack:
- В каталоге
src
создаем каталогjs
. - Внутри
js
создаем JavaScript-файлrainbows.js
. - Пишем код в
rainbows.js
. Например:
1 |
console.log('This is rainbows.js') |
4. Создаём другой JavaScript-файл — unicorns.js
в каталоге js
.
5. Пишем код в unicorns.js
. Например:
1 |
console.log('Hello, unicorns!') |
6. Добавляем следующий код в app.js
, чтобы импортировать rainbows.js
и unicorns.js
:
1 2 |
import './js/rainbows.js'; import './js/unicorns.js'; |
7. Запускаем Webpack в Терминале командой:
1 |
<strong class="markup--strong markup--pre-strong">npm run build</strong> |
Теперь появился каталог dist
!
После запуска index.html
в браузере откройте инструменты разработчика (Developer Tools) и посмотрите на консоль. Там будут сообщения как из rainbows.js
, так и
unicorns.js
.
Добавляем SCSS
- Создаём каталог
scss
вsrc
. - Создаём файл
base.scss
в каталогеscss
. - Добавляем CSS-код в
base.scss
. Например:1234$bg-color: pink;body {background: $bg-color;} - Добавляем следующий код в
src/app.js
, чтобы импортироватьbase.scss
:1import './scss/base.scss'
Чтобы Webpack прочитал sass-стили, необходимо добавить дополнительные загрузчики.
Добавляем загрузчики стилей
- Выполняем команду в Терминале, чтобы установить style-loader, css-loader, sass-loader, node-sass, extract-text-webpack-plugin.
1npm install style-loader css-loader sass-loader node-sass extract-text-webpack-plugin -D
- Добавляем плагин «Extract Text Plugin» в начало
webpack.config.js
. Он отвечает за перемещение CSS в отдельный файл.1const ExtractTextPlugin = require('extract-text-webpack-plugin'); - Теперь указываем Webpack, что необходимо обработать .scss файлы. Он выполнит их через «Extract Text Plugin», CSS- и Sass-загрузчик. Вставляем следующий код после фигурной скобки группы «output». Обратите внимание на запятую!
1234567891011121314output: {...},module: {rules: [{test: /\.scss$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader']})}]}
- Делаем ссылку на «Extract Text Plugin» прямо перед последней фигурной скобкой. Это даст знать Webpack, что все CSS-файлы необходимо соединить в отдельный файл и назвать его «style.css».
Webpack.config.js
теперь выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
const path = require('path'); const ExtractTextPlugin = require("extract-text-webpack-plugin"); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, module: { rules: [ { test: /\.scss$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader', 'sass-loader'] }) } ] }, plugins: [ new ExtractTextPlugin('style.css') ] }; |
Расскажем HTML обо всем этом!
- Делаем ссылку на CSS-файл в
<head>
.1<link rel='stylesheet' href='dist/style.css'> - Запускаем Webpack в Терминале.
1npm run build
- Открываем
index.html
в браузере. Если фон розовый, значит, CSS загрузился. - Благодаря команде Webpack
watch
, которую мы добавили в npm-скрипты, обработка происходит после каждого изменения. Она будет производиться автоматически после каждого сохранения исходного файла в редакторе.1npm run start - Вносим изменения в
base.scss
. Например:1$bg-color: orange; - Обновляем страницу в браузере. Цвет фона меняется на оранжевый.
Добавляем и редактируем файлы
- Создаём файл
typography.scss
в каталогеsrc/scss
. - Добавляем в него немного кода SCSS. Например:
1234567@import url('https://fonts.googleapis.com/css?family=Roboto');$base-font: 'Roboto';$title-padding: 3em;h1 {font-family: $base-font;padding: $title-padding;}
- Прописываем ссылку на
typography.scss
вsrc/app.js
.1import './scss/typography.scss'; - Обновляем страницу в браузере. Типографика изменилась? Да, он работает!
Заключение
Также существуют и другие способы настройки Webpack (они называются boilerplate), для меня было главным понять принципы среды, как она в действительности работает. Выше мы рассмотрели, как составные части окружения работают вместе.
На первый взгляд Webpack кажется сложным. Внимательно разберите этапы работы, и тогда вы получите мощный и полезный инструмент для создания проектов.
Перевод статьи на hackernoon.com