#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 итак, какие старые материалы мне нужно удалить? (Та же проблема)