<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>服务器渲染 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B8%B2%E6%9F%93/</link><description>Recent content in 服务器渲染 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 17 Dec 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B8%B2%E6%9F%93/index.xml" rel="self" type="application/rss+xml"/><item><title>服务器渲染</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/vue/vue-020/</link><pubDate>Sat, 05 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/vue/vue-020/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;什么是SSR(Server-Side Rendering)？类似于用Java、ASP.NET、php开发前端页面，服务端准备数据并执行页面渲染，然后把完整的HTML发送给客户端。现代化的SSR通常和Vue、React等前端框架强关联，通过Node.js在服务端提前将page、component使用同构方式渲染为html代码，其目的是在实现SSR时尽量复用一套渲染机制。例如Vue框架就同时支持了CSR(Client-Side Rendering)和SSR。&lt;/p&gt;
&lt;p&gt;SSR能解决什么问题？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SEO: &lt;code&gt;Google&lt;/code&gt;、&lt;code&gt;百度&lt;/code&gt;、&lt;code&gt;Yandex&lt;/code&gt;、&lt;code&gt;Bing&lt;/code&gt;或者&lt;code&gt;Yahoo&lt;/code&gt;等搜索引擎会通过网络爬取你的页面并建立索引，如果的信息越完整，那么你的网站就更容易被检索到。使用SSR技术，让页面在服务端提前渲染好再返回给客户端，这样各类搜索引擎就能拿到比较完整的页面信息，提升检索质量。&lt;/li&gt;
&lt;li&gt;首屏渲染：SPA(Single Page Application)将页面渲染放到客户端执行，并且在渲染之前要加载大量的Javascript代码，所以首屏渲染需要花费较长时间。而SSR直接在服务端渲染完再返回客户端，使用户能够快速看到页面内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;有哪些框架支持SSR？&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;开源库&lt;/th&gt;
&lt;th&gt;支持语言&lt;/th&gt;
&lt;th&gt;star数&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/nuxt/nuxt"&gt;Nuxt&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Vue&lt;/td&gt;
&lt;td&gt;54.9k&lt;/td&gt;
&lt;td&gt;快速构架、类型安全、高性能、易扩展&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/vercel/next.js"&gt;Next&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;127k&lt;/td&gt;
&lt;td&gt;老牌框架、社区完善、Data Fetch、Styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://quasar.dev/"&gt;quasar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Vue&lt;/td&gt;
&lt;td&gt;26k&lt;/td&gt;
&lt;td&gt;丰富的UI、支持桌面端和移动端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://remix.run/"&gt;Remix&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;29.9k&lt;/td&gt;
&lt;td&gt;极致的用户体验、开箱即用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本知识点将以 Nuxt 为例，介绍如何实现 SSR。&lt;/p&gt;
&lt;h2 id="什么是nuxt"&gt;什么是Nuxt&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/vue/vue-020/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;基于Vue、React、Angular实现的&lt;code&gt;full-stack&lt;/code&gt;框架数不胜数，但就Vue框架领域内，应该数Nuxt最为Top 1。Nuxt保持了&lt;code&gt;Vue&lt;/code&gt;生态的&lt;code&gt;“开箱即用”&lt;/code&gt;特性，类似于Vite，几条指令就可直接run起来。如果你熟悉Vue，那么基于Nuxt写应用，体验上和写Vue客户端应用极其相似。&lt;/p&gt;
&lt;p&gt;Nuxt提前预制了一套目录结构，并自动处理路由、导入、数据获取，开发人员仅需按约定的规则实现页面、组件、数据API即可，极大降低开发人员学习成本。Nuxt的特性可总结为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于文件的路由: 页面统一添加到&lt;code&gt;pages/&lt;/code&gt;目录下，例如添加index.vue、about.vue、contact.vue，就可以通过&lt;code&gt;/&lt;/code&gt;访问首页，通过&lt;code&gt;/about&lt;/code&gt;返回关于页面；&lt;/li&gt;
&lt;li&gt;代码分割：得益于Vue的&lt;code&gt;Virtual Node&lt;/code&gt;，Nuxt根据目录规则提前生成完整的依赖树，这样能够将所有code拆分为最小单元的&lt;code&gt;chunks&lt;/code&gt;, 从而减少应用初始化加载时间；&lt;/li&gt;
&lt;li&gt;开箱即用的SSR：Nuxt内部使用Vue的SSR，除了Vue实现SSR、CSR本身的差异，可以像开发CSR的Vue应用一样来开发SSR，降低研发心智负担；&lt;/li&gt;
&lt;li&gt;自动导入：在实现页面或组件时，不需要像CSR手动导入(&lt;code&gt;import Card from './Card.Vue'&lt;/code&gt;)依赖，当Nuxt识别到有使用外部组件，bundle过程会自动识别；&lt;/li&gt;
&lt;li&gt;数据获取工具：提供一套组合式FetchAPI，实现client、server端的同构；&lt;/li&gt;
&lt;li&gt;配置好的构建工具：&lt;strong&gt;默认使用Vite构建，同时支持Webpack、Rspack&lt;/strong&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nuxt的架构设计和&lt;code&gt;vue/core&lt;/code&gt;很相似，将整体功能拆分为独立的package:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心引擎：&lt;a href="https://github.com/nuxt/nuxt/tree/main/packages/nuxt"&gt;nuxt&lt;/a&gt;；&lt;/li&gt;
&lt;li&gt;bundlers: 打包器包含&lt;code&gt;@nuxt/vite-builde&lt;/code&gt;、&lt;code&gt;nuxt/webpack-builder&lt;/code&gt;、&lt;code&gt;@nuxt/rspack-builder&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;命令行工具：&lt;a href="https://github.com/nuxt/nuxt/tree/main/packages/nuxi"&gt;nuxi&lt;/a&gt;；&lt;/li&gt;
&lt;li&gt;服务端引擎：&lt;a href="https://github.com/unjs/nitro"&gt;nitro&lt;/a&gt;；&lt;/li&gt;
&lt;li&gt;开发套件：&lt;a href="https://github.com/nuxt/nuxt/tree/main/packages/kit"&gt;@nuxt/kit&lt;/a&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="上手体验"&gt;上手体验&lt;/h2&gt;
&lt;h3 id="初始化项目"&gt;初始化项目&lt;/h3&gt;
&lt;p&gt;使用&lt;code&gt;nuxi&lt;/code&gt;提供的指令初始化项目：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx nuxi&lt;span style="color:#a6e22e"&gt;@latest&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;init&lt;/span&gt; nuxt-learn-examples
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果安装过程下载失败，可能需要配置hosts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.199.108.133 raw.githubusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;最新nuxt版本3.14初始化的项目目录比较简单，少了pages、plugins等目录&lt;/strong&gt;，入口为&lt;code&gt;app.vue&lt;/code&gt;：&lt;/p&gt;</description></item></channel></rss>