`
JerryWang_SAP
  • 浏览: 1042375 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

UI5 Source code map机制的细节介绍

阅读更多

在我的博客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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

 
 
0
0
分享到:
评论

相关推荐

    DevExpress Components 18.2.3 Source Code

    DevExpress Components 18.2.3 Source Code DevExpress Components 18.2.3 源代码 内含: BuildUWP DevExpress.AspNetCore.Bootstrap DevExpress.AspNetCore.Common DevExpress.BonusSkins DevExpress.Code...

    RxSwift Reactive Programming with Swift + source code

    4. **绑定与响应式UI**:理解如何使用RxSwift将模型数据与用户界面元素绑定,实现声明式的UI更新,让代码更易于维护和测试。 5. **错误处理**:学习如何在RxSwift中优雅地处理错误,使用catch和retry等操作符来构建...

    RxSwfit Reactive Programming With Swift 2017.3 & Source Code Package

    《RxSwift Reactive Programming With Swift 2017.3 & Source Code Package》是针对Swift开发者的一份重要资源,它深入介绍了如何使用RxSwift框架来实现响应式编程。RxSwift是ReactiveX的一个Swift版本,是一种强大...

    propertymap:Qt World Summit 2019演讲“快速C ++到QML属性”的PropertyMap游乐场源代码-Source code world

    5. **数据绑定**:QML的强项在于其数据绑定能力,允许开发者声明性地描述UI元素如何随数据变化而更新。PropertyMap在C++和QML之间创建桥梁,使得这种数据绑定变得更加便捷。 6. **信号和槽**:C++中的信号和槽机制...

    前端UI框架Svelte.zip

    const { code, map } = svelte.compile( source, { // the target module format – defaults to 'es' (ES2015 modules), can // also be 'amd', 'cjs', 'umd' or 'iife' format: 'umd', // the filename of ...

    source.zip

    视频名称 源码 ----------------------...复杂UI界面设计、GPS与GoogleMap、自定义View、Ubuntu Linux下使用C语言面向底层开发、通过JNI进行底层组件调用、图形与OpenGl ES、界面特效、下载修改及编绎Android框架代码。

    CodeSMART.Integration.with.The.Visual.Studio.2010.IDE

    7,Source Code Perfectly Formatted and Documented with The CodeSMART Code Maintenance Tools Code Formatter Sort Procedures XML Comments XML Comments Preview Regular Comments Code Commenting ...

    javamap源码-HADOOP-COUNTER-SOURCE-CODE:在HadoopMapReduce编码中使用自定义计数器的Java程序

    在“javamap源码-HADOOP-COUNTER-SOURCE-CODE”项目中,我们可以深入理解如何在Java程序中利用Hadoop的计数器机制。这个项目可能包含一个或多个示例,展示了如何在Mapper和Reducer中创建和更新自定义计数器,以便...

    MAP GPS with VB

    【标签】"sourcecode" 表示这个压缩包可能包含源代码文件,供学习或参考。源代码是程序员编写的、可读性强的人类语言文本,用于告诉计算机如何执行特定任务。在这里,你可以通过阅读和分析源代码了解VB如何与GPS系统...

    RxSwift_Reactive_Programming_with_Swift_v3.0_Source_Code.zip

    5. **调度器**(15-intro-to-schedulers):调度器是RxSwift中的一个重要概念,它们决定了观察者序列何时以及在哪里运行。例如,`MainScheduler`确保在主线程执行操作,以更新UI,而`BackgroundScheduler`可以在后台...

    UnityTutorialRoguelikeGame:Unity课程的源代码-Unity game source code

    在Unity中,可以使用C#脚本来实现这些算法,结合Unity的Tilemap系统创建出多样化的游戏环境。 2. **回合制战斗**:战斗系统通常基于角色的行动点或时间槽,玩家和敌人的行动轮流进行。在Unity中,可以创建一个行为...

    Pro Radar Builder (Source Included) 3.0.1

    Since this is the source included version you have access to all the source code you need.. For 2D Radars please see: 2D Radar Builder For 3D Radars please see: 3D Radar Builder Simple AI (just ...

    P4_02_code_source_OPTIMISE

    标题"P4_02_code_source_OPTIMISE"和描述中的信息看似简洁,但它们暗示了这是一个关于代码优化的项目,可能包含了一些优化过的JavaScript源代码。"OPTIMISE"一词表明这个项目专注于提高代码效率,减少资源消耗,或者...

    Android_Studio_Google_Maps_Application:谷歌地图应用程序,用于第二学期开放源码的最后一年-Android application source code

    6. **地图初始化**:在Fragment或Activity的生命周期方法中,开发者需要初始化GoogleMap对象,设置地图类型、缩放级别、是否显示用户位置等参数。 7. **Marker与InfoWindow**:在地图上添加标记(Marker)来表示...

    Jquery autocomplete插件的使用示例

    下面我们将详细介绍如何使用jQuery Autocomplete插件。 首先,确保你已经引入了jQuery库和jQuery UI库。你可以通过CDN链接或本地文件引入。例如: ```html <script src="https://code.jquery....

    Terraria源码英文-支持中文

    `Terraria.Map`与地图生成和管理有关,源码可能涵盖了地图数据结构的设计、生成算法以及读写地图文件的实现。理解这部分代码有助于实现自定义的地图编辑器或者探索更复杂的生成策略。 `Terraria.Net`可能是网络模块...

    jQuery实现自动补全功能

    <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script> ``` 然后,我们可以设置一个HTML...

    基于Jquery自动补全

    在介绍jQuery自动补全之前,我们先来回顾一下jQuery的基础知识。jQuery是一个JavaScript库,它简化了DOM操作、事件处理、动画设计和Ajax交互。通过使用$符号,我们可以快速地选中页面元素并对其进行操作。例如,`$(...

    jquery自动完成插件

    response($.map(data, function(item) { return { label: item.label, value: item.value }; })); } }); } }); ``` 总的来说,jQuery自动完成插件是一个强大且灵活的工具,它简化了前端开发中的动态建议功能...

    jquery autocomplete 自动完成 插件

    <script src="https://code.jquery.com/ui/1.x.x/jquery-ui.min.js"></source> ``` 2. **创建元素**:创建一个input元素,用于实现自动补全功能。 ```html ``` 3. **初始化插件**:使用jQuery选择器找到该...

Global site tag (gtag.js) - Google Analytics