1

我正在使用 grunt withcssmin来缩小和连接 css 文件。Css 文件很好地连接和缩小,但是当我尝试在“ Sources”选项卡下的 chrome 开发工具中查看非缩小文件时,文件显示为空。这是我的cssmin任务:

cssmin: {
    options: {
        report: 'gzip',
        keepSpecialComments: 0,
        sourceMap: true,
        outputSourceFiles: true
    },
    target: {
        files: {
            'web/assets/dist/css/vendors.min.css': [
                'bower_components/bootstrap/dist/css/bootstrap.min.css',
                'bower_components/chosen/chosen.min.css',
                'bower_components/slabText/css/slabtext.css',
                'bower_components/video.js/dist/video-js.css',
                'bower_components/video.js/dist/video-js.css'
            ],
            'web/assets/dist/css/app.min.css': [
                'app/Resources/assets/css/jumbotron-narrow.css',
                'app/Resources/assets/css/custom.css',
            ],
        }
    }
},

在 chrome 下启用源映射设置。 web/assets/dist/css/app.min.css.map看起来像这样:

{
    "version":3,
    "sources":["app/Resources/assets/css/jumbotron-narrow.css","app/Resources/assets/css/custom.css"],
    "names":[],
    "mappings":"AAeA,QAdA,KAeI,eAAgB,KADpB,QA6BA,WAEI,cAAe,IAAI,MAAM,QA7C7B,KACI,YAAa,KCUb,YAAa,eAAkB,WDHnC,QAFA,QACA,WAEI,cAAe,KACf,aAAc,KASlB,WACI,WAAY,EACZ,cAAe,EACf,YAAa,KAIjB,QACI,YAAa,KACb,MAAO,KACP,WAAY,IAAI,MAAM,QAI1B,yBACI,WACI,UAAW,OAGnB,qBACI,OAAQ,KAAK,EAIjB,WACI,WAAY,OAGhB,gBACI,QAAS,KAAK,KACd,UAAW,KAIf,WACI,OAAQ,KAAK,EAEjB,gBACI,WAAY,KAIhB,oCAII,QAFA,QACA,WAEI,cAAe,EACf,aAAc,EAGlB,QACI,cAAe,KAGnB,WACI,cAAe,GC3EvB,WACI,YAAa,eACb,IAAK,iCAAkC,mBAG3C,WACI,YAAa,YACb,IAAK,8BAA+B,mBAOxC,GACI,WAAY,KACZ,eAAgB,UAChB,YAAa,EACb,YAAa,YAAe,WAC5B,YAAa,EAAI,EAAI,IAAI,KAG7B,4BACI,QAAS,MACT,YAAa,KACb,aAAc,KACd,cAAe,IAGnB,UACI,UAAW,MACX,WAAY,KAIhB,oBACI,MAAO,IAGX,sBACI,gBAAiB,KACjB,YAAa,EAGjB,cACI,aAAc,QAIlB,iCACI,QAAS"
 } 

来自我的 package.json 的版本:

 "grunt-contrib-cssmin": "^0.12.0",

我究竟做错了什么?

4

2 回答 2

0

编辑:首先,尝试root在您options的中指定 a ,Gruntfile.js如下所示:

