[ Vue 入門 ] 02 - 從原生 HTML 到 CDN 應用,打造 Vue 動態介面

zxlee-avatar-img
發佈於Vue
更新 發佈閱讀 10 分鐘

初步認識 Vue 之後,接著我們就動手開始寫 Vue 吧。不過在建立專案之前,讓我們先從熟悉的地方,也就是靜態的原生寫法開始。

如果還沒看過介紹 Vue 的文章,可以在這裡移步觀看:我是傳送門
這篇文章的範例與流程主要來自 Scrimba 課程教學,並截取部分 Vue 官方文件說明。

原始 HTML 檔案

假如我們的原始檔案是這樣:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="styles.css" />
<title>Vue.js Basics</title>
</head>
<body>
<header>
<span>🤪</span>
</header>
<main>
<h1>Hello, Vue!</h1>
<p>
I'm about to learn
<a href="https://vuejs.org/" target="_blank"> Vue.js </a>
!
</p>
</main>
<footer>
<p>&copy; 2026</p>
</footer>
</body>
</html>

改寫流程

接著,我們要透過 CDN 的方式來改寫成 Vue。這代表我們會透過 <script> 標籤,引入 Vue 的來源檔案:

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

以下是我們要執行的流程:

  1. 引入 Vue CDN
  2. 把所有內容包在 id 為 app 的容器裡,作為根元件 (root component)
  3. 在另一個 <script> 標籤中,從 Vue 物件中取出 createApp 與 ref 方法
  4. 使用 createApp 建立應用程式實例,並透過 mount 掛載到 #app
  5. 使用 ref 定義動態資料

前四步驟範例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="styles.css" />
<title>Vue.js Basics</title>
</head>
<body>
<!-- 👇 1. 放入 CDN -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

<!-- 👇 2. 把所有內容放入 app 容器 -->
<div id="app">
<header>
<span>🤪</span>
</header>
<main>
<h1>Hello, Vue!</h1>
<p>
I'm about to learn
<a href="https://vuejs.org/" target="_blank"> Vue.js </a>
!
</p>
</main>
<footer>
<p>&copy; 2026</p>
</footer>
</div>

<!-- 撰寫 Vue 程式 -->
<script>
// 👇 3. 從 Vue 取出需要的函式
const { createApp, ref } = Vue

// 👇 4. 創建並掛載應用程式實例
createApp({
// 根元件設置
}).mount("#app")
</script>
</body>
</html>

💡 補充:關於 createApp

  • Vue 建立應用程式的方法,會回傳應用程式實例。
  • 所傳入的物件事實上是一個元件,通常是應用程式的根元件。
  • 如果是透過 npm 建立專案,預設會在 App.vue 匯集應用程式的元件,然後在 main.js 匯入。
// main.js
import { createApp } from "vue"
import App from "./App.vue"

createApp(App).mount("#app")

💡 補充:關於 mount

  • 應用程式實例需要經過掛載,才會渲染出來。
  • 傳入的是作為根元件的容器,可以是選擇器字串或是 DOM 元素。
  • 這個方法應該在所有配置設置好、資源註冊完成後呼叫。
  • 不像其他資源註冊方法,mount 回傳的是根元件實例,不是應用程式實例。
import { createApp } from "vue"
import App from "./App.vue"

const app = createApp(App)

// 資源註冊方法
app.use(...)
app.component(...)
app.provide(...)

app.mount("#app")

透過 ref 定義動態資料

要定義動態資料,首先需要在 #app 容器內的模板中,找到要改寫的地方,並使用 {{ }} 插值語法標記變數名稱。

假設我們想把 header 裡原本寫死的 🤪 改成可以動態變化的 emoji,可以執行以下步驟:

一、修改模板

先將模板的 🤪 改用 {{ emoji }} 取代,即:

<header>
<span>{{ emoji }}</span>
</header>

二、在根元件定義

