zoukankan      html  css  js  c++  java
  • 压缩代码如何快速定位到脚本异常位置

      线上的代码几乎都经过了压缩处理,几十个文件打包成了一个并丑化了的代码,当我们收到 a is not defined 的时候,我们根本不知道这个变量 a 究竟是什么含义,此时报错的错误日志显然是无效的。

      那么如何去快速定位到脚本异常的位置呢?

      第一想到的办法是利用 sourcemap 定位到错误代码的具体位置

      另外也可以通过在打包的时候,在每个合并的文件之间添加几行空格,并相应加上一些注释,这样在定位问题的时候很容易可以知道是哪个文件报的错误,然后再通过一些关键词的搜索,可以快速地定位到问题的所在位置。

    一、压缩代码定位错误困难

    // 1、源代码(存在错误)
    function test() {
        noerror // <- 报错
    }
    test();
    
    // 2、经 webpack 打包压缩后产生如下代码
    !function(n){function r(e){if(t[e])return t[e].exports;var o=t[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={};r.m=n,r.c=t,r.i=function(n){return n},r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(t,"a",t),t},r.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},r.p="",r(r.s=0)}([function(n,r){function t(){noerror}t()}]);
    
    // 3、代码如期报错,并上报相关信息
    { msg: 'Uncaught ReferenceError: noerror is not defined',
      url: 'http://127.0.0.1:8077/main.min.js',
      row: '1',
      col: '515' }

      此时,错误信息中行列数为 1 和 515。 结合压缩后的代码,肉眼观察很难定位出具体问题。

    二、如何定位到具体错误

    1、不压缩 js 代码

      这种方式简单粗暴,但存在明显问题:1. 源代码泄漏,2. 文件的大小大大增加。

    2、将压缩代码中分号变成换行

      uglifyjs 有一个叫 semicolons 配置参数,设置为 false 时,会将压缩代码中的分号替换为换行符,提高代码可读性, 如:

    !function(n){function r(e){if(t[e])return t[e].exports
    var o=t[e]={i:e,l:!1,exports:{}}
    return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={}
    r.m=n,r.c=t,r.i=function(n){return n},r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n}
    return r.d(t,"a",t),t},r.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},r.p="",r(r.s=0)}([function(n,r){function t(){noerror}t()}])

      此时,错误信息中行列数为 5 和 137,查找起来比普通压缩方便不少。但仍会出现一行中有很多代码,不容易定位的问题。

    3、js 代码半压缩,保留空格和换行

      uglifyjs 的另一配置参数 beautify 设置为 true 时,最终代码将呈现压缩后进行格式化的效果(保留空格和换行),如

    !function(n) {
        // ...
        // ...
    }([ function(n, r) {
        function t() {
            noerror;
        }
        t();
    } ]);

      此时,错误信息中行列数为 32 和 9,能够快速定位到具体位置,进而对应到源代码。但由于增加了换行和空格,所以文件大小有所增加。

    4、SourceMap 快速定位

      SourceMap 是一个信息文件,存储着源文件的信息及源文件与处理后文件的映射关系。

      在定位压缩代码的报错时,可以通过错误信息的行列数与对应的 SourceMap 文件,处理后得到源文件的具体错误信息。

    5、开源方案 sentry

      sentry 是一个实时的错误日志追踪和聚合平台,包含了上面 sourcemap 方案,并支持更多功能,如:错误调用栈,log 信息,issue管理,多项目,多用户,提供多种语言客户端等,具体介绍可以查看 getsentry/sentrysentry.io,这里暂不展开。

  • 相关阅读:
    werfault进程使用CPU率高
    oracel 拆分字符串
    TCP TIME WAIT
    netstat 命令
    Java 理论与实践: 并发集合类
    DIV与SPAN之间有什么区别
    oracle超出打开游标的最大数的原因和解决方案
    Quartz表达式
    Axis创建webservice客户端和服务端
    Web服务cxf框架发布2
  • 原文地址:https://www.cnblogs.com/goloving/p/13985936.html
Copyright © 2011-2022 走看看