// ...
cssmin: {
  options: {
    // ...
    root: 'web/assets/dist/css/' // <-- Add this too.
  },
  target: {
    // ...
  }
  /...

问题

生成的sourceMap文件grunt-contrib-cssmin错误地指定了sources数组中的路径。生成的sourceMap应如下所示:

app.min.css.map

{
  "version":3,
  "sources":[
    "../../../../app/Resources/assets/css/jumbotron-narrow.css",
    "../../../../app/Resources/assets/css/custom.css"
  ],
  "names":[],
  "mappings":"AAeA,QAdA,KAeI,eAAgB,KADpB,QA6BA,WAEI,cAAe,IAAI,MAAM,QA7C7B,KACI,YAAa,KCUb,YAAa,eAAkB,WDHnC,QAFA,QACA,WAEI,cAAe,KACf,aAAc,KASlB,WACI,WAAY,EACZ,cAAe,EACf,YAAa,KAIjB,QACI,YAAa,KACb,MAAO,KACP,WAAY,IAAI,MAAM,QAI1B,yBACI,WACI,UAAW,OAGnB,qBACI,OAAQ,KAAK,EAIjB,WACI,WAAY,OAGhB,gBACI,QAAS,KAAK,KACd,UAAW,KAIf,WACI,OAAQ,KAAK,EAEjB,gBACI,WAAY,KAIhB,oCAII,QAFA,QACA,WAEI,cAAe,EACf,aAAc,EAGlB,QACI,cAAe,KAGnB,WACI,cAAe,GC3EvB,WACI,YAAa,eACb,IAAK,iCAAkC,mBAG3C,WACI,YAAa,YACb,IAAK,8BAA+B,mBAOxC,GACI,WAAY,KACZ,eAAgB,UAChB,YAAa,EACb,YAAa,YAAe,WAC5B,YAAa,EAAI,EAAI,IAAI,KAG7B,4BACI,QAAS,MACT,YAAa,KACb,aAAc,KACd,cAAe,IAGnB,UACI,UAAW,MACX,WAAY,KAIhB,oBACI,MAAO,IAGX,sBACI,gBAAiB,KACjB,YAAa,EAGjB,cACI,aAAc,QAIlB,iCACI,QAAS"
}

请注意添加到 Array 中每个路径的sourceRoot前缀。../../../../sources

SourceMap 规范中有一节内容如下:

解析源

如果在添加“sourceRoot”之后源不是绝对 URL,则源将相对于 SourceMap 进行解析(如解析 html 文档中的脚本 src)。

如果指定root路径(如最初提到的)不能解决问题,那么它表明规范的这一部分没有被grunt-contrib-cssmin.


替代解决方案

如果最初建议的修复不起作用,那么考虑添加一个自定义任务来调用一个函数,该函数在sourceMap(s)创建后修复每个sources路径。grunt-contrib-cssmin

你可以这样做:

Gruntfile.js

module.exports = function (grunt) {

  grunt.initConfig( {
    cssmin: {
      options: {
        report: 'gzip',
        keepSpecialComments: 0,
        sourceMap: true,
        outputSourceFiles: true
      },
      target: {
        files: {
          'web/assets/dist/css/vendors.min.css': [
            'bower_components/bootstrap/dist/css/bootstrap.min.css',
            'bower_components/chosen/chosen.min.css',
            'bower_components/slabText/css/slabtext.css',
            'bower_components/video.js/dist/video-js.css'
          ],
          'web/assets/dist/css/app.min.css': [
            'app/Resources/assets/css/jumbotron-narrow.css',
            'app/Resources/assets/css/custom.css'
          ]
        }
      }
    }
  });

  /**
   * Helper function prefixes sources paths in sourceMap files with a sourceRoot.
   *
   * `grunt-contrib-cssmin` does not apply the correct sourceRoot for each
   * path in the `sources` Array. See github issue #248 for further info:
   * (https://github.com/gruntjs/grunt-contrib-cssmin/issues/248)
   * 
   * @param {String} filePath - The path to the sourceMap to fix.
   * @param {String} sourceRootPrefix - The sourceRoot prefix e.g. ../../
   */
  function prefixSourceMap(filePath, sourceRootPrefix) {
    var json = grunt.file.readJSON(filePath);
    json.sources = json.sources.map(function (_path) {
      return sourceRootPrefix + _path;
    });
    grunt.file.write(filePath, JSON.stringify(json));
  }

  // Register Task to invoke function for fixing paths in each sourceMap file.
  grunt.registerTask('fixSourceMaps', 'Fix paths in each sourceMap', function () {
    prefixSourceMap('web/assets/dist/css/vendors.min.css.map', '../../../../');
    prefixSourceMap('web/assets/dist/css/app.min.css.map', '../../../../');
  });

  grunt.loadNpmTasks('grunt-contrib-cssmin');

  grunt.registerTask("default", [
    'cssmin',
    'fixSourceMaps' // <-- Must be after cssmin tasks.
  ]);
};

笔记

  1. 名为的自定义grunt.registertask为每个要修复的 sourceMap 文件调用fixSourceMapsprefixSourceMap函数。

  2. 两个参数被传递给prefixSourceMap函数,即:

    • filePath- 要修复的 sourceMap 的路径。
    • sourceRootPrefix- sourceRoot 前缀,例如../../
  3. 为了修复两个sourceMap文件 (vendors.min.css.mapapp.min.css.map),sourceRootPrefix参数被指定为- 由于结果文件和它在目录结构中原始未压缩源文件的位置../../../../之间的关系,这被指定为四个级别。.min.css.css

如果您要向您的任务添加另一组.css要缩小的文件,其中结果文件和未缩小的源文件cssmin.target.files之间的关系不是四个级别,您将需要指定不同的值。.min.css.csssourceRootPrefix

例如,让我们在cssmin.target.files下面的 css 中说要缩小:

// ...
target: {
  files: {
    //...
    'web/assets/quux.min.css': [ // <-- Two levels deep
      'path/to/file/foo.css',
      'path/to/file/baz.css'
    ],
    // ...
  }
}
// ...

由于结果quux.min.css保存在两层深的目录中,因此sourceRootPrefix参数将prefixSoureMap作为'../../'. 例如:

//...
grunt.registerTask('fixSourceMaps', 'Fix paths in each sourceMap', function () {
  prefixSourceMap('web/assets/quux.min.css.map', '../../');
  //...
});
//...
于 2017-10-05T11:07:46.423 回答
0

正如上面评论中所解释的,我的 Gruntfile 中有两个问题:

  • root@RobC 解释的缺少指令
  • 网络服务器无法访问原始资产,因此我将它们移动到虚拟主机的网络根目录下的某个位置。就我而言web/assets。这是我cssmin现在正在执行的任务:

    cssmin: {
        options: {
            root: 'web/assets/dist/css/',
            report: 'gzip',
            keepSpecialComments: 0,
            sourceMap: true,
            outputSourceFiles: true
        },
        target: {
            files: {
                'web/assets/dist/css/app.min.css': [
                    'web/assets/css/jumbotron-narrow.css',
                    'web/assets/css/custom.css',
                ],
            }
        }
    },
    
于 2017-10-06T12:48:53.470 回答