函数内联混淆后代码报错,该怎么排查?

Des.诗雯 阅读 45

最近给项目加了代码混淆,用了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参数都没用,求大佬指点排查方向?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
码农东耀
问题应该出在terser的inline选项对高阶函数的处理上。inline设置为2时,terser会尽可能地把函数内联展开,但对于像compose(fnA)(fnB())()这种链式调用的高阶函数,很容易因为上下文丢失导致this指向错误。

排查的话建议先确认是不是某个特定函数被错误内联了。你可以在terserOptions里加个warningPass选项设为true,这样打包时会输出警告信息,看看是不是某些函数被过度优化了。

解决办法有几个方向可以试试。第一种是给容易出问题的高阶函数加上注释禁用内联:

/*#__PURE__*/ compose(fnA)(fnB())()

第二种是调整inline策略,不全局使用inline:2,而是通过pure_funcs指定需要内联的函数名:


terserOptions: {
compress: {
inline: 1,
pure_funcs: ['safeFunc1', 'safeFunc2']
}
}


最后如果还是不行,可以考虑用mangle选项里的reserved保留关键函数名不被混淆:

keep_fnames: /compose|with|wrapper/

这几种方法按需组合基本能解决大部分高阶函数内联报错的问题。调试这种问题确实挺烦人的,我之前也被坑过好几次,慢慢调吧。
点赞 1
2026-02-14 12:10