在我的博客A debugging issue caused by source code mapping里我介绍了在我做SAP C4C开发时遇到的一个曾经困扰我很久的问题,最后结论是这个问题由于JavaScript的source code map机制在Chrome开发者工具里起作用,其实是working as designed的一种行为。但是当时因为时间限制,没有去深入学习JavaScript source code map的更多细节。

在这篇文章里我用一个简单的UI5应用来研究该机制。这个应用的UI仅仅包含一个Button,点击之后弹出一个Message Toast。

下面是我XML view和Controller的实现。

打开Chrome开发者工具里的source code map开关:

然后浏览器里访问这个UI5应用,我们就能在Chrome开发者工具里看到这些UI5库文件的调试版本(.dbg.js)。但是在Chrome开发者工具的Network标签里,我们观察不到这些调试版本文件的加载。那么问题来了:这些.dbg.js文件从哪里来的?

当关闭Chrome开发者工具的source code map功能之后,我们在Chrome开发者工具里再也观察不到这些.dbg.js文件了。将下图和source code map打开时的截图做比较:

如何在本地找到sap-ui-core.js.map文件

单击sap-ui-core.js,在其最后一行1875行,看到该行内容:


//# sourceMappingURL=sap-ui-core.js.map

这个文件的后缀.map给了我们提示:其作用就是维护位置映射关系,将sap-ui-core.js(压缩之后的文件)里的代码位置映射到压缩之前的代码位置(来自压缩之前的文件名,代码行数,代码列数,涉及到的压缩之前的JavaScript变量名)。

但是,同样的,我在开发者工具的Network标签里也观察不到这个.map文件被加载。

在Chrome里输入url: "chrome://net-internals/#events", 结果显示确实有一个url请求去访问sap-ui-core.js.map, 只是因为本地磁盘缓存能响应该请求, 因此没有产生真正的网络请求:

在Chrome里输入"chrome://cache"能看到Chrome本地的所有缓存,从这里我成功找到了文件sap-ui-core.js.map的本地缓存。

单击该超链接能看到这条缓存的抬头信息。但是缓存的具体文件内容显示格式为HEX,没法直接分析。

因此我使用了工具Cache viewer for Google Chrome Web browser, 将该缓存导出成本地文件。

sap-ui-core.js.map文件内容一览

这篇博客Introduction to JavaScript Source Maps介绍了JavaScript source code map的基本知识。

文件sap-ui-core.js.map的内容:

  • version: 3

.map文件的各组成部分的作用和含义定义在一个叫做Source Map Revision Proposal的协议文档里,在我的例子sap-ui-core.js.map里使用了该协议的第三版。

  • sources:

这是一个数组,包含了所有用于生成压缩之后的js文件的原始文件的名称。

  • names:

这是一个数组,包含了原始js文件里出现的JavaScript变量和属性名称。

下面是一个例子,体现了原始文件之一Device-dbg.js里的变量名称和其在sap-ui-core.js.map文件里的names数组里的对应记录,方便您理解。

  • mappings:

.map文件最重要的部分,定义了原始文件内的位置和生成压缩版本文件内位置的对应关系。对应关系记录的粒度是基于压缩之后文件的每一行,用分号隔开。这样做的好处是无需再分配而外的位来维护压缩文件位置的行号信息。

回到我的例子,压缩文件sap-ui-core.js一共包含1874行,因此sap-ui-core.js.map一共出现了1874次分号,每个分号内又是一个很长的字符串,由一系列逗号隔开,这些由逗号隔开的字符串片段称为Segment。每个Segment维护了一个位置的映射关系。

如何生成.map文件

有很多开源的组件用于生成.map文件,其中之一是Google Closure compiler。假设我想基于我的测试应用里的controller实现文件App.controller.js生成一个压缩版本的文件:

从Google网站下载compile.jar, 然后生成一个名为script-min.js的压缩文件和script-min.js.map:


java -jar compile.jar --js App.controller.js --create_source_map ./script-min.js.map --source_map_format=V3 --js_output_file script-min.js

生成的压缩文件script-min.js只有1行内容:

生成的script-min.js.map内容:

