提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件。但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦。不过也不用担心,souce maps将会帮你解决这一问题。

  Source map提供了一种方式,能够将压缩文件中的代码映射回源文件中对应的位置。这意味着,你可以借助一些软件很轻易地调试应用程序中那些经过优化处理过的资源。Chrome和Firefox提供的开发者工具都内置了对source maps的支持。

  本文将介绍source maps的工作原理,以及如何生成它们。我们将主要关注JavaScript代码的source maps,不过这些原理也同样适用于CSS。

  提示:Firefox开发者工具中的source maps默认是开启的。对于Chrome而言,你可能需要手动启用这一功能(译者:目前看来,Chrome中这一功能默认也是开启的)。在Chrome中打开开发者工具(译者:默认的快捷键是F12),然后找到“设置”面板(译者:开发者工具面板的右上角,点击有三个点的菜单,其中可以找到“Settings”菜单),在“General”选项卡中勾选“Enable JS source maps”和“Enable CSS source maps”(译者:我所使用的Chrome版本中,这两个设置项在“Preferences”选项卡中)。

Source Maps的工作原理

  顾名思义,source map中包含了许多能够将压缩文件中的代码映射回源代码的信息。对于每一个压缩文件,你可以为其指定不同的source map。

  通过在经过优化的压缩文件的末尾添加一行特殊的注释,来告诉浏览器有可用的source map。

//# sourceMappingURL=/path/to/script.js.map

  该注释通常由生成source map的程序自动添加。当浏览器的开发者工具被打开时,如果source maps功能被启用,那么该文件将会被加载。

  你还可以通过在压缩的JavaScript文件的响应中发送X-SourceMap HTTP头来指定source map。

X-SourceMap: /path/to/script.js.map

  Source map文件包含一个JSON对象,用来描述source map文件本身以及JavaScript源文件的一些信息。下面是一个例子:

{
version: 3,
file: "script.js.map",
sources: [
"app.js",
"content.js",
"widget.js"
],
sourceRoot: "/",
names: ["slideUp", "slideDown", "save"],
mappings: "AAA0B,kBAAhBA,QAAOC,SACjBD,OAAOC,OAAO..."
}

  让我们来仔细看看这些属性。

  • version - 此属性用于说明source map文件的版本。
  • file - source map文件的名称。
  • sources - 一组包含源文件URLs的数组。
  • sourceRoot - (可选)sources属性中那些URLs相对路径的根目录。
  • names - 包含源文件中所有变量和函数名称的数组。
  • mappings - 一组包含实际代码映射的Base64 VLQs的字符串(这正是source map起作用的核心)。

使用UglifyJS生成source maps

  UglifyJS是一个很流行的命令行工具,用来合并和压缩JavaScript文件。版本2提供了许多的命令行参数,用来帮助我们生成source maps。

  • --source-map - 生成的source map文件的名称。
  • --source-map-root - (可选)指定source map文件中sourceRoot属性的值。
  • --source-map-url - (可选)在经过优化的压缩文件底部的注释中指定source map文件的路径。如://# sourceMappingURL=/path/to/script.js.map
  • --in-source-map - (可选)输入的source map。假如你正在压缩的JavaScript文件是从另一个源文件生成的。例如JavaScript库。
  • --prefix-p - (可选) 移除source map文件中sources属性里URLs的路径层级。例如,-p 3将会移除路径中的前三级,这样“one/two/three/file.js”会变成“file.js”。使用-p relative会让UglifyJS在source map和源文件之间计算出相对路径。

  下面是一个使用这些命令行参数的例子。

uglifyjs [input files] -o script.min.js --source-map script.js.map --source-map-root http://example.com/js -c -m

  注意:如果在Grunt中使用grunt-contrib-uglify插件,请参考这里查看如何在Gruntfile中使用这些选项。

  还有许多其它可用的工具能够生成source maps文件。下面列出了其中一些。

Chrome开发者工具中的source maps

Chrome开发者工具中的Sources选项卡

  如果你的source maps设置正确,那么你将在Sources选项卡中看到所有的JavaScript源文件。

  查看页面的HTML代码,你会发现仅有一个压缩的JavaScript文件被引用。而开发者工具自动加载了对应的source map文件并获取了对应的源文件。

