前置知識:前端工程化 (Nodejs, npm...),Vue.js (最好 >= 3.0),TypeScript,基本的 markdown 編寫能力。 我們需要做什么?我們的目標(biāo)是構(gòu)建一個靜" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 用 Vite 構(gòu)建靜態(tài)網(wǎng)站

用 Vite 構(gòu)建靜態(tài)網(wǎng)站

時間:2023-10-12 08:18:01 | 來源:網(wǎng)站運營

時間:2023-10-12 08:18:01 來源:網(wǎng)站運營

用 Vite 構(gòu)建靜態(tài)網(wǎng)站:本文發(fā)布在我的個人網(wǎng)站 archergu.me 上,請勿隨意轉(zhuǎn)載!

前置知識:前端工程化 (Nodejs, npm...),Vue.js (最好 >= 3.0),TypeScript,基本的 markdown 編寫能力。

我們需要做什么?

我們的目標(biāo)是構(gòu)建一個靜態(tài)網(wǎng)站,但是顯然不是那種純粹用 html 編寫的頁面,我們的網(wǎng)站在完成搭建后,后續(xù)只需要在 markdown 中大展才華,然后通過自動化的流程將 markdown 轉(zhuǎn)換成靜態(tài)的 html 頁面,并為之生成相應(yīng)的路由。所以這篇文章實際上將要介紹的是如何構(gòu)建一個自動化的靜態(tài)網(wǎng)站生成器,就像 VuePress, Hexo 那樣。

目標(biāo)明確后,我們就需要列一下關(guān)鍵技術(shù):

后面我就對上面的技術(shù)點進行說明,在此過程中也會穿插一些細節(jié)內(nèi)容。

生成一個 Vite 項目

Vite 是 2020 年 Evan You 為我們帶來的一個下一代前端開發(fā)與構(gòu)建工具。這里不會詳細的介紹 Vite ,感興趣的朋友可以閱讀其 官方文檔。我對 Vite 的感覺,就是一個字 —— ?,真的是非??彀““? 。

生成一個 Vite 項目( Node.js 版本 >= 12.0.0):

$ npm init @vitejs/app vite-static-site根據(jù)命令行的提示,我們選擇 Vue 框架,用 TypeScript 開發(fā)。然后進入項目目錄,安裝依賴。

就像你用 vue-cli 構(gòu)建的 Vue 項目一樣,項目源碼都被放置在src目錄下,入口同樣是main.ts文件。而框架的配置文件則由vue.config.js換成了vite.config.ts。此時這只是一個簡單的 Vue 項目(只是把構(gòu)建器從 Webpack 換成了 Vite),距離我們的目標(biāo)還相去甚遠。接下來我們需要安裝各種 vite-plugin-*,即 Vite 的插件,插件將在vite.config.ts中配置。

因為這是一個基于 Vite 的 Vue 項目,所以我們先把 @vitejs/plugin-vue 配置好,該插件為 Vite 提供了 Vue3 的 SFC 支持(由于剛才生成項目的時候選擇了 Vue 作為開發(fā)框架,所以該插件無需手動安裝)。

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

文件路由

什么是文件路由?確切的說應(yīng)該是基于文件系統(tǒng)的路由(file system based routing)。因為網(wǎng)站搭建后,通常情況下我們只需要寫寫 markdown,或者.vue頁面就可以自動生成路由,而訪問者只要訪問具體的路由,即可訪問對應(yīng)文件包含的內(nèi)容了,這樣做我們就不用像傳統(tǒng) Vue 項目開發(fā)那樣在 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; }, }), ],});---title: Hellodate: 2021-06-02---總結(jié)就是,vite-plugin-pages 會自動把 pages 目錄中的 .vue.md 文件生成對應(yīng)的路由,并且我們可以利用 markdown 的 front-matter 來為路由提供一些額外信息。

然后我們來修改一下項目中的一些文件,讓它們的功能和結(jié)構(gòu)符合當(dāng)前的插件配置。

