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を構成してすべての画像のURLを書き換えるにはどうすればよいですか?
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)うなり声を実行します。
私は以下を使用して問題を解決しました。
useminPrepare: {
html: 'src/index.html',
options: {
dest: 'build',
flow: {
html: {
steps: {
js: ['concat', 'uglifyjs'],
css: ['cssmin']
},
post: {}
}
}
}
},
cssmin: {
options: {
root: 'src'
}
}
まず、useminPrepare
のflow
をオーバーライドし、cssフローからconcatタスクを削除します。 concatは相対パス情報を破棄するため、これが必要です。 cssmin自体が複数のファイルを連結するため、sepearte連結タスクは有害なだけです。 ( https://github.com/yeoman/grunt-usemin/issues/225 )
最後に、プロジェクトの「ルート」がGruntfileのどこにあるかをcssmin
に伝えます。これは、cssmin
がこの「ルート」ディレクトリに関連して見つけた相対URLを書き換えるのに役立ちます。
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']
]
}
}
},
少し調べてみると、仕事が完了するように見える2つのタスクが見つかりました: https://github.com/yeoman/grunt-filerev & https: //github.com/richardbolt/grunt-cssurlrev 。これに関する唯一の問題は、次のように、Gruntfile内のパスを手動で構成する必要があることです。
grunt.initConfig({
filerev: {
images: {
src: ['img1.png', 'img2.png'],
dest: 'tmp'
}
},
cssurlrev: {
dist: {
src: ['public/css/*.css']
},
}
});
私の知る限り、このタスクを自動的に実行するプラグインはありません。
新しいタスクを実装する必要がありました。これは私の予備的な実装です。
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);
}
});
});
この問題に対する私のアプローチは、基本的にベンダースタイルごとに個別のstyles/select2/select2.css
を作成することでした。その後、関連するすべての画像をGruntによってstyles/select2
にコピーできます(相対パスや上書きなどを心配する必要はありません)。スクリプトの一部。あれは:
app/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
]);