对于源映射,我是这样处理的:
在我的生产版本的 bundle 命令中,我告诉它生成一个源映射:
IOS:
react-native bundle --platform ios --entry-file index.ios.js --dev false --bundle-output ./ios/main.jsbundle --assets-dest ./ios --sourcemap-output ./sourcemap.js
Android - 我必须实际修改 android/app/react.gradle 文件才能在发布编译时生成源映射。可能有一种更简单的方法,但基本上你可以找到它在 bundleReleaseJsAndAssets 方法中构建 bundle 命令的位置,并向其中添加源映射位:
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine "cmd","/c", "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease, "--sourcemap-output", file("$buildDir/../../../sourcemap.js")
} else {
commandLine "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease, "--sourcemap-output", file("$buildDir/../../../sourcemap.js")
}
输出路径看起来有点奇怪,但这将它放在你的根级别(与 iOS 相同的位置。我想要那样。你显然可以把它放在任何地方)。
然后,一旦您的行号出现错误,您就可以通过“源映射”NPM 包运行它。您的方法可能会非常详细,但我只是采用了:
var sourceMap = require('source-map');
var fs = require('fs');
fs.readFile('./sourcemap.js', 'utf8', function (err, data) {
var smc = new sourceMap.SourceMapConsumer(data);
console.log(smc.originalPositionFor({
line: 16,
column: 29356
}));
});
应使用上面示例输出中的行号和列号替换行和列。
如果您将源映射存储在某处,因为随着代码的变化,行号和列号会随着构建而变化,这显然最有效。但是,如果您可以使用您选择的源代码控制设置返回用于构建相关应用程序的提交,并使用命令的附加位重新生成包以生成源映射,它应该会非常接近。