Статьи

Введение в Webpack: часть 2

В предыдущем уроке мы узнали, как настроить проект Webpack и как использовать загрузчики для обработки нашего JavaScript. Тем не менее, Webpack действительно хорош в своей способности связывать другие типы статических ресурсов, таких как CSS и изображения, и включать их в наш проект, только когда они необходимы. Давайте начнем с добавления некоторых стилей на нашу страницу.

Сначала создайте обычный CSS-файл в каталоге стилей. Вызовите main.css и добавьте правило стиля для элемента заголовка.

1
2
3
4
h2 {
    background: blue;
    color: yellow;
}

Итак, как мы можем получить эту таблицу стилей на нашей странице? Ну, как и большинство вещей с Webpack, нам понадобится еще один загрузчик. На самом деле два: css-loader и style-loader . Первый читает все стили из наших CSS-файлов, в то время как другие вводят указанные стили в нашу HTML-страницу. Установите их так:

1
npm install style-loader css-loader

Далее мы расскажем Webpack, как их использовать. В webpack.config.js нам нужно добавить еще один объект в массив загрузчиков. В нем мы хотим добавить тест для соответствия только CSS-файлам, а также указать, какие загрузчики использовать.

1
2
3
4
5
{
    test: /\.css$/,
    exclude: /node_modules/,
    loader: ‘style!css’
}

Интересной частью этого фрагмента кода является строка 'style!css' . Загрузчики читаются справа налево, поэтому Webpack должен сначала прочитать стили любого файла, заканчивающегося на .css , а затем вставить эти стили на нашу страницу.

Поскольку мы обновили наш файл конфигурации, нам нужно будет перезапустить сервер разработки, чтобы наши изменения были приняты. Используйте ctrl+c чтобы остановить сервер, и webpack-dev-server чтобы запустить его снова.

Все, что нам нужно сделать сейчас, — это запросить нашу таблицу стилей из нашего файла main.js Мы делаем это так же, как и любой другой модуль JavaScript:

1
2
3
4
5
const sayHello = require(‘./say-hello’);
 
require(‘./styles/main.css’);
 
sayHello(‘Guybrush’, document.querySelector(‘h2’));

Обратите внимание, что мы даже не коснулись index.html . Откройте браузер, чтобы увидеть страницу со стилем h2 . Измените цвет заголовка в вашей таблице стилей, чтобы он сразу обновлялся без обновления. Прекрасный.

«Но никто не использует CSS в наши дни, дедушка! Все дело в Sass ». Конечно, это. К счастью, в Webpack есть загрузчик, который делает именно это . Установите его вместе с версией Sass для узла, используя:

1
npm install sass-loader node-sass

Затем обновите webpack.config.js :

1
2
3
4
5
{
    test: /\.scss$/,
    exclude: /node_modules/,
    loader: ‘style!css!sass’
}

Теперь это говорит о том, что для любого файла, заканчивающегося на .scss , преобразуйте Sass в обычный CSS, прочитайте стили из CSS, а затем вставьте стили на страницу. Не забудьте переименовать main.css в main.scss и вместо этого потребовать новый файл. Сначала немного Sass:

1
2
3
4
5
6
$background: blue;
 
h2 {
    background: $background;
    color: yellow;
}

Тогда main.js:

1
require(‘./styles/main.scss’);

Супер. Это так просто. Нет преобразования и сохранения файлов, или даже просмотра папок. Мы просто требуем в наших стилях Sass напрямую.

«Значит, я уверен, что изображения, загрузчики тоже?» Конечно! С изображениями мы хотим использовать url-загрузчик . Этот загрузчик берет относительный URL вашего изображения и обновляет путь, чтобы он правильно включался в ваш пакет файлов. По обыкновению:

1
npm install url-loader

Теперь давайте попробуем что-то другое в нашем webpack.config.js . Добавьте еще одну запись в массив loaders обычным способом, но на этот раз мы хотим, чтобы регулярное выражение совпадало с изображениями с разными расширениями файлов:

1
2
3
4
5
{
    test: /\.(jpg|png|gif)$/,
    include: /images/,
    loader: ‘url’
}

Обратите внимание на другое отличие здесь. Мы не используем ключ exclude . Вместо этого мы используем include . Это более эффективно, так как говорит веб-пакету игнорировать все, что не соответствует папке, называемой «изображения».

Обычно вы будете использовать какую-то систему шаблонов для создания ваших HTML-представлений, но мы будем придерживаться базового подхода и создавать тег изображения в JavaScript по старинке. Сначала создайте элемент изображения, установите для требуемого изображения атрибут src, а затем добавьте элемент на страницу.

