Процесс сборки Laravel Mix масштабируется до множества (более 50) тем - PullRequest
1 голос
/ 18 сентября 2019

Существует ли стандартный способ масштабирования Laravel Mix для поддержки процесса сборки из 50+ различных тем веб-интерфейса?

Я просто запускаю npm run dev и npm run watch в настоящее время счетыре разные темы в моем файле webpack.mix.js, которые проходят и собирают / следят за всеми этими темами одновременно, но я боюсь, что производительность снизится, когда мы перейдем к масштабированию.В идеале я хотел бы иметь возможность создавать / просматривать темы только по одной, например, npm run dev --theme:some-site или npm run watch --theme:another-site

Вот как будет выглядеть мой webpack.mix.js с такой скоростью, еслиЯ ничего не меняю:

const mix = require('laravel-mix');

// Parent Theme
mix.js('resources/[parent-theme-folder]/assets/js/app.js', 'public/[parent-theme-folder]/js/')
  .sass('resources/[parent-theme-folder]/assets/scss/app.scss', 'public/[parent-theme-folder]/css/')
  ;

// Client 1
mix.js('resources/[child-theme-1-folder]/assets/js/app.js', 'public/[child-theme-1-folder]/js/')
  .sass('resources/[child-theme-1-folder]/assets/scss/app.scss', 'public/[child-theme-1-folder]/css/')
  ;
// Client 2
mix.js('resources/[child-theme-2-folder]/assets/js/app.js', 'public/[child-theme-2-folder]/js/')
  .sass('resources/[child-theme-2-folder]/assets/scss/app.scss', 'public/[child-theme-2-folder]/css/')
  ;
...etc...
// Client 47
mix.js('resources/[child-theme-47-folder]/assets/js/app.js', 'public/[child-theme-47-folder]/js/')
  .sass('resources/[child-theme-47-folder]/assets/scss/app.scss', 'public/[child-theme-47-folder]/css/')
  ;

Есть предложения?Спасибо!

-

Еще немного информации о нашей настройке, если это поможет ...

Мы используем пакет родительских / дочерних тем - igaster/ laravel-theme - для управления несколькими веб-интерфейсами в одном проекте Laravel.По сути, у нас есть 4 типа веб-сайтов и 20-30 клиентов, каждый из которых имеет свой экземпляр до 4-х этих продуктов.Каждый из них имеет свою собственную дочернюю тему, которая расширяет родительскую тему для этого продукта, добавляя любые пользовательские макеты, стили, представления и т. Д. Мы чувствовали, что одним проектом Laravel будет легче управлять, чем настраивать 20-30 различных проектов Laravel для каждого.клиент, особенно когда дело доходит до управления обслуживанием и обновлениями.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Согласно документации , вы можете использовать переменные окружения, чтобы вводить параметры в Laravel Mix.Объедините это с пользовательским скриптом в вашем package.json, и вы получите то, что вы хотите.

По умолчанию package.json поставляется со следующими двумя сценариями (и более):

"scripts": {
    "dev": "npm run development",
    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
}

Простодобавьте свой собственный скрипт в качестве оболочки:

"scripts": {
    "dev": "npm run development",
    "dev:customer1": "cross-env MIX_CUSTOMER=customer1 npm run dev"
}

Конечно, это работает и с пряжей ...

В вашем webpack.mix.js вы можете просто запроситьПеременная среды для создания только одного клиента:

const mix = require('laravel-mix');

// Parent Theme
mix.js('resources/[parent-theme-folder]/assets/js/app.js', 'public/[parent-theme-folder]/js/')
  .sass('resources/[parent-theme-folder]/assets/scss/app.scss', 'public/[parent-theme-folder]/css/');

if (process.env.MIX_CUSTOMER === 'customer1') {
    mix.js('resources/[child-theme-1-folder]/assets/js/app.js', 'public/[child-theme-1-folder]/js/')
      .sass('resources/[child-theme-1-folder]/assets/scss/app.scss', 'public/[child-theme-1-folder]/css/');
}

if (process.env.MIX_CUSTOMER === 'customer2') {
    mix.js('resources/[child-theme-2-folder]/assets/js/app.js', 'public/[child-theme-2-folder]/js/')
      .sass('resources/[child-theme-2-folder]/assets/scss/app.scss', 'public/[child-theme-2-folder]/css/');
}

Чтобы упростить webpack.mix.js, вы также можете сделать следующее при использовании переменной среды:

const mix = require('laravel-mix');

