【译】Source Maps浅析
Link: 原文链接
译文开始:
对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩。但是当你需要调试这些压缩文件中的代码的时候,会发生什么?可能会是一场噩梦。但是,不用害怕,即将有一个解决方案到来,它就是Source Maps。
source maps提供一种将压缩文件中的代码映射回源文件中原始位置的方法。这意味着,借助一些软件的帮助,即使你的资源被压缩,你也可以轻易调试你的程序。Chrome和Firefox内置的开发者工具都支持source maps了。
在这篇文章中,你将会学习到source maps的实现原理以及怎么去生成source maps。我们主要是关注JavaScript代码的source maps,但是这些原则同样适用于CSS的source maps。
Source Maps实现原理
顾名思义,source map(源映射)就是包含一堆的信息,可以将压缩文件的代码映射回到源代码。你可以为每个压缩文件指定不同的source map。
通过在压缩文件底部添加特殊的注释,向浏览器表明souce map是可用的。
//# sourceMappingURL=/path/to/script.js.map
该注释通常会被用于生成source map的程序添加。仅当开发者工具支持source map启用了以及打开的时候,开发者工具才会加载这些文件。
也可以在压缩的JavaScript文件的响应中通过设置X-SourceMap的HTTP响应头来开启source map。
X-SourceMap: /path/to/script.js.map
下面来看看source map文件的内容:一个JSON对象,包含文件说明以及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: 源文件URL的一个数组
- sourceRoot: (可选)源文件数组URL指定的文件根路径
- names:包含源文件所有变量和函数名的数组。
- mappings:包含实际代码映射的Base64 VLQ字符串。 (这就是魔术发生的地方)
使用UglifyJS 生成Source Maps
UglifyJS是一个用于合并压缩JS文件的命令行工具。版本2支持很多有助于生成source map的命令行标识。
- --source-map:source map输出文件
- --source-map-root:(可选)source map源文件根路径
- --source-map-url :(可选)服务器source map文件路径。用于压缩文件的注释中路径。
//# sourceMappingURL=/path/to/script.js.map
以上全部选项可查看文档
来看个试一下生成一个source map,在一个目录中创建一个JS文件test.js
test.js内容:
function test(){
console.log('test')
}
uglifyjs test.js -o test.min.js --source-map "url='test.min.js.map'"
如果没有安装,需要先安装uglifyJs,执行命令后,生成三个文件。

以上没有用原文的例子,使用自己实现的例子。
test.min.js输出后到代码:
function test(){console.log("test")}
//# sourceMappingURL=test.min.js.map
还有以下其他工具也可以用于生成source maps:
Chorome开发者工具调试Source Maps
为了方便演示,已经偏离原文的例子。
之前生成的test.min.js文件,我们通过引入到html文件中进行调试。
html文件:
<html>
<head>
<title>test</title>
</head>
<body>
<script src="./test.min.js"></script>
<script>
test()
</script>
</body>
</html>
先看看没开启source map的情况是如何:

没开启source map,只加载了test.min.js文件

开启后再尝试:

发现会加载test.js源文件,以及在源文件进行调试。
小结
使用source map可以使开发人员维护直接的调试环境,同时优化其站点的性能。
有用的链接
(完)
【译】Source Maps浅析的更多相关文章
- JavaScript Source Maps浅析
阅读目录 有用的链接 Link: 原文链接 译文开始: 对网站进行性能优化对一个最容易的方法就是把JS和CSS进行打包压缩.但是当你需要调试这些压缩文件中的代码的时候,会发生什么?可能会是一场噩梦.但 ...
- WebStorm 9 自动编译 LESS 产出 CSS 和 source maps
1.双击桌面Chrome图标,打开Chrome,按键盘“F12”键,打开开发工具界面,点击其右上角的“设置”按钮,勾选“Enable JavaScript source maps” 及“Enable ...
- 前端构建:Source Maps详解
一.前言 当使用CoffeeScript.ClojureScript编写前端脚本时,当使用Less.Sacc编写样式规则时,是否觉得调试时无法准确找到源码位置呢?当使用jquery.min.js等经压 ...
- [AngualrJS + Webpack] Production Source Maps
When you uglify your Angular code with Webpack's uglify plugin, debugging your application can be a ...
- [转] Webpack的devtool和source maps
source maps Webpack打包生成的.map后缀文件,使得我们的开发调试更加方便,它能帮助我们链接到断点对应的源代码的位置进行调试(//# souceURL),而devtool就是用来指定 ...
- [Angular] Debug Angular apps in production without revealing source maps
Source: https://blog.angularindepth.com/debug-angular-apps-in-production-without-revealing-source-ma ...
- Source Maps简介
提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件.但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦.不过也不用担心,souce maps将会帮你解决这一问题. Sourc ...
- Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT Source Maps 详解
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- Introduction to JavaScript Source Maps
下载jquery时候发现:jquery.min.map 这什么鬼呀? https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/core.js http ...
随机推荐
- JavaScript之深入函数(二)
上一篇我们主要讲解了函数的执行过程和原理,本篇我们将介绍函数的另外两个特殊表现:闭包和立即执行函数. 一 闭包 1, 闭包的形成 之前我们提到,函数执行完毕,马上就会销毁自己的AO对象.但是如果遇到 ...
- H5当弹出弹窗遮罩时如何阻止滚动穿透(使用css方式)
最近的一个H5活动中有一个是点击[分享]弹窗指引遮罩弹窗引导用户进行分享,但突然发现弹出弹窗的时候下层仍然可以进行滑动,这个问题是个H5经久不衰讨论的问题,重点是我这个页面在安卓系统上有明显的滑动闪烁 ...
- Spring boot 梳理 - SpringApplication
简单启动方式 public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, a ...
- spring boot 配置访问其他模块包中的mapper和xml
maven项目结构如下,这里只是简单测试demo,使用的springboot版本为2.1.3.RELEASE 1.comm模块主要是一些mybatis的mapper接口和对应的xml文件,以及数据库表 ...
- 动态set mybatis与ibatis的写法
mybatis: <set> <if test="obj.buyerId != null"> buyerId = #{obj.buyerId}, </ ...
- WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)
目录 1. 概述 2. 示例:绘制多个三角形 2.1. Triangle_MVPMatrix.html 2.2. Triangle_MVPMatrix.js 2.2.1. 数据加入Z值 2.2.2. ...
- 1. jQuery中的DOM操作
1)查找节点 通过jQuery选择器来完成 2)创建节点 创建元素节点:var newTd = $("<td></td>") 创建文本节点:在创建元素节点时 ...
- Java为什么需要四种引用?
首先抛出一个问题:在闲暇时间收拾自己家里的时候,对某一件物件要不要丢弃的问题上,是否有过食之无味,弃之可惜的感觉? 同样的,JVM在回收Java对象的时候,是否对对象实例也有食之无味,弃之可惜的感受? ...
- 最简单的JS实现json转csv
工作久了,总会遇到各种各样的数据处理工作,比如同步数据,初始化一些数据,目前比较流行的交互数据格式就是JSON,可是服务器中得到的JSON数据如果提供给业务人员看的话可能会非常不方便,这时候,转成CS ...
- 04-03 scikit-learn库之AdaBoost算法
目录 scikit-learn库之AdaBoost算法 一.AdaBoostClassifier 1.1 使用场景 1.2 参数 1.3 属性 1.4 方法 二.AdaBoostRegressor 更 ...