时间:2023-10-12 08:18:01 | 来源:网站运营
时间:2023-10-12 08:18:01 来源:网站运营
用 Vite 构建静态网站:本文发布在我的个人网站 archergu.me 上,请勿随意转载!前置知识:前端工程化 (Nodejs, npm...),Vue.js (最好 >= 3.0),TypeScript,基本的 markdown 编写能力。
$ npm init @vitejs/app vite-static-site
根据命令行的提示,我们选择 Vue 框架,用 TypeScript 开发。然后进入项目目录,安装依赖。src
目录下,入口同样是main.ts
文件。而框架的配置文件则由vue.config.js
换成了vite.config.ts
。此时这只是一个简单的 Vue 项目(只是把构建器从 Webpack 换成了 Vite),距离我们的目标还相去甚远。接下来我们需要安装各种 vite-plugin-*
,即 Vite 的插件,插件将在vite.config.ts
中配置。@vitejs/plugin-vue
配置好,该插件为 Vite 提供了 Vue3 的 SFC 支持(由于刚才生成项目的时候选择了 Vue 作为开发框架,所以该插件无需手动安装)。// vite.config.tsimport { defineConfig } from "vite";import ViteVue from "@vitejs/plugin-vue";export default defineConfig({ plugins: [ ViteVue({ include: [//.vue$/, //.md$/], }), ],});
.vue
页面就可以自动生成路由,而访问者只要访问具体的路由,即可访问对应文件包含的内容了,这样做我们就不用像传统 Vue 项目开发那样在 vue-router 中配置专门的路由映射。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-plugin-pages 的配置:// 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
的功能,可以获取相关文件中的 front-matter
,并将其处理为一个对象。front-matter
:markdown 文件顶部,由 ---
包裹的一块区域,就像:---title: Hellodate: 2021-06-02---
总结就是,vite-plugin-pages 会自动把 pages
目录中的 .vue
和 .md
文件生成对应的路由,并且我们可以利用 markdown 的 front-matter
来为路由提供一些额外信息。router
,并让 app use 。修改 src/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");
Note: 在 TS 中,直接从 `pages-generated` 导入会引起类型错误,需要在 `tsconfig.json` 的 `compilerOptions.types` 数组中加入 `vite-plugin-pages/client` 来加载对应的声明文件。
App.vue
文件也需要进行修改,我们可以删除自动生成的所有代码,然后添加一个简单:<!-- src/App.vue --><template> <router-view /></template>
还缺少一些页面,我们在项目根目录下创建 pages
文件夹,并在里面创建一个 index.vue
文件作为 homepage,再创建一个 foo.vue
作为测试页面:<!-- pages/index.vue --><template> <div>Hello, Vite</div></template><!-- pages/foo.vue --><template> <div>foo</div></template>
上面的这些操作其实就和我们构建一个常规的 Vue 项目一样。现在我们可以运行一下网站:$ npm run dev
你可以在浏览器中看到我们设置的首页。在地址栏中添加 /foo
可以跳转到 foo 页面。pages
目录下创建一个 .md
文件的页面,但是却发现尽管路由生成了,但是页面却无法显示,因为目前这个静态网站生成器还缺少 markdown 的支持。vite-plugin-md
为 Vite 提供了将 markdown 当作 Vue 组件使用的功能,也可以在 markdown 中使用 Vue 组件。安装该插件:$ npm i vite-plugin-md -D
然后配置一下:// vite.config.ts (以下为该插件的配置,不包括其他插件的配置)// ...import ViteMarkdown from "vite-plugin-md";// plugins settingsexport default defineConfig({ plugins: [ //... ViteMarkdown(), ],});
现在我们就可以在 pages
目录下创建一个 bar.md
来尝试一下了:<!-- pages/bar.md --># Hi, MarkdownThis is a markdown page.
重启项目后,在浏览器地址栏里添加 /bar
,就可以看到这个 markdown 页面了。src/components
下建立一个 Vue 组件,比如叫 MyComponent.vue
:<!-- src/components/MyComponent.vue --><template> <div>This is a Vue component.</div></template>
然后我们把该组件加入到 pages/bar.md
中:<!-- pages/bar.md --># Hi, MarkdownThis is a markdown page.+ <MyComponent />
重启项目,什么都没有发生 。这是因为 markdown 中我们没法像 js/ts 那样将组件 import 进来,所以除非这个组件被全局注册,否则无法直接使用。vite-plugin-components
插件可以帮我们解决问题,这个插件提供了组件自动导入功能( vite-plugin-md 实际上是对 markdown 进行了 html 转换处理,所以在 markdown 中使用了组件,也可以获得 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"), }), ],});
重启项目,此时 MyComponent
组件已经正确的显示了!build
项目时将页面打包成一个个的静态页面。$ npm install vite-ssg -D# 使用 vite-ssg 需要的依赖$ npm install @vueuse/head -S$ npm install @vue/server-renderer -D
接下来,我们修改一下项目的入口文件 main.ts
:// 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
:"scripts": { "dev": "vite",- "build": "vue-tsc --noEmit && vite build",+ "build": "vite-ssg build", "serve": "vite preview" },
用 dev
模式重启一下项目,应该没有啥问题。然后我们执行下 build
:$ npm run build
项目自动进行打包,输出目录默认是根目录下的 dist
文件夹。你会发现,这个打包的结果和常规的 vue-cli 或者 Vite 项目打包的结果不同,它将页面都转换成了的 .html
静态页面文件。这样我们在部署网站时,搜索引擎将尽可能的收集我们创作的内容。vite-static-site
找到本文所记录的源码。antfu.me
和 vitesse
。实际上前文提到的大部分插件和工具都是 Anthony Fu 创造并维护的,感谢他为我们带来了这些有趣的项目。 关键词:静态