Astro 專題 - DevPulse:極簡開發者技術雷達 (Tech Radar)-1

更新 發佈閱讀 13 分鐘

這是一個讓開發者管理自己「想學、正在學、已精通」技術清單的工具,強調極速的頁面切換與流暢的 UI。

環境架構設計

  • astro v5
  • tailwind v4
  • Nano Stores
  • vercel 佈署

第一步:環境初始化

首先,我們直接使用 Astro 5 的腳手架建立專案。

# 建立專案
npm create astro@latest DevPulse

# 進入目錄
cd DevPulse

# 安裝 Tailwind v4 (目前 v4 推薦直接透過 Vite 插件整合)
npm install tailwindcss @tailwindcss/vite

# 安裝 Nano Stores
npm install nanostores @nanostores/react

💡 配置 Tailwind v4

在 Astro 5 中,修改 astro.config.mjs

import { defineConfig } from 'astro/config'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
vite: {
plugins: [tailwindcss()],
},
})

並在 src/styles/global.css 中引入:

@import 'tailwindcss';

💡 環境初始化與型別定義對齊 (Environment Initialization & Type Alignment)

當 astro 來到 ^5.16.15tsconfig.json 將有所不同:

{
"extends": "astro/tsconfigs/strict",
"compilerOptions": {
"moduleResolution": "Bundler",
"target": "ESNext",
"module": "ESNext",
"strict": true
},
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}
  • "extends": "astro/tsconfigs/strict"
    繼承 Astro 官方定義的最高標準嚴格規則
  • compilerOptions 編譯器設定:
    1. "moduleResolution": "Bundler" 定義「模組解析策略」。告訴 TypeScript:「請模仿 Vite 或 Webpack 這些打包工具找檔案的方式」。這讓你寫 import ... from 'astro:content' 時,電腦才找得到東西。
    2. "target": "ESNext" 設定輸出的 JavaScript 版本目標。告訴電腦:「我的程式碼要編譯成最新、最現代的 JavaScript 格式」。它支援所有最新的語法。
    3. "module": "ESNext" 指定要使用哪種模組系統。使用現代的 import 和 export 語法
    4. "strict": true 開啟所有嚴格型別檢查選項。
  • "include": [".astro/types.d.ts", "**/*"]
    告訴 TypeScript 哪些檔案是它需要負責「看管」的。
  • "exclude": ["dist"]
    告訴 TypeScript 哪些檔案完全不用理會。

第二步:建立 Nano Stores 狀態中心

我們需要一個全域狀態來存儲使用者的技術過濾條件。在 src/store/techStore.js 中建立:

import { atom } from 'nanostores'

// 定義目前的過濾分類:'all', 'learning', 'mastered'
export const categoryFilter = atom('all')

export function setCategory(value) {
categoryFilter.set(value)
}

第三步:利用 Astro 5 Content Layer 建立資料

Astro 5 的強項在於 Content Layer。在 src/content/config.ts 定義你的技術清單:

import { defineCollection, z } from 'astro:content'
import { glob } from 'astro/loaders'

const techs = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/techs' }),
schema: z.object({
name: z.string(),
status: z.enum(['learning', 'mastered', 'wishlist']),
icon: z.string(),
}),
})

export const collections = { techs }

💡 astro:content :

  • 當遇到 IDE 錯誤訊息 Cannot find module 'astro:content' or its corresponding type declarations.
    # terminal 執行
    npx astro sync
    # 執行完後,跟目錄會生成 .astro 資料夾,錯誤訊息也會消失
  • 為什麼會遇到這個錯誤?
    astro:content 是由 Astro 動態生成的虛擬模組。
    如果是剛建立專案、新增了 src/content/config.ts,或者剛從 Git 下載專案,TypeScript 就會因為找不到實體檔案而報錯。
  • npx astro sync 的用途是什麼?
    這個指令的核心目的是 「同步專案的狀態與 TypeScript 的型別定義」
    當你執行 npx astro sync 時,Astro 會在後台做這幾件事:
    1. 生成內容快照: 掃描 src/content/ 資料夾中的所有內容。
    2. 建立檔案結構: 在專案的 .astro/ 目錄下生成必要的檔案。
    3. 生成型別定義: 這也是最重要的,它會自動產生 types.d.ts 檔案,讓 VS Code 或其他編輯器能辨識 astro:content。它會根據 config.ts 中定義的 zod schema,把 Markdown/MDX 的 frontmatter 轉換成強型別。

第四步:實作互動式 UI (Tailwind v4 實踐)