// Parent Theme
mix.js('resources/[parent-theme-folder]/assets/js/app.js', 'public/[parent-theme-folder]/js/')
  .sass('resources/[parent-theme-folder]/assets/scss/app.scss', 'public/[parent-theme-folder]/css/');

function buildCustomerAssets(customerFolder)
{
    mix.js(`resources/${customerFolder}/assets/js/app.js', 'public/${customerFolder}/js/')
      .sass('resources/${customerFolder}/assets/scss/app.scss', 'public/${customerFolder}/css/');
}

var customers = {
    'customer1': 'child-theme-1-folder',
    'customer2': 'child-theme-2-folder',
};

if (process.env.MIX_CUSTOMER) {
    var customerFolder = customers[process.env.MIX_CUSTOMER];
    buildCustomerAssets(customerFolder);
} else {
    for (const customerFolder of Object.values(customers)) {
        buildCustomerAssets(folder);
    }
}

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

0 голосов
/ 20 сентября 2019

Я закончил с техникой, описанной во многих деталях в статье compulsivecoders , но с некоторыми личными изменениями.Я не буду перефразировать всю их статью и объяснять каждую строку, но я включу каждую строку кода, которая вам понадобится для дублирования моей настройки ниже.

-

Сначала запустите npm install laravel-mix-merge-manifest.Эта часть необходима, если вы хотите использовать mix() в своих представлениях, чтобы найти ресурсы css / js и включить очистку кеша.В противном случае, каждый раз, когда вы запускаете npm run dev/watch/etc --theme=theme-name, он перезаписывает предыдущую тему в вашем файле mix-manifest.json , и вы получаете ошибки Laravel, которые не могут найти ваши ресурсы.Вы на самом деле будете использовать этот пакет в файлах миксов вашей темы в конце.

Затем удалите все в файле webpack.mix.js в корне и вставьте:

// webpack.mix.js
try {
    require(`${__dirname}/webpack/webpack.${process.env.npm_config_theme}.mix.js`)
} catch (ex) {
    console.log(
        '\x1b[41m%s\x1b[0m',
        'Provide correct --theme argument to build, e.g.: `npm run watch --theme=theme1` or `npm run dev --theme=theme2`'
    )
    throw new Error('Provide correct --theme argument to build: `npm run watch --theme=theme1` or `npm run dev --theme=theme2`')
}
// ...that's it. Nothing is ever managed in this file.

Я подправил это из примера в статье.Мне не нравилось использовать if() для поиска в массиве всех названий ваших тем, потому что это была еще одна вещь, которую нужно обновить при добавлении / удалении тем, поэтому я просто использую try {}, которая выдастошибка, если не удается найти файл webpack.mix этой темы.Возможно, вы могли бы написать что-нибудь, что бы найти и зациклить все ваши файлы миксов и собрать все сразу, но это не является необходимым в моем случае использования или производительности, когда у меня столько тем, сколько у меня.

Затем создайте / webpack / webpack. [Theme] .mix.js файл для каждой темы.Я поместил свой в папку / webpack / только потому, что не хотел, чтобы в моем корне было более 50 таких файлов.Обратите внимание, что папка / webpack / указана в третьей строке файла webpack.mix.js выше, поэтому измените эту ссылку, если хотите, чтобы она была где-то еще.Вот пример одного из моих, но ваш, очевидно, будет отличаться.

// /webpack/webpack.my-theme-1.mix.js
const mix = require('laravel-mix');
require('laravel-mix-merge-manifest');

mix.js('resources/my-theme-1/assets/js/app.js', 'public/my-theme-1/js/').sourceMaps().version()
   .sass('resources/my-theme-1/assets/scss/app.scss', 'public/my-theme-1/css/').sourceMaps().version()
   .mergeManifest();

Обратите внимание на две ссылки на манифест слияния.Эти две вещи требуются в каждой теме.

Наконец, вы можете запустить все свои обычные команды сборки, передав аргумент --theme = [theme-name], например:

npm run dev --theme=my-theme-1
npm run watch --theme=my-theme-2
npm run prod --theme=my-parent-theme-1

Я лично разделил свой терминал и запустил watch как на своей дочерней, так и на родительской темах, поскольку я начинаю их создавать, но как только моя родительская тема станет стабильной, мне просто нужно будет просмотреть свои дочерние темы.

Пока все отлично работает, но я открыт для критики.Спасибо всем за помощь, которая вывела меня на правильный путь.

...