美文网首页工作生活
通过SourceMap解析RN中的js异常

通过SourceMap解析RN中的js异常

作者: jayhe | 来源:发表于2019-07-01 15:45 被阅读0次

    RN的js异常,上报的堆栈信息是包含转化后的行号和列号,但是没有具体的js文件信息,这样对于定位js的问题很难,我们需要通过在RN打包的时候导出sourcemap,然后通过sourcemap解析js的异常,定位到具体的js文件,从而帮助我们去解决js的问题

    1. RN打包导出sourcemap

    只需要在RN提供的bundle工具,加上命令选项--sourcemap-output,参数值传需要导出map的路径,eg:SourceMapPath='../main.sourcemap'

    ./node_modules/.bin/react-native bundle \
                    --entry-file index.js \
                    --bundle-output ${BundlePath} \
                    --platform ios \
                    --assets-dest ${AssetsPath} \
                    --dev false \
                    --sourcemap-output ${SourceMapPath}
    

    2.解析js的异常

    这里暂时只做了本地解析的流程。

    传入收集到的js异常的line和column,解析出具体的文件信息,并打印同时输出到文件中

    1. 收集到的js异常类似这样:
    (evaluating 'n.inte..., stack: updateIndex@868:3366 onScrollEnd@868:2911 scrollResponderHandleMomentumScrollEnd@208:3066 g@47:296 invokeGuardedCallback@47:496 invokeGuardedCallbackAndCatchFirstError@47:611 A@47:2410 D@47:3172 F@47:2984 <unknown>@47:15122 batchedUpdates@47:65404 Ie@47:14473 ze@47:14968 receiveEvent@47:15409 value@19:3471 <unknown>@19:956 value@19:2898 value@19:928 
    

    updateIndex@868:3366 @符号后面的就行和列

    1. 根据行和列解析定位到具体的js parse_error.js
    /**
     * node parse_error.js line column // 参数为行号列号
     */
    var fs = require('fs');
    var sourceMap = require('source-map');
    var arguments = process.argv.splice(2);
    console.log('所传递的参数是:', arguments);
    function parseJSError(aLine, aColumn) {
        fs.readFile('./main.sourcemap', 'utf8', function (err, data) {
            var smc = new sourceMap.SourceMapConsumer(data);
            let parseData = smc.originalPositionFor({
                line: parseInt(aLine),
                column: parseInt(aColumn)
            });
            // 输出到控制台
            console.log(parseData);
            // 输出到文件中
            fs.appendFile('./parsed.txt', JSON.stringify(parseData) + '\n', 'utf8', function(err) {  
                if(err) {  
                    console.log(err);
                }
            });  
        });
    }
    
    var line = arguments[0];
    var column = arguments[1];
    parseJSError(line, column);
    

    fs.readFile('./main.sourcemap'注意这个地方修改为你本地的sourcemap的路径

    • cd到parse_error.js所在的目录,执行node parse_error.js line column line传行,column传列号
    • 执行结果如下
    hechaodeMac-mini:脚本 hechao$ node parse_error.js 888 888
    所传递的参数是: [ '888', '888' ]
    { source: '/Users/hechao/.jenkins/workspace/cassec-app-ios/RN/node_modules/react-native-vector-icons/node_modules/lodash/_copyArray.js',
      line: 17,
      column: 9,
      name: 'array' }
    
    • 一步步解析,最后得到整个报错堆栈的解析后的文件(在js的同级目录下)


      图片.png

    这里只讲了本地通过sourcemap解析js的异常;理想中应该是sourcemap上传到服务器、js异常上传到服务器,服务器进行异常解析,类似于bugly的功能

    相关文章

      网友评论

        本文标题:通过SourceMap解析RN中的js异常

        本文链接:https://www.haomeiwen.com/subject/cuogcctx.html