在首頁 src/pages/index.astro 中,我們結合 Astro 的靜態渲染與 Nano Stores 的動態過濾。

---
import Layout from '../layouts/Layout.astro';
import { getCollection } from 'astro:content';
const allTechs = await getCollection('techs');
---

<Layout title="DevPulse">
<main class="max-w-4xl mx-auto p-8">
<h1 class="text-4xl font-bold tracking-tight text-gray-900 mb-8">
My Tech Radar
</h1>

<div class="flex gap-4 mb-10">
<button class="px-4 py-2 bg-indigo-600 text-white rounded-full hover:scale-105 transition">
All
</button>
</div>

<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
{allTechs.map(tech => (
<div class="p-6 border border-gray-200 rounded-2xl hover:shadow-lg transition-shadow">
<h3 class="text-xl font-semibold">{tech.data.name}</h3>
<span class="text-sm text-indigo-500 uppercase">{tech.data.status}</span>
</div>
))}
</div>
</main>
</Layout>

💡 getCollection('techs') :

  • 當遇到 IDE 錯誤訊息
    No overload matches this call.
    Overload 1 of 2, '(collection: never, filter?: ((entry: never) => entry is never) | undefined): Promise<never[]>', gave the following error.
    Argument of type '"techs"' is not assignable to parameter of type 'never'.
    Overload 2 of 2, '(collection: never, filter?: ((entry: never) => unknown) | undefined): Promise<never[]>', gave the following error.
    Argument of type '"techs"' is not assignable to parameter of type 'never'.
    # terminal 一樣執行
    npx astro sync
    # 執行完後,會掃描 src/content/ 資料夾中的所有內容,並生成對應型別

第五步:Vercel 部署

  1. 將程式碼推送到 GitHub。
  2. 登入 Vercel。
  3. 點擊 Import Project 並選擇該 Repo。
  4. Vercel 會自動偵測到這是 Astro 專案,保持預設設定即可。
  5. 點擊 Deploy

💡 下方提供一些可以使用的 Markdown 範例檔案

src/content/techs/astro.md

---
name: 'Astro'
status: 'mastered'
icon: '🚀'
---

Astro 是我目前最愛的 Web 框架,其「孤島架構」(Islands Architecture) 能極大化減少客戶端 JS 載入量。

src/content/techs/tailwind-v4.md

---
name: 'Tailwind CSS v4'
status: 'learning'
icon: '🎨'
---

全新的氧化物引擎 (Oxide engine),不再需要繁瑣的 `tailwind.config.js`,速度快到令人髮指!

src/content/techs/rust.md

---
name: 'Rust'
status: 'wishlist'
icon: '🦀'
---

聽說性能強大且記憶體安全,是我 2026 年一定要排進時程學習的語言。

src/content/techs/nanostores.md

---
name: 'Nano Stores'
status: 'mastered'
icon: '🧪'
---

極簡、輕量、去中心化的狀態管理工具,配合 Astro 這種多框架環境簡直是天作之合。
留言
avatar-img
李昀瑾的沙龍
0會員
32內容數
李昀瑾的沙龍的其他內容
2026/02/19
要在 Astro v5 儀表板中加入互動圖表,最推薦的方式是使用 Recharts 或 Chart.js 配合 React 或 Vue 組件,因為圖表需要客戶端(Client-side)的 JavaScript 來達成縮放、懸停提示等互動功能。
2026/02/19
要在 Astro v5 儀表板中加入互動圖表,最推薦的方式是使用 Recharts 或 Chart.js 配合 React 或 Vue 組件,因為圖表需要客戶端(Client-side)的 JavaScript 來達成縮放、懸停提示等互動功能。
2026/02/12
在 Astro v5 的架構下,為多語系儀表板加入搜索功能,最推薦的方案是 Pagefind。它是一個極其快速、靜態化的搜尋庫,非常適合 Astro 這種注重效能的框架。 以下是將 Pagefind 整合進你的專案的步驟: 1. 安裝與設定 Pagefind 是在構建(Build)完成後掃描
2026/02/12
在 Astro v5 的架構下,為多語系儀表板加入搜索功能,最推薦的方案是 Pagefind。它是一個極其快速、靜態化的搜尋庫,非常適合 Astro 這種注重效能的框架。 以下是將 Pagefind 整合進你的專案的步驟: 1. 安裝與設定 Pagefind 是在構建(Build)完成後掃描
2026/02/05
環境架構設計 astro v5 tailwind v4 vercel 佈署 i18n 多語系架構
2026/02/05
環境架構設計 astro v5 tailwind v4 vercel 佈署 i18n 多語系架構
看更多
你可能也想看
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News