Как удалить javascript во время компиляции grunt-usemin

У меня есть код, который упрощает и быстро записывает/тестирует код, этот код не принадлежит моему производственному коду (в основном он извиняет сервер, поэтому мне нужен только сервер grunt).

Две части этого: один из них - это удаление частей script

angular.module('nglaborcallApp', [
'ngCookies',
'ngResource',
'ngSanitize',
'ngRoute',
'server_mocks',  // Don't want this line in the production build
'dialogs'

]

а затем раздел index.html, который должен уйти

<!-- build:js({.tmp,app}) scripts/mocks/mocks.js -->
<script type='text/javascript'>var Mocks = {};</script>
<script src='scripts/mocks/jobs.js'></script>
<script src='scripts/mock.js'></script>
<!-- endbuild -->

Так что это могут быть 2 вопроса. Я ничего не вижу в документации по usemin, поэтому я предполагаю, что есть другой инструмент, но я не знаю, как это называется.

Другая возможность заключается в том, что я делаю это неправильно и вместо того, чтобы вводить этот издевательский объект, я должен делать это с помощью сервера grunt. Что делают остальные?

Ответ 1

Хорошо, так наткнулся на ответ, ища что-то еще, и так как никто еще не ответил. Вот как я это решил:

Вы получаете копию Grunt Preprocess с

npm install --save-dev grunt-preprocess

Затем вы изменяете свой GruntFile.js так (это для проекта angular, YMMV)

module.exports = function (grunt) {
    grunt.loadNpmTasks('grunt-preprocess');      <-- Add this line near the top of the file

добавить это в свой список подзадач

    preprocess : {
        options: {
            inline: true,
            context : {
                DEBUG: false
            }
        },
        html : {
            src : [
                '<%= yeoman.dist %>/index.html', 
                '<%= yeoman.dist %>/views/*.html'
            ]
        },
        js : {
            src: '.tmp/concat/scripts/*.js'
        }
    },

Измените зарегистрированные задачи (внизу файла), например thils:

grunt.registerTask('build', [
    'clean:dist',
    'useminPrepare',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'preprocess:js',  // Remove DEBUG code from production builds
    'preprocess:html',  // Remove DEBUG code from production builds
    'ngmin',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'rev',
    'usemin'
]);

Затем измените существующий код javascript примерно так:

// @if DEBUG
'server_mocks',  // Won't be included in production builds
// @endif

и ваш существующий html-код примерно так:

<!-- @if DEBUG -->
<script src='scripts/mock.js'></script>  <!-- Won't be included in production builds -->
<!-- @endif -->

Ответ 2

Взгляните на dom munger (https://github.com/cgross/grunt-dom-munger), вы можете предоставить элементы, которые вы хотите удалить, с определенным атрибутом или идентификаторами и иметь его удалите их из html файла. Но, что мне больше нравится, нужно, чтобы он добавлял через append или prepend нежелательный элемент, когда я указывал цель dev. Он сохраняет оригинальный очиститель HTML. Однако я не делю с удалением частей javascript. В зависимости от того, что еще находится в вашем файле js, который вы хотите изменить, вы могли бы ввести в него другую версию файла для вашей версии dev и release.

Удалить примеры:

  • 'script [data-remove = "true" ]' - все элементы script с атрибутом data-remove и значением true.
  • '# removeMe' - элемент с идентификатором removeMe

Добавить примеры:

  • {selector: 'html', html: '< script src= \' scripts/mock.js\' > </script> '} - добавьте указанный html в элемент html

Ответ 3

вот решение, в котором вам не нужны дополнительные инструменты:

как указано в документации, вы можете использовать тип, который не является css/js, и это будет удалено во время сборки

<!-- build:<type>(alternate search path) <path> -->
... HTML Markup, list of script / link tags.
<!-- endbuild -->
  • type: может быть js, css или пользовательский тип с установленной функцией замены блока.
  • Если другой тип, блок будет проигнорирован. Полезно для блоков "только для разработки", которые не будут отображаться в вашей сборке

чтобы вы могли просто сделать что-то вроде этого:

<!-- build:mockJs -->
<script type='text/javascript'>var Mocks = {};</script>
<script src='scripts/mocks/jobs.js'></script>
<script src='scripts/mock.js'></script>
<!-- endbuild -->

EDIT: для javascript вы можете использовать uglifies global definition

http://github.com/gruntjs/grunt-contrib-uglify/blob/master/docs/uglify-examples.md#conditional-compilation

просто выполните конфигурацию uglify в файле grunt:

grunt.initConfig({
   ...
   uglify: { 
      options: { 
         compress: {
            global_defs: {
               "PROD": true
             }
         }
      }
   }
   ...
});

и в js выполните что-то вроде:

var modules = ['ngCookies', 'ngResource',
   'ngSanitize',
   'ngRoute',
   'dialogs'
]

if(!PROD) {
  modules.push('server_mocks');
}

angular.module('nglaborcallApp', modules);

вы также можете добавить этот глобальный JS в блок отладки

<!-- build:mockJs -->
<script type='text/javascript'>var Mocks = {};</script>
<script src='scripts/mocks/jobs.js'></script>
<script src='scripts/mock.js'></script>
<script type='text/javascript'>
   PROD = false;
</script>
<!-- endbuild -->