Firefox开发者工具中的source maps

Firefox开发者工具中的调试器面板

  Firefox用户在开发者工具的调试器中能够看到source maps对应的源文件。开发者工具识别出了source map的存在并自动获取了对应的源文件。

一些感想

  使用source map使得开发人员能够在调试环境下直观地查看并维护代码,同时网站也获得了更好的性能提升。

  本文介绍了source maps的工作原理以及如何用UglifyJS生成source maps。如果你的网站使用了压缩过的资源(推荐这样做),那么可以考虑花点时间将source map整合到其中。

有用的链接

原文地址:https://blog.teamtreehouse.com/introduction-source-maps

Source Maps简介的更多相关文章

  1. WebStorm 9 自动编译 LESS 产出 CSS 和 source maps

    1.双击桌面Chrome图标,打开Chrome,按键盘“F12”键,打开开发工具界面,点击其右上角的“设置”按钮,勾选“Enable JavaScript source maps”  及“Enable ...

  2. 前端构建:Source Maps详解

    一.前言 当使用CoffeeScript.ClojureScript编写前端脚本时,当使用Less.Sacc编写样式规则时,是否觉得调试时无法准确找到源码位置呢?当使用jquery.min.js等经压 ...

  3. [AngualrJS + Webpack] Production Source Maps

    When you uglify your Angular code with Webpack's uglify plugin, debugging your application can be a ...

  4. [转] Webpack的devtool和source maps

    source maps Webpack打包生成的.map后缀文件,使得我们的开发调试更加方便,它能帮助我们链接到断点对应的源代码的位置进行调试(//# souceURL),而devtool就是用来指定 ...

  5. [Angular] Debug Angular apps in production without revealing source maps

    Source: https://blog.angularindepth.com/debug-angular-apps-in-production-without-revealing-source-ma ...

  6. 【译】Source Maps浅析

    Time:2019/10/27~2019/10/29 Link: 原文链接 译文开始: 对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩.但是当你需要调试这些压缩文件中的代码的时候, ...

  7. JavaScript Source Maps浅析

    阅读目录 有用的链接 Link: 原文链接 译文开始: 对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩.但是当你需要调试这些压缩文件中的代码的时候,会发生什么?可能会是一场噩梦.但 ...

  8. Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT Source Maps 详解

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  9. Introduction to JavaScript Source Maps

    下载jquery时候发现:jquery.min.map  这什么鬼呀? https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/core.js http ...

随机推荐

  1. 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S

    使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish   等几个常用命令. 2.了解Dock ...

  2. reportlab生成pdf

    文档地址:https://www.reportlab.com/docs/reportlab-userguide.pdf 源码地址:https://bitbucket.org/rptlab/report ...

  3. java网络爬虫,乱码问题终于完美解决

    第一次写爬虫,被乱码问题困扰两天,试了很多方法都不可以,今天随便一试,居然好了. 在获取网页时创建了一个缓冲字节输入流,问题就在这个流上,添加标红代码即可 BufferedReader in = nu ...

  4. 使用WebService发布soap接口,并实现客户端的https验证

    什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...

  5. MyBatis从入门到精通:各个实体类

    SysUser类: package tk.mybatis.simple.model; import java.util.Date; public class SysUser { public Long ...

  6. VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题

    DisplayMember绑定需要显示的数据表字段, 而ValueMember绑定需要获取选择的项的值. 然后通过 combo.SelectedValue就可以取得选中项的值了. DisplayMem ...

  7. 万字长文:ELK(V7)部署与架构分析

    ELK(7版本)部署与架构分析 1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日 ...

  8. 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)

    微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...

  9. php laravel5.6引入geetest 行为验证

    php laravel5.6引入geetest 行为验证 使用必要性 网站和APP,在所有可能被机器行为攻击的场景,例如但不限于注册.登录.短信接口.查询接口.营销活动.发帖评论等等,都可以部署使用「 ...

  10. 如何在 Centos7 中安装 Mysql 5.7

    一.下载安装包 (1). 下载MySQL源码 (进入/usr/local/src目录,使用wget下载) cd /usr/local/src wget https://dev.mysql.com/ge ...