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

如何在全独立式Angular应用中安装Angular Universal?

为独立式Angular应用配置Angular Universal

1. 安装Angular Universal依赖

执行官方安装命令,尽管它会生成基于NgModule的文件,后续我们手动调整即可:

ng add @nguniversal/express-engine

2. 重构server.ts文件

安装后生成的server.ts默认依赖NgModule风格的AppServerModule,我们替换为独立式应用的引导逻辑:

  • 删除原有导入:import { AppServerModule } from './src/main.server';
  • 添加必要的独立式API导入:
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './src/app/app.component';
import { provideRouter } from '@angular/router';
import { AppRoutes } from './src/app/app.routes';
import { provideClientHydration } from '@angular/platform-browser';
import { importProvidersFrom } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
  • 替换app()函数内的路由处理逻辑,改为启动独立式应用并渲染:
export function app(): express.Express {
  const server = express();
  const distFolder = join(process.cwd(), 'dist/[你的应用名称]/browser');
  const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';

  server.set('view engine', 'html');
  server.set('views', distFolder);

  // 静态资源服务
  server.get('*.*', express.static(distFolder, {
    maxAge: '1y'
  }));

  // 所有路由使用Universal引擎渲染
  server.get('*', (req, res) => {
    bootstrapApplication(AppComponent, {
      providers: [
        provideRouter(AppRoutes),
        provideClientHydration(),
        importProvidersFrom(BrowserModule.withServerTransition({ appId: 'serverApp' }))
      ]
    }).then((appRef) => {
      appRef.renderToString().then((html) => {
        res.render(indexHtml, { html, req });
        appRef.destroy();
      });
    }).catch(err => console.error(err));
  });

  return server;
}

3. 清理冗余文件并调整main.ts

  • 删除自动生成的src/main.server.ts和src/app/app.server.module.ts,独立式应用不需要这些NgModule文件
  • 保留你已配置好的main.ts,确保BrowserModule.withServerTransition已加入:
bootstrapApplication(AppComponent, {
  providers: [
    importProvidersFrom(
      RouterModule.forRoot(AppRoutes),
      BrowserModule.withServerTransition({ appId: 'serverApp' })
    )
  ]
}).catch(err => console.error(err));

4. 修正angular.json配置

找到architect下的server配置,确认main指向server.ts,outputPath与你的应用打包路径匹配:

"server": {
  "builder": "@angular-devkit/build-angular:server",
  "options": {
    "outputPath": "dist/[你的应用名称]/server",
    "main": "server.ts",
    "tsConfig": "tsconfig.server.json"
  },
  "configurations": {
    "production": {
      "outputHashing": "media"
    }
  }
}

5. 验证SSR运行

执行命令启动SSR开发服务:

npm run dev:ssr

访问http://localhost:4200,即可验证服务端渲染是否正常工作。

注意:确保所有第三方依赖和自定义服务都适配Angular独立式API,若依赖NgModule,可通过importProvidersFrom导入兼容。

内容的提问来源于stack exchange,提问作者Fernando Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:01:01