React项目混淆后接口请求失败是怎么回事?
我用 webpack + terser 对 React 项目做了 JS 混淆,结果上线后发现调用接口报错了。本地没混淆时一切正常,混淆后某些请求参数好像被改掉了?
比如下面这个组件里的 fetch 请求,混淆后用户名字段传成了 undefined,但代码里明明写了 user.name 啊:
const LoginButton = ({ user }) => {
const handleClick = () => {
fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username: user.name })
});
};
return <button onClick={handleClick}>登录</button>;
};
解决方案很简单,在webpack配置里调整terser的mangle.properties选项,保护你需要的字段名不被混淆:
如果你用的是旧版terser(webpack4),配置稍微不一样:
另一种更省心的办法是在代码里用字符串字面量写属性名,terser就不会动它:
不过如果字段多的话还是建议用第一种方案,统一在webpack里配置。