代码混淆后如何保证前端逻辑完整性?
我用 Webpack + Terser 做了代码混淆,但发现某些 React 组件的逻辑在生产环境跑着跑着就出错了,本地开发完全正常。怀疑是混淆过程中变量名或控制流被改乱了,但又不能关掉混淆,安全审计过不了。
比如下面这个简单的权限校验组件,混淆后 sometimes 返回了错误的渲染结果:
const AuthGuard = ({ role, children }) => {
const userRole = useSelector(state => state.auth.role);
if (!userRole || role !== userRole) {
return <div>无权限</div>;
}
return <>{children}</>;
};
有没有办法在开启混淆的同时,确保关键逻辑不被破坏?或者怎么排查是哪部分被“误伤”了?
1. 先确保babel配置正确,特别是preset-react的development模式要关掉:
2. 给关键组件加displayName防止被混淆:
3. Terser配置里加个safari10选项,能避免一些奇怪的优化:
4. 对于你这个权限组件,可以优化成用useMemo包裹条件判断,减少被混淆影响的可能性:
排查的话建议:
- 先用source-map找具体出错位置
- 把生产包里的对应组件代码复制出来格式化后看看
- 重点检查条件判断和依赖数组部分
要是还不行,可以在terser配置里加个compress: { keep_fnames: true },虽然会降低混淆效果但能保住关键函数名。