EP45 - 單檔組件

更新於 2024/10/22閱讀時間約 6 分鐘
Single-File Components,接下來六篇是要講解Scaling Up的東西
Scaling Up意思應該是擴大規模、增加規模,
意思應該是要更加解釋組件吧?繼續來看下去

介紹 - Introduction

Vue 單文件元件(也稱為 *.vue 文件,簡稱 SFC)是一種特殊的文件格式,允許我們將 Vue 元件的模板、邏輯和樣式封裝在一個文件中。以下是一個 SFC 的範例:

<script setup>
import { ref } from 'vue'
const greeting = ref('Hello World!')
</script>

<template>
<p class="greeting">{{ greeting }}</p>
</template>

<style>
.greeting {
color: red;
font-weight: bold;
}
</style>

如我們所見,Vue SFC 是 HTML、CSS 和 JavaScript 經典三重奏的自然延伸。<template>、<script> 和 <style> 區塊將元件的視圖、邏輯和樣式封裝並放置在同一文件中。完整的語法在 SFC 語法規範中定義。

為什麼使用 SFC - Why SFC​

雖然 SFC 需要建置步驟,但它帶來了許多好處:

SFC 是 Vue 作為框架的一個定義特性,並且是以下情況下使用 Vue 的推薦方法:

  • 單頁應用程式(SPA)
  • 靜態網站生成(SSG)
  • 任何需要建置步驟以提升開發體驗(DX)的非簡單前端專案

話雖如此,我們也意識到有些情況下使用 SFC 可能顯得過於繁瑣。這就是為什麼 Vue 仍然可以通過純 JavaScript 使用,而無需建置步驟。如果你只是想為主要是靜態的 HTML 增強一些輕量級的互動,可以查看 petite-vue,這是一個優化為漸進增強的 6 kB 的 Vue 子集。

運作方式 - How It Works

Vue SFC 是一種框架特定的文件格式,必須由 @vue/compiler-sfc 預編譯為標準 JavaScript 和 CSS。編譯後的 SFC 是一個標準的 JavaScript (ES) 模組,這意味著在適當的建置設定下,你可以像匯入模組一樣匯入 SFC:

import MyComponent from './MyComponent.vue'

export default {
components: {
MyComponent
}
}

SFC 內的 <style> 標籤在開發過程中通常會被注入為原生的 <style> 標籤,以支援熱更新。對於生產環境,它們可以被提取並合併為一個單一的 CSS 文件。

你可以在 Vue SFC Playground 上嘗試 SFC,並探索它們的編譯過程。

在實際專案中,我們通常將 SFC 編譯器與建置工具(如 Vite 或基於 webpackVue CLI)集成。Vue 提供了官方的鷹架工具,讓你能夠最快速地開始使用 SFC。更多詳情請查看 SFC 工具部分。

關於關注點分離? - What About Separation of Concerns?​

一些來自傳統網頁開發背景的使用者可能會擔心,SFC 將不同的關注點混合在同一個地方,而 HTML/CSS/JS 本應該是分離的!

要回答這個問題,重要的是我們需要同意關注點分離並不等同於文件類型的分離。工程原則的最終目標是提高代碼庫的可維護性。在當前越來越複雜的前端應用中,關注點分離如果僅僅是基於文件類型的分離,並不能幫助我們達到這個目標。

在現代 UI 開發中,我們發現,與其將代碼庫分為三個相互交織的巨大層次,將它們分成鬆散耦合的組件並進行組合更有意義。在一個組件內,它的模板、邏輯和樣式是內在耦合的,將它們放在一起實際上使組件更加內聚和可維護。

即使你不喜歡單文件組件的概念,你仍然可以通過使用 Src Imports 將 JavaScript 和 CSS 分離到不同的文件中,利用其熱加載和預編譯功能。

看完這篇覺得還有蠻多要學習的www
Vite, Vue CLI這兩個工具應該是很實用的!!!
  • Vite:是一個現代前端建置工具,專為提升開發速度和效率而設計。它支援熱模組替換(HMR, Hot Module Replacement),讓開發者在編輯代碼時立即看到變更結果。
  • Vue CLI:Vue CLI 是基於 webpack 的 Vue.js 專案腳手架工具,它提供了一個完整的開發環境和建置設置,方便開發者快速啟動和管理 Vue.js 專案。









avatar-img
2會員
71內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
<Suspense> 是 Vue 3 的一個實驗性組件,用於協調異步組件的加載狀態,簡化異步處理。它能在等待多個嵌套組件的異步依賴解決時顯示加載指示器,避免每個組件獨立處理加載和錯誤狀態,從而提高用戶體驗。
<Teleport> 是 Vue.js 的內建組件,允許我們將組件的部分內容「傳送」到 DOM 的不同位置,即使這些內容邏輯上屬於某個組件,但可以在視覺上顯示在其他位置,常用於模態框和覆蓋層等情境。
學會了使用 <KeepAlive>,這是一個內建組件,允許我們在動態切換多個組件時有條件地緩存組件實例,避免狀態丟失並提高速度。使用 include 和 exclude 屬性來自定義緩存行為,並透過 max 屬性限制緩存的實例數量。
<TransitionGroup> 是一個內建組件,專為對列表中的元素或組件進行插入、移除和順序變更的動畫處理而設計。與 <Transition> 的主要區別在於,<TransitionGroup> 預設不會渲染包裹元素,且不支持轉場模式。
<Transition> 用於元素或組件進入和離開 DOM 時的動畫,而 <TransitionGroup> 則應用於 v-for 列表的插入、移除或移動。這些組件透過 CSS 類別來控制動畫,例如進入/離開的狀態類別。可以透過 name 屬性自訂過渡效果的命名。
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
<Suspense> 是 Vue 3 的一個實驗性組件,用於協調異步組件的加載狀態,簡化異步處理。它能在等待多個嵌套組件的異步依賴解決時顯示加載指示器,避免每個組件獨立處理加載和錯誤狀態,從而提高用戶體驗。
<Teleport> 是 Vue.js 的內建組件,允許我們將組件的部分內容「傳送」到 DOM 的不同位置,即使這些內容邏輯上屬於某個組件,但可以在視覺上顯示在其他位置,常用於模態框和覆蓋層等情境。
學會了使用 <KeepAlive>,這是一個內建組件,允許我們在動態切換多個組件時有條件地緩存組件實例,避免狀態丟失並提高速度。使用 include 和 exclude 屬性來自定義緩存行為,並透過 max 屬性限制緩存的實例數量。
<TransitionGroup> 是一個內建組件,專為對列表中的元素或組件進行插入、移除和順序變更的動畫處理而設計。與 <Transition> 的主要區別在於,<TransitionGroup> 預設不會渲染包裹元素,且不支持轉場模式。
<Transition> 用於元素或組件進入和離開 DOM 時的動畫,而 <TransitionGroup> 則應用於 v-for 列表的插入、移除或移動。這些組件透過 CSS 類別來控制動畫,例如進入/離開的狀態類別。可以透過 name 屬性自訂過渡效果的命名。
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。