跳到主要内容

服务端渲染

Analog 支持在开发和生产环境构建时的服务端渲染。

转换包以实现 SSR 兼容性

有些依赖项可能需要额外的转换才能用于服务端渲染。如果你在开发过程中遇到 SSR 错误,一个选项是在 Vite 配置中吧这些包添加到 ssr.noExternal 数组中。

你可以使用 glob 范式来包括包或者库。下面是一些例子:

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
ssr: {
noExternal: [
'apollo-angular', // npm 包导入
'apollo-angular/**', // npm 包及其子包导入
'@spartan-ng/**', // Nx 工作空间下 npmScope 的库
],
},
// ...其他配置
}));

关于 SSR 的外部依赖项更多信息,请参阅 Vite 文档

混合渲染与仅客户端路由

SSR 默认是启用的。对于混合方法,你可以指定一些路由仅在客户端渲染,而不进行服务端渲染。这是通过 routeRules 配置对象指定 ssr 选项来完成的。

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// ...其他配置
plugins: [
analog({
prerender: {
routes: ['/', '/404.html'],
},
nitro: {
routeRules: {
// 所有 admin URL 仅在客户端渲染
'/admin/**': { ssr: false },

// 渲染 404 页面作为后备页面
'/404.html': { ssr: false },
},
},
}),
],
}));

禁用 SSR

SSR 默认是开启的。你可以通过在 vite.config.tsanalog() 插件里添加以下选项来禁用它并且生成仅客户端的构建:

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// ...其他配置
plugins: [
analog({
ssr: false,
prerender: {
routes: [],
},
}),
],
}));

预渲染路由

"/" 路由在 SSR 模式下默认会被预渲染。

当用户访问应用的根目录时返回渲染的 HTML 是一个关键步骤。预渲染的路由可以自定义,但是请记住一定要包含 "/" 根路由。

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// ...其他配置
plugins: [
analog({
prerender: {
routes: ['/', '/about'],
},
}),
],
}));

你可以通过传入一个空数组来禁用预渲染,并在根路由上禁用预渲染。

import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// ...其他配置
plugins: [
analog({
ssr: true,
prerender: {
routes: async () => {
return [];
},
},
}),
],
}));