Vite2 + SSG 实现预渲染

2021/12/22 Vue3SSG

# 初始化 Vite 项目

# npm 6.x
npm init vite@latest my-vue-app --template vue

# npm 7+, 需要额外的双横线:
npm init vite@latest my-vue-app -- --template vue

# yarn
yarn create vite my-vue-app --template vue

# pnpm
pnpm create vite my-vue-app -- --template vue

# 文件路由

什么是文件路由?确切的说应该是基于文件系统的路由(file system based routing)。因为网站搭建后,通常情况下我们只需要写写 markdown,或者.vue 页面就可以自动生成路由,而访问者只要访问具体的路由,即可访问对应文件包含的内容了,这样做我们就不用像传统 Vue 项目开发那样在 vue-router 中配置专门的路由映射。

vite-plugin-pages 插件为我们提供了这样的功能,安装该插件:

# 该插件还是需要vue-router提供支持的
npm install vite-plugin-pages -D
npm install vue-router@next

配置 vite-plugin-pages:

// vite.config.ts
import vue from "@vitejs/plugin-vue";
import path from "path";
import Pages from "vite-plugin-pages";
import ElementPlus from "unplugin-element-plus/vite";

// https://vitejs.dev/config/
export default {
  plugins: [
    vue(),
    ElementPlus(),
    Pages({
      extensions: ["vue"],
    }),
  ],
};
  • extensions:需要包含的文件类型,这里显然是 .vue 和 .md 文件。
  • pagesDir:寻找文件的目录,这里选择了项目根目录下的 pages 目录。
  • extendRoute:提供一个方法,对每个文件产生路由做一些加工,这里是对 route.meta 的处理。
  • matter:gray-matter 的功能,可以获取相关文件中的 front-matter,并将其处理为一个对象。
  • front-matter:markdown 文件顶部,由 --- 包裹的一块区域,就像:
---
title: Hello
date: 2021-06-02
---

总结就是,vite-plugin-pages 会自动把 pages 目录中的 .vue 和 .md 文件生成对应的路由,并且我们可以利用 markdown 的 front-matter 来为路由提供一些额外信息。

同时我们还需要引入vite-plugin-pages 的路由。

// src/main.ts
import App from "./App.vue";
import { createApp } from "vue";
import routes from "virtual:generated-pages"; // vite-plugin-pages生成的路由信息
import { createRouter, createWebHistory } from "vue-router";

const app = createApp(App);
app.use(
  createRouter({
    history: createWebHistory(),
    routes,
  })
);

app.mount("#app");

最后在 pages 文件夹中创建.vue 文件,然后就可以运行网站了。

# SEO 优化@vueuse/head (opens new window)的使用

设置 header 中的信息

<!-- src/pages/index.vue -->
<script setup>
import { useHead } from "@vueuse/head";

useHead({
  title: "首页",
});
</script>

# 静态页面生成

通过上面的配置后已经是一个具有基本功能的网站了,但是我们做 SEO 的话还需要生成静态页面。

安装 vite-ssg

npm install vite-ssg -D

修改项目入口文件main.ts

// src/main.ts
import App from "./layout/main.vue";
import routes from "virtual:generated-pages";
import { ViteSSG } from "vite-ssg";
// import { createRouter, createWebHistory } from "vue-router";

// 将createRouter替换成ViteSSG
export const createApp = ViteSSG(
  // the root component
  App,
  // vue-router options
  { routes },
  // function to have custom setups
  ({ app, router, routes, isClient, initialState }) => {
    // install plugins etc.
  }
);

最后在 package.json 中添加打包命令

"scripts": {
    "dev": "vite",
    "build": "vite build",
+   "ssg": "vite-ssg build",
    "serve": "vite preview"
  },
最近更新时间: 2022/11/2 21:00:03