В наши дни это довольно стандартная практика, когда при создании веб-сайта используется какой-то процесс сборки, помогающий выполнять задачи разработки и подготавливать ваши файлы для реальной среды.
Для этого вы можете использовать Grunt или Gulp , создав цепочку преобразований, которые позволят вам перебросить код с одной стороны и получить несколько минимизированных CSS и JavaScript с другой.
Эти инструменты чрезвычайно популярны и очень полезны. Есть, однако, другой способ сделать что-то, и это использовать Webpack .
Что такое Webpack?
Webpack — это то, что известно как «модуль связывания». Он берет модули JavaScript, понимает их зависимости, а затем объединяет их вместе наиболее эффективным способом, выпуская один файл JS в конце. Ничего особенного, верно? Такие вещи, как RequireJS делают это годами.
Ну, вот поворот. В Webpack модули не ограничиваются файлами JavaScript. Используя Loaders, Webpack понимает, что для модуля JavaScript может потребоваться файл CSS, а для файла CSS может потребоваться изображение. Выведенные активы будут содержать только то, что нужно с минимальной суетой. Давайте настроим так, чтобы мы могли видеть это в действии.
Установка
Как и в случае большинства инструментов разработки, для продолжения вам понадобится установить Node.js. Предполагая, что вы правильно настроили это, все, что вам нужно сделать, чтобы установить Webpack, это просто набрать следующее в командной строке.
1
|
npm install webpack -g
|
Это установит Webpack и позволит вам запустить его из любой точки вашей системы. Затем создайте новый каталог и внутри создайте основной файл HTML, например, так:
01
02
03
04
05
06
07
08
09
10
11
|
<!doctype html>
<html>
<head>
<meta charset=»utf-8″>
<title>Webpack fun</title>
</head>
<body>
<h2></h2>
<script src=»bundle.js»></script>
</body>
</html>
|
Важной частью здесь является ссылка на bundle.js
, который Webpack сделает для нас. Также обратите внимание на элемент H2 — мы будем использовать это позже.
Затем создайте два файла в том же каталоге, что и ваш HTML-файл. Назовите первый main.js
, который, как вы можете себе представить, является основной точкой входа для нашего скрипта. Затем назовите второй say-hello.js
. Это будет простой модуль, который принимает имя человека и элемент DOM и вставляет приветственное сообщение в указанный элемент.
1
2
3
4
5
|
// say-hello.js
module.exports = function (name, element) {
element.textContent = ‘Hello ‘ + name + ‘!’;
};
|
Теперь, когда у нас есть простой модуль, мы можем потребовать это и вызвать его из main.js
Это так же просто, как сделать:
1
2
3
|
var sayHello = require(‘./say-hello’);
sayHello(‘Guybrush’, document.querySelector(‘h2’));
|
Теперь, если бы мы открыли наш HTML-файл, это сообщение, очевидно, не было бы показано, поскольку мы не включили main.js
не скомпилировали зависимости для браузера. Что нам нужно сделать, так это заставить Webpack посмотреть на main.js
и посмотреть, есть ли в нем зависимости. Если это так, он должен скомпилировать их вместе и создать файл bundle.js, который мы можем использовать в браузере.
Вернитесь к терминалу, чтобы запустить Webpack. Просто введите:
1
|
webpack main.js bundle.js
|
Первый указанный файл — это входной файл, в котором мы хотим, чтобы Webpack начал поиск зависимостей. Он сработает, если для каких-либо необходимых файлов потребуются какие-либо другие файлы, и будет делать это до тех пор, пока не будут обработаны все необходимые зависимости. После этого он выводит зависимости в виде единого объединенного файла в bundle.js
. Если вы нажмете кнопку возврата, вы должны увидеть что-то вроде этого:
1
2
3
4
5
6
7
|
Hash: 3d7d7339a68244b03c68
Version: webpack 1.12.12
Time: 55ms
Asset Size Chunks Chunk Names
bundle.js 1.65 kB 0 [emitted] main
[0] ./main.js 90 bytes {0} [built]
[1] ./say-hello.js 94 bytes {0} [built]
|
Теперь откройте index.html
в вашем браузере, чтобы увидеть на вашей странице привет.
конфигурация
Не очень интересно указывать наши входные и выходные файлы каждый раз, когда мы запускаем Webpack. К счастью, Webpack позволяет нам использовать файл конфигурации, чтобы избавить нас от хлопот. Создайте файл с именем webpack.config.js
в корневом каталоге вашего проекта со следующим содержимым:
1
2
3
4
5
6
|
module.exports = {
entry: ‘./main.js’,
output: {
filename: ‘bundle.js’
}
};
|
Теперь мы можем просто набрать webpack
и ничего больше, чтобы достичь тех же результатов.
Сервер разработки
Что это? Вы даже не можете печатать webpack
каждый раз, когда меняете файл? Я не знаю, сегодняшнее поколение и т. Д. И т. Д. Хорошо, давайте настроим небольшой сервер разработки, чтобы сделать вещи еще более эффективными. На терминале напишите:
1
|
npm install webpack-dev-server -g
|
Затем запустите команду webpack-dev-server
. Это запустит простой веб-сервер, использующий текущий каталог в качестве места для обслуживания файлов. Откройте новое окно браузера и перейдите по адресу http: // localhost: 8080 / webpack-dev-server / . Если все хорошо, вы увидите что-то вроде этого:
Теперь у нас есть не только симпатичный маленький веб-сервер, но и тот, который следит за изменениями в нашем коде. Если он увидит, что мы изменили файл, он автоматически запустит команду webpack, чтобы связать наш код и обновить страницу, не делая ничего. Все с нулевой конфигурацией.
Попробуйте, измените имя, переданное функции sayHello
, и переключитесь обратно в браузер, чтобы увидеть, что ваши изменения применяются немедленно.
Погрузчики
Одна из важнейших функций Webpack — это Loaders . Загрузчики аналогичны «задачам» в Grunt и Gulp. По сути, они берут файлы и каким-то образом преобразуют их, прежде чем они будут включены в наш связанный код.
Скажем, мы хотели использовать некоторые тонкости ES2015 в нашем коде. ES2015 — это новая версия JavaScript, которая поддерживается не во всех браузерах, поэтому нам нужно использовать загрузчик для преобразования нашего кода ES2015 в простой старый код ES5, который поддерживается. Для этого мы используем популярный загрузчик Babel, который, согласно инструкциям, устанавливаем так:
1
|
npm install babel-loader babel-core babel-preset-es2015 —save-dev
|
Это устанавливает не только сам загрузчик, но и его зависимости и предустановку ES2015, поскольку Babel необходимо знать, какой тип JavaScript он конвертирует.
Теперь, когда загрузчик установлен, нам просто нужно сказать Бабелю, чтобы он использовался. Обновите webpack.config.js
чтобы он выглядел так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
module.exports = {
entry: ‘./main.js’,
output: {
filename: ‘bundle.js’
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: ‘babel’,
query: {
presets: [‘es2015’]
}
}
],
}
};
|
Здесь следует отметить несколько важных вещей. Первым является test: /\.js$/
, который является регулярным выражением, говорящим нам применить этот загрузчик ко всем файлам с расширением .js
. Аналогичным образом exclude: /node_modules/
указывает Webpack игнорировать каталог node_modules
. loader
и query
довольно понятны — используйте загрузчик Babel с предустановкой ES2015.
Перезагрузите веб-сервер, нажав ctrl+c
и webpack-dev-server
запустив webpack-dev-server
. Все, что нам нужно сделать сейчас, это использовать некоторый код ES6 для проверки преобразования. Как насчет того, чтобы изменить переменную sayHello
на постоянную?
1
|
const sayHello = require(‘./say-hello’)
|
После сохранения Webpack должен автоматически перекомпилировать ваш код и обновить ваш браузер. Надеюсь, вы не увидите никаких изменений. bundle.js
в bundle.js
и посмотрите, сможете ли вы найти ключевое слово const
. Если Webpack и Babel выполнили свою работу, вы нигде этого не увидите — просто старый JavaScript.
На части 2
Во второй части этого руководства мы рассмотрим использование Webpack для добавления CSS и изображений на вашу страницу, а также подготовку вашего сайта к развертыванию.