在metro.config.js中配置drop_console无法移除生产构建的console.log
解决Expo生产构建中console.log无法移除的问题
问题根源
你直接赋值config.transformer.minifierConfig会覆盖掉getSentryExpoConfig生成的原有minifier配置,导致metro的压缩规则没有正确应用。
修复metro.config.js配置
修改minifierConfig的赋值逻辑,用扩展运算符合并原有配置,而不是完全替换:
const { getSentryExpoConfig } = require('@sentry/react-native/metro'); module.exports = (() => { const config = getSentryExpoConfig(__dirname); const { transformer, resolver } = config; config.transformer = { ...transformer, babelTransformerPath: require.resolve("react-native-svg-transformer"), // 合并原有minifier配置,添加drop_console minifierConfig: { ...transformer.minifierConfig, compress: { ...(transformer.minifierConfig?.compress || {}), drop_console: true, }, }, }; config.resolver = { ...resolver, assetExts: resolver.assetExts.filter((ext) => ext !== "svg"), sourceExts: [...resolver.sourceExts, "svg"], }; return config; })();
更可靠的替代方案:使用Babel插件
如果上述方法仍不生效,可以用babel-plugin-transform-remove-console直接在编译阶段移除console语句,这种方式不受metro配置影响:
- 安装插件:
npm install babel-plugin-transform-remove-console --save-dev # 或 yarn add babel-plugin-transform-remove-console --dev
- 修改
babel.config.js,仅在生产环境启用:
module.exports = function(api) { api.cache(true); return { presets: ['babel-preset-expo'], plugins: [ // 只有生产环境才移除console process.env.NODE_ENV === 'production' && 'transform-remove-console', ].filter(Boolean), }; };
额外检查点
- 确认EAS构建时使用的是
production环境,在eas.json中确保构建配置的env设置为production - 清理构建缓存后重新构建:运行
npx expo prebuild --clean或在EAS构建时勾选清理缓存选项
内容的提问来源于stack exchange,提问作者Andrew Radulescu
相关产品推荐
相关产品推荐

