0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

插件化架構(gòu)定義及插件化架構(gòu)的實踐思路分析

454398 ? 來源: OPPO互聯(lián)網(wǎng)技術(shù) ? 作者: OPPO互聯(lián)網(wǎng)技術(shù) ? 2020-10-15 17:45 ? 次閱讀

babel插件、webpack插件、vue-cli插件,為啥這么多的優(yōu)秀框架都是使用插件系統(tǒng)?插件化架構(gòu)是什么?帶來了什么好處?可以應(yīng)用到什么場景呢?

1. 插件化架構(gòu)定義

插件化架構(gòu)又稱微核架構(gòu),指的是軟件的內(nèi)核相對較小,主要功能和業(yè)務(wù)邏輯都通過插件實現(xiàn)。插件化架構(gòu)一般有兩個核心的概念:內(nèi)核和插件。

內(nèi)核(pluginCore)通常只包含系統(tǒng)運行的最小功能;

插件(plugin)則是互相獨立的模塊,一般會提供單一的功能。內(nèi)核一般會將要完成的所有業(yè)務(wù)進行抽象,抽象出最小粒度的基礎(chǔ)接口,供插件方來調(diào)用。這樣,插件開發(fā)的效率將會極大的提高。比方說,瀏覽器就是一個典型的插件化架構(gòu),瀏覽器是內(nèi)核,頁面是插件,這樣通過不同的URL地址加載不同的頁面,來提供非常豐富的功能。而且,我們開發(fā)網(wǎng)頁時候,瀏覽器會提供很多API和能力,這些接口通過 window來掛載, 比如,DOM、BOM、Event、Location等等。

設(shè)計一個完善的插件化架構(gòu)的系統(tǒng),包含三要素:

plugCore:插件內(nèi)核,提供插件運行時,管理插件的加載、運行、卸載等生命周期(類比瀏覽器);

pluginAPI:插件運行時需要的基礎(chǔ)接口(類比瀏覽器例子,相當于window);

plugin:一系列特定功能的獨立模塊(類比瀏覽器例子,相當于不同的網(wǎng)頁)。

2. 插件化架構(gòu)的實踐

我們將從plugCore、 pluginAPI和plugin三要素,來解析jQuery、Babel和Vue CLI這三大優(yōu)秀的開源庫其插件化架構(gòu)的實踐。

2.1 jQuery的插件化架構(gòu)

jQuery 是一個 JavaScript 庫,極大地簡化了JavaScript 編程,用更少的代碼完成更多工作。早期瀏覽器的標準不統(tǒng)一,開發(fā)網(wǎng)頁需要兼容不同瀏覽器的用戶使用是一件十分痛苦的事情。jQuery在適配了不同瀏覽器的差異的基礎(chǔ)上提供了更加完善易用API,供前端開發(fā)人員完成網(wǎng)頁編程,使用jQuery編寫的網(wǎng)頁,在一套代碼下也可以在不同廠商的瀏覽器上正常運行。在 MV* 框架流行之前,jQuery是絕對的扛霸子。jQuery是可擴展的,其擁有完善的插件體系,網(wǎng)頁開發(fā)所需要的各種插件在其生態(tài)都可以找到。我們解析一下jQuery插件體系。

插件定義:

特別說明:$.fn = jQuery.protype(插件精髓)。jQuery的插件機制通過原型鏈來掛載。

插件機制執(zhí)行過程

demo 示例

$app便可以在原型鏈上查找到myPlugin:

從三要素來總結(jié):

pluginCore:通過原型鏈賦值來擴展不同的插件,再獲得jQuery實例后可以被調(diào)用。

pluginAPI:jQuery包的核心接口,(jQuery依靠其優(yōu)異的Api取勝)

plugin:無限制,可以是JavaScript的類型,一般是實現(xiàn)具體功能的模塊,比如,日期選擇器等。2.2 Babel的插件化架構(gòu)

Babel 是一個工具鏈,主要用于將 ECMAScript 2015+ 版本的代碼轉(zhuǎn)換為向后兼容的 JavaScript 語法,以便能夠運行在當前和舊版本的瀏覽器或其他環(huán)境中。在代碼轉(zhuǎn)換的過程中會涉及許多特性和語法的轉(zhuǎn)換,而且ECMAScript的提案總是不斷地更新。如何組織大量(不斷增加)的轉(zhuǎn)換規(guī)則呢?我們來看看 Babel的工作原理。

