当前位置: 首页 > news >正文

Wepack(1):SourceMap讲解以及使用

今天我们来讲讲定位源码的工具 Sourcemap , 我们先讲最简单的配置,之后才补充 sourcemap 的其他属性

Sourcemap

作用

  1. 可以在打包的代码直接对应相应源码 例如 vue2 , vue3
  2. 可以把对应的错误上传到相关服务器

使用

  1. webpack.config.js
const config = {entry: './src/commomjs.js', // 打包入口地址devtool: 'source-map',output: {filename: 'bundle.js', // 输出文件名path: path.join(__dirname, 'dist'), // 输出文件目录},// ...plugins: [new webpack.SourceMapDevToolPlugin({filename: '[name].js.map',}),// ...];
}
  1. commomjs.js
console.log('sourcemap');
  1. 然后执行 npm run build
// bundle.js
/*! For license information please see bundle.js.LICENSE.txt */
console.log('sourcemap');
//# sourceMappingURL=main.js.map

会发现 dist 出现一个叫 main.js.map 的文件,这就是 sourcemap 生成的索引,然后格式化下,出现的结果

{// sourcemap 当前版本"version": 3,// 对应的dist文件"file": "bundle.js",// mappings 记录位置信息的字符串"mappings": ";AAAAA,QAAQC,IAAI",// 转换前的文件。该项是一个数组,表示可能存在多个文件合并。"sources": ["webpack:///./src/commomjs.js"],// 转换前文件的原始内容。"sourcesContent": ["console.log('sourcemap')"],// 转换前的所有变量名和属性名"names": ["console", "log"],// 转换前的文件所在的目录。如果与转换前的文件在同一目录,该项为空。"sourceRoot": ""
}

解析

我们看看 mappings 是怎么对应的,我先了解其中对应的意思

{"mappings": ";AAAAA,QAAQC,IAAI"
}

其中 ; 代表换行,, 表示列 , 从我们的代码可以看出 其中console.log('sourcemap')代表着 AAAAA,QAAQC,IAAI

那这几个代表啥意思呢 , 这其实就是 位置转换 , 大致就是下面这些

  • 第一位,表示这个位置在(转换后的代码的)的第几列。
  • 第二位,表示这个位置属于 sources 属性中的哪一个文件。
  • 第三位,表示这个位置属于转换前代码的第几行。
  • 第四位,表示这个位置属于转换前代码的第几列。
  • 第五位,表示这个位置属于 names 属性中的哪一个变量。

每一个位置都可以用 VLQ 编码 转换,形成一种映射关系。可以在下面的网站转换测试,将 AAAAA,QAAQC,IAAI 转换后的结果:

VLQ CODEC

转换后发现

[0, 0, 0, 0, 0], [8, 0, 0, 8, 1], [4, 0, 0, 4];

根据上面的规则,我们可以看出

console 这个变量对应 编码转化后 0 列第一个文件 , 转化前第 0 行转化前第 0 列 , 出现在 name 中第 1 个元素

log 这个变量对应 编码转化后 8 列第一个文件 , 转化前第 0 行转化前第 8(0为console的位置+8) 列 , 出现在 name 中第 2 个元素

