grunt-usemin帮我改造
<link href="/dependencies/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="/dependencies/nanoscroller/bin/css/nanoscroller.css" rel="stylesheet" />
<link href="/dependencies/dropzone/downloads/css/dropzone.css" rel="stylesheet" />
完美组合和缩小的js:
<link href="scripts/8e1991c7.libraries.js" rel="stylesheet" />
在concat,cssmin和uglify之后我有一个几乎完美的文件夹结构,除了图像和它们的位置。
这是我的问题:
所有这些供应商的css文件都包含图像位置。不好的是,他们所有人都在分享不同类型的地点。他们中的一些人在css文件夹中使用图像,而其他人在img文件夹中使用。
如何配置grunt usemin来重写所有图片网址?
答案 0 :(得分:15)
1)Rev图像。将图像路径添加到rev任务中。
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/static/scripts/{,*/}*.js',
'<%= yeoman.dist %>/static/styles/{,*/}*.css',
'<%= yeoman.dist %>/static/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
]
}
}
}
2)将包含图像位置的文件路径添加到usemin任务中。
usemin: {
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/static/styles/{,*/}*.css'],
options: {
assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist%>/static/images'],
}
}
3)跑grunt。
答案 1 :(得分:10)
我使用以下方法解决了这个问题。
useminPrepare: {
html: 'src/index.html',
options: {
dest: 'build',
flow: {
html: {
steps: {
js: ['concat', 'uglifyjs'],
css: ['cssmin']
},
post: {}
}
}
}
},
cssmin: {
options: {
root: 'src'
}
}
首先,我们重写useminPrepare
的{{1}},从css流中删除concat任务。这是必需的,因为concat会破坏相对路径信息。由于cssmin本身会将多个文件连接在一起,因此sepearte concat任务只会有害。 (https://github.com/yeoman/grunt-usemin/issues/225)
最后,我们告诉flow
项目的“根”来自Gruntfile。这有助于cssmin
重写相对于此“根”目录找到的相对URL。
答案 2 :(得分:5)
为我修复CSS background-image
的原因是在options
中添加CSS模式,该模式会在CSS中找到所有资产引用,并将其替换为加速资产。
// Performs rewrites based on rev and the useminPrepare configuration
usemin: {
...
...
options: {
...
...
// This is so we update image references in our ng-templates
patterns: {
js: [
[/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
],
css: [
[/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the CSS to reference our revved images']
]
}
}
},
答案 3 :(得分:1)
我做了一点挖掘,发现了一对他们完成工作的任务:https://github.com/yeoman/grunt-filerev&amp; https://github.com/richardbolt/grunt-cssurlrev。唯一的问题是你必须手动配置Gruntfile中的路径,如下所示:
grunt.initConfig({
filerev: {
images: {
src: ['img1.png', 'img2.png'],
dest: 'tmp'
}
},
cssurlrev: {
dist: {
src: ['public/css/*.css']
},
}
});
据我所知,没有一个插件可以自动执行此任务。
答案 4 :(得分:1)
我必须执行一项新任务。这是我的初步实施。
grunt.registerMultiTask('rewriteCssUrl', 'rewrite url in css', function () {
var options = this.options({
assets: grunt.filerev ? grunt.filerev.summary : {},
postFilter: function identity(input){ return input}
});
var self = this;
var assets = options.assets;
self.filesSrc.forEach(function (file) {
var css = grunt.file.read(file);
var original = css;
css = css.replace(/(?:src=|url\(\s*)['"]?([^'"\)]+)['"]?\s*\)?/gm, function (match, src) {
var key = path.join(path.dirname(file), src);
var asset = assets[path.normalize(key)];
var val = options.postFilter(asset);
return match.replace(src, val || match);
});
if(original !== css) {
grunt.log.writeln('✔ '.green + file + (' was changed.').grey);
grunt.file.write(file, css);
}
});
});
答案 5 :(得分:0)
我解决这个问题的方法是基本上为每个供应商风格创建一个单独的styles/select2/select2.css
,然后Grunt可以将所有相关图像复制到styles/select2
(无需担心相对路径或覆盖等)作为脚本的一部分。那就是:
应用程序/ index.html的
<!-- build:css(.tmp) styles/select2/select2.css -->
<link rel="stylesheet" href="bower_components/select2/select2.css">
<!-- endbuild -->
Gruntfile.js
添加新的copy
任务,在.tmp
最小化之前将供应商样式复制到cssmin
目录中:
copy: {
// this copies bower_components/*.css into .tmp so they can be compiled
styles: {
expand: true,
cwd: '<%= yeoman.app %>',
dest: '.tmp/',
src: [
'styles/{,*/}*.css',
'bower_components/**/*.css'
]
},
dist: ...
然后,一旦它们被最小化,复制相关资产(在这种情况下,我假设只是PNG和GIF图像):
// and once we have compiled all of our stylesheets, we need to also copy over any necessary image files
distAssets: {
expand: true,
cwd: '<%= yeoman.app %>/bower_components',
dest: '<%= yeoman.dist %>/styles',
src: [
'**/*.png',
'**/*.gif'
]
}
},
最后,将新任务添加到build
任务中:
grunt.registerTask('build', [
'clean:dist',
'replace:dist',
'copy:styles', // -- added
'useminPrepare',
// ... etc ...
'copy',
'rev',
'usemin',
'copy:distAssets' // -- added
]);