升级DOMPurify至3.1.6/2.4.9后Gulp压缩遇正则语法错误求助
问题
此前使用DOMPurify 2.3.10搭配Gulp进行文件压缩,一切运行正常。但升级至3.1.6或2.4.9版本后,出现以下错误:
Uncaught SyntaxError: Invalid regular expression: //gm),DATA_ATTR=seal(/: Unmatched ')'
3.1.6版本相关代码:
MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm), ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm), TMPLIT_EXPR = seal(/\${[\w\W]*}/gm), DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/), ARIA_ATTR = seal(/^aria-[\-\w]+$/);
2.3.10版本相关代码:
MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm), ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm), DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/);
问题根源是Chrome将TMPLIT_EXPR中的\${[\w\W]*}识别为模板字面量并替换为空值,导致正则表达式语法错误。需要通过Gulp或其他方式解决该问题且不引入新问题。
解决方案
方法1:调整Gulp压缩工具的模板字面量处理规则
如果使用gulp-uglify或gulp-terser进行压缩,可通过配置禁用模板字面量相关优化,或升级压缩工具到最新版本(新版本通常已修复这类正则解析bug)。
以gulp-terser为例的配置示例:
const terser = require('gulp-terser'); gulp.task('minify-js', () => { return gulp.src('src/*.js') .pipe(terser({ compress: { // 保留模板字面量结构,避免误解析正则中的${} keep_template_literals: true } })) .pipe(gulp.dest('dist')); });
方法2:修改DOMPurify源码的正则定义
临时修改DOMPurify源码,将正则字面量改为字符串构造形式,避免被浏览器误识别为模板字面量:
// 替换原正则定义 TMPLIT_EXPR = seal(new RegExp('\\${[\\w\\W]*}', 'gm')),
修改后再通过Gulp打包,即可规避语法错误。
方法3:使用DOMPurify官方预编译版本
直接引入DOMPurify官方提供的预编译压缩包,官方版本已处理好正则转义问题,无需自行压缩,可直接避免该错误。
内容的提问来源于stack exchange,提问作者Maldanna Gk
相关产品推荐
相关产品推荐

