Настройка Webpack и React с помощью Phoenix 1.3 (с развертыванием Heroku)
Если вы создаете приложение с упором на внешний интерфейс. Вы можете использовать Webpack. Особенно, если вы тоже хотите добавить React в свой проект.
Мы можем вручную заменить Brunch на Webpack. Это избавит от многих головных болей при развертывании приложения Phoenix (сам по себе сложный процесс).
Начиная с версии 1.4, Phoenix будет поддерживать его из коробки для управления активами.
Спасибо Виталию Татаринцеву за первоначальное руководство.
Настроить веб-пакет
Нам нужно удалить всю конфигурацию бранча, которая уже есть в нашем проекте.
В качестве первого шага мы должны удалить следующие библиотеки из зависимостей разработки файла package.json
:
"devDependencies": {
"babel-brunch": "...",
"brunch": "...",
"clean-css-brunch": "...",
"uglify-js-brunch": "...",
...
}
(и любые другие зависимости Brunch, которые у вас могут быть)
Установите новые необходимые зависимости:
cd assets npm install babel-core babel-loader@7 babel-preset-env --save-dev npm install webpack webpack-cli --save-dev npm install copy-webpack-plugin css-loader mini-css-extract-plugin optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin --save-dev
Примечание. На момент написания этой статьи Вавилон 7 только что вышел. Если вы хотите использовать последнюю версию Babel, игнорируйте babel-loader@7
и используйте babel-loader
. Вам придется немного отладить имена пресетов.
Откройте снова package.json
и измените:
"scripts": { "deploy": "brunch build --production", "watch": "brunch watch --stdin" },
to
"scripts": { "deploy": "webpack --mode production", "watch": "webpack --mode development --watch" },
Теперь удалите файл brunch-config.js
.
rm brunch-config.js
Создайте новый файл: assets/webpack.config.js
со следующим содержимым:
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = (env, options) => ({
optimization: {
minimizer: [
new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: false }),
new OptimizeCSSAssetsPlugin({})
]
},
entry: './js/app.js',
output: {
filename: 'app.js',
path: path.resolve(__dirname, '../priv/static/js')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
},
plugins: [
new MiniCssExtractPlugin({ filename: '../css/app.css' }),
new CopyWebpackPlugin([{ from: 'static/', to: '../' }])
]
});
Добавьте import css from "../css/app.css"
поверх файла assets/js/app.js
В config/dev.exs
изменении
watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
cd: Path.expand("../assets", __DIR__)]]
to:
watchers: [node: ["node_modules/webpack/bin/webpack.js", "--mode", "development", "--watch-stdin",
cd: Path.expand("../assets", __DIR__)]]
Создайте файл assets/.babelrc
со следующим содержимым:
{ "presets": [ "env" ] }
Если требуется дополнительная настройка, вы можете ознакомиться с документацией babel-preset-env.
Остановитесь на мгновение и запустите свой сервер:
cd .. # If you are inside your /assets directory mix phx.server
Если у вас есть какие-либо ошибки, выполните предыдущие шаги для отладки.
По умолчанию Phoenix CSS
Мы не включили assets/css/phoenix.css
в файл assets/css/app.css
.
Phoenix 1.3 предоставляет нам по умолчанию шрифты glyphicons. Однако они не импортируются. Это не было проблемой с бранчем, потому что мы не видим никаких ошибок, связанных с отсутствующими шрифтами, пока не попытаемся их использовать. Этот рабочий процесс меняется с Webpack. Когда Webpack обрабатывает файл, он пытается построить граф зависимостей. Если произойдет ошибка, произойдет сбой.
Если вы хотите использовать assets/css/phoenix.css
, вы должны либо удалить строку в уменьшенном файле или импортировать глификонышрифты.
Настроить реакцию
Если вы хотите установить React (или любой другой интерфейсный фреймворк), продолжайте.
Во-первых, давайте установим дополнительные зависимости.
cd assets
npm install --save react react-dom
npm install --save-dev babel-preset-react
cd ..
Расширьте предустановки assets/.babelrc
, чтобы иметь также react
.
{ "presets": [ "env", "react" ] }
Сделанный! Импортируйте все файлы JS, как обычно, в файл app.js
.
Развертывание на Heroku
Если вы переходите с Brunch на Webpack в рабочем приложении, вам потребуется внести некоторые изменения в развертывание.
На момент написания в сборочных пакетах Heroku по умолчанию используется Brunch.
Настройка пакета сборки
По умолчанию существует сценарий оболочки acompile
, который запускается после сборки зависимостей и непосредственно перед завершением сборки. Файл compile
выглядит так.
Чтобы настроить хук компиляции вашего приложения, просто добавьте файл compile
в корневой каталог вашего приложения. compile
— это просто сценарий оболочки, поэтому вы можете использовать любой допустимый код bash
. Имейте в виду, что у вас будет доступ к вашим node_modules
и mix
. Это означает, что если вы используете инструмент сборки Node, отличный от brunch
, вы можете просто сделать что-то вроде:
#./компилировать
cd $phoenix_dir npm --prefix ./assets run build mix "${phoenix_ex}.digest"
Рекомендуемый файл compile
для Webpack:
./node_modules/.bin/webpack -p cd $phoenix_dir mix phx.digest
Затем повторно разверните приложение.