Как определить отдельные потоки в useminPrepare для каждого блока в html-файле?

#angularjs #gruntjs #uglifyjs #grunt-usemin

#angularjs #gruntjs #uglifyjs #grunt-usemin

Вопрос:

У нас есть 2 блока, определенных в нашем index.html — один для сторонних библиотек и один для файлов нашего приложения. Поскольку библиотеки сторонних разработчиков уже уменьшены, мы просто хотим объединить их, но не уродовать. Как я могу это сделать с useminPrepare ?

 <!-- build:js js/lib.js -->
<script src="lib/angular/angular.min.js"></script>
<script src="lib/angular-cookies/angular-cookies.min.js"></script>
<script src="lib/angular-route/angular-route.min.js"></script>
<!-- endbuild -->

 <!-- build:js js/app.js -->
<script src="js/app.js"></script>
<script src="js/controllers/LanguageCtrl.js"></script>
<!-- endbuild -->
  

gruntfile.js:

 useminPrepare: {
        html: '<%= yeoman.app %>/index.html',
        options: {
            dest: '<%= yeoman.dist %>',
            flow: {
                html: {
                    steps: {
                        // TODO for libs.js block I don't want uglify!
                        js: ['concat', 'uglifyjs'], 
                        css: ['cssmin']
                    },
                    post: {}
                }
            }
        }
    }
  

Ответ №1:

Кажется, вам нужно определить свой пользовательский блок. Будет показано на примере — создание пользовательского блока «myjs» только с помощью concat.

Gruntfile.js

 useminPrepare: {
  html: '<%= config.app %>/index.html',
  options: {
    dest: '<%= config.dist %>',
    flow: {
      // i'm using this config for all targets, not only 'html'
      steps: {
        // Here you define your flow for your custom block - only concat
        myjs: ['concat'],
        // Note that you NEED to redefine flow for default blocks... 
        // These below is default flow.
        js: ['concat', 'uglifyjs'],
        css: ['concat', 'cssmin']
      },
      // also you MUST define 'post' field to something not null
      post: {}
    }
  },
},
  

Вам также необходимо определить замену блока для вашего пользовательского блока. Эти блоки должны быть такими же, как для js.

Gruntfile.js:

 usemin: {
  options: {
    assetsDirs: ['<%= config.dist %>', '<%= config.dist %>/images'],
    blockReplacements: {
      // our 'replacement block'
      myjs: function (block) {
        return '<script src="'   block.dest   '"></script>';
      }
      // no need to redefine default blocks
    }
  },
  html: ['<%= config.dist %>/{,*/}*.html'],
  css: ['<%= config.dist %>/styles/{,*/}*.css']
},
  

Итак, теперь вы можете использовать свой новый пользовательский блок в своем index.html:

 <!-- build:myjs js/lib.js -->
  <script src="lib/angular/angular.min.js"></script>
  <script src="lib/angular-cookies/angular-cookies.min.js"></script>
  <script src="lib/angular-route/angular-route.min.js"></script>
<!-- endbuild -->

<!-- build:js js/app.js -->
  <script src="js/app.js"></script>
  <script src="js/controllers/LanguageCtrl.js"></script>
<!-- endbuild -->
  

Теперь это должно работать так, как вы хотите. Я не тестировал этот код, но у меня очень похожая конфигурация в моем приложении, и она работает как шарм. У меня также были некоторые проблемы с определением блоков замены — это было очень неприятно.

Надеюсь, это поможет!

Комментарии:

1. спасибо. Я пробовал это с последней версией grunt-usemin (2.3.0), но это не работает. блок build:myjs заменяется на undefined в index.html .

2. после удаления некоторых старых материалов из моего gruntfile.js это работает! спасибо!

3. @fischermatte какой старый материал вы удалили? У меня такая же проблема

4. @fischermatte итак, какой старый материал? У меня такая же проблема build:myjs gets replaced with undefined

5. @JavierFigueroa итак, какие старые материалы мне нужно удалить? (Та же проблема)