Я пытаюсь использовать Grunt в качестве инструмента для сборки моего веб-приложения.
Я хочу иметь как минимум две настройки:
I. Настройка разработки - загрузка сценариев из отдельных файлов без объединения,
поэтому мой index.html будет выглядеть примерно так:
<!DOCTYPE html>
<html>
<head>
<script src="js/module1.js" />
<script src="js/module2.js" />
<script src="js/module3.js" />
...
</head>
<body></body>
</html>
II. Настройка производства - загрузите мои сценарии, сведенные и объединенные в один файл,
с index.html соответственно:
<!DOCTYPE html>
<html>
<head>
<script src="js/MyApp-all.min.js" />
</head>
<body></body>
</html>
Вопрос в том, как я могу заставить grunt сделать эти index.html в зависимости от конфигурации при запуске grunt dev
или grunt prod
?
Или, может быть, я копаю в неправильном направлении, и было бы легче всегда генерировать, MyApp-all.min.js
но поместить в него либо все мои сценарии (сцепленные), либо сценарий загрузчика, который асинхронно загружает эти сценарии из отдельных файлов?
Как вы это делаете, ребята?
источник
Ответы:
Я недавно обнаружил эти
v0.4.0
совместимые с Grunt задачи:Грунт-предобработка
Грунт-окр
Ниже приведены отрывки из моего
Gruntfile.js
.Настройка ENV:
Preprocess:
Задачи:
И в
/src/tmpl/index.html
файле шаблона (например):Я уверен, что мои настройки отличаются от большинства людей, и полезность выше будет зависеть от вашей ситуации. Для меня, хотя это потрясающий кусок кода, Yeoman grunt-usemin является более надежным, чем мне лично нужно.
ПРИМЕЧАНИЕ. Я только что обнаружил перечисленные выше задачи сегодня, поэтому я могу пропустить функцию и / или мой процесс может измениться в будущем. На данный момент я люблю простоту и возможности, которые могут предложить grunt-preprocess и grunt-env . :)
Январь 2014 обновление:
По мотивам отрицательного голоса ...
Когда я опубликовал этот ответ, у Grunt было не так много вариантов,
0.4.x
которые предлагали бы решение, которое бы работало для моих нужд. Теперь, спустя месяцы, я бы предположил, что есть больше вариантов, которые могли бы быть лучше, чем я разместил здесь. Хотя я все еще лично использую эту технику для своих сборок и получаю от нее удовольствие , я прошу будущих читателей найти время, чтобы прочитать другие ответы и изучить все варианты. Если вы найдете лучшее решение, пожалуйста, оставьте свой ответ здесь.Обновление за февраль 2014 года:
Я не уверен, поможет ли это кому-либо, но я создал этот демо-репозиторий на GitHub, который показывает полную (и более сложную настройку) с использованием техники, которую я описал выше.
источник
path : '/<%= pkg.name %>/dist/<%= pkg.version %>/<%= now %>/<%= ver %>'
переменную, которая объединяет все переменные (это мой путь сборки). На моем шаблоне я буду иметь:<script src="http://cdn.foo.com<!-- @echo path -->/js/bulldog.min.js"></script>
. В любом случае, я счастлив, что смог сэкономить вам время! : Ddata
объект для dev / prod.Я придумал свое собственное решение. Еще не отполировано, но я думаю, что буду двигаться в этом направлении.
По сути, я использую grunt.template.process (), чтобы сгенерировать my
index.html
из шаблона, который анализирует текущую конфигурацию и создает либо список моих исходных файлов, либо ссылки на один файл с уменьшенным кодом. Приведенный ниже пример относится к js-файлам, но тот же подход можно распространить на css и любые другие возможные текстовые файлы.grunt.js
:index.js (the index task)
:Наконец,
index.tmpl
с логикой генерации, запеченной в:UPD. Выяснилось, что у Yeoman , основанного на grunt, есть встроенная задача usemin, которая интегрируется с системой сборки Yeoman. Он генерирует производственную версию index.html на основе информации в разрабатываемой версии index.html, а также других параметров среды. Немного сложнее, но интересно смотреть.
источник
grunt.template.process()
(которую вы здесь используете), которая сделает это еще проще. Вы можете сделать то же самое, используя grunt-template , просто передав другойdata
объект для dev / prod.Мне не нравятся решения здесь (включая то, которое я ранее дал ) и вот почему:
Я выяснил, как решить обе эти проблемы. Я настроил свою задачу, чтобы при каждом добавлении или удалении файла автоматически генерировались теги сценария, отражающие это. Таким образом, вам не нужно изменять html-файл или файл grunt при добавлении / удалении / переименовании файлов JS.
Чтобы подвести итог, как это работает, у меня есть HTML-шаблон с переменной для тегов сценария. Я использую https://github.com/alanshaw/grunt-include-replace для заполнения этой переменной. В режиме разработки эта переменная исходит из шаблона глобализации всех моих файлов JS. Задача наблюдения пересчитывает это значение при добавлении или удалении файла JS.
Теперь, чтобы получить разные результаты в режиме dev или prod, вы просто заполняете эту переменную другим значением. Вот некоторый код:
jsSrcFileArray
это ваш типичный грубый файл-шаблон.jsScriptTags
беретjsSrcFileArray
и объединяет их вместе сscript
тегами с обеих сторон.destPath
это префикс, который я хочу для каждого файла.А вот как выглядит HTML:
Теперь, как вы можете видеть в конфигурации, я генерирую значение этой переменной как жестко закодированный
script
тег, когда он запускается вprod
режиме. В режиме разработки эта переменная будет расширена до значения, подобного этому:Дайте знать, если у вас появятся вопросы.
PS: Это безумное количество кода для того, что я хотел бы сделать в каждом клиентском JS-приложении. Я надеюсь, что кто-то может превратить это в плагин многократного использования. Может быть, я когда-нибудь.
источник
I've set up my grunt task so that every time a file is added or deleted, the script tags automatically get generated to reflect that
Как ты это сделал?<script>
тегов?destPath
изjsScriptTags
и поменялсяgrunt.file.expandMapping
сgrunt.file.expand
как файлами , которые я хотел уже были в правильных местах. Это многое упростило. Спасибо @DanielKaplan, вы сэкономили мне огромное количество времени :)Некоторое время я задавал себе тот же вопрос, и я думаю, что этот плагин grunt может быть настроен на то, что вы хотите: https://npmjs.org/package/grunt-targethtml . Он реализует условные HTML-теги, которые зависят от целевой цели.
источник
Я искал более простое, прямое решение, поэтому я объединил ответ на этот вопрос:
Как разместить если еще блок в gruntfile.js
и придумал следующие простые шаги:
Используйте следующую логику в блоке concat / copy вашего Gruntfile.js для вашего файла index.html:
запустите 'grunt --Release', чтобы выбрать файл index-production.html и снимите флажок, чтобы получить версию для разработки.
Нет новых плагинов для добавления или настройки и нет новых задач.
источник
Эта грубая задача с именем scriptlinker выглядит как простой способ добавить сценарии в режиме разработки. Вероятно, вы могли бы сначала запустить задачу concat, а затем указать ее на свой сцепленный файл в режиме prod.
источник
<!--SINON COMPONENT SCRIPTS-->
и<!--SPEC SCRIPTS-->
. И вот задача Grunt, которая делает это (фактическая рабочая, в отличие от материала в документах). Надеюсь, это поможет;)grunt-dom-munger читает и манипулирует HTML с помощью селекторов CSS. Ex. читать теги из вашего HTML. Удалить узлы, добавить узлы и многое другое.
Вы можете использовать grunt-dom-munger, чтобы прочитать все ваши файлы JS, связанные с вашим index.html, увеличить их, а затем снова использовать grunt-dom-munger, чтобы изменить ваш index.html и связать только минимизированный JS.
источник
Я нашел плагин grunt под названием grunt-dev-prod-switch. Все, что он делает - это закомментирует определенные блоки, которые ищет, основываясь на опции --env, которую вы передаете grunt (хотя она ограничивает вас dev, prod и test).
Как только вы установите его, как описано здесь , вы можете запустить, например:
grunt serve --env=dev
и все, что он делает, это закомментирует блоки, которые обернутыи это раскомментирует блоки, которые обернуты
Он также работает на JavaScript, я использую его для настройки правильного IP-адреса для подключения к моему внутреннему API. Блоки просто меняются на
В вашем случае это было бы так просто:
источник
grunt-bake - это фантастический сценарий grunt, который бы отлично работал здесь. Я использую это в моем сценарии автоматической сборки JQM.
https://github.com/imaginethepoet/autojqmphonegap
Взгляните на мой файл grunt.coffee:
Он просматривает все файлы в base.html и всасывает их, чтобы создать index.html, который отлично работает для многостраничных приложений (phonegap). Это упрощает разработку, поскольку все разработчики не работают над одним длинным одностраничным приложением (что предотвращает множество проверок на конфликты). Вместо этого вы можете разбивать страницы и работать с более мелкими кусками кода и компилировать до полной страницы с помощью команды watch.
Bake читает шаблон из base.html и внедряет html-страницы компонента в часы.
Демоверсии jQuery для мобильных устройств
app.initialize ();
Вы можете сделать еще один шаг вперед и добавить на свои страницы инъекции для «меню», «всплывающих окон» и т. Д., Чтобы вы могли по-настоящему разбить страницы на более мелкие управляемые компоненты.
источник
Используйте сочетание wiredep https://github.com/taptapship/wiredep и usemin https://github.com/yeoman/grunt-usemin , чтобы grunt позаботился об этих задачах. Wiredep будет добавлять ваши зависимости по одному файлу сценария за раз, а usemin объединит их все в один файл для производства. Это может быть достигнуто только с некоторыми комментариями HTML. Например, мои пакеты bower автоматически включаются и добавляются в html при запуске
bower install && grunt bowerInstall
:источник
Этот ответ не для нубов!
Использование шаблонов Jade ... передача переменных в шаблон Jade - стандартный вариант использования болота
Я использую grunt (grunt-contrib-jade), но вам не нужно использовать grunt. Просто используйте стандартный npm jade модуль.
Если вы используете grunt, то ваш gruntfile хотел бы что-то вроде ...
Теперь мы можем легко получить доступ к данным, переданным grunt в шаблоне Jade.
Подобно подходу, используемому Modernizr, я установил класс CSS для тега HTML в соответствии со значением переданной переменной и могу использовать оттуда логику JavaScript в зависимости от того, присутствует класс CSS или нет.
Это замечательно, если вы используете Angular, так как вы можете использовать ng-if для включения элементов на странице в зависимости от того, присутствует ли класс.
Например, я мог бы включить скрипт, если класс присутствует ...
(Например, я могу включить скрипт живой перезагрузки в dev, но не в производство)
источник
Рассмотрим processhtml . Это позволяет определять несколько «целей» для сборок. Комментарии используются для условного включения или исключения материала из HTML:
становится
Это даже подразумевает делать изящные вещи, как это (см. README ):
источник