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浅析的更多相关文章

  1. JavaScript Source Maps浅析

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

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

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

  3. 前端构建:Source Maps详解

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

  4. [AngualrJS + Webpack] Production Source Maps

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

  5. [转] Webpack的devtool和source maps

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

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

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

  7. Source Maps简介

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

  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. [Advanced Python] 11 - Implement a Class

    基础概念:[Python] 08 - Classes --> Objects 进阶概念:[Advanced Python] 11 - Implement a Class 参考资源:廖雪峰,面向对 ...

  2. 神奇的互换身体术--java的类型擦除

    故事背景 <互换身体>是由环球影业发行的喜剧电影,于2011年8月5日在美国上映.该片由大卫·道金执导,瑞安·雷诺兹.杰森·贝特曼.奥利维亚·王尔德等主演.该片讲述了一位居家好男人和一位蜂 ...

  3. 通俗讲解 RESTful

    1 什么是 RESTful 百度一下 RESTful,查到的资料很多都讲得不清楚,看完了都不知道说的是啥,导致很多人对 RESTful 不甚了解.来看一下常见的解释: (1)神一样的描述REST 并不 ...

  4. Python 之父的解析器系列之七:PEG 解析器的元语法

    原题 | A Meta-Grammar for PEG Parsers 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众 ...

  5. Android导入Burp Suite证书抓包HTTPS

    需求 Android APP安全测试时,主要工作分为: APK安全 业务安全 APK安全这里不讨论,我说说业务安全,因为大部分的业务校验逻辑还是放在Servier端,这里就会涉及到网络通信了.因此网络 ...

  6. MySQL命令窗口出现中文乱码的解决方法

    查询表语句的时候,出现了中文乱码,但是用Navicat for MySQL查看的时候却是正常的,字符集都是设置的utf-8,如下图所示:     其实上大学学习java的时候也遇到了中文乱码但是却没有 ...

  7. 引用极光jar包之后出现控制台日志打印不出来的问题。解决!

    由于极光的jar包中引用的有log4j,项目本身也引用有log4j,如果版本有冲突,则会出现控制台日志记录打印不出来的现象.解决:引用极光jar包的时候,排除log4j. <dependency ...

  8. ps查看图层大小快捷键

    1.图层大小尺寸的: ctrl+alt+c 2.图片大小尺寸.像素大小: ctrl+alt+i

  9. [Abp vNext 源码分析] - 9. 接口参数的验证

    一.简要说明 ABP vNext 当中的审计模块早在 依赖注入与拦截器一文中有所提及,但没有详细的对其进行分析. 审计模块是 ABP vNext 框架的一个基本组件,它能够提供一些实用日志记录.不过这 ...

  10. 43 道检验基础的 JavaScript 面试题

    导读 这两天的GitHub Trending repositories被一个名叫 javascript-questions的项目霸榜了,项目中记录了一些JavaScript题目. 文中有些点作者解释的 ...