source 这个变量对应 编码转化后 0 + 8 + 4(log(的长度) = 12 列第一个文件 , 转化前第 0 行转化前第 0 + 8 + 4(log(的长度) = 12 列 , 未出现在 name 所以不显示

所以可以得到上面的结论

懂得了这些我们改写下 commonjs.js

var a = 123;
console.log(123);

结果为

//bundle.js
console.log(123);
//# sourceMappingURL=main.js.map
{"version": 3,"file": "bundle.js","mappings": "AACAA,QAAQC,IAAI","sources": ["webpack:///./src/commomjs.js"],"sourcesContent": ["var a = 123;\nconsole.log(123)"],"names": ["console", "log"],"sourceRoot": ""
}

转化后得知 [0,0,1,0,0], [8,0,0,8,1], [4,0,0,4]

其中 [0,0,1,0,0] 代表 console , console 这个变量对应 编码转化后 0 列第一个文件 , 转化前第 1 行转化前第 0 列 , 出现在 name 中第 1 个元素

其中 [8,0,0,8,1] 代表 log , log 这个变量对应 编码转化后 0 列第一个文件 , 转化前第 (1(这个1为console)+0) 行转化前第 8 列 , 出现在 name 中第 2 个元素

其中 [8,0,0,8,1] 代表 123 ,source 这个变量对应 编码转化后 0 + 8 + 4(log(的长度) = 12 列第一个文件 , 转化前第 (1(这个1为console)+0+0) 行转化前第 0 + 8 + 4(log(的长度) = 12 列 , 未出现在 name 所以不显示

其实可以看出,数组的前 4 位都是相加到最后的,最后一位则代表 `name` 出现的位置

转化 + 测试

最后我们试试 4 是怎么转化成 I

转化规则如下

第一步,将16改写成二进制形式10000。第二步,在最右边补充符号位。因为16大于0,所以符号位为0,整个数变成100000。第三步,从右边的最低位开始,将整个数每隔5位,进行分段,即变成1和00000两段。如果最高位所在的段不足5位,则前面补0,因此两段变成00001和00000。第四步,将两段的顺序倒过来,即00000和00001。第五步,在每一段的最前面添加一个"连续位",除了最后一段为0,其他都为1,即变成100000和000001。第六步,将每一段转成Base 64编码。

我们一个一个试试

4 转化为 二进制 为 0100补充符号位,为 01000分割(由于前4位没有溢出,也就是不会像16一样100000),所以分割为 [01000]补位 001000转化为 Base 64I

参考

  1. SoucreMap讲解
  2. JavaScript Source Map 详解
  3. VLQ转化实现
  4. Webpack官网

相关文章:

Wepack(1):SourceMap讲解以及使用

今天我们来讲讲定位源码的工具 Sourcemap , 我们先讲最简单的配置,之后才补充 sourcemap 的其他属性 Sourcemap 作用 可以在打包的代码直接对应相应源码 例如 vue2 , vue3可以把对应的错误上传到相关服务器 使用 webpack.config.js const config …...

华为OD机试题,用 Java 解【最多等和不相交连续子序列】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

Kubernetes06:Controller

Kubernetes06:Controller 1、什么是controller 管理和运行容器的对象,是一个物理概念 在集群上管理和运行容器的对象 2、Pod和Controller之间的关系 Pod是通过controller来实现应用的运维 比如伸缩、滚动升级等等操作Pod和Controller之间通过 label 标签建立关系…...

采购文件中 RFI、RFQ、RFP、IFB的区别

【PMBOK的描述】   采购文件用于征求潜在卖方的建议书。如果主要依据价格来选择卖方(如购买商业或标准产品时),通常就使用标书、投标或报价等术语。如果主要依据其他考虑(如技术能力或技术方法)来选择卖方&#xff0…...

linux升级gcc版本详细教程

0.前言一般linux操作系统默认的gcc版本都比较低,例如centos7系统默认的gcc版本为4.8.5。gcc是从4.7版本开始支持C11的,4.8版本对C11新特性的编译支持还不够完善,因此如果需要更好的体验C11以及以上版本的新特性,需要升级gcc到一个…...

NBA Top Shot 跌落神坛

近日,美国职业篮球联盟(NBA)授权的NFT 项目“NBA Top Shot Moments”被纽约法院初步裁定为“可能符合证券的定义”,虽然这不是对2021年用户指控该项目违法的最终判决,但这个裁定引发了市场担忧,部分NFT的地…...

状态管理Pinia使用详解(带你入门)

状态管理Pinia使用详解(带你从入门到入神) 序: ​ 如果你之前使用过 vuex 进行状态管理的话,那么 pinia 就是一个类似的插件。它是最新一代的轻量级状态管理插件。你可以通过defineStore来简单创建一个存储管理。 ​ 与 vuex 相比,pinia 提…...

Linux系统基础命令(一)

一、图形界面和终端界面 图形界面:是指采用图形方式显示的计算机操作用户界面。 终端界面:是指黑底白字的命令行界面。 什么是tty呢? tty:终端设备的统称。 tty一词源于Teletypes,或者teletypewriters,…...

djvu批量转换为pdf的工具和djvu阅读器(附下载链接)

简介 DjVuToy是一款美观易用、功能强大的DjVu处理工具,DjVuToy官方版功能包括图像文件转DjVu,支持PDG、BMP、GIF等格式。转换的同时可以进行OCR,生成双层DjVu。可以插入、删除、移动、旋转多页DjVu中的页面。还可以将多个DjVu文件合并成一个&…...

Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】

文章目录一、前言二、有关git的相关历史介绍三、Git版本管理1、感性理解 —— 大学生实验报告2、程序员与产品经理3、张三的CEO之路 —— 版本管理工具的诞生四、如何在Linux上使用Git1、创建仓库2、将仓库克隆到本地3、git三板斧① git add② git commit③ git push4、有关git…...

FFmpeg 编译和集成

背景FFmpeg 是一款知名的开源音视频处理软件,它提供了丰富而友好的接口支持开发者进行二次开发。FFmpeg 读作 “ef ef em peg” ,其中的 “FF” 指的是 “Fast Forward”,“mpeg” 则是 “Moving Picture Experts Group” (动态图…...

OOM的俩种情况---主动kill/被动kill

出现OOM, 有两种处理方式:1. 主动Kill; 2. 被动Kill 例:HBase Region Server OOM定位问题复盘 现象 在HBase资源隔离项目中,对测试集群进行压测时,发现region server会出现崩溃的情况,单机请求量从>200到~50每秒都…...

ssh远程连接ECS实例连接失败

尝试通过 SSH 远程连接服务来连接ECS云服务器实例时,收到“连接被拒”或“连接超时”的错误信息,可能的原因分析如下: 错误信息描述 1、错误消息:“ssh: connect to ecs-X-X-X-X.compute-xxxxxxxxx.com port 22: Connection tim…...

[框架设计] MVVM 的介绍,应用及优缺点

介绍 MVVM(Model-View-ViewModel)是一种架构模式,用于将应用程序分离为三个部分: Model(模型):负责处理应用程序的数据和业务逻辑。View(视图):负责呈现用户…...

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表 1 DL 645协议简介 DL645协议是一种用于智能电能表的远程抄读通讯标准。制定该标准是为统一和规范多功能电能表与数据终端设备进行数据交换时的物理连接和通信链路及应用技术规范。DL645协议可用于远程监测电力传输和使用…...

认识微服务

目录 认识微服务 单体架构 分布式架构 服务架构演变 服务治理 微服务 总结 微服务技术对比 微服务结构 微服务技术对比 企业需求 SpringCloud SpringCloud和SpringBoot的版本兼容 认识微服务 单体架构 单体架构:将业务的所有功能集中在一个项目中开发&a…...

升级Android Studio Electric Eel问题汇总

1.升级以后找不到java可执行程序 问题原因:升级后,Android Studio自带的java目录不再是根目录/jre,调整为一个新目录 Studio根目录/jbr 修改方法:1)修改系统环境变量, JAVA_HOME调整为Studio下对应的java…...

令执法机构头疼的“虚拟货币犯罪”,为何链上天眼能“行”

谈到洗钱,你脑海中率先想到的可能是影视剧中利用赌场、收藏品拍卖等来实施犯罪。其实洗钱犯罪的花样不止于此,在近期热播的扫黑剧《狂飙》中,唐小龙为洗白“赌博资金、高利贷业务”,便通过“卖酒网销”的方式达成洗钱目的。 随着科…...

【unity】开发rts 3

一 出生点、阵营类型、阵营 实例栏-GameManage,默认有一个插槽 size 插槽数量 role 权限,host是主人,权限高 type 阵营类型,不选不限制,选的效果没看懂,文档原文: The Type field in Data al…...

突破老旧OA系统局限,打通五大业务管理体系,让效率“狂飙”

目录 用无代码构建上海致远信息化平台 一、支持类(行政人事、财务)体系 二、营销体系 三、供应链体系 四、质量管理体系 五、技术研发体系 下一步规划 我们公司用的第一套系统是 IBM 的系统,部署在本地服务器,这套系统用了十几年,当时 2020 年要全部迁移到LCHub低代…...

【vue2小知识】路由守卫的使用与解决RangeError: Maximum call stack size exceeded问题的报错。

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作 【前言】当我们在做类似于登录页面的时候&…...

Google Guice 5:AOP

1. AOP 1.1 实际开发中面临的问题 在实际开发中&#xff0c;经常需要打印一个方法的执行时间&#xff0c;以确定是否存在慢操作 最简单的方法&#xff0c;直接修改已有的方法&#xff0c;在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…...

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年&#xff0c;是一个托管和同…...

Linux 文件、目录与磁盘格式

用户与用户组 用户&#xff1a;即某个文件的拥有者&#xff0c;可以管理自己账号下的文件&#xff0c;另有一个超级账号 root&#xff0c;可以统一管理全局&#xff0c;利用 su root 命令登录该账号。用户组&#xff1a;相当于群组&#xff0c;多个用户之间可以组成用户组&…...

锁屏面试题百日百刷-Hive篇(五)

锁屏面试题百日百刷&#xff0c;每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线&#xff0c;官网地址&#xff1a;https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容&#xff0c;还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…...

java多线程(七)线程等待与唤醒

一、wait()、notify()、notifyAll()等方法介绍 在Object.java中&#xff0c;定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态&#xff0c;同时&#xff0c;wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用&#xff0…...

第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)

1.仓储服务开发配置 1.1.加入到Nacos注册中心 spring:application:name: gmall-warecloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c1.2.配置网关路由 spring:cloud:gateway:routes:- id: ware_routeuri: lb://gmal…...

Maven 命令行及例子

基本 mvn -v - show-version -version 显示版本信息mvn -h - help 显示帮助信息mvn -e -errors控制 maven 的日志级别&#xff0c;产生执行错误相关消息mvn -q - quiet 控制 maven 的日志级别&#xff0c;仅仅显示错误mvn -o - offline 运行 offline 模式&#xff0c;不联网更…...

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在&#xff0c;表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…...

为什么图标的宽度总是8的倍数?

对于 Windows 上的所有图标而言&#xff0c;它的宽度总是8的倍数&#xff0c;这可不是因为人们喜欢2的幂&#xff0c;虽然在计算机世界&#xff0c;你会看到很多这样的数字&#xff0c;例如&#xff0c;1024&#xff0c;4096等。 在 Windows 的早期阶段&#xff0c;大多数显卡…...

手机如何做微商城网站设计/百度seo白皮书

1.准备六个面 div做出六个面&#xff0c;在同一个父级容器下 父级容器的transform-style:preserve-3d 六个div设置成绝对定位&#xff0c;重叠在一起 2.父元素做简单的变换 父元素用transform:rotate旋转 3.每个子页面做3D变换 每个子页面则用rotate旋转&#xff0c;和t…...

网站流量100g/自己搭建网站需要什么

完整微信小程序(Java后端) 技术贴目录清单页面&#xff08;必看&#xff09; 图标。组件属性的长度单位默认为px&#xff0c;2.4.0起支持传入单位(rpx/px)。 属性类型默认值必填说明最低版本typestring是icon的类型&#xff0c;有效值&#xff1a;success, success_no_circle…...

衡水网站制/免费发帖的平台有哪些

1.背景 中文互联网没有真正的以地信遥感的资源内容为导向的网站。 而对于寻找相关地信资源、卫星产品数据的初学者&#xff0c;主要通过以下方式获取数据: 百度直接搜索数据。 通过淘宝、闲鱼购买数据&#xff1b; 转发公众号的推文&#xff0c;获取数据。 而知道各类数据下载…...

求邯郸网站制作/网店培训骗局

好的参考&#xff1a;https://linux.cn/article-4302-1.html http://darkdust.net/files/GDB%20Cheat%20Sheet.pdf 1&#xff09;加 -g 了吗&#xff1f; 首先请确保在编译时加上了-g 如果出现找不到*.cpp文件等错误&#xff0c;一般是没有正确添加 -g 选项。 2&#xff…...

网站 党组织建设/seo商学院

转自&#xff1a;http://tchuairen.blog.51cto.com/3848118/1686875/ 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tchuairen.blog.51cto.com/3848118/1686875 上一篇介绍了邮件服务器…...

如何拥有自己的私人网站平台/app推广方式有哪些

Orcad 画原理图的快捷键与allegro pcb不同&#xff0c;Orcad是无法修改快捷键的&#xff0c;只能使用系统自带的常用快捷键 I&#xff1a;放大原理图 O&#xff1a;缩小原理图 R&#xff1a;90度旋转 H&#xff1a;水平翻转...