函数内联混淆后代码报错,该怎么排查?
最近给项目加了代码混淆,用了terser的inline设置,结果打包后页面报错”Cannot read properties of undefined (reading ‘call’)”
我检查过混淆配置是这样写的:
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: { inline: 2 },
},
}),
],
},
错误发生在某个高阶函数调用的地方,比如compose(fnA)(fnB())()。把inline调成0后问题消失,但这样又达不到混淆效果。试过升级terser版本和调整keep_fnames参数都没用,求大佬指点排查方向?
排查的话建议先确认是不是某个特定函数被错误内联了。你可以在terserOptions里加个warningPass选项设为true,这样打包时会输出警告信息,看看是不是某些函数被过度优化了。
解决办法有几个方向可以试试。第一种是给容易出问题的高阶函数加上注释禁用内联:
/*#__PURE__*/ compose(fnA)(fnB())()第二种是调整inline策略,不全局使用inline:2,而是通过pure_funcs指定需要内联的函数名:
最后如果还是不行,可以考虑用mangle选项里的reserved保留关键函数名不被混淆:
keep_fnames: /compose|with|wrapper/这几种方法按需组合基本能解决大部分高阶函数内联报错的问题。调试这种问题确实挺烦人的,我之前也被坑过好几次,慢慢调吧。