一般我们调试的 js/css 文件都是编译压缩后的,一旦出错很难定位原始的位置,gulp-sourcemaps 的出现帮助我们解决了这个问题。

首先我们看下目录结构:

css
js
  a.js
  b.js
sass
  a.scss
  b.scss
index.htm
gulpfile.js
package.json

我们的目标是 sass 文件夹中的两个文件合并压缩后,放入 css 文件夹中(命名为 main.min.css),js 文件夹中的两个文件合并压缩后,生成新的文件放在 js 文件夹中(命名为 main.min.js),然后 index.htm 页面引用新生成的两个文件。

我们分别从 css 和 js 的角度来介绍如何使用 gulp-sourcemaps。

css

// sass -> css
gulp.task('css', function() {  // 任务名
   return gulp.src('sass/*.scss')  // 目标 sass 文件
    .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
    // // 因为我们的 "时光穿梭机" 希望能回退到 sass 文件,所以加在 sass() 前
    .pipe(sourcemaps.init())
    .pipe(sass())  // sass -> css
    .pipe(gulp.dest('css'))
    .pipe(minifyCss())  // 压缩 css
    .pipe(concat('main.min.css'))  // 合并 css,并命名叫 main.min.css
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('css'))  // 目标目录
});

注意它的两个 API,sourcemaps.write 一般会在 xx.min.css 输出前调用,而 sourcemaps.init 一般在 sass->css 编译前调用,比如 sass() 前调用,这表示最终生成的 xx.min.css 会回溯到 sass() 调用前,也就是 sass 文件中去寻找 "最初的样子"。

可以尝试将 sourcemaps.init 放到不同的地方,如果放到 sass() 后,那么最终会到 a.css 和 b.css 去寻找。

如果不用 "时光穿梭机",我们看到的源文件应该就是 main.min.css。

还有一个问题是,如果调用 sourcemaps.write 不给任何参数,不会生成一个 .map 的文件,而是会把映射加在生成的 css 文件中(我们可以打开 main.min.css 看看)。这样很不友好,我们可以给它加个参数,生成一个独立的 .map 文件:

.pipe(sourcemaps.write(''))  // 路径,相对于下一步骤的相对路径,此处 main.min.css 和 main.min.css.map 在一个目录

这时我们再看 main.min.css 文件,后面只跟了一句话,这也是我们常用的方法。

/*# sourceMappingURL=main.min.css.map */

js

js 和 css 类似。

gulp.task('scripts', function() {  // 这个任务的名称是 scripts
  gulp.src('js/+(a|b).js')  //
    .pipe(sourcemaps.init())  // 我们希望出错能回溯到最原始的文件,也就是 a.js 和 b.js 中去寻找错误的原因
    .pipe(concat('main.min.js'))  // 指定合并并压缩后的文件名
    .pipe(uglify())  // 压缩
    .pipe(sourcemaps.write(''))
    .pipe(gulp.dest('js'));
});

这个时候,如果错误源自 a.js,那么控制台报错,错误文件会指向 a.js。

更多内容可以参考官方文档 https://www.npmjs.com/package/gulp-sourcemaps