createApp({
setup() {
const emoji = ref("🥹") // 定義

return { emoji } // 回傳
}
}).mount("#app")

當 setup 回傳 emoji 之後,模板中就可以使用它。畫面上原本的 🤪 就會變成 🥹 了。

完成版範例我寫在 CodePen 上:

💡 補充:關於 setup

由於這裡是採用 Composition API 寫法,所以會在 setup 使用從 Vue 物件取得的 ref 方法定義資料。

你可能會在其他地方看到 Options API 的寫法,這樣便可以不需要引用方法,直接在 data 定義:

createApp({
data() {
return { emoji: "🥹" }
}
}).mount("#app")

💡 補充:什麼是 In-DOM 根元件模板?

掛載目標 #app 容器內的 DOM,稱為「In-DOM 根元件模板」。以本文範例來說,就是原本在 body 裡的 header、main 及 footer。

當我們呼叫 mount("#app") 時,Vue 會把 #app 內的 HTML 當作 template 進行編譯,效果就和專案模式中寫在 App.vue裡的 <template> 相同。

這種寫法多見於 CDN 的使用方式,不需要建置工具即可運作。不過在實務專案中,通常會搭配建置工具(如 Vite)並使用 .vue 單檔元件來開發。

小結

這篇文章來自於 Scrimba 教學影片內容,主要快速走過如何透過 CDN 撰寫 Vue 程式碼,其中包括:

  • createApp 建立應用程式實例
  • mount 將應用程式掛載到根元件上
  • ref 定義動態資料

相信對開專案後,能夠在理解 Vue 專案的運作上有所幫助。

參考資料

  1. Scrimba 教學影片
  2. Vue 官方文件

Vue 入門系列文章

  1. [ Vue 入門 ] 01:宣告式渲染、響應式系統與 SFC
  2. [ Vue 入門 ] 02 - 從原生 HTML 到 CDN 應用,打造 Vue 動態介面
留言
avatar-img
肝 code 人生
1會員
8內容數
2024 年 7 月開始的「肝 code 人生」,2025 年 1 月撰寫第一篇程式筆記
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
為什麼 JavaScript 中的字串無法修改?為什麼複製變數後,改變其中一個會影響另一個?本文將深入解析 JavaScript 的原生值 (primitive values) 與物件 (objects) 的運作機制,說明傳值與傳參考的差異,避免非預期的程式行為,提升開發效率!!
Thumbnail
為什麼 JavaScript 中的字串無法修改?為什麼複製變數後,改變其中一個會影響另一個?本文將深入解析 JavaScript 的原生值 (primitive values) 與物件 (objects) 的運作機制,說明傳值與傳參考的差異,避免非預期的程式行為,提升開發效率!!
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
iFrame在微前端架構中的優缺點,分析了其對用戶體驗、SEO及性能的影響。 iFrame在嵌入小型UI元件、創建隔離環境等特定場景中仍具備相當的應用價值。
Thumbnail
iFrame在微前端架構中的優缺點,分析了其對用戶體驗、SEO及性能的影響。 iFrame在嵌入小型UI元件、創建隔離環境等特定場景中仍具備相當的應用價值。
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
這篇文章分享了申請 AppWorks School 轉職培訓的過程,包括背景及源起、報名前準備、報名及面談、總結等內容,並提供了未來申請者的建議。如果你正在尋求轉職機會,這篇文章可能對你有所幫助。
Thumbnail
這篇文章分享了申請 AppWorks School 轉職培訓的過程,包括背景及源起、報名前準備、報名及面談、總結等內容,並提供了未來申請者的建議。如果你正在尋求轉職機會,這篇文章可能對你有所幫助。
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
Thumbnail
data-* attributes 是 HTML 內建的屬性,可將網頁的狀態與元素進行綁定。而Tailwind CSS 在 3.2 版更新中推出使用 data-* attributes 自訂樣式的功能,讓樣式設定可以更動態多變。
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News