每日必须一课:使用Vite开发一个静态页面生成器

1,777 阅读1分钟

Vite总结一个字快,相较webpack,下面搭设的项目基于Vue3.0+Vite+TS,一个文件路由,实现Markdown 中使用 Vue 组件,可以实现服务端渲染。

1 生成Vite项目

npm init @vitejs/app vite-static-site

2 安装配置vite-plugin-*

2.1 配置@vitejs/plugin-vue

// vite.config.tsimport { defineConfig } from "vite";import ViteVue from "@vitejs/plugin-vue";export default defineConfig({  plugins: [    ViteVue({      include: [/\.vue$/, /\.md$/],    }),  ],});

2.2 配置文件路由vite-plugin-pages

# 该插件还是需要vue-router提供支持的$ npm install vite-plugin-pages -D$ npm install vue-router@next
# 配置该插件需要用到的辅助库$ npm install @types/fs-extra @types/node fs-extra gray-matter -D

// vite.config.ts (以下为该插件的配置,不包括其他插件的配置)// ...import VitePages from "vite-plugin-pages";import { resolve } from "path";import fs from "fs-extra";import matter from "gray-matter";// plugins settingsexport default defineConfig({  plugins: [    //...    VitePages({      extensions: ["vue", "md"],      pagesDir: "pages",      extendRoute(route) {        const path = resolve(__dirname, route.component.slice(1));        const md = fs.readFileSync(path, "utf-8");        const { data } = matter(md);        route.meta = Object.assign(route.meta || {}, { frontmatter: data });        return route;      },    }),  ],});


extensions:需要包含的文件类型,这里显然是 .vue 和 .md 文件。pagesDir:寻找文件的目录,这里选择了项目根目录下的 pages 目录。extendRoute:提供一个方法,对每个文件产生路由做一些加工,这里是对 route.meta的处理。matter:gray-matter[12] 的功能,可以获取相关文件中的 front-matter,并将其处理为一个对象。front-matter:markdown 文件顶部,由 --- 包裹的一块区域,就像:

修改main.ts

// src/main.tsimport App from "./App.vue";import { createApp } from "vue";import routes from "pages-generated"; // vite-plugin-pages 生成的路由信息import { createRouter, createWebHistory } from "vue-router";const app = createApp(App);app.use(  createRouter({    history: createWebHistory(),    routes,  }));app.mount("#app");

修改App.vue

<!-- src/App.vue --><template>  <router-view /></template>

在根目录下创建pages文件夹,新建各类.vue文件,npm run dev,就可以通过文件夹路由跳转页面

3 支持Markdown

3.1 安装配置vite-plugin-md

npm i vite-plugin-md -D

// vite.config.ts (以下为该插件的配置,不包括其他插件的配置)// ...import ViteMarkdown from "vite-plugin-md";// plugins settingsexport default defineConfig({  plugins: [    //...    ViteMarkdown(),  ],});

pages下创建.md文件,重启系统就可以通过路由访问

3.2  markdown 文件中使用 Vue 组件

在src/components下新建.vue文件,并在.md中使用该组件,加入代码

+

安装配置vite-plugin-components

//安装
npm i vite-plugin-components


// vite.config.ts (以下为该插件的配置,不包括其他插件的配置)// ...import ViteComponents from "vite-plugin-components";// plugins settingsexport default defineConfig({  plugins: [    //...    ViteComponents({      extensions: ["vue", "md"],      customLoaderMatcher: (path) => path.endsWith(".md"),    }),  ],});

重启既可以实现markdown 文件中使用 Vue 组件

4.生成静态文件(SEO)

安装、配置静态工具vite-ssg

$ npm install vite-ssg -D# 使用 vite-ssg 需要的依赖$ npm install @vueuse/head -S$ npm install @vue/server-renderer -D


// src/main.tsimport App from "./App.vue";import routes from "pages-generated";import { ViteSSG } from "vite-ssg";// `export const createApp` is requiredexport const createApp = ViteSSG(App, { routes });


//package.json修改
"scripts": {    "dev": "vite",-   "build": "vue-tsc --noEmit && vite build",+   "build": "vite-ssg build",    "serve": "vite preview"  },

build后会生成许多html文件,方便搜索引擎的搜索,可以简单SEO配置了