从 React Native 应用程序中删除 console.log
Removing console.log from React Native app
在将 React Native 应用程序部署到商店之前,您是否应该删除 console.log()
调用?如果 console.log()
调用保留在代码中,是否存在一些性能或其他问题?
有没有办法删除一些任务运行器的日志(以类似于 Grunt 或 Gulp 等网络相关任务运行器的方式)?我们在 development/debugging/testing 阶段仍然需要它们,但不在生产阶段。
相信最好的做法是将调试代码包装在诸如...
if(__DEV__){
console.log();
}
这样,只有当您 运行 在打包程序或模拟器中时,它才会运行。更多信息在这里...
https://facebook.github.io/react-native/docs/performance#using-consolelog-statements
好吧,您可以随时执行以下操作:
if (!__DEV__) {
console.log = () => {};
}
因此,一旦 __DEV__
不正确,每个 console.log
都会失效。
Babel 转译器可以使用以下插件为您删除 console
语句:
npm i babel-plugin-transform-remove-console --save-dev
编辑 .babelrc:
{
"env": {
"production": {
"plugins": ["transform-remove-console"]
}
}
}
并且 console
语句已从您的代码中删除。
使用 Sentry
跟踪异常会在生产中自动禁用 console.log
,但也会将其用于跟踪设备日志。因此,您可以在哨兵异常详细信息(面包屑)中查看最新日志。
我发现以下是一个不错的选择,因为即使 __DEV__ === true,如果您不是远程调试,也不需要记录。
事实上,我发现 RN/JavaScriptCore/etc 的某些版本在记录(甚至只是字符串)时几乎停止,而 Chrome 的 V8 引擎则不是这种情况。
// only true if remote debugging
const debuggingIsEnabled = (typeof atob !== 'undefined');
if (!debuggingIsEnabled) {
console.log = () => {};
}
我知道这个问题已经得到解答,但我只想添加我自己的 two-bits。返回 null
而不是 {}
略微 更快,因为我们不需要在内存中创建和分配空对象。
if (!__DEV__)
{
console.log = () => null
}
这显然极小,但您可以在下面看到结果
// return empty object
console.log = () => {}
console.time()
for (var i=0; i<1000000; i++) console.log()
console.timeEnd()
// returning null
console.log = () => null
console.time()
for (var i=0; i<1000000; i++) console.log()
console.timeEnd()
虽然在其他地方测试时更明显:
老实说,在现实世界中,这可能不会有太大的好处,只是想我会分享。
我使用 babel-plugin-transform-remove-console
进行了尝试,但上述解决方案对我不起作用。
如果有人也在尝试使用 babel-plugin-transform-remove-console
可以使用这个。
npm i babel-plugin-transform-remove-console --save-dev
编辑babel.config.js
module.exports = (api) => {
const babelEnv = api.env();
const plugins = [];
if (babelEnv !== 'development') {
plugins.push(['transform-remove-console']);
}
return {
presets: ['module:metro-react-native-babel-preset'],
plugins,
};
};
在将 React Native 应用程序部署到商店之前,您是否应该删除 console.log()
调用?如果 console.log()
调用保留在代码中,是否存在一些性能或其他问题?
有没有办法删除一些任务运行器的日志(以类似于 Grunt 或 Gulp 等网络相关任务运行器的方式)?我们在 development/debugging/testing 阶段仍然需要它们,但不在生产阶段。
相信最好的做法是将调试代码包装在诸如...
if(__DEV__){
console.log();
}
这样,只有当您 运行 在打包程序或模拟器中时,它才会运行。更多信息在这里... https://facebook.github.io/react-native/docs/performance#using-consolelog-statements
好吧,您可以随时执行以下操作:
if (!__DEV__) {
console.log = () => {};
}
因此,一旦 __DEV__
不正确,每个 console.log
都会失效。
Babel 转译器可以使用以下插件为您删除 console
语句:
npm i babel-plugin-transform-remove-console --save-dev
编辑 .babelrc:
{
"env": {
"production": {
"plugins": ["transform-remove-console"]
}
}
}
并且 console
语句已从您的代码中删除。
使用 Sentry
跟踪异常会在生产中自动禁用 console.log
,但也会将其用于跟踪设备日志。因此,您可以在哨兵异常详细信息(面包屑)中查看最新日志。
我发现以下是一个不错的选择,因为即使 __DEV__ === true,如果您不是远程调试,也不需要记录。
事实上,我发现 RN/JavaScriptCore/etc 的某些版本在记录(甚至只是字符串)时几乎停止,而 Chrome 的 V8 引擎则不是这种情况。
// only true if remote debugging
const debuggingIsEnabled = (typeof atob !== 'undefined');
if (!debuggingIsEnabled) {
console.log = () => {};
}
我知道这个问题已经得到解答,但我只想添加我自己的 two-bits。返回 null
而不是 {}
略微 更快,因为我们不需要在内存中创建和分配空对象。
if (!__DEV__)
{
console.log = () => null
}
这显然极小,但您可以在下面看到结果
// return empty object
console.log = () => {}
console.time()
for (var i=0; i<1000000; i++) console.log()
console.timeEnd()
// returning null
console.log = () => null
console.time()
for (var i=0; i<1000000; i++) console.log()
console.timeEnd()
虽然在其他地方测试时更明显:
老实说,在现实世界中,这可能不会有太大的好处,只是想我会分享。
我使用 babel-plugin-transform-remove-console
进行了尝试,但上述解决方案对我不起作用。
如果有人也在尝试使用 babel-plugin-transform-remove-console
可以使用这个。
npm i babel-plugin-transform-remove-console --save-dev
编辑babel.config.js
module.exports = (api) => {
const babelEnv = api.env();
const plugins = [];
if (babelEnv !== 'development') {
plugins.push(['transform-remove-console']);
}
return {
presets: ['module:metro-react-native-babel-preset'],
plugins,
};
};