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

Angular Universal能否指定部分路径不进行服务端渲染?

如何让Angular Universal跳过特定路径的服务端渲染

当然可以实现!你只需要在server.ts里调整路由匹配逻辑,给不需要SSR的路径单独设置处理规则,直接返回静态的客户端index.html,就能实现和常规ng serve一致的客户端渲染行为。

修改思路

Express的路由是按定义顺序匹配的,所以我们要把“跳过SSR”的路由规则放在通用的Universal渲染路由之前,确保特定路径的请求先被捕获处理,不会走到服务端渲染的逻辑里。

修改后的server.ts代码

export function app() { 
  const server = express(); 
  const distFolder = join(process.cwd(), 'dist/browser'); 
  const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index'; 

  // Our Universal express-engine
  server.engine('html', ngExpressEngine({ 
    bootstrap: AppServerModule, 
  })); 
  server.set('view engine', 'html'); 
  server.set('views', distFolder); 

  // TODO: implement data requests securely 
  server.get('/api/**', (req, res) => { 
    res.status(404).send('data requests are not yet supported'); 
  }); 

  // Serve static files from /browser 
  server.get('*.*', express.static(distFolder, { maxAge: '1y' })); 

  // 👇 添加这部分:特定路径跳过SSR,直接返回客户端index.html
  // 示例:匹配所有以/client-only开头的路径
  server.get('/client-only/**', (req, res) => {
    res.sendFile(join(distFolder, indexHtml));
  });

  // All regular routes use the Universal engine 
  server.get('*', (req, res) => { 
    res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] }); 
  }); 

  return server; 
}

关键说明

  • 路由顺序很重要:必须把跳过SSR的路由放在server.get('*', ...)之前,否则会被Universal的通用渲染逻辑优先捕获,达不到跳过的效果。
  • 多路径支持:如果有多个路径需要跳过SSR,可以用正则表达式批量匹配,比如:
    // 匹配/client-page1或/client-page2开头的所有路径
    server.get(/^\/(client-page1|client-page2)\/.*$/, (req, res) => {
      res.sendFile(join(distFolder, indexHtml));
    });
    
  • 行为差异:跳过SSR的路径会完全由客户端Angular应用接管,和ng serve一致,不会经过服务端的渲染过程,适合那些依赖浏览器特定API(比如window、document)且不需要SEO的页面。

内容的提问来源于stack exchange,提问作者Валентин Антонов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:02:31