You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:09:50