移除CSP头unsafe-eval后JS代码报错,2.0.2版本兼容方案咨询
移除CSP
unsafe-eval 后Angular 2.0.2代码无法运行的解决办法 核心方案:切换到AOT编译模式
从报错栈能看出,问题根源是Angular的JIT(即时编译)过程中,编译器调用了new Function()(属于CSP禁止的unsafe-eval范畴)。Angular 2.0.2支持AOT(提前编译),在构建阶段就把模板和组件编译成原生JS,运行时不需要动态编译,自然就不会触发unsafe-eval限制。
具体操作:
- 安装对应版本的AOT工具:
npm install @angular/compiler-cli@2.0.2 @angular/platform-server@2.0.2 --save-dev - 调整项目构建配置:
- 创建
main-aot.ts作为AOT入口,直接导入编译好的模块(不再调用bootstrapModule):import { platformBrowser } from '@angular/platform-browser'; import { AppModuleNgFactory } from './app/app.module.ngfactory'; platformBrowser().bootstrapModuleFactory(AppModuleNgFactory); - 使用
ngc命令编译项目:
(需配置ngc -p tsconfig-aot.jsontsconfig-aot.json,指定angularCompilerOptions,比如"genDir": "aot", "skipMetadataEmit": true等) - 部署编译后生成的AOT文件,替换原来的JIT构建产物
- 创建
额外优化:Zone.js配置调整
报错里提到了zone.min.js,可以做以下配置避免不必要的eval调用:
- 禁用Zone.js的长堆栈追踪功能,这个特性可能依赖
eval,在导入Zone.js前添加:Zone.__disable_long_stack_trace = true;
其他排查方向
- 检查依赖库是否有非
eval版本:部分库会提供不含eval的构建包(比如带-no-eval后缀的版本),替换现有依赖试试 - 排查自定义代码:虽然不修改库代码,但自己的代码里如果有直接用
eval或new Function()的地方,优先移除
内容的提问来源于stack exchange,提问作者bateda
相关产品推荐
相关产品推荐

