本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)和軟件架構(gòu)領(lǐng)域,特別涉及一種web應(yīng)用的插件化構(gòu)建方法、系統(tǒng)、服務(wù)器及計(jì)算設(shè)備。
背景技術(shù):
::在軟件架構(gòu)領(lǐng)域中,一直希望能構(gòu)建由插件或組件組成的系統(tǒng),以取代整體風(fēng)格。整體風(fēng)格是指把一個(gè)完整的應(yīng)用當(dāng)成一個(gè)開(kāi)發(fā)單元,內(nèi)部自然劃分為客戶(hù)端、服務(wù)器端和數(shù)據(jù)庫(kù),但隨著業(yè)務(wù)功能的擴(kuò)大,整體風(fēng)格的維護(hù)難度加大,難以控制模塊間的耦合深度,為發(fā)布、維護(hù)和擴(kuò)展帶來(lái)了麻煩。而插件化風(fēng)格是指將小的服務(wù)開(kāi)發(fā)成單一應(yīng)用的形式,每個(gè)應(yīng)用可以獨(dú)立開(kāi)發(fā)、獨(dú)立替代和獨(dú)立更新。當(dāng)確定插件的邊界時(shí),插件化風(fēng)格圍繞業(yè)務(wù)功能進(jìn)行劃分,實(shí)現(xiàn)了對(duì)各個(gè)插件保持最低限度的集中管理。如今,隨著互聯(lián)網(wǎng)技術(shù)的大力發(fā)展,web應(yīng)用的得到了廣泛推廣和使用,對(duì)于web應(yīng)用而言,如果使用整體風(fēng)格來(lái)進(jìn)行應(yīng)用構(gòu)建,則會(huì)使得面對(duì)客戶(hù)端和面對(duì)服務(wù)器的功能容易出現(xiàn)混淆,導(dǎo)致模塊深耦合,非常不利于后期的維護(hù)和更新,因此通常采用插件化風(fēng)格來(lái)構(gòu)建web應(yīng)用。現(xiàn)有的web應(yīng)用的插件化構(gòu)建方法中,以express、koa為代表的基于node.js的web應(yīng)用后端開(kāi)發(fā)框架,提供了以中間件增強(qiáng)web應(yīng)用的方案,將各種功能從應(yīng)用本身抽取出來(lái),作為中間件添加到框架中,但中間件并不適于實(shí)現(xiàn)業(yè)務(wù)邏輯,且后端開(kāi)發(fā)框架并不能提供前端功能,如用戶(hù)界面仍需另行實(shí)現(xiàn),這相當(dāng)于業(yè)務(wù)功能的開(kāi)發(fā)仍以整體風(fēng)格為主。另一方面,對(duì)前端功能而言,常見(jiàn)的如側(cè)邊欄、公告板等以展示為目的的用戶(hù)界面,多是限定了用戶(hù)界面所包含的插件,不能支持多變的業(yè)務(wù)場(chǎng)景,且插件之間無(wú)關(guān)聯(lián),無(wú)法互相依賴(lài)或聯(lián)動(dòng),且作為前端技術(shù),并未涉及后端的實(shí)現(xiàn)。因此,需要一種新的web應(yīng)用的插件化構(gòu)建方法來(lái)優(yōu)化上述處理過(guò)程。技術(shù)實(shí)現(xiàn)要素:為此,本發(fā)明提供一種web應(yīng)用的插件化構(gòu)建的技術(shù)方案,以力圖解決或者至少緩解上面存在的問(wèn)題。根據(jù)本發(fā)明的一個(gè)方面,提供一種web應(yīng)用的插件化構(gòu)建方法,適于在服務(wù)器中執(zhí)行,web應(yīng)用適于由多個(gè)插件組合生成,每個(gè)插件具有對(duì)應(yīng)的依賴(lài)庫(kù)和插件代碼,插件代碼包括服務(wù)器端代碼和/或客戶(hù)端代碼,服務(wù)器端代碼包括服務(wù)器端注冊(cè)代碼和服務(wù)器端執(zhí)行代碼,該方法包括如下步驟:首先掃描插件目錄,為插件目錄中的各插件安裝對(duì)應(yīng)的依賴(lài)庫(kù);初始化web服務(wù)器端服務(wù),注冊(cè)通用組件并創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例,通用組件包括靜態(tài)資源服務(wù);對(duì)于各插件中的每個(gè)插件,若其插件代碼包括服務(wù)器端代碼,則獲取并解析該插件的服務(wù)器端注冊(cè)代碼,以便將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中;初始化web客戶(hù)端服務(wù),提供web應(yīng)用對(duì)應(yīng)的客戶(hù)端入口;對(duì)于各插件中的每個(gè)插件,若其插件代碼包括客戶(hù)端代碼,則將客戶(hù)端代碼打包,并作為靜態(tài)資源放入靜態(tài)資源目錄中以便通過(guò)靜態(tài)資源服務(wù)來(lái)提供給客戶(hù)端,以完成web應(yīng)用的構(gòu)建。可選地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例的步驟包括:讀取web服務(wù)器端服務(wù)的初始化配置信息,初始化配置信息包括web應(yīng)用的基礎(chǔ)配置;根據(jù)基礎(chǔ)配置創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例。可選地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,基礎(chǔ)配置包括web服務(wù)器端服務(wù)的ip地址和監(jiān)聽(tīng)的端口??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,在創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例的步驟之后,還包括:遍歷插件目錄中的所有插件,獲取各插件的配置文件,并將配置文件導(dǎo)出??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,配置文件包括插件id、服務(wù)器端代碼入口和/或客戶(hù)端代碼入口??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,還包括:從配置文件中獲取客戶(hù)端代碼入口;根據(jù)客戶(hù)端代碼入口獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑,并通過(guò)路徑來(lái)查找到客戶(hù)端代碼??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法中,客戶(hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,在將客戶(hù)端代碼打包的步驟之前,方法還包括:解析客戶(hù)端代碼,以獲取客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè);將解析好的插件放入插件集合中,以便通過(guò)插件id從插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。根據(jù)本發(fā)明的又一個(gè)方面,提供一種web應(yīng)用的插件化構(gòu)建系統(tǒng),該系統(tǒng)適于駐留在服務(wù)器中,web應(yīng)用適于由多個(gè)插件組合生成,每個(gè)插件具有對(duì)應(yīng)的依賴(lài)庫(kù)和插件代碼,插件代碼包括服務(wù)器端代碼和/或客戶(hù)端代碼,服務(wù)器端代碼包括服務(wù)器端注冊(cè)代碼和服務(wù)器端執(zhí)行代碼,該系統(tǒng)包括安裝模塊、第一初始化模塊、第一處理模塊、第二初始化模塊和第二處理模塊。其中,安裝模塊適于掃描插件目錄,為插件目錄中的各插件安裝對(duì)應(yīng)的依賴(lài)庫(kù);第一初始化模塊適于初始化web服務(wù)器端服務(wù),注冊(cè)通用組件并創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例,通用組件包括靜態(tài)資源服務(wù);第一處理模塊適于對(duì)于各插件中的每個(gè)插件,當(dāng)其插件代碼包括服務(wù)器端代碼時(shí),獲取并解析該插件的服務(wù)器端注冊(cè)代碼,以便將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中;第二初始化模塊適于初始化web客戶(hù)端服務(wù),提供web應(yīng)用對(duì)應(yīng)的客戶(hù)端入口;第二處理模塊適于對(duì)于各插件中的每個(gè)插件,當(dāng)其插件代碼包括客戶(hù)端代碼時(shí),將客戶(hù)端代碼打包,并作為靜態(tài)資源放入靜態(tài)資源目錄中以便通過(guò)靜態(tài)資源服務(wù)來(lái)提供給客戶(hù)端,以完成web應(yīng)用的構(gòu)建??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,第一初始化模塊進(jìn)一步適于:讀取web服務(wù)器端服務(wù)的初始化配置信息,初始化配置信息包括web應(yīng)用的基礎(chǔ)配置;根據(jù)基礎(chǔ)配置創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,基礎(chǔ)配置包括web服務(wù)器端服務(wù)的ip地址和監(jiān)聽(tīng)的端口。可選地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,還包括導(dǎo)出模塊,適于:遍歷插件目錄中的所有插件,獲取各插件的配置文件,并將配置文件導(dǎo)出??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,配置文件包括插件id、服務(wù)器端代碼入口和/或客戶(hù)端代碼入口??蛇x地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,還包括獲取模塊,適于:從配置文件中獲取客戶(hù)端代碼入口;根據(jù)客戶(hù)端代碼入口獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑,并通過(guò)路徑來(lái)查找到客戶(hù)端代碼。可選地,在根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)中,客戶(hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,第二處理模塊還適于:解析客戶(hù)端代碼,以獲取客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè);將解析好的插件放入插件集合中,以便通過(guò)插件id從插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。根據(jù)本發(fā)明的又一個(gè)方面,提供一種服務(wù)器,包括根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)。根據(jù)本發(fā)明的又一個(gè)方面,提供一種計(jì)算設(shè)備,包括一個(gè)或多個(gè)處理器、存儲(chǔ)器以及一個(gè)或多個(gè)程序,其中一個(gè)或多個(gè)程序存儲(chǔ)在存儲(chǔ)器中并被配置為由一個(gè)或多個(gè)處理器執(zhí)行,一個(gè)或多個(gè)程序包括用于執(zhí)行根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法的指令。根據(jù)本發(fā)明的又一個(gè)方面,還提供一種存儲(chǔ)一個(gè)或多個(gè)程序的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),一個(gè)或多個(gè)程序包括指令,指令當(dāng)由計(jì)算設(shè)備執(zhí)行時(shí),使得計(jì)算設(shè)備執(zhí)行根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法。根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建的技術(shù)方案,首先為要組成該web應(yīng)用的各插件安裝對(duì)于的依賴(lài)庫(kù),初始化web服務(wù)器端服務(wù)以創(chuàng)建web應(yīng)用對(duì)于的服務(wù)器應(yīng)用實(shí)例,對(duì)于插件代碼包括服務(wù)器端代碼的插件,將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中,并初始化web客戶(hù)端服務(wù),對(duì)于插件代碼包括客戶(hù)端代碼的插件,將客戶(hù)端代碼打包作為靜態(tài)資源放入靜態(tài)資源目錄以便提供給客戶(hù)端,從而完成web應(yīng)用的構(gòu)建。在上述技術(shù)方案中,通過(guò)提供基礎(chǔ)的web服務(wù)器端服務(wù),使得后續(xù)開(kāi)發(fā)其他web應(yīng)用時(shí)無(wú)需重復(fù)開(kāi)發(fā)服務(wù)器端基礎(chǔ)功能,并且可復(fù)用各插件,實(shí)現(xiàn)了一次開(kāi)發(fā),多次使用。而且,一個(gè)插件可集合web服務(wù)器端和客戶(hù)端的邏輯,換言之一個(gè)插件能夠一并提供后端和前端功能,增強(qiáng)了該插件的可用性和兼容性。同時(shí),由于各個(gè)插件是從業(yè)務(wù)角度對(duì)web應(yīng)用進(jìn)行分解后,劃分出的功能單一、開(kāi)發(fā)獨(dú)立的插件,實(shí)現(xiàn)了插件間的互相解耦,開(kāi)發(fā)時(shí)不必考慮其他插件的影響。要使用其他插件的功能,無(wú)需開(kāi)發(fā)包裝代碼,可直接進(jìn)行調(diào)用,而且一個(gè)插件的更換、升級(jí)或淘汰不會(huì)影響其他插件,使得插件間的依賴(lài)關(guān)系更清晰且可維護(hù)。附圖說(shuō)明為了實(shí)現(xiàn)上述以及相關(guān)目的,本文結(jié)合下面的描述和附圖來(lái)描述某些說(shuō)明性方面,這些方面指示了可以實(shí)踐本文所公開(kāi)的原理的各種方式,并且所有方面及其等效方面旨在落入所要求保護(hù)的主題的范圍內(nèi)。通過(guò)結(jié)合附圖閱讀下面的詳細(xì)描述,本公開(kāi)的上述以及其它目的、特征和優(yōu)勢(shì)將變得更加明顯。遍及本公開(kāi),相同的附圖標(biāo)記通常指代相同的部件或元素。圖1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的計(jì)算設(shè)備100的結(jié)構(gòu)框圖;圖2示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建方法200的流程圖;圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建系統(tǒng)300的示意圖;以及圖4示出了根據(jù)本發(fā)明的又一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建系統(tǒng)400的示意圖。具體實(shí)施方式下面將參照附圖更詳細(xì)地描述本公開(kāi)的示例性實(shí)施例。雖然附圖中顯示了本公開(kāi)的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開(kāi)而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開(kāi),并且能夠?qū)⒈竟_(kāi)的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。圖1是示例計(jì)算設(shè)備100的框圖。在基本的配置102中,計(jì)算設(shè)備100典型地包括系統(tǒng)存儲(chǔ)器106和一個(gè)或者多個(gè)處理器104。存儲(chǔ)器總線(xiàn)108可以用于在處理器104和系統(tǒng)存儲(chǔ)器106之間的通信。取決于期望的配置,處理器104可以是任何類(lèi)型的處理,包括但不限于:微處理器(μp)、微控制器(μc)、數(shù)字信息處理器(dsp)或者它們的任何組合。處理器104可以包括諸如一級(jí)高速緩存110和二級(jí)高速緩存112之類(lèi)的一個(gè)或者多個(gè)級(jí)別的高速緩存、處理器核心114和寄存器116。示例的處理器核心114可以包括運(yùn)算邏輯單元(alu)、浮點(diǎn)數(shù)單元(fpu)、數(shù)字信號(hào)處理核心(dsp核心)或者它們的任何組合。示例的存儲(chǔ)器控制器118可以與處理器104一起使用,或者在一些實(shí)現(xiàn)中,存儲(chǔ)器控制器118可以是處理器104的一個(gè)內(nèi)部部分。取決于期望的配置,系統(tǒng)存儲(chǔ)器106可以是任意類(lèi)型的存儲(chǔ)器,包括但不限于:易失性存儲(chǔ)器(諸如ram)、非易失性存儲(chǔ)器(諸如rom、閃存等)或者它們的任何組合。系統(tǒng)存儲(chǔ)器106可以包括操作系統(tǒng)120、一個(gè)或者多個(gè)應(yīng)用122以及程序數(shù)據(jù)124。在一些實(shí)施方式中,應(yīng)用122可以布置為在操作系統(tǒng)上利用程序數(shù)據(jù)124進(jìn)行操作。計(jì)算設(shè)備100還可以包括有助于從各種接口設(shè)備(例如,輸出設(shè)備142、外設(shè)接口144和通信設(shè)備146)到基本配置102經(jīng)由總線(xiàn)/接口控制器130的通信的接口總線(xiàn)140。示例的輸出設(shè)備142包括圖形處理單元148和音頻處理單元150。它們可以被配置為有助于經(jīng)由一個(gè)或者多個(gè)a/v端口152與諸如顯示器或者揚(yáng)聲器之類(lèi)的各種外部設(shè)備進(jìn)行通信。示例外設(shè)接口144可以包括串行接口控制器154和并行接口控制器156,它們可以被配置為有助于經(jīng)由一個(gè)或者多個(gè)i/o端口158和諸如輸入設(shè)備(例如,鍵盤(pán)、鼠標(biāo)、筆、語(yǔ)音輸入設(shè)備、觸摸輸入設(shè)備)或者其他外設(shè)(例如打印機(jī)、掃描儀等)之類(lèi)的外部設(shè)備進(jìn)行通信。示例的通信設(shè)備146可以包括網(wǎng)絡(luò)控制器160,其可以被布置為便于經(jīng)由一個(gè)或者多個(gè)通信端口164與一個(gè)或者多個(gè)其他計(jì)算設(shè)備162通過(guò)網(wǎng)絡(luò)通信鏈路的通信。網(wǎng)絡(luò)通信鏈路可以是通信介質(zhì)的一個(gè)示例。通信介質(zhì)通??梢泽w現(xiàn)為在諸如載波或者其他傳輸機(jī)制之類(lèi)的調(diào)制數(shù)據(jù)信號(hào)中的計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊,并且可以包括任何信息遞送介質(zhì)?!罢{(diào)制數(shù)據(jù)信號(hào)”可以這樣的信號(hào),它的數(shù)據(jù)集中的一個(gè)或者多個(gè)或者它的改變可以在信號(hào)中編碼信息的方式進(jìn)行。作為非限制性的示例,通信介質(zhì)可以包括諸如有線(xiàn)網(wǎng)絡(luò)或者專(zhuān)線(xiàn)網(wǎng)絡(luò)之類(lèi)的有線(xiàn)介質(zhì),以及諸如聲音、射頻(rf)、微波、紅外(ir)或者其它無(wú)線(xiàn)介質(zhì)在內(nèi)的各種無(wú)線(xiàn)介質(zhì)。這里使用的術(shù)語(yǔ)計(jì)算機(jī)可讀介質(zhì)可以包括存儲(chǔ)介質(zhì)和通信介質(zhì)二者。計(jì)算設(shè)備100可以實(shí)現(xiàn)為服務(wù)器,例如文件服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、應(yīng)用程序服務(wù)器和web服務(wù)器等,也可以實(shí)現(xiàn)為小尺寸便攜(或者移動(dòng))電子設(shè)備的一部分,這些電子設(shè)備可以是諸如蜂窩電話(huà)、個(gè)人數(shù)字助理(pda)、個(gè)人媒體播放器設(shè)備、無(wú)線(xiàn)網(wǎng)絡(luò)瀏覽設(shè)備、個(gè)人頭戴設(shè)備、應(yīng)用專(zhuān)用設(shè)備、或者可以包括上面任何功能的混合設(shè)備。計(jì)算設(shè)備100還可以實(shí)現(xiàn)為包括桌面計(jì)算機(jī)和筆記本計(jì)算機(jī)配置的個(gè)人計(jì)算機(jī)。在一些實(shí)施例中,計(jì)算設(shè)備100實(shí)現(xiàn)為服務(wù)器,該服務(wù)器被配置為執(zhí)行根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建方法200。應(yīng)用122包括根據(jù)本發(fā)明的web應(yīng)用的插件化構(gòu)建系統(tǒng)300。其中,web應(yīng)用適于由多個(gè)插件組合生成,每個(gè)插件具有對(duì)應(yīng)的依賴(lài)庫(kù)和插件代碼,插件代碼包括服務(wù)器端代碼和/或客戶(hù)端代碼,服務(wù)器端代碼包括服務(wù)器端注冊(cè)代碼和服務(wù)器端執(zhí)行代碼。由此可知插件可分為三類(lèi),第一類(lèi)是服務(wù)器端插件,插件代碼中只包括服務(wù)器端代碼,第二類(lèi)是客戶(hù)端插件,插件代碼中只包括客戶(hù)端代碼,第三類(lèi)是混合插件,插件代碼中既包括服務(wù)器端代碼也包括客戶(hù)端代碼,可將混合插件理解為一個(gè)服務(wù)器端插件與一個(gè)客戶(hù)端插件的組合。同時(shí),約定插件對(duì)應(yīng)的服務(wù)器端代碼開(kāi)發(fā)為hapi.js的組件,客戶(hù)端代碼開(kāi)發(fā)為react.js的組件。圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建方法200的流程圖。web應(yīng)用的插件化構(gòu)建方法200適于在實(shí)現(xiàn)為服務(wù)器的計(jì)算設(shè)備100(例如圖1所示的計(jì)算設(shè)備100)中執(zhí)行。如圖2所示,方法200始于步驟s210。在步驟s210中,掃描插件目錄,為插件目錄中的各插件安裝對(duì)應(yīng)的依賴(lài)庫(kù)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,插件目錄的路徑為/config/plugins,插件目錄的結(jié)構(gòu)如下所示:在該實(shí)施方式中,根據(jù)路徑/config/plugins查找到插件目錄并對(duì)其進(jìn)行掃描,對(duì)掃描到的插件,如插件authplugin,安裝對(duì)應(yīng)的依賴(lài)庫(kù)。這里的依賴(lài)庫(kù)一般指第三方開(kāi)源庫(kù),由開(kāi)源社區(qū)開(kāi)發(fā)和維護(hù),遵循如gpl(generalpubliclicense,通用公開(kāi)許可證)的開(kāi)源協(xié)議,常規(guī)的依賴(lài)庫(kù)包括react.js、hapi.js和webpack.js等。但是,對(duì)于不同的插件而言,可能還具有一些與自身功能相關(guān)的依賴(lài)庫(kù),比如權(quán)限管理插件authplugin,除了上述常規(guī)的依賴(lài)庫(kù),還會(huì)使用到如hapi-auth-jwt2、hapi-cookies和boom之類(lèi)的庫(kù)。隨后,進(jìn)入步驟s220,初始化web服務(wù)器端服務(wù),注冊(cè)通用組件并創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例,通用組件包括靜態(tài)資源服務(wù)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,在初始化web服務(wù)器端服務(wù)后注冊(cè)通用組件,通用組件包括靜態(tài)資源服務(wù)、數(shù)據(jù)庫(kù)等,再通過(guò)以下方式創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例。首先讀取web服務(wù)器端服務(wù)的初始化配置信息,初始化配置信息包括web應(yīng)用的基礎(chǔ)配置,再根據(jù)基礎(chǔ)配置創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例。其中,基礎(chǔ)配置包括web服務(wù)器端服務(wù)的ip地址和監(jiān)聽(tīng)的端口。從步驟s210給出的一個(gè)插件目錄示例中可知,全局配置文件的路徑是/config/configuration.yml,而全局配置文件configuration.yml中存儲(chǔ)有web服務(wù)器端服務(wù)的初始化配置信息,獲取該初始化配置信息中的基礎(chǔ)信息,將基礎(chǔ)信息中的web服務(wù)器端服務(wù)的ip地址配置為server.host:127.0.0.1,監(jiān)聽(tīng)的端口配置為server.port:9999,則實(shí)現(xiàn)了在本機(jī)9999端口上啟動(dòng)該web應(yīng)用的服務(wù)器端服務(wù),這里所創(chuàng)建的server即是該web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例,其負(fù)責(zé)監(jiān)聽(tīng)端口、接收外界的請(qǐng)求及發(fā)送響應(yīng)等一切服務(wù)器端邏輯的實(shí)體。在完成創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用示例后,若要繼續(xù)執(zhí)行后續(xù)步驟,還需要獲取各插件的配置文件,以便基于配置文件來(lái)查找到各插件的服務(wù)器端代碼和/或客戶(hù)端代碼,從而進(jìn)行后續(xù)的插件代碼處理。根據(jù)本發(fā)明的一個(gè)實(shí)施例,在創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例之后,遍歷插件目錄中的所有插件,獲取各插件的配置文件,并將配置文件導(dǎo)出。其中,配置文件包括插件id、服務(wù)器端代碼入口和/或客戶(hù)端代碼入口。在該實(shí)施方式中,插件的配置文件在插件目錄中通常命名為index.js,也就是插件的入口文件。以權(quán)限管理插件authplugin為例,其配置文件為/plugins/authplugin/index.js,內(nèi)容如下所示:importauthfrom'./server/auth';exportfunctiondeclareplugin(platform){returnnewplatform.plugin({id:'auth',ui:{main:'./client'},server:asyncserver(server){awaitauth(server);},});}如上所示的插件的配置文件,聲明了插件id為auth,以及分別給出了插件的客戶(hù)端代碼入口和服務(wù)端代碼入口,其中,客戶(hù)端代碼入口見(jiàn)配置文件中的ui部分,服務(wù)端代碼入口見(jiàn)配置文件中的server部分。對(duì)于插件的配置文件可以這么理解,即配置文件實(shí)際上是提供了一個(gè)函數(shù),對(duì)于這個(gè)函數(shù)的輸入和輸出形式進(jìn)行了預(yù)先約定,如果配置文件沒(méi)有給出約定的輸出,則無(wú)法解析和添加插件,此類(lèi)配置文件即是不合法的配置文件。進(jìn)而,在實(shí)際處理中,還需要根據(jù)這一區(qū)分規(guī)則從獲取到的配置文件中選出合法的配置文件導(dǎo)出,以便從合法的配置文件中查找插件對(duì)應(yīng)的服務(wù)器端代碼和/或客戶(hù)端代碼。考慮到插件分為服務(wù)器端插件、客戶(hù)端插件和混合插件三類(lèi),則服務(wù)器端插件只需獲取對(duì)應(yīng)的服務(wù)器端代碼,客戶(hù)端插件只需獲取對(duì)應(yīng)的客戶(hù)端代碼,而混合插件需要獲取對(duì)應(yīng)的服務(wù)器端代碼和客戶(hù)端代碼。根據(jù)本發(fā)明的一個(gè)實(shí)施例,獲取服務(wù)器端插件和混合插件對(duì)應(yīng)的服務(wù)器端代碼時(shí),先從合法的配置文件中獲取服務(wù)器端代碼入口,再根據(jù)服務(wù)器端代碼入口獲取對(duì)應(yīng)的服務(wù)器端代碼的路徑,并通過(guò)該路徑來(lái)查找到服務(wù)器端代碼,而獲取客戶(hù)端插件和混合插件對(duì)應(yīng)的客戶(hù)端代碼時(shí),先從合法的配置文件中獲取客戶(hù)端代碼入口,再根據(jù)客戶(hù)端代碼入口獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑,并通過(guò)該路徑來(lái)查找到客戶(hù)端代碼。例如,權(quán)限管理插件authplugin很明顯是一個(gè)混合插件,若要獲得該插件的服務(wù)器端代碼,則從配置文件/plugins/authplugin/index.js中獲取服務(wù)器端代碼入口,即server部分的內(nèi)容,進(jìn)而獲取對(duì)應(yīng)的服務(wù)器端代碼的路徑以查找服務(wù)器端代碼,若要獲得該插件的客戶(hù)端代碼,則從配置文件/plugins/authplugin/index.js中獲取客戶(hù)端代碼入口,即ui部分的內(nèi)容,進(jìn)而獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑以查找客戶(hù)端代碼。接下來(lái),進(jìn)入步驟s230,對(duì)于各插件中的每個(gè)插件,若其插件代碼包括服務(wù)器端代碼,則獲取并解析該插件的服務(wù)器端注冊(cè)代碼,以便將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中。根據(jù)本發(fā)明的一個(gè)實(shí)施例,服務(wù)器端插件和混合插件的插件代碼中均包括對(duì)應(yīng)的服務(wù)器端代碼,則對(duì)這兩類(lèi)插件來(lái)說(shuō),獲取并解析插件的服務(wù)器端注冊(cè)代碼,通過(guò)執(zhí)行該服務(wù)器端注冊(cè)代碼將插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中。服務(wù)器端執(zhí)行代碼實(shí)際上類(lèi)似于一個(gè)路由,將該注入的路由添加進(jìn)相應(yīng)的監(jiān)聽(tīng)列表,一旦接收到對(duì)該路由的請(qǐng)求,即轉(zhuǎn)發(fā)給對(duì)應(yīng)插件以便其處理,上述注入過(guò)程的相關(guān)代碼如下所示://插件調(diào)用plugin構(gòu)造函數(shù)創(chuàng)建插件實(shí)例module.exports=platform=>newplatform.plugin({id:'mysql_node',server:asyncserver=>{awaitmysqlnode(server);},});//調(diào)用register注入插件實(shí)例server.register(plugins,err=>handleerr(err,server));在步驟s240中,初始化web客戶(hù)端服務(wù),提供web應(yīng)用對(duì)應(yīng)的客戶(hù)端入口。根據(jù)本發(fā)明的一個(gè)實(shí)施例,初始化web客戶(hù)端服務(wù)后,在提供web應(yīng)用對(duì)應(yīng)的客戶(hù)端入口之外,還提供單一數(shù)據(jù)源。在該實(shí)施方式中,單一數(shù)據(jù)源是指redux技術(shù),通過(guò)把客戶(hù)端各個(gè)組件原本分別持有的數(shù)據(jù),或者狀態(tài),匯聚到一個(gè)存儲(chǔ)容器store中,并通過(guò)單向數(shù)據(jù)流層層傳遞,使客戶(hù)端組件狀態(tài)的維護(hù)變得簡(jiǎn)單和清晰。關(guān)于redux技術(shù)的具體實(shí)現(xiàn),為較為成熟的現(xiàn)有技術(shù),此處不予以贅述。在完成上述初始化web客戶(hù)端服務(wù)后,應(yīng)執(zhí)行步驟s250來(lái)對(duì)客戶(hù)端插件和混合插件所對(duì)應(yīng)的客戶(hù)端代碼進(jìn)行打包處理,但在打包之前,還需要對(duì)各客戶(hù)端代碼對(duì)應(yīng)的插件進(jìn)行注冊(cè)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,客戶(hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,在將客戶(hù)端代碼打包之前,解析該客戶(hù)端代碼,以獲取該客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè),再將解析好的插件放入插件集合中,以便通過(guò)插件id從插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。由于只有客戶(hù)端插件和混合插件才具有對(duì)應(yīng)的客戶(hù)端代碼,在該實(shí)施方式中,客戶(hù)端插件可進(jìn)一步分為有路由的客戶(hù)端插件和無(wú)路由的客戶(hù)端插件,混合插件則是由一個(gè)服務(wù)器端插件和一個(gè)有路由的客戶(hù)端插件組成的。對(duì)于有路由的客戶(hù)端插件而言,其通常對(duì)應(yīng)于一個(gè)或幾個(gè)頁(yè)面,比如提供“/login”、“/signup”頁(yè)面的權(quán)限管理插件authplugin。此時(shí),將有路由的客戶(hù)端插件的客戶(hù)端代碼解析后,獲取該客戶(hù)端代碼對(duì)應(yīng)的插件id為auth,并遵循react-router的用法將該有路由的客戶(hù)端插件掛載到其注冊(cè)的客戶(hù)端路由中,從而完成對(duì)應(yīng)的插件的注冊(cè),相關(guān)代碼如下所示://插件調(diào)用addreducer和addrouteconfig傳遞路由配置和狀態(tài)函數(shù)register.addreducer('auth',auth);register.addrouteconfig({path:'/auth',indexroute:{component:require('./containers/auth').default},});//使用react-router,掛載插件到其注冊(cè)的客戶(hù)端路由reactdom.render(<providerstore={store}><routerhistory={history}routes={{childroutes:modules}}/></provider>,……);需要說(shuō)明的是,在實(shí)際處理過(guò)程中,對(duì)于有路由的客戶(hù)端插件和服務(wù)器端插件類(lèi)似,在完成注冊(cè)后就生效了,訪(fǎng)問(wèn)相應(yīng)的路由即可開(kāi)始工作,而無(wú)路由的客戶(hù)端插件則有所不同。對(duì)于無(wú)路由的客戶(hù)端插件而言,其是在頁(yè)面上使用的公共組件,如一個(gè)表格,一個(gè)彈出框等,在完成無(wú)路由的客戶(hù)端插件的注冊(cè)后,還需將解析好的插件放入插件集合中,以便通過(guò)插件id從插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用,從而渲染到頁(yè)面中,相關(guān)代碼如下所示://插件調(diào)用addhook加入插件集合register.addhook(datatable,{hook:'datatable'});//根據(jù)插件id獲得插件,轉(zhuǎn)化為react界面元素consthook=hooks[plugin_name];react.createelement(hook,{children:this.props.children})最后,進(jìn)入步驟s250,對(duì)于各插件中的每個(gè)插件,若其插件代碼包括客戶(hù)端代碼,則將客戶(hù)端代碼打包,并作為靜態(tài)資源放入靜態(tài)資源目錄中以便通過(guò)靜態(tài)資源服務(wù)來(lái)提供給客戶(hù)端,以完成web應(yīng)用的構(gòu)建。根據(jù)本發(fā)明的一個(gè)實(shí)施例,將客戶(hù)端插件和混合插件對(duì)應(yīng)的客戶(hù)端代碼進(jìn)行打包處理,作為靜態(tài)資源放入靜態(tài)資源目錄中,比如放入“/dist/assets”文件夾,這里的“/dist/assets”文件夾是靜態(tài)資源目錄的一個(gè)實(shí)例,具體如下所示:當(dāng)構(gòu)建好web應(yīng)用后,可以從插件目錄下的package.json文件中獲取各插件的插件id和版本號(hào),將所有插件的插件id、版本號(hào)等信息進(jìn)行記錄,啟動(dòng)web服務(wù)器端服務(wù),至此,該web應(yīng)用的插件化構(gòu)建完成并可開(kāi)始提供服務(wù)。圖3示出了本發(fā)明一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建系統(tǒng)300的示意圖。如圖3所示,web應(yīng)用的插件化構(gòu)建系統(tǒng)300包括安裝模塊310、第一初始化模塊320、第一處理模塊330、第二初始化模塊340和第二處理模塊350。安裝模塊310適于掃描插件目錄,為插件目錄中的各插件安裝對(duì)應(yīng)的依賴(lài)庫(kù)。第一初始化模塊320與安裝模塊310相連,適于初始化web服務(wù)器端服務(wù),注冊(cè)通用組件并創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例,通用組件包括靜態(tài)資源服務(wù)。第一初始化模塊320進(jìn)一步適于:讀取web服務(wù)器端服務(wù)的初始化配置信息,初始化配置信息包括web應(yīng)用的基礎(chǔ)配置;根據(jù)基礎(chǔ)配置創(chuàng)建web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例。其中,基礎(chǔ)配置包括web服務(wù)器端服務(wù)的ip地址和監(jiān)聽(tīng)的端口。第一處理模塊330與第一初始化模塊320相連,適于對(duì)于各插件中的每個(gè)插件,當(dāng)其插件代碼包括服務(wù)器端代碼時(shí),獲取并解析該插件的服務(wù)器端注冊(cè)代碼,以便將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中。第二初始化模塊340與安裝模塊310相連,適于初始化web客戶(hù)端服務(wù),提供web應(yīng)用對(duì)應(yīng)的客戶(hù)端入口。第二處理模塊350分別與第一初始化模塊320和第二初始化模塊340相連,適于對(duì)于各插件中的每個(gè)插件,當(dāng)其插件代碼包括客戶(hù)端代碼時(shí),將客戶(hù)端代碼打包,并作為靜態(tài)資源放入靜態(tài)資源目錄中以便通過(guò)靜態(tài)資源服務(wù)來(lái)提供給客戶(hù)端,以完成web應(yīng)用的構(gòu)建??蛻?hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,第二處理模塊350還適于解析客戶(hù)端代碼,以獲取客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè);將解析好的插件放入插件集合中,以便通過(guò)插件id從插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。圖4示出了本發(fā)明又一個(gè)實(shí)施例的web應(yīng)用的插件化構(gòu)建系統(tǒng)400的示意圖。如圖4所示,web應(yīng)用的插件化構(gòu)建系統(tǒng)400的安裝模塊410、第一初始化模塊420、第一處理模塊430、第二初始化模塊440和第二處理模塊450,分別與圖3中web應(yīng)用的插件化構(gòu)建系統(tǒng)300的安裝模塊310、第一初始化模塊320、第一處理模塊330、第二初始化模塊340和第二處理模塊350一一對(duì)應(yīng),是一致的,并新增了導(dǎo)出模塊460和獲取模塊470。導(dǎo)出模塊460適于遍歷插件目錄中的所有插件,獲取各插件的配置文件,并將配置文件導(dǎo)出。其中,配置文件包括插件id、服務(wù)器端代碼入口和/或客戶(hù)端代碼入口。獲取模塊470分別與第二處理模塊450和導(dǎo)出模塊460相連,適于從配置文件中獲取客戶(hù)端代碼入口;根據(jù)客戶(hù)端代碼入口獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑,并通過(guò)路徑來(lái)查找到客戶(hù)端代碼。關(guān)于web應(yīng)用的插件化構(gòu)建的具體步驟以及實(shí)施例,在基于圖2的描述中已經(jīng)詳細(xì)公開(kāi),此處不再贅述。現(xiàn)有的web應(yīng)用的插件化構(gòu)建方法中,在后端開(kāi)發(fā)上無(wú)法提供前端功能,所使用的中間件并不適于實(shí)現(xiàn)業(yè)務(wù)邏輯,業(yè)務(wù)功能的開(kāi)發(fā)仍以整體風(fēng)格為主,而對(duì)前端開(kāi)發(fā)而言,難以支持多變的業(yè)務(wù)場(chǎng)景,且插件之間無(wú)關(guān)聯(lián),無(wú)法互相依賴(lài)或聯(lián)動(dòng),且并未涉及后端的實(shí)現(xiàn)。根據(jù)本發(fā)明實(shí)施例的web應(yīng)用的插件化構(gòu)建的技術(shù)方案,首先為要組成該web應(yīng)用的各插件安裝對(duì)于的依賴(lài)庫(kù),初始化web服務(wù)器端服務(wù)以創(chuàng)建web應(yīng)用對(duì)于的服務(wù)器應(yīng)用實(shí)例,對(duì)于插件代碼包括服務(wù)器端代碼的插件,將該插件的服務(wù)器端執(zhí)行代碼注入到服務(wù)器應(yīng)用實(shí)例中,并初始化web客戶(hù)端服務(wù),對(duì)于插件代碼包括客戶(hù)端代碼的插件,將客戶(hù)端代碼打包作為靜態(tài)資源放入靜態(tài)資源目錄以便提供給客戶(hù)端,從而完成web應(yīng)用的構(gòu)建。在上述技術(shù)方案中,通過(guò)提供基礎(chǔ)的web服務(wù)器端服務(wù),使得后續(xù)開(kāi)發(fā)其他web應(yīng)用時(shí)無(wú)需重復(fù)開(kāi)發(fā)服務(wù)器端基礎(chǔ)功能,并且可復(fù)用各插件,實(shí)現(xiàn)了一次開(kāi)發(fā),多次使用。而且,一個(gè)插件可集合web服務(wù)器端和客戶(hù)端的邏輯,換言之一個(gè)插件能夠一并提供后端和前端功能,增強(qiáng)了該插件的可用性和兼容性。同時(shí),由于各個(gè)插件是從業(yè)務(wù)角度對(duì)web應(yīng)用進(jìn)行分解后,劃分出的功能單一、開(kāi)發(fā)獨(dú)立的插件,實(shí)現(xiàn)了插件間的互相解耦,開(kāi)發(fā)時(shí)不必考慮其他插件的影響。要使用其他插件的功能,無(wú)需開(kāi)發(fā)包裝代碼,可直接進(jìn)行調(diào)用,而且一個(gè)插件的更換、升級(jí)或淘汰不會(huì)影響其他插件,使得插件間的依賴(lài)關(guān)系更清晰且可維護(hù)。a7.如a1-6中任一項(xiàng)所述的方法,所述客戶(hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,在將所述客戶(hù)端代碼打包的步驟之前,所述方法還包括:解析所述客戶(hù)端代碼,以獲取所述客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè);將解析好的插件放入插件集合中,以便通過(guò)插件id從所述插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。b9.如b8所述的系統(tǒng),所述第一初始化模塊進(jìn)一步適于:讀取所述web服務(wù)器端服務(wù)的初始化配置信息,所述初始化配置信息包括所述web應(yīng)用的基礎(chǔ)配置;根據(jù)所述基礎(chǔ)配置創(chuàng)建所述web應(yīng)用對(duì)應(yīng)的服務(wù)器應(yīng)用實(shí)例。b10.如b9所述的系統(tǒng),所述基礎(chǔ)配置包括所述web服務(wù)器端服務(wù)的ip地址和監(jiān)聽(tīng)的端口。b11.如b8-10中任一項(xiàng)所述的系統(tǒng),還包括導(dǎo)出模塊,適于:遍歷所述插件目錄中的所有插件,獲取各插件的配置文件,并將所述配置文件導(dǎo)出。b12.如b11所述的系統(tǒng),所述配置文件包括插件id、服務(wù)器端代碼入口和/或客戶(hù)端代碼入口。b13.如b11或12所述的系統(tǒng),還包括獲取模塊,適于:從所述配置文件中獲取客戶(hù)端代碼入口;根據(jù)所述客戶(hù)端代碼入口獲取對(duì)應(yīng)的客戶(hù)端代碼的路徑,并通過(guò)所述路徑來(lái)查找到所述客戶(hù)端代碼。b14.如b8-13中任一項(xiàng)所述的系統(tǒng),所述客戶(hù)端代碼包括客戶(hù)端注冊(cè)代碼和客戶(hù)端執(zhí)行代碼,所述第二處理模塊還適于:解析所述客戶(hù)端代碼,以獲取所述客戶(hù)端代碼對(duì)應(yīng)的插件id并完成對(duì)應(yīng)的插件的注冊(cè);將解析好的插件放入插件集合中,以便通過(guò)插件id從所述插件集合中查找對(duì)應(yīng)的插件來(lái)進(jìn)行調(diào)用。在此處所提供的說(shuō)明書(shū)中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下被實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書(shū)的理解。類(lèi)似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開(kāi)并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開(kāi)的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多特征。更確切地說(shuō),如下面的權(quán)利要求書(shū)所反映的那樣,發(fā)明方面在于少于前面公開(kāi)的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書(shū)由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。本領(lǐng)域那些技術(shù)人員應(yīng)當(dāng)理解在本文所公開(kāi)的示例中的設(shè)備的模塊或單元或組間可以布置在如該實(shí)施例中所描述的設(shè)備中,或者可替換地可以定位在與該示例中的設(shè)備不同的一個(gè)或多個(gè)設(shè)備中。前述示例中的模塊可以組合為一個(gè)模塊或者此外可以分成多個(gè)子模塊。本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組間組合成一個(gè)模塊或單元或組間,以及此外可以把它們分成多個(gè)子模塊或子單元或子組間。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的所有特征以及如此公開(kāi)的任何方法或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書(shū)中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。此外,所述實(shí)施例中的一些在此被描述成可以由計(jì)算機(jī)系統(tǒng)的處理器或者由執(zhí)行所述功能的其它裝置實(shí)施的方法或方法元素的組合。因此,具有用于實(shí)施所述方法或方法元素的必要指令的處理器形成用于實(shí)施該方法或方法元素的裝置。此外,裝置實(shí)施例的在此所述的元素是如下裝置的例子:該裝置用于實(shí)施由為了實(shí)施該發(fā)明的目的的元素所執(zhí)行的功能。這里描述的各種技術(shù)可結(jié)合硬件或軟件,或者它們的組合一起實(shí)現(xiàn)。從而,本發(fā)明的方法和設(shè)備,或者本發(fā)明的方法和設(shè)備的某些方面或部分可采取嵌入有形媒介,例如軟盤(pán)、cd-rom、硬盤(pán)驅(qū)動(dòng)器或者其它任意機(jī)器可讀的存儲(chǔ)介質(zhì)中的程序代碼(即指令)的形式,其中當(dāng)程序被載入諸如計(jì)算機(jī)之類(lèi)的機(jī)器,并被所述機(jī)器執(zhí)行時(shí),所述機(jī)器變成實(shí)踐本發(fā)明的設(shè)備。在程序代碼在可編程計(jì)算機(jī)上執(zhí)行的情況下,計(jì)算設(shè)備一般包括處理器、處理器可讀的存儲(chǔ)介質(zhì)(包括易失性和非易失性存儲(chǔ)器和/或存儲(chǔ)元件),至少一個(gè)輸入裝置,和至少一個(gè)輸出裝置。其中,存儲(chǔ)器被配置用于存儲(chǔ)程序代碼;處理器被配置用于根據(jù)該存儲(chǔ)器中存儲(chǔ)的所述程序代碼中的指令,執(zhí)行本發(fā)明的web應(yīng)用的插件化構(gòu)建方法。以示例而非限制的方式,計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)存儲(chǔ)諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息。通信介質(zhì)一般以諸如載波或其它傳輸機(jī)制等已調(diào)制數(shù)據(jù)信號(hào)來(lái)體現(xiàn)計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并且包括任何信息傳遞介質(zhì)。以上的任一種的組合也包括在計(jì)算機(jī)可讀介質(zhì)的范圍之內(nèi)。如在此所使用的那樣,除非另行規(guī)定,使用序數(shù)詞“第一”、“第二”、“第三”等等來(lái)描述普通對(duì)象僅僅表示涉及類(lèi)似對(duì)象的不同實(shí)例,并且并不意圖暗示這樣被描述的對(duì)象必須具有時(shí)間上、空間上、排序方面或者以任意其它方式的給定順序。盡管根據(jù)有限數(shù)量的實(shí)施例描述了本發(fā)明,但是受益于上面的描述,本
技術(shù)領(lǐng)域:
:內(nèi)的技術(shù)人員明白,在由此描述的本發(fā)明的范圍內(nèi),可以設(shè)想其它實(shí)施例。此外,應(yīng)當(dāng)注意,本說(shuō)明書(shū)中使用的語(yǔ)言主要是為了可讀性和教導(dǎo)的目的而選擇的,而不是為了解釋或者限定本發(fā)明的主題而選擇的。因此,在不偏離所附權(quán)利要求書(shū)的范圍和精神的情況下,對(duì)于本
技術(shù)領(lǐng)域:
:的普通技術(shù)人員來(lái)說(shuō)許多修改和變更都是顯而易見(jiàn)的。對(duì)于本發(fā)明的范圍,對(duì)本發(fā)明所做的公開(kāi)是說(shuō)明性的,而非限制性的,本發(fā)明的范圍由所附權(quán)利要求書(shū)限定。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12