「坐上时光机,查找编译压缩后的文件最初的样子」gulp-sourcemaps 使用说明的更多相关文章

  1. 快压、360压缩、WinRAR关于打开快压通过超高压缩比压缩后的文件不兼容的问题

    今天接收了同事发过来的一个压缩文件,用360压缩打开和用WinRAR打开压缩文件,傻眼了,这发的是什么鬼压缩包.压缩包的文件大小有27533KB,用360压缩工具解压查看只有121.5kb,而且完全没 ...

  2. VS2015 编译前/后拷贝文件到指定目录

    项目属性 —> Build Events —>Pre-build / Post-build event command line 中: Copy 源路径 目标路径(将路径用 " ...

  3. html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题

    先上效果 上传图片后(设置了最多上传3张图片,三张后上传按钮消失) 点击图片放大,可以使用删除和旋转按钮 (旋转功能主要是因为ios手机拍照后上传会有写图片被自动旋转,通过旋转功能可以调正) html ...

  4. bootstrap-datetimepicker在经过GC(Google Closure Compiler)压缩后无法使用的解决方案

    将压缩级别由simple改成whitespace 问题就是这样之后压缩后的文件大了很多 <?xml version="1.0"?> <project name=& ...

  5. bzip2 zip 压缩后体积比 0.8:1

    1. 对.bz2 后缀文件 跳过不处理 2.逐行同字段的json文件,压缩后大小为原文件的12.81% 测试文件近似认为为逐行json文本数据,没有进行多文件重复测试,没有统计时间: {"u ...

  6. vue使用webpack压缩后体积过大要怎么优化

    vue使用webPack压缩后存储过大,怎么优化 在生产环境去除developtool选项 在webpack.config.js中设置的developtool选项,仅适用于开发环境,这样会造成打包成的 ...

  7. Grunt: 拼接代码,js丑化(压缩),css压缩,html压缩,观察文件,拷贝文件,删除文件,压缩文件

    准备工作 grunt 基于nodeJs所以 nodeJs需要的基础配置都需要安装 1.Grunt 安装 npm install -g grunt-cli 这是全局安装 2.在当前文件下npm init ...

  8. Linux命令(十八) 压缩或解压缩文件和目录 gzip gunzip

    目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 和 zip 命令类似,gzip 用于文件的压缩,gzip压缩后的文件扩展名为 ".gz",gzip默认压缩后 ...

  9. gzip, gunzip, zcat - 压缩或展开文件

    总揽 gzip [ -acdfhlLnNrtvV19 ] [-S 后缀] [ 文件名 ... ] gunzip [ -acfhlLnNrtvV ] [-S 后缀] [ 文件名 ... ] zcat [ ...

随机推荐

  1. ASP.NET Core 中文文档 第二章 指南(5) 在 Nano Server 上运行ASP.NET Core

    原文 ASP.NET Core on Nano Server 作者 Sourabh Shirhatti 翻译 娄宇(Lyrics) 校对 刘怡(AlexLEWIS).许登洋(Seay).谢炀(kile ...

  2. logstash日志分析的配置和使用

    logstash是一个数据分析软件,主要目的是分析log日志.整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是v ...

  3. A chatroom for all! Part 1 - Introduction to Node.js(转发)

    项目组用到了 Node.js,发现下面这篇文章不错.转发一下.原文地址:<原文>. ------------------------------------------- A chatro ...

  4. 解决NTKO Office中文文件名保存到服务器时出现乱码的问题

    再使用NTKO office控件时,在ntko往服务器提交文件时,中文文件名会出现乱码的问题! 其实解决这个问题可以换一种思路,在ntko往服务器提交文件时英文肯定是不会出现乱码的问题的! 那么想办法 ...

  5. Debian的软件包管理工具命令 (dpkg,apt-get)详解

    本文转载于:http://blog.chinaunix.net/uid-20769502-id-106056.html   1.dpkg包管理工具 dpkg --info "软件包名&quo ...

  6. QML 从无到有 3 (自动更新)

    新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序> ...

  7. Connect to the DSP on C6A8168/DM8168/DM8148 using CCS

    转自ti-wiki  这份wiki,我曾经就收藏过,但是没有加以重视,以至于绕了一大圈的ccs开发环境的配置,现在正式收藏于自己的博客中...总结良多啊 Connecting to DSP on C6 ...

  8. 如何解决MSI类型的Sharepoint Server2016 安装即点即用的office 2016 plus问题

    前提 在sharepoint server 2016安装office 2016 plus提示如下错误: 解决方法 Ø 概念 1. 即点和即用的概念:即点即用是一种通过 Internet 安装和更新 O ...

  9. LaunchScreen.storyboard启动图遇到的坑

    Xcode有时候在LaunchScreen.storyBoard中修改了启动图片之后,运行却没有效果,直接白屏,而往storyboard中拖插件是可以显示的,设置成Assets.xcassets中的其 ...

  10. ReactNative中iOS和Android的style分开设置教程

    reactnative可以编辑iOS程序也可以编辑Android程序, 而且80%的代码都可以重用. 及有些文件是两个系统通用的, 相信大家也都清楚了. 但是也许大家会遇到一些屏幕布局的问题, 最常遇 ...