iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Modern Web

30天用Vitepress 開啟我的"部落客"生活系列 第 16

[Day16] - build a resume - Data Loading

  • 分享至 

  • xImage
  •  

banner16

履歷表最重要的還是工作經歷吧,普遍的操作都是後端 API 拉資料,前端迴圈渲染出來,但是我們 VitePress 專案沒有後端阿~ 總不可能寫死一大片資料在 vue 裡面吧? 也太醜了。
這個部分, VitePress 提供的 Build-Time Data Loading 功能剛好可以解決這個問題:

Build-Time Data Loading

Build-Time Data LoadingVitePress 提供的資料載入功能,他允許載入任意資料,並在 .mdVue Component 引用他,資料的載入只在 build 的時候執行,資料將被序列化成 JSON 放在 Javascript 包中。

資料載入可以被用來接 API 回傳的資料,也可以基於本地文件中生成。

基本用法

一個用於資料載入的文件必須以 .data.js.data.ts 結尾。且必須包含一個 export default 物件,該物件具有 load() 方法:

  • example.data.ts
export default {
    load() {
        return {
            hello: 'world'
        };
    }
};

資料載入功能只在 Node.js 中執行,因此可以按需導入 Node APInpm 依賴。

然後,可以在 .mdVue Component 中使用 data 具名導出從該文件中導入資料:

<script setup>
    import { data } from './example.data.js';
</script>

<pre>
{{ data }}
</pre>

輸出:

{
  "hello": "world"
}

不是 export default 了嗎? 那這個 data 是哪來的?
VitePress 背後呼叫了 load() 並用名為 data 的具名export 隱式地暴露了結果。

就算是異步進行,也是可以的:

export default {
    async load() {
        // 透過 API 取的資料
        return (await fetch('...')).json();
    }
};

實際使用

是的各位,基本用法已經滿足了我們的使用需求,首先我們在 docs/data/ 中建立檔案 works.data.ts,然後輸入內容:

export default {
    load() {
        return [
            {
                compImg: 'images/resume/ai4dt.png',
                company: '不正常人類研究中心',
                location: 'Tainan, Taiwan',
                jobTitle: 'Front-End Developer',
                period: '2023.09 - Now',
                description: `一、工作內容概述:<br />......`
            }
        ];
    }
};

然後在 resume.vue 中使用他:

<script setup lang="ts">
    import { data as workExperienceData } from '@/data/works.data';
</script>

<template>
    <div class="work-experience-block">
        <MoleWorkExperience
            v-for="work in workExperienceData"
            :key="work.company"
            :comp-img="withBase(work.compImg)"
            :company="work.company"
            :location="work.location"
            :job-title="work.jobTitle"
            :period="work.period"
            :description="work.description"
        />
    </div>
</template>

會發現 import { data as workExperienceData } from '@/data/works.data'; 報錯了:

模組 '"@/data/skills.data"' 沒有匯出的成員 'data'。您是要改用 'import data from "@/data/skills.data"' 嗎?ts-plugin(2614)

這是因為我們沒有為 works.data 設定 loaderdataexport 類型,依照官網範例我們改寫成這樣:

import { defineLoader } from 'vitepress'

export interface Data {
    compImg: string
    company: string
    location: string
    jobTitle: string
    period: string
    description: string
}

declare const data: Data[]
export { data }

export default defineLoader({
    load() {
        ...
    }
});

恩很棒,最基本的資料引用就完成囉~ 一個簡單的 resume 也完成了~

備註
Resume 製作的這三天幾乎沒有看見任何的 CSS 程式碼,這不意味著我們是使用 VitePress 的預設主題,而是 Opshell 覺得排版非常的簡單,所以就不把 CSS 貼出來水版面了。


上一篇
[Day15] - build a resume - SVG Icon 管理
下一篇
[Day17] - 自訂 Layout
系列文
30天用Vitepress 開啟我的"部落客"生活30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言