Angular Universal SSR初始化AOS库报document未定义错误
错误原因
Angular Universal 是在 Node.js 服务端完成首屏渲染,Node 运行环境不存在浏览器原生提供的 document、window 等DOM全局对象。document is not defined错误来自AOS库本身:AOS是面向浏览器端的滚动动画库,初始化阶段会直接访问document对象做DOM查询、全局样式注入,服务端执行AOS.init()时找不到对应对象就会抛出引用错误。
修复方案
核心原则是所有AOS相关逻辑只在浏览器端执行,服务端完全跳过,具体实现步骤如下:
- 引入Angular内置的平台判断工具,区分当前代码运行在服务端还是浏览器
- 仅在浏览器环境下加载、初始化AOS库
修改后的AppComponent代码如下:
import { Component, OnInit, PLATFORM_ID, Inject } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { SeoService } from './core/services/seo.service'; // 若import阶段就触发document报错,可删除这行静态导入,改用下方动态导入写法 import * as AOS from 'aos'; @Component({ selector: 'rvi-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], }) export class AppComponent implements OnInit { constructor( private seo: SeoService, @Inject(PLATFORM_ID) private platformId: Object ) {} ngOnInit() { this.seo.initDefaultMetaTags(); if (isPlatformBrowser(this.platformId)) { // 静态导入写法,适用于AOS import阶段无DOM访问的版本 AOS.init({ once: true, duration: 1000 }); // 若静态导入仍报错,注释上面的AOS.init,改用动态导入写法 // import('aos').then(AOSModule => { // AOSModule.default.init({ once: true, duration: 1000 }); // }) } } }
额外注意事项
- 如果项目存在路由跳转,路由切换渲染的新DOM元素不会被AOS自动识别,可在路由导航结束事件中,同样在浏览器环境判断内调用
AOS.refresh()刷新动画绑定 - 不要在服务端模块里引入AOS相关的服务或逻辑,避免构建或运行时异常
内容的提问来源于stack exchange,提问作者syahiruddin
相关产品推荐
相关产品推荐