Babel轉(zhuǎn)換源碼,分為三個步驟:

解析(parse):進行詞法分析(Lexical Analysis)和語法分析(Syntactic Analysis)以生成抽象語法樹(AST);

轉(zhuǎn)換 (transform):遍歷AST中每個節(jié)點并進行相應(yīng)的轉(zhuǎn)換操作,該過程通過使用不同的插件來實現(xiàn)各種特性和語法的轉(zhuǎn)換;

生成 (generate):根據(jù)AST生成目標代碼。

Babel在AST轉(zhuǎn)換的過程(即上圖的第2步),便使用插件化架構(gòu),下面將會詳細講解這個轉(zhuǎn)換過程的插件化架構(gòu)的使用。

插件定義:

插件是一個函數(shù),返回值是一個包含visitor的對象。插件定義的部分概念說明:

name:插件名

pluginAPI: 插件運行時傳入的API

visitor: 是一個對象,對象的key是AST的每節(jié)點的類型,對象的值是一個函數(shù),AST轉(zhuǎn)換的過程便在這里發(fā)生的。

nodePath:是一個AST的節(jié)點的實例對象,詳細可以參考:@babel/parser/src/parser/node.js [1],其中, type字段 : 該節(jié)點的類型,常見類型:VariableDeclaration(變量聲明)、VariableDeclarator(變量聲明表達式)、ArrowFunctionExpression(箭頭函數(shù)表達式)等等,詳細可以參考@babel/types [2]。(筆者認為pluginAPI還應(yīng)包括nodePath,因為,每個節(jié)點實例除了語法和詞法描述,還包含需求語法間的轉(zhuǎn)換方法)

插件示例

箭頭函數(shù)轉(zhuǎn)換成普通函數(shù)的插件:@babel/plugin-transform-arrow-functions [3]源碼:

插件的執(zhí)行思路:

第一步,執(zhí)行該插件,獲取到包含visitor對象;

第二步,ATS遍歷節(jié)點,檢測nodePath的type === ‘ArrowFunctionExpression’,尋找到vistor對象的中key為 ArrowFunctionExpression的函數(shù);

第三步,將nodePath傳入該函數(shù)進行調(diào)用(AST在這步被修改);單個插件的執(zhí)行思路很明確了,那么在ATS遍歷過程,怎么做到多個插件一起工作呢?

Babel在轉(zhuǎn)換源碼過程中,插件化架構(gòu)的工作流程是這樣的:

第一步:通過解析babel的配置文件(或者命令行--plugins參數(shù)),獲取Babel配置的所有插件的描述;

第二步,將插件的require進內(nèi)存,獲得插件函數(shù),并執(zhí)行插件函數(shù),獲取到多個包含vistor字段對象;(詳細邏輯:@babel/core/src/config/full.js [4])

第三步,將多個包含vistor字段對象整合成一個大的visitor源碼展示(詳細邏輯:@babel/core/src/transformation/index.js [5]):

合并后的visitor對象:

visitor的對象中的值變成了 Array《function(nodePath)》

第四步,AST遍歷時,每個節(jié)點根據(jù) NodeType,來獲取 visitor[NodeType],并依次執(zhí)行。從三要素來總結(jié):

pluginCore:插件加載并整合(即vistor合并),AST遍歷期間是調(diào)用查找vistor[NodeType]并依次調(diào)用;

pluginAPI:nodePath,提供不同類型節(jié)點的接口來轉(zhuǎn)換AST節(jié)點;

plugin:visitor[NodeType]=function(nodepath)。2.3 vue-cli的插件化架構(gòu)

Vue CLI 是一個基于 Vue.js 進行快速開發(fā)的完整系統(tǒng)。CLI插件是向你的 Vue 項目提供可選功能的 npm 包,例如 Babel/TypeScript 轉(zhuǎn)譯、ESLint 集成、單元測試和 end-to-end 測試等。Vue CLI 插件的名字以 @vue/cli-plugin- (內(nèi)建插件) 或 vue-cli-plugin- (社區(qū)插件) 開頭,非常容易使用。下面,我們將會解析cli插件的定義、執(zhí)行、安裝等過程。

插件定義

插件必須是vue-cli-plugin-命名的npm包,并且目錄結(jié)構(gòu)也是要嚴格遵循文件命名來定義。

注意:@vue/cli-service [6],會通過 項目根目錄下package.json中dependencies和devDependencies中定義的 npm包中符合插件命名規(guī)范的 npm包作為項目的插件。

