EP39 - 外掛

閱讀時間約 7 分鐘
Plugins 外掛,好奇有什麼好用的外掛嗎?
外掛用的好~開發沒煩惱 www
能客製化外掛也是蠻重要的~~

介紹 - Introduction

插件是自包含的代碼,通常用於為 Vue 添加應用級別的功能。這是安裝插件的方法:

import { createApp } from 'vue'

const app = createApp({})

app.use(myPlugin, {
/* 可選配置 */
})

插件可以定義為一個暴露 install() 方法的物件,或者作為安裝函數本身的函數。install 函數接收應用實例以及傳遞給 app.use() 的額外選項(如果有):

const myPlugin = {
install(app, options) {
// 配置應用
}
}

插件沒有嚴格定義的範圍,但插件有以下常見的用途:

  • 使用 app.component()app.directive() 註冊一個或多個全局組件或自定義指令。
  • 通過調用 app.provide() 使資源可在整個應用中注入
  • 通過將它們附加到 app.config.globalProperties 來添加一些全局實例屬性或方法。

需要執行上述操作組合的庫(例如 vue-router)通常會使用插件。

Q: 組件與外掛差異?

在 Vue 中,組件(Component)和外掛(Plugin)有不同的用途和功能,以下是它們的主要差異:

定義與用途

  • 組件(Component):
    • 組件是 Vue 應用的基本構建塊,封裝了 HTML、CSS 和 JavaScript。它們用於創建可重用的 UI 部分,讓開發者能夠更好地組織和管理應用的界面。
    • 每個組件都有自己的狀態(data)和生命週期,可以接收屬性(props)並發出事件。
  • 外掛(Plugin):
    • 外掛是用於擴展 Vue 應用功能的自包含代碼,通常用於添加應用級別的功能,如全局註冊組件、添加全局方法或資源注入。
    • 外掛使用 app.use() 方法進行安裝,並且可以在全局範圍內影響應用。

2. 使用場景

  • 組件:
    • 適合用於創建可重用的 UI 元素,如按鈕、表單、模態框等,並且可嵌套其他組件以構建複雜的界面。
  • 外掛:
    • 適合用於需要在多個組件之間共享功能或狀態的情況,例如路由管理(vue-router)、狀態管理(Vuex)或全局事件總線。

3. 設計模式

  • 組件:
    • 通常以模板和組件選項(如 datamethodscomputed)的形式進行定義,並且有明確的輸入(props)和輸出(事件)。
  • 外掛:
    • 通常以對象或函數的形式進行定義,包含一個 install 方法,負責配置應用的全局屬性或方法。

總結

簡而言之,組件主要用於構建 UI 元素,而外掛則用於擴展應用的功能。在實際開發中,通常會結合使用組件和外掛,以便更有效地開發和管理 Vue 應用。

編寫外掛 - Writing a Plugin

為了更好地理解如何創建自己的 Vue.js 外掛,我們將創建一個非常簡化的外掛,顯示 i18n(國際化)的字符串。

首先,我們將設置外掛對象。建議在單獨的文件中創建並導出它,以保持邏輯的封裝和分離,示例如下:

// plugins/i18n.js
export default {
install: (app, options) => {
// 外掛代碼在這裡
}
}

我們希望創建一個翻譯函數。這個函數將接收一個以點分隔的鍵字符串,並用來在用戶提供的選項中查找翻譯字符串。這是模板中的預期用法:

<h1>{{ $translate('greetings.hello') }}</h1>

由於這個函數應該在所有模板中全局可用,我們將通過將其附加到 app.config.globalProperties 中來實現:

// plugins/i18n.js
export default {
install: (app, options) => {
// 注入全局可用的 $translate() 方法
app.config.globalProperties.$translate = (key) => {
// 使用 `key` 作為路徑來檢索 `options` 中的嵌套屬性
return key.split('.').reduce((o, i) => {
if (o) return o[i]
}, options)
}
}
}

我們的 $translate 函數將接受像 greetings.hello 的字符串,查看用戶提供的配置並返回翻譯的值。

包含翻譯鍵的對象應在安裝期間通過額外的參數傳遞給外掛:

import i18nPlugin from './plugins/i18n'

app.use(i18nPlugin, {
greetings: {
hello: 'Bonjour!'
}
})

現在,我們的初始表達式 $translate('greetings.hello') 將在運行時被替換為 Bonjour!

另見: Augmenting Global Properties 

提示:儘量少用全局屬性,因為如果在應用中使用太多不同外掛注入的全局屬性,可能會快速變得混淆。