為了讓路由在 app 中生效,我們需要創(chuàng)建一個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` 導(dǎo)入會引起類型錯誤,需要在 `tsconfig.json` 的 `compilerOptions.types` 數(shù)組中加入 `vite-plugin-pages/client` 來加載對應(yīng)的聲明文件。
App.vue 文件也需要進行修改,我們可以刪除自動生成的所有代碼,然后添加一個簡單:

<!-- src/App.vue --><template> <router-view /></template>還缺少一些頁面,我們在項目根目錄下創(chuàng)建 pages 文件夾,并在里面創(chuàng)建一個 index.vue 文件作為 homepage,再創(chuàng)建一個 foo.vue 作為測試頁面:

<!-- pages/index.vue --><template> <div>Hello, Vite</div></template><!-- pages/foo.vue --><template> <div>foo</div></template>上面的這些操作其實就和我們構(gòu)建一個常規(guī)的 Vue 項目一樣?,F(xiàn)在我們可以運行一下網(wǎng)站:

$ npm run dev你可以在瀏覽器中看到我們設(shè)置的首頁。在地址欄中添加 /foo 可以跳轉(zhuǎn)到 foo 頁面。

支持 Markdown

完成上面的 vite-plugin-pages 插件配置后,也許你嘗試在 pages 目錄下創(chuàng)建一個 .md 文件的頁面,但是卻發(fā)現(xiàn)盡管路由生成了,但是頁面卻無法顯示,因為目前這個靜態(tài)網(wǎng)站生成器還缺少 markdown 的支持。

vite-plugin-md 為 Vite 提供了將 markdown 當(dāng)作 Vue 組件使用的功能,也可以在 markdown 中使用 Vue 組件。安裝該插件:

$ npm i vite-plugin-md -D然后配置一下:

// vite.config.ts (以下為該插件的配置,不包括其他插件的配置)// ...import ViteMarkdown from "vite-plugin-md";// plugins settingsexport default defineConfig({ plugins: [ //... ViteMarkdown(), ],});現(xiàn)在我們就可以在 pages 目錄下創(chuàng)建一個 bar.md 來嘗試一下了:

<!-- pages/bar.md --># Hi, MarkdownThis is a markdown page.重啟項目后,在瀏覽器地址欄里添加 /bar,就可以看到這個 markdown 頁面了。

不是說還可以在 markdown 文件中使用 Vue 組件嗎?那么現(xiàn)在,在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 />重啟項目,什么都沒有發(fā)生 。這是因為 markdown 中我們沒法像 js/ts 那樣將組件 import 進來,所以除非這個組件被全局注冊,否則無法直接使用。

這里又有一個 vite-plugin-components 插件可以幫我們解決問題,這個插件提供了組件自動導(dǎo)入功能( vite-plugin-md 實際上是對 markdown 進行了 html 轉(zhuǎn)換處理,所以在 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 組件已經(jīng)正確的顯示了!

靜態(tài)頁面生成

完成上面的 Vite 插件配置后其實已經(jīng)是一個具有基本功能的網(wǎng)站了,你完全可以按照常規(guī)的開發(fā)模式來構(gòu)建自己的頁面。但是這里我們還需要完成靜態(tài)頁面的生成,這樣當(dāng)你創(chuàng)作內(nèi)容并發(fā)布后,搜索引擎也許會記錄到一些信息(SEO 優(yōu)化)。

Anthony Fu 大佬為我們提供了一個靜態(tài)頁面生成器(SSG,server-side generation)—— vite-ssg。使用這個工具,我們可以在 build 項目時將頁面打包成一個個的靜態(tài)頁面。

安裝 vite-ssg:

$ 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 模式重啟一下項目,應(yīng)該沒有啥問題。然后我們執(zhí)行下 build

$ npm run build項目自動進行打包,輸出目錄默認是根目錄下的 dist 文件夾。你會發(fā)現(xiàn),這個打包的結(jié)果和常規(guī)的 vue-cli 或者 Vite 項目打包的結(jié)果不同,它將頁面都轉(zhuǎn)換成了的 .html 靜態(tài)頁面文件。這樣我們在部署網(wǎng)站時,搜索引擎將盡可能的收集我們創(chuàng)作的內(nèi)容。

最后說的話

這是一個基礎(chǔ)的 Vite 靜態(tài)頁面生成器,我們可以利用它來構(gòu)建各種有趣的項目,你可以在 vite-static-site 找到本文所記錄的源碼。

它的整體思路都來自于 Anthony Fu 的 antfu.mevitesse。實際上前文提到的大部分插件和工具都是 Anthony Fu 創(chuàng)造并維護的,感謝他為我們帶來了這些有趣的項目。

如果你喜歡該文章,可以關(guān)注我的 [個人網(wǎng)站] 或者 在 GitHub 上follow我,非常感謝~

關(guān)鍵詞:靜態(tài)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