如何阻止sourcemaps / usemin将css .map <link />标记附加到输出?

时间:2016-03-17 18:24:27

标签: gulp source-maps grunt-usemin gulp-sourcemaps gulp-usemin

gulp-usemin正在生成并附加css sourcemap链接标记以输出html,但不会为js做。如何阻止它附加sourcemap标记?

Gulp任务:

gulp.task('build', function () {
    return gulp.src('templates/**')
        .pipe(usemin({
             css: [sourcemaps.init({ loadMaps: true }), 'concat', cleanCss(), rev(), sourcemaps.write('./')],
             js: [sourcemaps.init({ loadMaps: true }), 'concat', uglify(), rev(), sourcemaps.write('./')]
         }))
        .pipe(gulp.dest('public'));
});

来源HTML:

<!-- build:css css/style.min.css -->
<link href="css/main.css" rel="stylesheet" media="screen">
<link href="css/style.css" rel="stylesheet" media="screen">
<!-- endbuild -->

<!-- build:js js/script.min.js -->
<script src="js/main.js"></script>
<script src="js/script.js"></script>
<!-- endbuild -->

这是结果输出。请注意额外的sourcemap css链接标记,但JS地图没有相应的sourcemap脚本标记。为什么会如此,如何停止为css ??

插入sourcemap标记
<link rel="stylesheet" href="css/style-cd92eb4ce7.min.css.map" media="screen"/>
<link rel="stylesheet" href="css/style-cd92eb4ce7.min.css" media="screen"/>

<script src="js/script-602bf332b2.min.js"></script>

2 个答案:

答案 0 :(得分:2)

如果查看gulp-usemin的源代码,可以看到为什么这适用于JS而不适用于CSS。 gulp-usemin explicitly makes sure仅为<script>结尾的文件创建.js个标记。 CSS有no such check

这可能是gulp-usemin维护者的疏忽,所以你应该确保让他们知道issue tracker

如果您完全没有其他选项且问题未在gulp-usemin本身修复,则此处有解决方法:

var through = require('through2').obj;
var path = require('path');

var writeAndRemoveSourceMaps = through(function(file, enc, cb) {
  if (path.extname(file.path) == '.map') {
    gulp.dest('public').write(file, enc, cb);
    return;
  }
  this.push(file);
  cb();
});

gulp.task('build', function () {
  return gulp.src('templates/**')
    .pipe(usemin({
         css: [
           sourcemaps.init({ loadMaps: true }),
           'concat',
           cleanCss(), 
           rev(), 
           sourcemaps.write('./'),
           writeAndRemoveSourceMaps  // FINAL STAGE IN PIPELINE
         ],
         js: [
           sourcemaps.init({ loadMaps: true }), 
           'concat', 
           uglify(), 
           rev(), 
           sourcemaps.write('./')
         ]
     }))
    .pipe(gulp.dest('public'));
});

上述内容在writeAndRemoveSourceMapscss文件推送到流后立即向sourcemaps.write()管道添加了另一个处理阶段.map。此阶段手动将.map文件写入目标目录,然后再次将其从流中删除,以便它无法到达gulp-usemin并且不会创建<link>标记

答案 1 :(得分:0)

感谢Sven的回答,我能够提出问题,维护者几乎立即通过this commit发布了修复程序。从v.0.3.25开始,该问题不再存在。