提供/注入與外掛 - Provide / Inject with Plugins

外掛也允許我們使用注入(inject)來提供函數或屬性給外掛的使用者。例如,我們可以讓應用程序訪問選項參數,以便使用翻譯物件。

// plugins/i18n.js
export default {
install: (app, options) => {
app.provide('i18n', options)
}
}

現在,外掛使用者將能夠使用 i18n 鍵將外掛選項注入到他們的組件中:

<script setup>
import { inject } from 'vue'

const i18n = inject('i18n')

console.log(i18n.greetings.hello)
</script>

NPM 打包 - Bundle for NPM

如果您還想為他人構建並發佈您的外掛,請參閱 Vite 的庫模式部分

寫外掛感覺可以更了解全局的應用~
有機會想來寫一些有趣的外掛
再來繼續練習吧~~
avatar-img
2會員
70內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
在學習 Vue 的可重用性(Reusability)時,Composables 是重要概念,專指可以重複使用的函式。這些函式利用 Vue 的 Composition API 封裝和重用有狀態的邏輯,幫助開發者在應用程式中進行常見任務的邏輯重用,例如格式化日期或追蹤鼠標位置。
Vue 的 scoped 樣式無法完全隔離全局樣式,需要採取其他策略如 BEM 命名規則或 CSS Modules 來避免衝突。未來可能也會遇到 JavaScript 衝突,因此需遵循嚴格的命名和範圍控制。
這段代碼展示了如何使用 Vue 的 <TransitionGroup> 組件來實現帶過渡效果的列表,這是一個實用的例子,對於學習前端動畫效果非常有幫助。
透過 Vue 3,可以輕鬆實現模態對話框。在 App.vue 中,使用按鈕來顯示模態視窗,並利用 Teleport 將其渲染到 body 中。在 Modal.vue 中,透過插槽提供自定義標題、主體和頁腳,並使用 Transition 組件添加顯示和隱藏的過渡效果。
引入 PolyGraph 子組件,並使用 ref 和 reactive 來管理標籤及其對應值。AxisLabel.vue 負責顯示每個統計數據標籤,並根據數據計算其在圖形中位置。PolyGraph.vue 則負責繪製多邊形和圓形,並透過 valueToPoint 函數將統計數據轉換為 SVG 坐標。
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
在學習 Vue 的可重用性(Reusability)時,Composables 是重要概念,專指可以重複使用的函式。這些函式利用 Vue 的 Composition API 封裝和重用有狀態的邏輯,幫助開發者在應用程式中進行常見任務的邏輯重用,例如格式化日期或追蹤鼠標位置。
Vue 的 scoped 樣式無法完全隔離全局樣式,需要採取其他策略如 BEM 命名規則或 CSS Modules 來避免衝突。未來可能也會遇到 JavaScript 衝突,因此需遵循嚴格的命名和範圍控制。
這段代碼展示了如何使用 Vue 的 <TransitionGroup> 組件來實現帶過渡效果的列表,這是一個實用的例子,對於學習前端動畫效果非常有幫助。
透過 Vue 3,可以輕鬆實現模態對話框。在 App.vue 中,使用按鈕來顯示模態視窗,並利用 Teleport 將其渲染到 body 中。在 Modal.vue 中,透過插槽提供自定義標題、主體和頁腳,並使用 Transition 組件添加顯示和隱藏的過渡效果。
引入 PolyGraph 子組件,並使用 ref 和 reactive 來管理標籤及其對應值。AxisLabel.vue 負責顯示每個統計數據標籤,並根據數據計算其在圖形中位置。PolyGraph.vue 則負責繪製多邊形和圓形,並透過 valueToPoint 函數將統計數據轉換為 SVG 坐標。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
插件的必要性 作為新手,我發現對於Zotero的插件很重要。因為原生Zotero是開源軟體,所以基本功能很簡單清晰。很多牛人陸續開發出很多很多種插件(真的很多)。這些插件用途非常多樣化,若應用得當,可以大幅提升Zotero使用效率。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
如何在 Vite 專案中安裝和設置 TypeScript 及路徑別名的步驟,包括安裝必要的依賴、配置 vite.config.js、tsconfig.json 的設置,及如何創建類型聲明文件來正確識別 .vue 文件。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
插件的必要性 作為新手,我發現對於Zotero的插件很重要。因為原生Zotero是開源軟體,所以基本功能很簡單清晰。很多牛人陸續開發出很多很多種插件(真的很多)。這些插件用途非常多樣化,若應用得當,可以大幅提升Zotero使用效率。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找