专栏名称: 前端外刊评论
最新、最前沿的前端资讯,最有深入、最干前端相关的技术译文。
目录
相关文章推荐
奇舞精选  ·  从 DeepSeek 看25年前端的一个小趋势 ·  昨天  
奇舞精选  ·  从 DeepSeek 看25年前端的一个小趋势 ·  昨天  
前端早读课  ·  【第3452期】React 开发中使用开闭原则 ·  2 天前  
前端早读课  ·  【第3451期】前端 TypeError ... ·  3 天前  
51好读  ›  专栏  ›  前端外刊评论

在线追踪压缩后的JS出错代码

前端外刊评论  · 公众号  · 前端  · 2017-11-06 14:06

正文

目前的web静态资源为了减少加载时间和一部分的安全原因,都对js文件进行了合并和压缩,虽然在网页体验上非常不错,但是对于在线js的错误跟踪就显得异常麻烦

解决思路

对于不要压缩,这点肯定是不能妥协的,用户体验是坚决不能牺牲的,但是能不能从压缩着手呢?答案是肯定的,第一时间,我们应该就会想到sourcemap,在sourcemap上来解决问题

怎么利用sourcemap

深入了解sourcemap映射原理前,最好读一下阮老师的文章《JavaScript Source Map 详解》。 读完之后,我们就大致了解了sourcemap的几个概念,接下来我们具体分析一下

1. sourcemap文件结构

  1. {

  2.     version : 3,

  3.     file: "out.js",

  4.     sourceRoot : "",

  5.     sources: ["foo.js", "bar.js"],

  6.     names: ["src", "maps", "are", "fun"],

  7.     mappings: "AAgBC,SAAQ,CAAEA"

  8. }

mappings里面的数据就是对应位置的映射,需要对mappings里面的各个位置进行分解

2. 分析位置

我们使用vlq库进行分解,获取具体的位置信息

  1. /*

  2. * 返回相应的位置信息

  3. * rt[0]:这个位置在(转换后的代码的)的第几列。

  4. * rt[1]:这个位置属于sources属性中的哪一个文件。

  5. * rt[2]:表示这个位置属于转换前代码的第几行。

  6. * rt[3]:表示这个位置属于转换前代码的第几列。

  7. * rt[4]:表示这个位置属于names属性中的哪一个变量。

  8. */

  9. let rt = vlq.decode( 'AAgBC' );

3. 记录完整的映射关系

对于第二步,只是知道每个点位的位置,然后对于全部位置的记录,需要关联整理,可以参考sourcemap-stack库,其中/src/mappingRealPath.js文件下面的mappingSingleFile函数记录关联了全部信息,以便后续使用

4.注意点

根据不同的环境,可能在计算中会有小偏差,所以我们需要修正相应的位置映射。在sourcemap-stack中,/src/mappingRealPath.js文件下面的mapErrorPosition函数进行了位置修正,以便正确获取

怎么产生sourcemap

  1. 如果目前在使用react,vue等框架时,一般都会用到webpack,在webpack打包的时候,是可以生产map文件的







请到「今天看啥」查看全文