15

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?

4

6 回答 6

15

1) 修订图像。将图像路径添加到 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)运行咕噜声。

于 2013-12-02T16:41:18.947 回答
10

我已经使用以下方法解决了这个问题。

useminPrepare: {
    html: 'src/index.html',
    options: {
        dest: 'build',
        flow: {
            html: {
                steps: {
                    js: ['concat', 'uglifyjs'],
                    css: ['cssmin']
                },
                post: {}
            }
        }
    }
},
cssmin: {
    options: {
        root: 'src'
    }
}

首先,我们覆盖useminPrepare's flow,从 css 流中删除 concat 任务。这是必需的,因为 concat 会破坏相对路径信息。由于 cssmin 本身会将多个文件连接在一起,因此单独的 concat 任务只会有害。(https://github.com/yeoman/grunt-usemin/issues/225

最后,我们将告诉cssmin您项目的“根”在 Gruntfile 中的位置。这有助于cssmin重写它找到的相对于这个“根”目录的相对 url。

于 2014-01-28T20:03:18.947 回答
6

对我来说修复 CSS background-imagerevving 的方法是在 中添加一个 CSS 模式options,它会在 CSS 中查找所有资产引用并将它们替换为 revved 资产。

// 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']
      ]
    }
  }
},
于 2014-08-27T08:15:54.020 回答
1

我做了一点挖掘,发现了一对看起来可以完成工作的任务: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']
      },
    }
});

据我所知,没有插件可以自动执行此任务。

于 2013-10-31T19:50:07.170 回答
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);
     }
  });
});
于 2013-11-01T09:43:00.717 回答
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将其复制到目录中:.tmpcssmin

    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
]);
于 2014-02-18T03:04:22.870 回答