<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>服务端渲染 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B8%B2%E6%9F%93/</link><description>Recent content in 服务端渲染 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B8%B2%E6%9F%93/index.xml" rel="self" type="application/rss+xml"/><item><title>Next.js核心功能与场景</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-34/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-34/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察候选人对现代SSR框架的&lt;strong>场景化架构能力&lt;/strong>和&lt;strong>渲染策略决策能力&lt;/strong>，重点评估：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>渲染模式原理理解&lt;/strong>：SSR(服务端渲染)与SSG(示例场景：商品详情页访问量100万/天)&lt;/li>
&lt;/ol>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>SSR &amp;gt; SSG &amp;gt; ISR &amp;gt; API Routes &amp;gt; 混合渲染策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>SSR (Server-side Rendering)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>工作流程：请求到达时Node.js服务器执行&lt;code>getServerSideProps&lt;/code>，获取实时数据生成完整HTML&lt;/li>
&lt;li>适用场景：用户相关数据(如个性化推荐)、高频更新的资讯类页面、需要首屏性能但无法预生成的内容&lt;/li>
&lt;li>性能消耗：TTFB时间受数据接口响应速度影响&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>SSG (Static Site Generation)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>工作原理：构建阶段通过&lt;code>getStaticProps&lt;/code>生成静态HTML，可托管CDN&lt;/li>
&lt;li>强化模式：通过&lt;code>revalidate&lt;/code>实现ISR（增量静态再生），在指定时间间隔后重新生成&lt;/li>
&lt;li>适用场景：产品文档、营销落地页、电商商品详情页等相对静态内容&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>API Routes&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>本质：基于Vercel Serverless的BFF层(Backend for Frontend)&lt;/li>
&lt;li>核心能力：直接访问数据库/第三方API，解决浏览器跨域问题&lt;/li>
&lt;li>典型应用：身份验证、支付回调、敏感操作&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>在SSG页面中调用浏览器API（如localStorage）&lt;/li>
&lt;li>误将&lt;code>getServerSideProps&lt;/code>用于可缓存内容导致服务器压力过大&lt;/li>
&lt;li>未处理SSG的&lt;code>fallback&lt;/code>状态导致404体验不佳&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Next.js的渲染策略选择需综合考量内容时效性、流量规模和数据源特性：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>SSR适用场景&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>电商首页：需要实时库存状态和个性化推荐&lt;/li>
&lt;li>用户仪表盘：包含敏感数据的动态仪表盘&lt;/li>
&lt;li>配置示例：&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9e9d0ab" class="language-javascript ">
 &lt;code>export async function getServerSideProps(context) {
 const res = await fetch(&amp;#39;https://api.com/realtime-data&amp;#39;)
 return { props: { data: await res.json() } }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>&lt;strong>SSG最佳实践&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>文档网站：内容更新频率低于1次/小时&lt;/li>
&lt;li>产品介绍页：营销活动页面&lt;/li>
&lt;li>强化配置：&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="be4a49d" class="language-javascript ">
 &lt;code>export async function getStaticProps() {
 return { 
 props: { /* ... */ },
 revalidate: 3600 // 启用ISR，每小时再生
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>&lt;strong>API Routes典型用例&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>支付回调处理：&lt;code>/api/payment-callback&lt;/code>&lt;/li>
&lt;li>数据库直连：避免前端暴露连接字符串&lt;/li>
&lt;li>代理层：封装第三方API调用&lt;/li>
&lt;/ul>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="混合渲染示例">混合渲染示例 &lt;a href="#%e6%b7%b7%e5%90%88%e6%b8%b2%e6%9f%93%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="eae04f4" class="language-javascript ">
 &lt;code>// 商品详情页（SSG&amp;#43;CSR）
export async function getStaticProps() {
 const product = await getProductFromCMS() // 基础数据预取
 return { props: { product }, revalidate: 60 }
}

function ProductPage({ product }) {
 // 客户端获取实时库存
 const [stock, setStock] = useState(product.stock)
 useEffect(() =&amp;gt; {
 fetchStock(product.id).then(setStock)
 }, [])
 
 return &amp;lt;div&amp;gt;{stock}件剩余&amp;lt;/div&amp;gt;
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="性能优化">性能优化 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>CDN缓存策略&lt;/strong>：SSG页面设置Cache-Control: public, max-age=31536000&lt;/li>
&lt;li>&lt;strong>流式SSR&lt;/strong>：结合Suspense边界逐步发送HTML片段&lt;/li>
&lt;li>&lt;strong>边缘计算&lt;/strong>：通过Middleware实现按地域SSR&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>&lt;strong>如何实现SSG页面的多语言支持？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>答案提示：基于&lt;code>getStaticPaths&lt;/code>的locale参数生成静态版本&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>SSR场景下如何避免服务器过载？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>答案提示：结合Redis缓存+请求限流&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>如何监控SSR的TTFB指标？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>答案提示：使用&lt;code>next-ax&lt;/code>或自定义APM埋点&lt;/li>
&lt;/ul></description></item><item><title>Vite服务端渲染（SSR）实现</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-20/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-20/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>SSR原理理解&lt;/strong>：是否清晰服务端渲染(SSR)的运行时机制，包括客户端激活(hydration)、双端构建等核心概念&lt;/li>
&lt;li>&lt;strong>Vite生态实践&lt;/strong>：对Vite插件体系及SSR适配方案的配置能力，特别是如何利用ESM特性优化构建&lt;/li>
&lt;li>&lt;strong>同构应用架构&lt;/strong>：能否正确处理双端代码差异，实现共享逻辑与平台特定逻辑的分离&lt;/li>
&lt;li>&lt;strong>构建流程优化&lt;/strong>：是否掌握SSR项目的特殊构建配置（如external配置、产物处理等）&lt;/li>
&lt;/ol>
&lt;p>具体评估点包括：&lt;/p>
&lt;ul>
&lt;li>双入口配置与构建产物管理&lt;/li>
&lt;li>数据预取与状态同步机制&lt;/li>
&lt;li>客户端激活(hydration)的实现原理&lt;/li>
&lt;li>开发模式与生产模式的差异处理&lt;/li>
&lt;li>第三方库的SSR兼容性处理&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite的SSR构建模式 &amp;gt; 客户端/服务端双入口 &amp;gt; 同构路由系统 &amp;gt; 数据预取&lt;/li>
&lt;li>&lt;code>vite-plugin-ssr&lt;/code>的自动注入机制 &amp;gt; Nuxt 3的文件约定路由 &amp;gt; 构建产物分发包&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite SSR通过&lt;code>ssrLoadModule&lt;/code>实现服务端直接加载ES模块，相比传统打包方案具有更快的冷启动速度。构建时分别生成：&lt;/p>
&lt;ul>
&lt;li>客户端包：包含静态资源和水合逻辑&lt;/li>
&lt;li>服务端包：生成可执行的Node.js渲染器&lt;/li>
&lt;/ul>
&lt;p>&lt;code>vite-plugin-ssr&lt;/code>的工作流程：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1be12a4" class="language- ">
 &lt;code>客户端请求
→ Node服务器渲染首屏
→ 返回包含预取数据的HTML
→ 客户端加载JS进行水合
→ 后续交互转为CSR模式&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆&lt;code>hydrate&lt;/code>与&lt;code>render&lt;/code>的使用场景&lt;/li>
&lt;li>未正确处理异步数据导致的客户端闪屏&lt;/li>
&lt;li>服务端构建未external Node内置模块&lt;/li>
&lt;li>开发环境未配置SSR中间件导致HMR失效&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中实现SSR的两种典型方案：&lt;/p>
&lt;p>&lt;strong>方案一：&lt;code>vite-plugin-ssr&lt;/code>&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>安装插件：&lt;code>npm install vite-plugin-ssr&lt;/code>&lt;/li>
&lt;li>配置&lt;code>vite.config.ts&lt;/code>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="00182e0" class="language-javascript ">
 &lt;code>import ssr from &amp;#39;vite-plugin-ssr&amp;#39;

export default {
 plugins: [ssr({
 prerender: true // 启用预渲染
 })]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>创建服务端入口&lt;code>/pages/_default.page.server.js&lt;/code>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1b45ea8" class="language-javascript ">
 &lt;code>export { render }
import { renderToHtml } from &amp;#39;vite-plugin-ssr&amp;#39;

async function render(pageContext) {
 const appHtml = await renderToHtml(pageContext)
 return { 
 documentHtml: `&amp;lt;div&amp;gt;${appHtml}&amp;lt;/div&amp;gt;`,
 pageContext: { /* 初始状态 */ }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>方案二：Nuxt 3集成&lt;/strong>&lt;/p></description></item></channel></rss>