1
2
3
4
5
var imgElement = document.createElement(‘img’);
 
imgElement.src = require(‘./images/my-image.jpg’);
 
document.body.appendChild(imgElement);

Вернитесь в браузер, чтобы увидеть ваше изображение на ваших глазах!

Другая задача, обычно выполняемая во время разработки, — это линтинг. Linting — это способ обнаружения потенциальных ошибок в вашем коде, а также проверка того, что вы выполнили определенные соглашения по кодированию. Вещи, которые вы, возможно, захотите найти: «Использовал ли я переменную, не объявив ее сначала?» или «Я забыл точку с запятой в конце строки?» Применяя эти правила, мы можем на ранних этапах отсеивать глупые ошибки.

Популярным инструментом для линтинга является JSHint . Это смотрит на наш код и выделяет возможные ошибки, которые мы сделали. JSHint можно запустить вручную из командной строки, но это быстро становится рутиной во время разработки. В идеале мы бы хотели, чтобы он запускался автоматически каждый раз, когда мы сохраняем файл. Наш сервер Webpack уже следит за изменениями, так что да, вы уже догадались — еще один загрузчик.

Установите jshint-загрузчик обычным способом:

1
npm install jshint-loader

Опять же, мы должны сказать Webpack использовать его, добавив его в наш webpack.config.js . Однако этот загрузчик немного другой. Это на самом деле не трансформирует какой-либо код — это просто выглядит. Мы также не хотим, чтобы все наши более тяжелые загрузчики, модифицирующие код, запускались и выходили из строя только потому, что мы забыли точку с запятой. Вот где входят предварительные загрузчики. Предварительный загрузчик — это любой загрузчик, который мы указываем для запуска перед нашими основными задачами. Они добавляются в наш webpack.conf.js аналогично загрузчикам.

01
02
03
04
05
06
07
08
09
10
11
12
module: {
    preLoaders: [
        {
            test: /\.js$/,
            exclude: /node_modules/,
            loader: ‘jshint’
        }
    ],
    loaders: [
       …
    ]
}

Теперь наш процесс линтинга запускается и сразу завершается неудачей, если обнаружена проблема. Прежде чем мы перезапустим наш веб-сервер, нам нужно сообщить JSHint, что мы используем ES6, иначе произойдет сбой, когда он увидит ключевое слово const мы используем.

После ключа модуля в нашей конфигурации добавьте еще одну запись с именем «jshint» и строку для указания версии JavaScript.

01
02
03
04
05
06
07
08
09
10
11
module: {
    preLoaders: [
        …
    ],
    loaders: [
        …
    ]
},
jshint: {
    esversion: 6
}

Сохраните файл и перезапустите webpack-dev-server . Работает нормально? Отлично. Это означает, что ваш код не содержит ошибок. Давайте представим один, удалив точку с запятой из этой строки:

1
var imgElement = document.createElement(‘img’)

Снова сохраните файл и посмотрите на терминал. Теперь мы получаем это:

1
2
3
WARNING in ./main.js
jshint results in errors
  Missing semicolon.

Спасибо, JSHint!

Теперь, когда мы счастливы, что наш код в форме и он делает все, что мы хотим, нам нужно подготовить его к реальному миру. Одной из наиболее распространенных вещей, которые нужно сделать при запуске своего кода, является его минимизация, объединение всех ваших файлов в один и последующее сжатие этого файла в наименьший возможный файл. Прежде чем мы продолжим, взгляните на ваш текущий bundle.js . Он читабелен, имеет много пробелов и имеет размер 32 КБ.

«Подожди! Не говори мне. Еще один грузчик, верно?» Нет! В этом редком случае нам не нужен загрузчик. В Webpack встроена минификация. Когда вы довольны своим кодом, просто запустите эту команду:

1
webpack -p

Флаг -p указывает Webpack подготовить наш код к работе. Поскольку он генерирует пакет, он оптимизирует столько, сколько может. После выполнения этой команды откройте bundle.js и вы увидите, что все это было сжато вместе, и даже при таком небольшом объеме кода мы сохранили 10 КБ.

Я надеюсь, что этот учебник, состоящий из двух частей, дал вам достаточно уверенности, чтобы использовать Webpack в ваших собственных проектах. Помните, что если вы хотите что-то сделать в процессе сборки, то, скорее всего, в Webpack есть загрузчик. Все загрузчики устанавливаются через npm , так что посмотрите, кто-то уже сделал то, что вам нужно.

Веселиться!