文件命名和內(nèi)容說明:

generator.js:會在插件被添加時執(zhí)行,可以安裝npm包、修改項目源碼等功能;

prompts.js:所有的對話邏輯都存儲在 prompts.js 文件中。對話內(nèi)部是通過 inquirer [7] 實現(xiàn),在調(diào)用其獲得安裝選項結(jié)果,并在 generator.js調(diào)用時作為參數(shù)存入;

index.js:Service插件的入口,@vue/cli-service [8]啟動時被執(zhí)行

詳情可以去看Vue Cli 插件開發(fā)指南 [9]

我們把Vue CLI的插件執(zhí)行分成兩種情況:

第一種:插件未安裝,插件被添加的時候調(diào)用(prompts.js + generator.js)

第二種:插件已安裝,插件系統(tǒng)啟動時被執(zhí)行(index.js)第一種 安裝流程

相比Babel的手動安裝添加插件方式,Vue CLI的插件系統(tǒng)提供命令行的安裝方式就顯得很方便了。我們看看Vue Cli插件系統(tǒng)時怎么實現(xiàn)一行命令添加插件的功能。

安裝流程的執(zhí)行思路如下:

第一步:從命令行參數(shù)解析出插件名,使用npm(yarn)install vue-cli-plugin-xxx 安裝插件,源碼位置:@vue/cli/lib/add.js [10]

第二步:require(‘vue-cli-plugin-xxx/prompts’),并獲取用戶安裝是選項結(jié)果pluginOptions,源碼位置:@vue/cli/lib/invoke.js [11]

第三步:使用pluginName和pluginOptions作為參數(shù)構(gòu)成出Generator [12]對象的實例

第四步:執(zhí)行g(shù)enerator.generate方法。這步包括了三個關(guān)鍵步驟:

1)require(vue-cli-plugin-xxx/generator),獲得插件的執(zhí)行函數(shù);

2)構(gòu)建GeneratorAPI(即pluginAPI);

3)調(diào)用generator.js導(dǎo)出函數(shù)。

詳細代碼:@vue/cli/lib/Generator.js [113]

第五步:將插件的參數(shù)添加到vue.config.js文件中。第二種 運行流程

插件運行流程是由@vue/cli-service [14]這個插件系統(tǒng)定義的,這里的調(diào)用插件有兩種:

第一種 內(nèi)置插件@vue/cli-service的命令和配置相關(guān),將系插件統(tǒng)功能拆分出多個內(nèi)置插件,在插件系統(tǒng)中默認調(diào)用);

第二種 項目插件,package.json 中定義的npm包名符合插件命名規(guī)范)。

插件運行邏輯很簡單:

這兩個流程的 pluginAPI是不一樣的。

安裝流程:@vue/cli/lib/GeneratorAPI [15]

運行流程:@vue/cli-service/lib/PluginAPI [16]從三要素來總結(jié):

1)安裝流程

pluginCore:@vue/cli [17]通過命令行參數(shù)獲得插件包名,然后安裝插件的npm包,并執(zhí)行prompts.js 獲得用戶安裝選項結(jié)果,然后,使用選項結(jié)果和generator.js作為參數(shù)構(gòu)造出generator,并在調(diào)用generator.generate中執(zhí)行g(shù)enerator.js函數(shù);

pluginAPI:GeneratorAPI [18],提供了源碼修改、npm包管理、模版文件生成等功能;

plugin:由prompts.js和generator.js組成,解決某種能力植入項目時,要處理的依賴。2)運行流程

pluginCore:@vue/cli-service [19],通過package.json中獲得項目插件后,與系統(tǒng)內(nèi)置插件合并,最后依次執(zhí)行;

pluginApI:PluginAPI [20],提供webpack配置修改和命令管理的能力;

plugin:index.js文件,在不同命令下進行工作。一個插件系統(tǒng)是可以不多個插件類型,并且插件系統(tǒng)通過命令安裝插件的實現(xiàn),用戶在使用插件系統(tǒng)時添加插件也是十分方便的。

3. 插件化架構(gòu)的應(yīng)用

3.1 應(yīng)用場景

通過上述的實例,總結(jié)處理插件架構(gòu)的應(yīng)用場景。

第一種:富pluginAPI場景:代碼在多種場景中運行,需要抹平場景中差異。(jQuery);

第二種:富plugin場景,插件系統(tǒng),可預(yù)期需求會越來越多,適合通過更多的插件來簡化系統(tǒng)的代碼量(Babel)

