Laravel Mix — сборка фронтенда
24.01.2021
Теги: CSS • JavaScript • Laravel • Web-разработка • Теория • Фреймворк
Laravel Mix ранее был известен как Elixir и поставлялся в виде отдельного плагина, но с версии 5.4 он был включён в официальную поставку фреймворка. Разница между Elixir и Mix в том, что последний является надстройкой над Webpack, в то время как первый основан на Gulp. Laravel Mix умело работает с JavaScript, не только минифицируя его, но и адаптируя под версию ECMAScript 5, гарантируя тем самым, что скрипт будет запускаться на старых браузерах.
Установка
Перед установкой нужно убедиться, что установлен Node и менеджер пакетов npm. Проверить можно с помощью двух команд:
> node -v # какая версия node установлена v14.15.1
> npm -v # какая версия npm установлена 6.14.9
Сразу после установки Laravel в корне проекта будет файл package.json
. Внутри секции devDependencies
большое количество зависимостей, и среди прочих — пакет laravel-mix
.
{ "private": true, "scripts": { "dev": "npm run development", "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --config=node_modules/laravel-mix/setup/webpack.config.js", "watch": "npm run development -- --watch", "watch-poll": "npm run watch -- --watch-poll", "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --config=node_modules/laravel-mix/setup/webpack.config.js" }, "devDependencies": { "axios": "^0.19", "bootstrap": "^4.0.0", "cross-env": "^7.0", "jquery": "^3.2", "laravel-mix": "^5.0.1", "lodash": "^4.17.19", "popper.js": "^1.12", "resolve-url-loader": "^3.1.0", "sass": "^1.15.2", "sass-loader": "^8.0.0", "vue-template-compiler": "^2.6.12" } }
Для установки laravel-mix
(и всех прочих пакетов из package.json
) — нужно выполнить команду из директории проекта:
> npm install
Запуск
Запустить все задачи:
> npm run dev
Запустить все задачи и следить за изменениями файлов:
> npm run watch
Если какой-либо файл был изменен, он производит автоматически его компиляцию. Эту команду есть смысл использовать, если нужно внести большие правки в стили или скрипты.
watch
иногда не работает (не отслеживает изменения файлов), в этом случае можно использовать watch-poll
— который запускается каждые несколько секунд и проверяет изменения файлов.
Запустить все задачи и минифицировать файлы:
> npm run prod
Настройка
Сразу после установки Laravel в директории проекта есть файл webpack.mix.js
— это и есть файл конфигурации mix
, в котором мы ставим задачи — что надо делать при запуске.
const mix = require('laravel-mix'); mix.js('resources/js/app.js', 'public/js') .sass('resources/sass/app.scss', 'public/css');
Изначально после установки Laravel в файле файл webpack.mix.js
есть всего две задачи — создать public/js/app.js
из resources/js/app.js
и создать public/css/app.css
из resources/sass/app.scss
.
less()
, который аналогичен методу sass()
для работы с SASS.
Использование метода js()
позволяет произвести транспиляцию в версию ECMAScript 5, минифицировать js-код, произвести сборку модулей и получить на выходе JavaScript, который может работать в старых браузерах.
Для объединения и минификации нескольких js-файлов предназначен метод scripts()
:
mix.scripts( ['public/js/admin.js', 'public/js/dashboard.js'], 'public/js/all.js' );
Для объединения и минификации нескольких css-файлов предназначен метод styles()
:
mix.styles( ['resources/css/mormilize.css', 'resources/css/common.css'], 'public/css/all.css' );
С помощью Laravel Mix можно копировать как файлы, так и директории. Это полезно, когда нужно скопировать шрифты, css или js-файлы из директории node_modules
в директорию public
.
mix.copy('node_modules/some-module/style.css', 'public/css/some-module.css');
При копировании директории метод copy()
сделает структуру директории более плоской. Если нужно поддерживать оригинальную структуру директории, следует использовать метод copyDirectory()
.
mix.copyDirectory('resources/img', 'public/img');
По умолчанию работа с source maps отключена, потому что это очень сильно замедляют процесс компиляции и требуют больше ресурсов процессора — но это всегда можно изменить.
mix.js('resources/js/app.js', 'public/js').sourceMaps();
Установить все пакеты из секций dependencies
и devDependencies
файла package.json
:
> npm install
Установить все пакеты из секции dependencies
файла package.json
(для production сервера)
> npm install --production
Установить пакет package-name
, но не добавлять его в файл package.json
:
> npm install package-name --no-save
Установить пакет package-name
и добавить в секцию devDependencies
файла package.json
:
> npm install package-name --save-dev > npm install -D package-name
Установить пакет package-name
и добавить в секцию dependencies
файла package.json
:
> npm install package-name --save-prod > npm install -P package-name > npm install package-name
Удалить пакет package-name
, но не удалять его из файла package.json
:
> npm uninstall package-name
Удалить пакет package-name
и удалить его из секции devDependencies
файла package.json
:
> npm uninstall package-name --save-dev > npm uninstall -D package-name
Удалить пакет package-name
и удалить его из секции dependencies
файла package.json
:
> npm uninstall package-name --save > npm uninstall -S package-name
Дополнительно
Поиск: CSS • JavaScript • Laravel • Web-разработка • Фреймворк • Mix • LESS • SASS • SCSS • Frontend • Фронтенд • Сборка • Node • npm • Теория