使用esbuild构建Chrome扩展时,如何避免转译代码出现eval?
解决esbuild构建Chrome扩展时生成eval的问题
针对你的情况,esbuild生成eval通常源于两个原因:一是对Node.js模块(如vm)的自动polyfill,二是低版本target导致的不必要语法转译。可以通过以下配置修改解决:
调整esbuild配置
修改构建配置,添加目标版本并禁用不必要的polyfill:
require('esbuild') .build({ entryPoints: [ 'src/contentScript.ts', 'src/index.html', ], outdir: 'dist', bundle: true, platform: 'browser', target: 'chrome90', // 根据你的需求指定适配的Chrome版本 external: ['vm'], // 阻止esbuild polyfill Node.js的vm模块 // 移除regeneratorRuntime的banner:高版本Chrome原生支持async/await等特性,无需额外声明 }) .catch(() => process.exit(1));
配置说明
- target: 'chrome90':Chrome 90及以上版本已原生支持async/await、Generator函数等ES6+特性,esbuild会跳过不必要的转译逻辑,不再生成依赖
regeneratorRuntime的代码,从根源避免相关的eval生成。 - external: ['vm']:你的代码或依赖可能间接引入了Node.js的
vm模块,esbuild在浏览器平台下会自动为其生成包含eval的polyfill。添加该配置可阻止该polyfill生成(前提是你的代码实际不需要vm模块功能)。 - 移除banner配置:当target版本足够高时,Chrome原生支持所需特性,无需再声明
regeneratorRuntime。
额外检查
如果修改后仍存在eval,排查以下内容:
- 代码中是否有使用
new Function()、动态拼接代码等手动生成代码的逻辑? - 依赖库内部是否使用了eval或类似动态执行逻辑?
内容的提问来源于stack exchange,提问作者sdfsdf
相关产品推荐
相关产品推荐