可以使用vlq.js将这些segment解码:

浏览器打开该html,产生如下输出:每个segment由4或5个字符组成。

每一位的对应含义:

  • 第一位,表示这个位置在转换后的压缩文件的第几列。
  • 第二位,sources数组中的索引,表示这个位置来自哪一个原始文件。
  • 第三位,表示这个位置属于原始文件的第几行。
  • 第四位,表示这个位置属于原始文件的第几列。
  • 第五位,names数组中的索引,表示这个位置属于源文件中的哪一个变量。

关于VLQ编码的更多细节,可以阅读这篇博客Source Maps under the hood – VLQ, Base64 and Yoda

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

UI5 Source code map机制的细节介绍相关推荐

  1. SAP UI5的source code map(源代码映射)机制

    SAP UI5库文件里出现的变量和函数,按照先后顺序出现在sap-ui-core-js.map文件里,如下图所示: 映射细节: 更详细的介绍,请参考我的博客: More detail about UI ...

  2. Chrome source code map - fail - cannot debug

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  3. Android进程间通信(IPC)机制Binder简要介绍和学习计划

    在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...

  4. 保存ResultSet中的数据(Java Source Code)

    当我们在编写程序的时候,免不了要与数据库打交道,相信ResultSet大家也并不陌生,从数据库读取的数据将会存入其中. 操作结束关闭数据库连接以及ResultSet,否则保持数据库的连接并直接对Res ...

  5. A Transformer-based Approach for Source code Summarization 翻译

    A Transformer-based Approach for Source Code Summarization 全文翻译 本文最佳阅读方式:读完一段中文内容快速阅读对应的英文部分 欢迎关注我的公 ...

  6. 论文中文翻译——Automated Vulnerability Detection in Source Code Using Deep Representation Learning

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--Automated Vulnerability Detection in Source Code Using Deep R ...

  7. 【综述笔记】 A survey of automatic generation of source code comments Algorithms and techniques

    A survey of automatic generation of source code comments Algorithms and techniques ABSTRACT 代码注释存在问题 ...

  8. Source Code Collection for Reproducible Research

    Source Code Collection for Reproducible Research [ http://www.csee.wvu.edu/~xinl/source.html] " ...

  9. android迷宫源代码,迷宫 c++源代码(Maze c++ source code).doc

    迷宫c源代码(Mazecsourcecode) 迷宫 c++源代码(Maze c++ source code) /// / /程序名称:迷宫游戏 / /编译环境:Visual C++ 6 / 2010 ...

最新文章

  1. 2、Get和post的区别
  2. https和http的主要区别
  3. vue - blog开发学习6
  4. .NET(C#):使用SmtpClient发送带有图片和附件的电子邮件
  5. python程序、画一个笑脸_如何使用canvas画一个微笑的表情(代码示例)
  6. Spring Cloud 子项目介绍
  7. 计算机换汉语快捷键,电脑常用快捷键
  8. 基于隐马尔可夫模型的有监督词性标注
  9. WPF ICommandSource Implementations Leak Memory!
  10. 汉仪欧楷字体获2016中国设计红星奖银奖
  11. “真正的机器人测试” - 淘宝泛终端机器人自动化测试实践
  12. 个人风景网站模板HTML+CSS+JS(源码)
  13. 入门级移动App服务器的软硬件需求
  14. 财务报表版本在开发报表中的应用
  15. 1677. 发票中的产品金额
  16. c语言怎么让电脑backspace,backspace键在哪里
  17. 评估EtherCAT从站节点解决方案
  18. Git 使用详解,日常使用 | 什么是git
  19. java基础火车站售票(线程安全)
  20. 2019年免费测试SRRC认证哪里办

热门文章

  1. MySql 扩展存储引擎
  2. libevent源码分析:eventop
  3. SharePoint 数据迁移解决方案
  4. Linux下怎么创建和进入带有空格的文件夹
  5. OSPF NBMA网络的五种基本类型
  6. Android ViewFlipper实现多个布局手势切换的效果
  7. [Servlet]研究ServletContext对象
  8. 线程同步synchronized理解
  9. 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
  10. IE edge是怎么了??