第三種:富pluginCore和pluginAPI場景,插件系統(tǒng)本身非常復(fù)雜,需要對開發(fā)人員要求極高,這時候,將復(fù)雜的工作放到內(nèi)核和中pluginApi實現(xiàn),剩下大部分的簡單的編碼工作留給插件方實現(xiàn),插件方借助pluginApi也可以快速完成業(yè)務(wù)開發(fā)(Vue CLI)3.2 發(fā)展方向

通過建立一個插件標準,將研發(fā)流程沉淀的能力進行插件化編程,整個公司通過使用一套的插件系統(tǒng)(中臺),這樣意味著,我們不用重復(fù)造業(yè)務(wù)輪子,團隊和企業(yè)可以持續(xù)積累自己的插件生態(tài),讓軟件開可以像汽車等工業(yè)制造一樣,打造一條標準化裝配的流水線。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Window
    +關(guān)注

    關(guān)注

    0

    文章

    80

    瀏覽量

    37212
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1461

    瀏覽量

    61492
  • 插件
    +關(guān)注

    關(guān)注

    0

    文章

    317

    瀏覽量

    22329
  • jQuery
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    11114
收藏 人收藏

    評論

    相關(guān)推薦

    MT6701磁編碼IC在自動插件流水線中的應(yīng)用

    本文將從MT6701磁編碼IC的特性、工作原理、在自動插件流水線中的具體應(yīng)用、以及未來的發(fā)展趨 MT6701磁編碼IC作為現(xiàn)代工業(yè)自動領(lǐng)域的重要組成部分,其在自動
    的頭像 發(fā)表于 07-22 17:59 ?767次閱讀
    MT6701磁編碼IC在自動<b class='flag-5'>化</b><b class='flag-5'>插件</b>流水線中的應(yīng)用

    基于DMAIC的SMT TX插件撞傷不良改善

    在快速發(fā)展的電子制造領(lǐng)域,SMT(表面貼裝技術(shù))已經(jīng)成為電子產(chǎn)品組裝的核心技術(shù)之一。然而,SMT TX插件撞傷不良問題一直是制約生產(chǎn)效率與產(chǎn)品質(zhì)量的瓶頸。本文將基于DMAIC(定義、測量、分析、改進
    的頭像 發(fā)表于 06-19 14:47 ?232次閱讀

    【線路板設(shè)計】詳解pcb插件特點

    ~ 以下是關(guān)于PCB插件的主要特點: 1.功能豐富:PCB插件提供了各種功能,包括自定義布局、RF設(shè)計、信號完整性分析、3D模型創(chuàng)建等。這些功能使得設(shè)計師能夠更靈活地進行設(shè)計,并解決復(fù)
    的頭像 發(fā)表于 05-21 17:51 ?429次閱讀

    鴻蒙實戰(zhàn)開發(fā)學(xué)習(xí):【HiView插件開發(fā)】

    Hiview是一個跨平臺的終端設(shè)備維測服務(wù)集,其中是由插件管理平臺和插件實現(xiàn)的各自功能構(gòu)成整套系統(tǒng)。 本文描述了hiview插件開發(fā)的全部流程。
    的頭像 發(fā)表于 03-12 11:52 ?1118次閱讀
    鴻蒙實戰(zhàn)開發(fā)學(xué)習(xí):【HiView<b class='flag-5'>插件</b>開發(fā)】

    鋁基板怎么焊接插件元件

    鋁基板怎么焊接插件元件
    的頭像 發(fā)表于 03-01 10:53 ?795次閱讀

    Embedded office發(fā)布安全插件V1.1版本!

    Embedded office很高興地宣布安全插件V1.1版本的發(fā)布了!現(xiàn)在通過外部設(shè)備或不同核心架構(gòu)的專門通道支持端到端受保護的安全通信。
    的頭像 發(fā)表于 02-20 11:12 ?458次閱讀

    插件型功率電感封裝類型對使用有影響嗎

    插件型功率電感封裝類型對使用有影響嗎 編輯:谷景電子 插件型功率電感在電子電路中是特別重要的一種電感元件,它對于保證電路的穩(wěn)定運作有著特別重要的影響。要想充分發(fā)揮插件型功率電感的功能作用,選型工作
    的頭像 發(fā)表于 02-18 13:52 ?319次閱讀

    從瀏覽器原理解析Chrome常見插件的實現(xiàn)思路

    近期Chrome進程架構(gòu) 從圖中可以看出,最新的 Chrome 瀏覽器包括:1 個瀏覽器主進程、1 個 GPU 進程、1 個網(wǎng)絡(luò)進程、多個渲染進程和多個插件進程。
    的頭像 發(fā)表于 12-08 14:25 ?621次閱讀
    從瀏覽器原理解析Chrome常見<b class='flag-5'>插件</b>的實現(xiàn)<b class='flag-5'>思路</b>

    Lambda數(shù)據(jù)架構(gòu)和Kappa數(shù)據(jù)架構(gòu)——構(gòu)建現(xiàn)代數(shù)據(jù)架構(gòu)

    如何更好地構(gòu)建我們的數(shù)據(jù)處理架構(gòu),如何對IT系統(tǒng)中的遺留問題進行現(xiàn)代改造并將其轉(zhuǎn)變?yōu)楝F(xiàn)代數(shù)據(jù)架構(gòu)?該怎么為你的需求匹配最適合的架構(gòu)設(shè)計呢,本文將
    的頭像 發(fā)表于 11-26 08:04 ?517次閱讀
    Lambda數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>和Kappa數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>——構(gòu)建現(xiàn)代數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>

    docker微服務(wù)架構(gòu)實戰(zhàn)

    的容器技術(shù),為微服務(wù)架構(gòu)的實施提供了強大的支持。本文將介紹Docker微服務(wù)架構(gòu)的實戰(zhàn)經(jīng)驗,包括Docker的概述、微服務(wù)架構(gòu)的設(shè)計原則以及實際應(yīng)用中的具體
    的頭像 發(fā)表于 11-23 09:26 ?518次閱讀

    什么是插件電阻?選擇插件電阻需要考慮哪些因素呢?

    什么是插件電阻?選擇插件電阻需要考慮哪些因素呢? 插件電阻(也稱為電子電阻或電路電阻)是一種用于限制電流流動的電子元件。它們通常由一個或多個電阻器組件構(gòu)成,用來控制和調(diào)節(jié)電子電路中的電流和電壓。
    的頭像 發(fā)表于 11-23 09:13 ?1213次閱讀

    Lambda數(shù)據(jù)架構(gòu)和Kappa數(shù)據(jù)架構(gòu)——構(gòu)建現(xiàn)代數(shù)據(jù)架構(gòu)

    如何更好地構(gòu)建我們的數(shù)據(jù)處理架構(gòu),如何對IT系統(tǒng)中的遺留問題進行現(xiàn)代改造并將其轉(zhuǎn)變?yōu)楝F(xiàn)代數(shù)據(jù)架構(gòu)?該怎么為你的需求匹配最適合的架構(gòu)設(shè)計呢,本文將
    的頭像 發(fā)表于 11-15 13:32 ?535次閱讀
    Lambda數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>和Kappa數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>——構(gòu)建現(xiàn)代數(shù)據(jù)<b class='flag-5'>架構(gòu)</b>

    工字插件電感引腳破損的常見原因分析

    工字插件電感是一種應(yīng)用非常廣泛的電感產(chǎn)品,大家在使用工字插件電感的時候會遇到很多問題,比如選型的問題,或者是使用中出現(xiàn)的一些其他異常問題等。本篇我們來分析一個比較常見的問題——引腳破損!
    發(fā)表于 11-13 16:42 ?3次下載

    基于EA的企業(yè)數(shù)字轉(zhuǎn)型架構(gòu)的設(shè)計

    從數(shù)字轉(zhuǎn)型的定義上看,至少包含兩個方面:一方面是商業(yè)模式的轉(zhuǎn)型,一方面是技術(shù)的升級。因此,數(shù)字轉(zhuǎn)型架構(gòu)是由業(yè)務(wù)架構(gòu)、技術(shù)
    的頭像 發(fā)表于 10-29 14:51 ?1177次閱讀
    基于EA的企業(yè)數(shù)字<b class='flag-5'>化</b>轉(zhuǎn)型<b class='flag-5'>架構(gòu)</b>的設(shè)計

    怎樣用現(xiàn)成的Eclipse插件來調(diào)試AT32系列芯片

    擁有很高的靈活性,軟件可以以Eclipse為架構(gòu)開發(fā)自己的IDE。這邊文檔主要描述怎樣用現(xiàn)成的Eclipse插件來調(diào)試AT32系列芯片。
    發(fā)表于 10-24 07:12