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,提问作者Валентин Антонов
相关产品推荐
相关产品推荐

