Автоматическая минимизация с помощью nodeJS и средства запуска задач Gulp

Мне нужны советы по улучшению автоматической минификации с помощью node и gulp.

Основная цель — динамически генерировать минифицированные файлы (для JS и LESS) в режиме разработки и автоматически заменять обычные файлы (js и меньше) на минифицированные файлы в производственном режиме.

Сценарий содержит:

  • NodeJS и ExpressJS для маршрутизации и настройки среды
  • Jade как шаблонизатор
  • Gulp (выполнение задач)

Это моя установка:

ГУЛП

Я использую nodemon для запуска server.js, который запускает мой сервер node. В этом файле gulp у меня есть несколько задач (['watch']) для наблюдения за изменениями в файлах JS и LESS и минимизации их при каждом изменении.

gulp.task('nodemon', function () {
    nodemon({ script: 'server.js'})
        .on('start', ['watch'])
        .on('change', ['watch'])
})

УЗЕЛ

На сервере узла я визуализирую инъекцию представлений и объект, который обнаруживает режим разработки или производства.

  var env= process.env.NODE_ENV = process.env.NODE_ENV || 'development';

  app.get('/', function(req, res){
        res.render('index', {environment: env});
    });

ДЖЕЙД

В представлении внедренный объект сравнивается, чтобы добавить обычные файлы CSS и JS для режима разработки или мини-файлы для режима производства.

 if environment == "development"
            link(rel='stylesheet', href='/vendor/bootstrap/dist/css/bootstrap.css')
  else
            link(rel='stylesheet', href='/vendor/bootstrap/dist/css/bootstrap.min.css')

Это правильный способ сделать это? Должен ли я проверить другие варианты? Я хочу избежать ручной минимизации перед отправкой приложения на сервер каждый раз. Все советы будут приняты для того, чтобы улучшить это.

Лучше делать минификацию при запуске сервера gulp? Как я могу сделать это с помощью Azure?

Спасибо.


person Jorge Guerola    schedule 29.10.2014    source источник


Ответы (2)


Я нашел новое решение для автоматической минификации.

С кодом моего вопроса выше вы можете генерировать в режиме разработки все минифицированные файлы для ручной загрузки на сервер. Может быть в порядке, но если вы сделаете некоторые изменения в css/js, не запустив задачу gulp для минимизации, изменения не будут минимизированы.

Я нашел новое решение, если вы работаете с Azure. В моем новом решении используется KUDU (https://github.com/projectkudu/kudu)

Kudu — это механизм развертывания git на веб-сайтах Azure, который также может работать за пределами Azure. При развертывании в Azure используется команда развертывания по умолчанию, которая устанавливает node и package.json.

С Kudu вы можете создать пользовательскую команду развертывания, чтобы запустить все, что вы хотите (gulp для минимизации, ворчание, тесты и т. д.). В этом случае мы собираемся запустить задачу gulp для минификации.

Прежде всего, мы собираемся установить локально azure-cli для создания пользовательского сценария развертывания для Azure:

npm install -g azure-cli

Затем мы создаем пользовательскую команду

azure site deploymentscript --node

Это добавит в ваш каталог следующие файлы:

  • .развертывание
  • развернуть.cmd

.deployment запускает deploy.cmd (необходим для Azure)

Если вы проверите deploy.cmd, вы увидите, что установлены все необходимые пакеты. Итак, для запуска grunt на сервере нам нужно добавить это в раздел настройки:

IF NOT DEFINED GULP_CMD (
  :: Install gulp
  echo Installing Gulp
  call npm --registry "http://registry.npmjs.org/" install gulp -g --silent
  IF !ERRORLEVEL! NEQ 0 goto error

  :: Locally just running "gulp" would also work
  SET GULP_CMD="%appdata%\npm\gulp.cmd"

)

и измените раздел развертывания следующим образом:

:Deployment
echo Handling node.js deployment.

:: 1. Select node version
call :SelectNodeVersion

:: 2. Install npm packages
IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd !NPM_CMD! install
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)

:: 3. Install npm packages
echo "Execute Gulp"
IF EXIST "%DEPLOYMENT_TARGET%\gulpfile.js" (
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd !GULP_CMD! YOUR_GULP_TASK_TO_EXECUTE
  IF !ERRORLEVEL! NEQ 0 goto error
)

popd

:: 4. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
  IF !ERRORLEVEL! NEQ 0 goto error
)

С этим настраиваемым сценарием развертывания для Azure каждый раз, когда вы выполняете развертывание (отправляете свою ветку в Azure), gulp запускает задачу YOUR_GULP_TASK_TO_EXECUTE (в моем случае «стили» для запуска минификации в файлы .less)

Если во время сценария развертывания будет допущена ошибка, лазурная реализация нашего сайта не удастся (проверьте реестр). Рекомендую запустить локально deploy.cmd, чтобы посмотреть, как будет работать в лазури и не вылетит ли.

Вы можете настроить этот скрипт для запуска, который вы хотите, в каждой отдельной реализации.

Я надеюсь, что это помогает!

person Jorge Guerola    schedule 02.11.2014

То, что я обычно, это именно то, чего вы хотели бы избежать .. :)

Во время разработки у меня есть несколько наблюдателей, которые анализируют js-файлы, переводят стилус в css и генерируют мои статические html-части из jade. Их последний шаг — использовать замечательный плагин gulp-inject для вызова неминифицированных ресурсов в моем индексном файле. Все эти файлы помещаются в папку build.

Когда я хочу протестировать свою производственную среду, у меня есть задача dist, которая берет все ресурсы, присутствующие в папке сборки, объединяет и минимизирует их, применяет суффикс rev к имени для очистки кеша и с помощью gulp-inject. я обновлю файл index.html ссылками на минифицированные активы.

На сервере я проверяю среду и указываю экспрессу (с пакетом serve-static) соответственно обслуживать папки сборки или дистрибутива.

При создании веб-сайта в Azure вы можете указать значение process.env.NODE_ENV, чтобы вы могли работать без изменений кода во время выполнения.

person Ghidello    schedule 30.10.2014
comment
Хорошо, покажите мне gulp-inject, было бы неплохо попробовать. Знаете ли вы, как запустить gulp, когда развертывание выполняется в Azure? Спасибо. - person Jorge Guerola; 31.10.2014
comment
Честно говоря, я никогда не исследовал эту тему: я предпочитаю выполнять все свои оптимизации на этапе разработки и загружать максимально статичный код на сервер. - person Ghidello; 01.11.2014
comment
Посмотри мой ответ, может поможет - person Jorge Guerola; 02.11.2014
comment
Спасибо, это может быть удобно для выполнения тестовой задачи на этапе развертывания. Что касается манипуляций с активами, я все же предпочитаю делать это перед загрузкой на сервер, но еще раз спасибо. - person Ghidello; 03.11.2014