Как избавиться от тегов grunt-processhtml "<link rel =....>"
Я пытаюсь динамически загрузить некоторые CSS-файлы из Javascript.
Snippet:
if (theme === 'testtheme' || theme === 'testtheme/') {
css =
<!-- build:css({.tmp,app}) styles/main_testtheme.css -->
'<link rel="stylesheet" href="styles/css/main_testtheme.css" type="text/css" />'
<!-- endbuild -->
;
} else {
css =
<!-- build:css({.tmp,app}) styles/main.css -->
'<link rel="stylesheet" href="styles/css/main.css" type="text/css" />'
<!-- endbuild -->
;
}
Однако задача grunt-build заменяет весь текст между комментариями сборки на что-то вроде:
<link rel="stylesheet" href="styles/e59b065a.main.css">
таким образом удаляя строковые кавычки и делая код недействительным.
Как я хотел бы запустить:
<!-- build:css({.tmp,app}) styles/main.css -->
css = 'styles/css/main.css';
<!-- endbuild -->
должно привести к:
css = 'styles/e59b065a.main.css';
Это позволило бы протестировать как unminified (unbuilt), так и minified версии. Сборка Grunt занимает у меня около 5 минут, поэтому я стараюсь избегать этого во время разработки.
Редактировать: я, вероятно, могу переопределить стандартное blockReplacement for css (см. https://github.com/yeoman/grunt-usemin), но после этого будет больно всем, кто придет позже, попытаться выяснить, почему их таблица стилей не встроен правильно.
1 ответ
Я все еще не смог найти приемлемое решение для этого, но вот то, которое работает, пока:
Фрагмент Gruntfile.js:
useminPrepare: {
html: ['<%= yeoman.app %>/index.html', '<%= yeoman.app %>/includes.html'],
options: {
dest: '<%= yeoman.dist %>',
flow: {
// i'm using this config for all targets, not only 'html'
steps: {
// Here you define your flow for your custom block
cssQuoted: ['concat', 'cssmin'],
// use the option below where you have minified files that you just want to concatenate
concatjs: ['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: {}
}
}
},
usemin: {
//css_name: ['<%= yeoman.dist %>/{,*/}*.html'],
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
options: {
//patterns: {
// html: [
// [ /cssHrefString\s+=\s+['"]([^"']+)["']/gm, 'Update the HTML to reference our revved/min CSS and add quotes' ]
// ]
//},
blockReplacements: {
cssQuoted: function(block){
return '\'<link rel="stylesheet" href="' + block.dest + '">\'';
},
concatjs: function (block) {
return '<script src="' + block.dest + '"></script>';
}
}
}
},
Фрагмент script.js:
var theme = getUrlParameter('theme');
var cssHrefString;
// we need fully qualified css tags below otherwise grunt build will not be able to pick them up
if (theme === 'testtheme' || theme === 'testtheme/') {
cssHrefString =
<!-- build:cssQuoted({.tmp,app}) styles/main_testtheme.css -->
'<link rel="stylesheet" href="styles/css/main_testtheme.css">'
<!-- endbuild -->
;
} else {
cssHrefString =
<!-- build:cssQuoted({.tmp,app}) styles/main.css -->
'<link rel="stylesheet" href="styles/css/main.css">'
<!-- endbuild -->
;
}
$('head').append(cssHrefString);
Конфигурационный файл grunt добавляет определение для concatjs - задачи, которые объединяют только минимизированные файлы, но не запускают на них uglifier. cssQuoted, который принимает строку между блоками и заменяет ее тегом "link rel =...", заключенным в кавычки.
Убедитесь, что версия вашего плагина grunt-usemin актуальна - я потерял несколько часов, пытаясь найти варианты со старой версией (~0.1.3). Код выше работает с 3.0.0.