You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular 18升级至19.0.1时,SSR中Domino-Ext引发严格模式下编译失败问题

Angular 18升级至19.0.1时,SSR中Domino-Ext引发严格模式下编译失败问题

我完全理解你升级Angular版本后遇到的这个SSR编译难题——Angular 19对代码规范和严格模式的检查比18版本严苛了不少,而domino-ext这类停更已久的DOM模拟库,代码里还保留着ES严格模式明确禁止的语法(比如报错提示里的with语句),这直接触发了编译失败。

下面给你几个可行的解决方案,按推荐优先级排序:

方案一:迁移到维护活跃的jsdom替代domino-ext

domino-ext已经多年没有更新,对新DOM API的支持严重不足,完全适配不了Angular 19的严格模式要求。而jsdom是目前Node.js端最流行的DOM模拟库,维护活跃,兼容性和功能覆盖都更优秀。

操作步骤:

  1. 卸载旧的domino-ext依赖:
npm uninstall domino-ext
  1. 安装jsdom
npm install jsdom --save
  1. 修改server.ts,替换原来的domino-ext相关逻辑为jsdom写法:
// 替换原有的domino-ext导入
// const domino = require('domino-ext');
import { JSDOM } from 'jsdom';

// ... 保留其他原有导入代码

// 替换DOM模拟的核心逻辑
const template = fs.readFileSync(path.join(distFolder, 'index.html')).toString();
const dom = new JSDOM(template);
// 挂载必要的全局对象
global['window'] = dom.window;
global['document'] = dom.window.document;
global['navigator'] = dom.window.navigator;
global['getComputedStyle'] = dom.window.getComputedStyle;

// 注:jsdom已自动模拟大部分常用DOM对象,无需像domino那样手动逐个声明(如DOMTokenList、Node等),后续若有缺失再按需补充即可

方案二:临时禁用严格模式(不推荐长期使用)

如果你暂时没时间迁移依赖库,可以尝试通过Node.js启动参数绕过严格模式检查,但这只是临时 workaround,长期会带来兼容性和安全风险:
修改package.json中的启动脚本(比如start:server):

"scripts": {
  "start:server": "node --no-strict dist/ss/server/main.js"
}

方案三:升级到Angular 19官方推荐的SSR架构

Angular 19对SSR配置做了大幅优化,官方现在推荐更简洁的初始化方式,能减少手动模拟DOM的需求,从根源上避免版本兼容问题:

  1. (可选)先移除旧的SSR相关依赖和配置
  2. 执行官方SSR初始化命令:
ng add @angular/ssr

这个命令会自动生成符合Angular 19规范的server.ts、配置文件和启动脚本,完全适配新版本的严格模式要求。

额外注意事项:

  • 确保zone.js版本与Angular 19兼容,建议升级到最新版:npm install zone.js@latest
  • 检查tsconfig.server.json中的strict配置,Angular 19默认启用strict: true,自定义配置需与官方规范保持一致

备注:内容来源于stack exchange,提问作者Santosh

火山引擎 最新活动