# vue_ssr **Repository Path**: yangxingli/vue_ssr ## Basic Information - **Project Name**: vue_ssr - **Description**: vue针对 SEO 的服务端渲染 - **Primary Language**: JavaScript - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-07-21 - **Last Updated**: 2022-07-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vue 3 + Typescript + Vite + SSR 此项目 SSR 部分仅针对蜘蛛爬虫进行服务端渲染,渲染时删除 js 引用。如果需要首屏加速,请自行优化。 ## 一、SEO渲染 ## SEO渲染主要需要解决两个问题: #### 1、异步数据加载问题 ### 这个问题解决很简单,Vue 3 中 setup 方法,返回如果不是 Object 对象而是一个 Promise,那么服务端渲染时会 await 等待数据获取结束,再进行页面渲染。因此封装了一个setupData方法,用法如下: ```javascript import {defineComponent} from 'vue' import setupData from '../plugin/setupData' export default defineComponent({ name: "index", setup() { // 函数封装很简单,参数格式自行查看源码 return setupData({ info: { url: '' }, }, { title: 'setupData' }); } }) ``` #### 2、title 和 meta ### 使用 /src/plugin/meta.ts 插件解决此问题,用法如下: ```javascript import {defineComponent} from 'vue' import {myMeta, usMeta} from '/src/plugin/meta' export default defineComponent({ mixins: ['myMeta'], // 1、使用 head 方法 head() { return { title: this.title, metas: [ { name: 'description', content: 'description' }, { name: 'keywords', content: 'keywords' }, { property: 'og:title', content: this.title }, { property: 'og:description', content: 'ogDescription' } ], } }, setup() { // 2、使用 usMeta 方法 const myMeta = usMeta(); myMeta.setHead({ title: 'title & meta', }); return { title: 'title & meta' } }, mounted() { // 3、使用 $myMeta 属性 this.$myMeta.setHead({ title: 'title & meta', }); } }) // 也可以设置 mixin = true 把 myMeta 添加到全局 mixin app.use(myMeta, {mixin: true}) ``` ## 二、运行环境 ## ```shell # 开发环境,SPA npm run dev # 开发环境,SEO,不引入样式,页面看起来很乱,只需要查看axios异步数据是否加载就行 npm run dev:seo # 打包 npm run build # 生产模式 seo 测试,需要先打包。引入样式,页面效果基本与SEO快照一致 npm run seo # 生产模式,需要先打包 npm run start # 生产模式 pm2 管理发布,自动拉取代码、打包并重启服务 # 需要先安装pm2: cnpm install pm2 -g npm run pm2 ``` ## 二、自定义组件 ## 对于比较简单的页面,可使用 listData 和 infoData 以简化页面代码。 #### 1、listData ### ```vue ``` #### 1、infoData ### ```vue ```