代码混淆后动态生成的HTML元素报错找不到,该怎么保证代码完整性?
我在给Vue项目混淆代码时用了Terser,结果发现原本能正常工作的动态DOM操作突然报错”Cannot read property ‘addEventListener’ of null”。比如这个按钮点击后动态创建的div:
<button @click="createElement">生成元素</button>
<div id="dynamic-container"></div>
混淆前正常,混淆后getElementById找不到节点,难道是变量名被压缩导致id冲突了?试过在terser选项里加keep_fnames也不行,求解具体该怎么配置才能保留关键DOM引用?
一个靠谱的解决方案是,在 Terser 的配置里明确保留那些和 DOM 相关的关键标识符。比如你可以通过
mangle.properties来避免压缩特定的属性名。具体配置可以这样写:另外,建议你在代码里尽量避免直接依赖 HTML 的 ID 或者 class 名来做动态操作,改成用 Vue 的 ref 更加稳妥。比如你的例子可以改成这样:
用 ref 的好处是它不会受到混淆的影响,而且更符合 Vue 的设计理念。如果你非得用原生 DOM 操作,记得在 Terser 配置里加上类似
reserved的选项来保护这些关键的 DOM 标识符。比如:总结一下,推荐优先用 Vue 的 ref 来替代原生 DOM 操作,如果一定要用原生方式,记得在 Terser 配置里保护好相关的标识符。这样基本就能解决混淆后找不到节点的问题了。