美文网首页工作生活
通过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异常

    RN的js异常,上报的堆栈信息是包含转化后的行号和列号,但是没有具体的js文件信息,这样对于定位js的问题很难,我...

  • webpack基础(七)sourceMap

    sourceMap 在解析js中可能会将高级语法转为低级语法 添加映射文件,调试源代码 1.source-map(...

  • RN学习网址(持续更新)

    学习RN之前我们需要了解 ReactHTM,JS相关知识 RN学习网站 RN中文网源码分析(RN源码解析我觉得这个...

  • 前端异常监控

    实现思路 前端 js报错事件监听+上报错误信息 后端 提供接口收集报错 根据前端提供的sourcemap文件解析前...

  • 重新评估通过Pod私有库引入React-Native

    Pod 私有库引入 RN原因 最大的原因是,原生开发不用考虑 RN 中 js 代码变更。具体如下 由于整个工程通过...

  • React Native java调用js源码分析

    RN若要调用js,先通过 (mReactContext.getJSModule(NativeToJsBridge....

  • React Native与原生iOS交互

    React Native与原生的交互 ios解析引擎 RN调用的是ios自带的JavaScriptCore做为JS...

  • 2019-07-05

    一、sourceMap sourceMap是一个映射关系,他知道dist目录下dist.js文件96行出错 实际对...

  • ReactNative JS端的崩溃检测处理

    RN JS端出错,在Debug环境显示为红屏报错,生产环境APP直接闪退。RN端有全局异常捕获函数 实现了该函数后...

  • SourceMap mappings解析

    源映射格式 所有地址可以是 http:// 开头的网址或者是本地文件地址。 下面着重介绍mappings mapp...

网友评论

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

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