Набор советов и решений проблем, с которыми я столкнулся при работе с webpack'ом. А, учитывая, что многие рецепты будут совсем базового уровня и других материалов на русском языке нет, то можно считать это «мини-учебником».
Пpока все в одном файле и вперемешку. Если разрастется и найдутся читатели, то категоризирую.
Конечно. И нужен именно чужой практический опыт: боролись с проблемой несколько часов/дней/недель? Создайте пулл с парой строк и общим описанием, помогу оформить и довести до ума.
Нужен ли мне webpack? http://webpack.github.io
Нужен, если:
- вы не хотите волноваться в каком формате ваши js-зависимости: AMD, CJS, Plain, etc
- вы не хотите волноваться о пре- и постпроцессорах и любой обработке, а хотите просто вызвать
require
и получит необходимый модуль - вы хотите объединять не только js-код, но и стили, картинки и любые другие ресурсы, создавая независимые модули
- вам нужна асихронная подгрузка и/или объединение модулей в пакеты
- вы хотите моментальной сборки в девелопменте и горячей замены модулей без перезагрузки страницы
- вы не боитесь экспериментировать и пробовать что-то новое
- куча других приятных мелочей ...
- что такое системы сборки и зачем они нужны
- что такое nodejs & npm
- уметь установить webpack (hint:
npm install webpack
)
Дано:
main.js
:
var myApp = require("./myapp.coffee");
myApp.init();
myapp.coffee:
module.exports = {...}
Решение:
- Создать
webpack.config.js
:
module.exports = {
entry: "./main.js",
output: {
filename: "bundle.js"
},
module: {
loaders: [
{ test: /\.coffee$/, loader: "coffee-loader" },
]
}
};
- Добавить
coffee-loader
вpackage.json
Объяснение:
Первое, что нужно понять, что webpack оперирует не папками и файлами, а модулями, т.е. ему именно важно, что вы написали внутри ваших файлов для построения дерева зависимостей.
Отсюда и первое отличие от других систем сборки: на вход подается не регулярное выражение а-ля src/**/*.coffee
, а entry point
вашего приложения. Любой же код, который вы подключите через require
пройдет обработку через загрузчики.
Автор Webpack стaрается держать ядро очень легковесным, «сваливая» всю работу на плагины и загрузчики.
Настройки того, на какие файлы какие загрузчики должны срабатывать описывается в разделе loaders
файла конфигурации: сначала идет регулярное выражение, которое применяется к названию файла, а затем список загрузчиков, которые сработают на удовлетворившем условию файле.
Дано:
Вызовы require
выглядят так:
require("./myapp.coffee")
require("./mystyle.css")
require("./myreact.jsx")
А хочется так:
require("./myapp")
require("./mystyle")
require("./myreact")
Решение:
resolve: {
extensions: ["", ".js", ".coffee", ".css", ".jsx"]
}