本發(fā)明涉及文件打包技術(shù)領(lǐng)域,尤其涉及一種文件打包預(yù)處理的技術(shù)。
背景技術(shù):
將文件進(jìn)行打包處理(也即,把一個(gè)或者多個(gè)文件用壓縮軟件進(jìn)行壓縮,壓制成一個(gè)壓縮文件包:一個(gè)解包文件,一個(gè)內(nèi)容文件),既可以節(jié)省空間,又方便網(wǎng)絡(luò)間傳送。而在目前的打包工具中,均是將包(package)作為拆分的最小粒度,這樣雖然比較簡單,但是會(huì)導(dǎo)致打包后的文件體積比較大,并且存在一個(gè)包內(nèi)的某些模塊并沒有被使用的現(xiàn)象,從而造成資源浪費(fèi)。而當(dāng)一個(gè)包足夠大時(shí),生成的包中的無用模塊是相當(dāng)可觀的,資源浪費(fèi)更加嚴(yán)重。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的一個(gè)目的是提供一種文件打包預(yù)處理的方法與設(shè)備。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種文件打包預(yù)處理方法,其中,該方法包括:
獲取待被打包處理的初始源文件;
確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息;
若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄所述依賴包中各子模塊的引用信息;
確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑;
根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。
根據(jù)本發(fā)明的另一方面,還提供了一種文件打包預(yù)處理設(shè)備,其中,該設(shè)備包括:
用于獲取待被打包處理的初始源文件的裝置;
用于確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的裝置;
用于若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄所述依賴包中各子模塊的引用信息的裝置;
用于確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑的裝置;
用于根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理的裝置。
根據(jù)本發(fā)明的還一個(gè)方面,還提供了一種文件打包工具,其中,該文件打包工具包括如前述根據(jù)本發(fā)明另一個(gè)方面的一種文件打包預(yù)處理設(shè)備。
與現(xiàn)有技術(shù)相比,本發(fā)明的一個(gè)實(shí)施例通過確定待被打包處理的初始源文件中依賴包的各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑,以及在依賴包的引用信息均是對(duì)其中子模塊的引用的情形下,將初始源文件進(jìn)行相關(guān)替換處理,以在打包時(shí)剔除依賴包中未引用的子模塊,減小包大小,從而減小文件體積,提高資源利用率,提升文件打包效率。相應(yīng)地,也減少了用戶端白屏?xí)r間,節(jié)省帶寬成本。
附圖說明
通過閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:
圖1示出根據(jù)本發(fā)明一個(gè)方面的一種用于文件打包預(yù)處理的設(shè)備示意圖;
圖2示出根據(jù)本發(fā)明另一個(gè)方面的一種用于文件打包預(yù)處理的方法流程圖。
附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。
圖1示出根據(jù)本發(fā)明一個(gè)方面的一種用于文件打包預(yù)處理的設(shè)備1,其中,設(shè)備1包括用于獲取待被打包處理的初始源文件的裝置(以下簡稱“文件獲取裝置11”);用于確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的裝置(以下簡稱“第一確定裝置12”);用于若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄所述依賴包中各子模塊的引用信息的裝置(以下簡稱“記錄裝置13”);用于確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑的裝置(以下簡稱“第二確定裝置14”);用于根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理的裝置(以下簡稱“替換裝置15”)。
具體地,文件獲取裝置11獲取待被打包處理的初始源文件;第一確定裝置12確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息;若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄裝置13所述依賴包中各子模塊的引用信息;第二確定裝置14確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑;替換裝置15根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。
設(shè)備1用于對(duì)待被打包處理的文件進(jìn)行預(yù)處理,其可以由文件打包工具實(shí)現(xiàn),如前端打包工具,在具體實(shí)施例中,設(shè)備1包括但不限于網(wǎng)絡(luò)設(shè)備、用戶設(shè)備或網(wǎng)絡(luò)設(shè)備與用戶設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。在此,所述網(wǎng)絡(luò)設(shè)備包括但不限于如網(wǎng)絡(luò)主機(jī)、單個(gè)網(wǎng)絡(luò)服務(wù)器、多個(gè)網(wǎng)絡(luò)服務(wù)器集或基于云計(jì)算的計(jì)算機(jī)集合等實(shí)現(xiàn);或者由用戶設(shè)備實(shí)現(xiàn)。在此,云由基于云計(jì)算(Cloud Computing)的大量主機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計(jì)算是分布式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個(gè)超級(jí)虛擬計(jì)算機(jī)。在此,所述用戶設(shè)備可以是任何一種可與用戶通過鍵盤、觸摸板、觸摸屏、或手寫設(shè)備等方式進(jìn)行人機(jī)交互的電子產(chǎn)品,例如PC、手機(jī)、智能手機(jī)、PDA、可穿戴設(shè)備、掌上電腦PPC或平板電腦等。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。本領(lǐng)域技術(shù)人員應(yīng)能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的網(wǎng)絡(luò)設(shè)備或用戶設(shè)備如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。在此,網(wǎng)絡(luò)設(shè)備及用戶設(shè)備均包括一種能夠按照事先設(shè)定或存儲(chǔ)的指令,自動(dòng)進(jìn)行數(shù)值計(jì)算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。
具體地,文件獲取裝置11通過諸如打包工具自身提供的提供待被打包處理文件的應(yīng)用程序接口(API),獲取待被打包處理的初始源文件;或者,通過獲取用戶導(dǎo)入的待被打包處理的文件的方式,來獲取待被打包處理的初始源文件。在此,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,所述初始源文件的格式并不受限制,優(yōu)選地,所述初始源文件包括前端編譯文件。
例如,假設(shè)用戶A預(yù)對(duì)文件夾A進(jìn)行打包處理,在某打包工具中點(diǎn)擊了打包處理按鈕以提交文件打包處理請(qǐng)求,然后選擇了文件夾A,則文件獲取裝置11通過打包工具自身提供的提供待被打包處理文件的應(yīng)用程序接口(API),便可獲取待被打包處理的初始源文件,即文件夾A。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述獲取待被打包處理的初始源文件的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的獲取待被打包處理的初始源文件的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
第一確定裝置12通過諸如抽象語法樹(AST,Abstract Syntax Tree),對(duì)所述初始源文件進(jìn)行靜態(tài)語法分析,以確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息。
在此,所述依賴包是指所述初始源文件中引入的包,其可來源于其他文件。
例如,接上例,第一確定裝置12對(duì)文件夾A通過AST進(jìn)行靜態(tài)語法分析,獲取到文件夾A中有以下import和/或require聲明:
聲明1):
import{ModuleA1,ModuleB1}from‘packageA’
console.log(ModuleA1,ModuleB1)//對(duì)子模塊的引用
聲明2):
import*as packageB from‘packageB’
console.log(package.ModuleA2,package.moduleB2)//對(duì)子模塊的引用聲明3):
var packageC=require(‘packageC’)
console.log(packageC.ModuleA3,package.moduleB3)//對(duì)子模塊的引用則第一確定裝置12可根據(jù)以上import和require聲明,確定文件夾A中具有依賴包packageA、packageB和packageC,其引用信息分別為console.log(ModuleA1,ModuleB1)、console.log(package.ModuleA2,package.moduleB2)、console.log(packageC.ModuleA3,package.moduleB3)。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄裝置13所述依賴包中各子模塊的引用信息。在此,所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用含義包括:1)所述至少一個(gè)引用信息均是對(duì)所述依賴包中一個(gè)或多個(gè)子模塊的引用;2)所述至少一個(gè)引用信息均是對(duì)所述依賴包中所有子模塊的引用。
例如,還接上例,對(duì)于文件夾A中包含的依賴包packageA、packageB和packageC,假設(shè)依賴包packageA中僅具有子模塊A1和B1,依賴包packageB中僅具有子模塊A2和B2,依賴包packageC中僅具有子模塊A3和B3,則關(guān)于依賴包packageA、依賴包packageB、依賴包packageC的引用信息均是對(duì)其中子模塊的引用,則記錄裝置13分別記錄依賴包packageA、依賴包packageB、依賴包packageC中各子模塊的引用信息,如以表格形式進(jìn)行記錄;再如,假設(shè)依賴包packageB還具有子模塊C2,而依賴包packageA中僅具有子模塊A1和B1,依賴包packageC中僅具有子模塊A3和B3,則記錄裝置13僅記錄依賴包packageA、和依賴包packageC中各子模塊的引用信息;還如,假設(shè)依賴包packageB還具有子模塊C2、依賴包packageC還具有子模塊C3,只有依賴包packageA中僅具有子模塊A1和B1,則記錄裝置13僅記錄依賴包packageA中各子模塊的引用信息。
第二確定裝置14確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑。在此,所述屬于子模塊導(dǎo)出的子模塊是指導(dǎo)出路徑為獨(dú)立導(dǎo)出路徑的子模塊。
例如,假設(shè)記錄裝置13僅記錄了依賴包packageA中各子模塊的引用信息,則第二確定裝置14可通過NodeJS的模塊加載方案,首先通過require.resolve函數(shù)獲取到依賴包packageA中子模塊A1和B1的根目錄;然后,再通過require函數(shù)獲取到子模塊A1和B1各自的輸出;接著,再通過require.cache函數(shù)對(duì)子模塊A1和B1的輸出進(jìn)行標(biāo)記,以得到子模塊A1和B1中哪個(gè)模塊屬于子模塊導(dǎo)出的子模塊,即將具有獨(dú)立導(dǎo)出路徑的子模塊作為屬于子模塊導(dǎo)出的子模塊,如得到子模塊A1屬于子模塊導(dǎo)出的子模塊,而子模塊B1不屬于子模塊導(dǎo)出的子模塊,并記錄模塊A1的導(dǎo)出路徑如packageA/path/to/ModuleA1。在此,所述輸出是指JavaScript腳本語言中定義的關(guān)于子模塊的所有外界可訪問的接口和屬性,如exports。
替換裝置15根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。
優(yōu)選地,所述相關(guān)替換處理包括以下至少任一項(xiàng):
-利用所述導(dǎo)出路徑對(duì)所述初始源文件中關(guān)于所述依賴包的導(dǎo)入聲明進(jìn)行替換;
-利用記錄的所述依賴包中各子模塊的引用信息對(duì)所述初始源文件中關(guān)于所述依賴包中的子模塊的引用信息進(jìn)行替換。
例如,對(duì)于文件夾A,假設(shè)僅其中的依賴包packageA滿足其至少一個(gè)引用信息均是對(duì)該依賴包中的子模塊的引用的觸發(fā)條件,依賴包packageB和packageC不滿足該觸發(fā)條件,且由于其中僅子模塊A1屬于子模塊導(dǎo)出的子模塊,子模塊A1的導(dǎo)出路徑為packageA/path/to/ModuleA1,則替換裝置15可對(duì)文件夾A中關(guān)于依賴包packageA的導(dǎo)入聲明即import聲明1)進(jìn)行替換,如將
import{ModuleA1,ModuleB1}from‘packageA’
替換為
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’),
將文件夾A中關(guān)于依賴包packageA中的子模塊A1和B1的引用信息console.log(ModuleA1,ModuleB1)
替換為console.log(packageAModuleA1,packageAModuleB1),
而對(duì)依賴包packageB和依賴包packageC的import和/或require聲明以及關(guān)于相應(yīng)依賴包中的子模塊的引用信息不做替換。從而獲得相應(yīng)的目標(biāo)源文件,以用于打包處理。
再如,仍以依賴包packageA為例進(jìn)行說明,假設(shè)初始源文件中關(guān)于依賴包packageA的導(dǎo)入聲明和依賴包packageA中的子模塊的引用信息為:import*as packageA from‘packageA’
console.log(package.ModuleA1,package.moduleB1)
且子模塊A1和B1均屬于子模塊導(dǎo)出的子模塊,子模塊B1的導(dǎo)出路徑為packageA/path/to/ModuleB1,則替換裝置15可將此替換為:
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’)
var packageAModuleB1=require(‘packageA/path/to/ModuleB1’)
console.log(packageAModuleA1,packageAModuleB1)
還如,繼續(xù)以依賴包packageA為例進(jìn)行說明,假設(shè)初始源文件中關(guān)于依賴包packageA的導(dǎo)入聲明和依賴包packageA中的子模塊的引用信息為:var packageA=require(‘packageA’)
console.log(packageA.ModuleA1,package.moduleB1)
且子模塊A1和B1均屬于子模塊導(dǎo)出的子模塊,則替換裝置15可將此替換為:
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’)
var packageAModuleB1=require(‘packageA/path/to/ModuleB1’)
console.log(packageAModuleA1,packageAModuleB1)
在此,所述導(dǎo)入聲明包括但不限于import聲明、require聲明等。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述相關(guān)替換處理的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的相關(guān)替換處理的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
由此,本發(fā)明通過以上替換,剔除了依賴包內(nèi)未引用的子模塊,在后續(xù)的打包過程中可以只引入包中用到的子模塊,沒有用到的就不會(huì)被引入,從而減少了輸出包的文件體積,提高了資源利用率,也提升了文件打包效率。相應(yīng)地,也減少了用戶端白屏?xí)r間,節(jié)省帶寬成本。
優(yōu)選地,設(shè)備1的各裝置之間是持續(xù)不斷工作的。具體地,文件獲取裝置11持續(xù)獲取待被打包處理的初始源文件;第一確定裝置12持續(xù)確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息;若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,記錄裝置13持續(xù)所述依賴包中各子模塊的引用信息;第二確定裝置14持續(xù)確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑;替換裝置15持續(xù)根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。在此,本領(lǐng)域技術(shù)人員應(yīng)理解所述“持續(xù)”是指設(shè)備1的各裝置之間分別不斷地進(jìn)行初始源文件的獲取、所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的確定、所述依賴包中各子模塊的引用信息的記錄、所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑的確定,以及對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,直至設(shè)備1在較長時(shí)間內(nèi)停止獲取所述初始源文件。
圖2示出根據(jù)本發(fā)明另一個(gè)方面的一種用于文件打包預(yù)處理的方法流程圖。
其中,該方法包括步驟S1、步驟S2、步驟S3、步驟S4和步驟S5。
具體地,在步驟S1中,設(shè)備1獲取待被打包處理的初始源文件;在步驟S2中,設(shè)備1確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息;若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,在步驟S3中,設(shè)備1所述依賴包中各子模塊的引用信息;在步驟S4中,設(shè)備1確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑;在步驟S5中,設(shè)備1根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。
設(shè)備1用于對(duì)待被打包處理的文件進(jìn)行預(yù)處理,其可以由文件打包工具實(shí)現(xiàn),如前端打包工具,在具體實(shí)施例中,設(shè)備1包括但不限于網(wǎng)絡(luò)設(shè)備、用戶設(shè)備或網(wǎng)絡(luò)設(shè)備與用戶設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。在此,所述網(wǎng)絡(luò)設(shè)備包括但不限于如網(wǎng)絡(luò)主機(jī)、單個(gè)網(wǎng)絡(luò)服務(wù)器、多個(gè)網(wǎng)絡(luò)服務(wù)器集或基于云計(jì)算的計(jì)算機(jī)集合等實(shí)現(xiàn);或者由用戶設(shè)備實(shí)現(xiàn)。在此,云由基于云計(jì)算(Cloud Computing)的大量主機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計(jì)算是分布式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個(gè)超級(jí)虛擬計(jì)算機(jī)。在此,所述用戶設(shè)備可以是任何一種可與用戶通過鍵盤、觸摸板、觸摸屏、或手寫設(shè)備等方式進(jìn)行人機(jī)交互的電子產(chǎn)品,例如PC、手機(jī)、智能手機(jī)、PDA、可穿戴設(shè)備、掌上電腦PPC或平板電腦等。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。本領(lǐng)域技術(shù)人員應(yīng)能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的網(wǎng)絡(luò)設(shè)備或用戶設(shè)備如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。在此,網(wǎng)絡(luò)設(shè)備及用戶設(shè)備均包括一種能夠按照事先設(shè)定或存儲(chǔ)的指令,自動(dòng)進(jìn)行數(shù)值計(jì)算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。
具體地,在步驟S1中,設(shè)備1通過諸如打包工具自身提供的提供待被打包處理文件的應(yīng)用程序接口(API),獲取待被打包處理的初始源文件;或者,通過獲取用戶導(dǎo)入的待被打包處理的文件的方式,來獲取待被打包處理的初始源文件。在此,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,所述初始源文件的格式并不受限制,優(yōu)選地,所述初始源文件包括前端編譯文件。
例如,假設(shè)用戶A預(yù)對(duì)文件夾A進(jìn)行打包處理,在某打包工具中點(diǎn)擊了打包處理按鈕以提交文件打包處理請(qǐng)求,然后選擇了文件夾A,則在步驟S1中,設(shè)備1通過打包工具自身提供的提供待被打包處理文件的應(yīng)用程序接口(API),便可獲取待被打包處理的初始源文件,即文件夾A。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述獲取待被打包處理的初始源文件的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的獲取待被打包處理的初始源文件的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
在步驟S2中,設(shè)備1通過諸如抽象語法樹(AST,Abstract Syntax Tree),對(duì)所述初始源文件進(jìn)行靜態(tài)語法分析,以確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息。
在此,所述依賴包是指所述初始源文件中引入的包,其可來源于其他文件。
例如,接上例,在步驟S2中,設(shè)備1對(duì)文件夾A通過AST進(jìn)行靜態(tài)語法分析,獲取到文件夾A中有以下import和/或require聲明:聲明1):
import{ModuleA1,ModuleB1}from‘packageA’
console.log(ModuleA1,ModuleB1)//對(duì)子模塊的引用
聲明2):
import*as packageB from‘packageB’
console.log(package.ModuleA2,package.moduleB2)//對(duì)子模塊的引用聲明3):
var packageC=require(‘packageC’)
console.log(packageC.ModuleA3,package.moduleB3)//對(duì)子模塊的引用則在步驟S2中,設(shè)備1可根據(jù)以上import和require聲明,確定文件夾A中具有依賴包packageA、packageB和packageC,其引用信息分別為console.log(ModuleA1,ModuleB1)、console.log(package.ModuleA2,package.moduleB2)、console.log(packageC.ModuleA3,package.moduleB3)。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,在步驟S3中,設(shè)備1所述依賴包中各子模塊的引用信息。在此,所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用含義包括:1)所述至少一個(gè)引用信息均是對(duì)所述依賴包中一個(gè)或多個(gè)子模塊的引用;2)所述至少一個(gè)引用信息均是對(duì)所述依賴包中所有子模塊的引用。
例如,還接上例,對(duì)于文件夾A中包含的依賴包packageA、packageB和packageC,假設(shè)依賴包packageA中僅具有子模塊A1和B1,依賴包packageB中僅具有子模塊A2和B2,依賴包packageC中僅具有子模塊A3和B3,則關(guān)于依賴包packageA、依賴包packageB、依賴包packageC的引用信息均是對(duì)其中子模塊的引用,則在步驟S3中,設(shè)備1分別記錄依賴包packageA、依賴包packageB、依賴包packageC中各子模塊的引用信息,如以表格形式進(jìn)行記錄;再如,假設(shè)依賴包packageB還具有子模塊C2,而依賴包packageA中僅具有子模塊A1和B1,依賴包packageC中僅具有子模塊A3和B3,則在步驟S3中,設(shè)備1僅記錄依賴包packageA、和依賴包packageC中各子模塊的引用信息;還如,假設(shè)依賴包packageB還具有子模塊C2、依賴包packageC還具有子模塊C3,只有依賴包packageA中僅具有子模塊A1和B1,則在步驟S3中,設(shè)備1僅記錄依賴包packageA中各子模塊的引用信息。
在步驟S4中,設(shè)備1確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑。在此,所述屬于子模塊導(dǎo)出的子模塊是指導(dǎo)出路徑為獨(dú)立導(dǎo)出路徑的子模塊。
例如,假設(shè)在步驟S3中,設(shè)備1僅記錄了依賴包packageA中各子模塊的引用信息,則在步驟S4中,設(shè)備1可通過NodeJS的模塊加載方案,首先通過require.resolve函數(shù)獲取到依賴包packageA中子模塊A1和B1的根目錄;然后,再通過require函數(shù)獲取到子模塊A1和B1各自的輸出;接著,再通過require.cache函數(shù)對(duì)子模塊A1和B1的輸出進(jìn)行標(biāo)記,以得到子模塊A1和B1中哪個(gè)模塊屬于子模塊導(dǎo)出的子模塊,即將具有獨(dú)立導(dǎo)出路徑的子模塊作為屬于子模塊導(dǎo)出的子模塊,如得到子模塊A1屬于子模塊導(dǎo)出的子模塊,而子模塊B1不屬于子模塊導(dǎo)出的子模塊,并記錄模塊A1的導(dǎo)出路徑如packageA/path/to/ModuleA1。在此,所述輸出是指JavaScript腳本語言中定義的關(guān)于子模塊的所有外界可訪問的接口和屬性,如exports。
在步驟S5中,設(shè)備1根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。
優(yōu)選地,所述相關(guān)替換處理包括以下至少任一項(xiàng):
-利用所述導(dǎo)出路徑對(duì)所述初始源文件中關(guān)于所述依賴包的導(dǎo)入聲明進(jìn)行替換;
-利用記錄的所述依賴包中各子模塊的引用信息對(duì)所述初始源文件中關(guān)于所述依賴包中的子模塊的引用信息進(jìn)行替換。
例如,對(duì)于文件夾A,假設(shè)僅其中的依賴包packageA滿足其至少一個(gè)引用信息均是對(duì)該依賴包中的子模塊的引用的觸發(fā)條件,依賴包packageB和packageC不滿足該觸發(fā)條件,且由于其中僅子模塊A1屬于子模塊導(dǎo)出的子模塊,子模塊A1的導(dǎo)出路徑為packageA/path/to/ModuleA1,則在步驟S5中,設(shè)備1可對(duì)文件夾A中關(guān)于依賴包packageA的導(dǎo)入聲明即import聲明1)進(jìn)行替換,如將
import{ModuleA1,ModuleB1}from‘packageA’
替換為
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’),
將文件夾A中關(guān)于依賴包packageA中的子模塊A1和B1的引用信息console.log(ModuleA1,ModuleB1)
替換為console.log(packageAModuleA1,packageAModuleB1),
而對(duì)依賴包packageB和依賴包packageC的import和/或require聲明以及關(guān)于相應(yīng)依賴包中的子模塊的引用信息不做替換。從而獲得相應(yīng)的目標(biāo)源文件,以用于打包處理。
再如,仍以依賴包packageA為例進(jìn)行說明,假設(shè)初始源文件中關(guān)于依賴包packageA的導(dǎo)入聲明和依賴包packageA中的子模塊的引用信息為:import*as packageA from‘packageA’
console.log(package.ModuleA1,package.moduleB1)
且子模塊A1和B1均屬于子模塊導(dǎo)出的子模塊,子模塊B1的導(dǎo)出路徑為packageA/path/to/ModuleB1,則在步驟S5中,設(shè)備1可將此替換為:
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’)
var packageAModuleB1=require(‘packageA/path/to/ModuleB1’)
console.log(packageAModuleA1,packageAModuleB1)
還如,繼續(xù)以依賴包packageA為例進(jìn)行說明,假設(shè)初始源文件中關(guān)于依賴包packageA的導(dǎo)入聲明和依賴包packageA中的子模塊的引用信息為:var packageA=require(‘packageA’)
console.log(packageA.ModuleA1,package.moduleB1)
且子模塊A1和B1均屬于子模塊導(dǎo)出的子模塊,則在步驟S5中,設(shè)備1可將此替換為:
var packageAModuleA1=require(‘packageA/path/to/ModuleA1’)
var packageAModuleB1=require(‘packageA/path/to/ModuleB1’)
console.log(packageAModuleA1,packageAModuleB1)
在此,所述導(dǎo)入聲明包括但不限于import聲明、require聲明等。
本領(lǐng)域技術(shù)人員應(yīng)能理解上述相關(guān)替換處理的方式僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的相關(guān)替換處理的方式如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并在此以引用方式包含于此。
由此,本發(fā)明通過以上替換,剔除了依賴包內(nèi)未引用的子模塊,在后續(xù)的打包過程中可以只引入包中用到的子模塊,沒有用到的就不會(huì)被引入,從而減少了輸出包的文件體積,提高了資源利用率,也提升了文件打包效率。相應(yīng)地,也減少了用戶端白屏?xí)r間,節(jié)省帶寬成本。
優(yōu)選地,設(shè)備1的各步驟之間是持續(xù)不斷工作的。具體地,在步驟S1中,設(shè)備1持續(xù)獲取待被打包處理的初始源文件;在步驟S2中,設(shè)備1持續(xù)確定所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息;若滿足所述至少一個(gè)引用信息均是對(duì)所述依賴包中的子模塊的引用的觸發(fā)條件,在步驟S3中,設(shè)備1持續(xù)所述依賴包中各子模塊的引用信息;在步驟S4中,設(shè)備1持續(xù)確定所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑;在步驟S5中,設(shè)備1持續(xù)根據(jù)記錄的所述依賴包中各子模塊的引用信息與所述導(dǎo)出路徑,對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,以獲得目標(biāo)源文件,以用于打包處理。在此,本領(lǐng)域技術(shù)人員應(yīng)理解所述“持續(xù)”是指設(shè)備1的各步驟之間分別不斷地進(jìn)行初始源文件的獲取、所述初始源文件中的依賴包及該依賴包的至少一個(gè)引用信息的確定、所述依賴包中各子模塊的引用信息的記錄、所述各子模塊中屬于子模塊導(dǎo)出的子模塊的導(dǎo)出路徑的確定,以及對(duì)所述初始源文件進(jìn)行相關(guān)替換處理,直至設(shè)備1在較長時(shí)間內(nèi)停止獲取所述初始源文件。
需要注意的是,本發(fā)明可在軟件和/或軟件與硬件的組合體中被實(shí)施,例如,可采用專用集成電路(ASIC)、通用目的計(jì)算機(jī)或任何其他類似硬件設(shè)備來實(shí)現(xiàn)。在一個(gè)實(shí)施例中,本發(fā)明的軟件程序可以通過處理器執(zhí)行以實(shí)現(xiàn)上文所述步驟或功能。同樣地,本發(fā)明的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲(chǔ)到計(jì)算機(jī)可讀記錄介質(zhì)中,例如,RAM存儲(chǔ)器,磁或光驅(qū)動(dòng)器或軟磁盤及類似設(shè)備。另外,本發(fā)明的一些步驟或功能可采用硬件來實(shí)現(xiàn),例如,作為與處理器配合從而執(zhí)行各個(gè)步驟或功能的電路。
另外,本發(fā)明的一部分可被應(yīng)用為計(jì)算機(jī)程序產(chǎn)品,例如計(jì)算機(jī)程序指令,當(dāng)其被計(jì)算機(jī)執(zhí)行時(shí),通過該計(jì)算機(jī)的操作,可以調(diào)用或提供根據(jù)本發(fā)明的方法和/或技術(shù)方案。而調(diào)用本發(fā)明的方法的程序指令,可能被存儲(chǔ)在固定的或可移動(dòng)的記錄介質(zhì)中,和/或通過廣播或其他信號(hào)承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲(chǔ)在根據(jù)所述程序指令運(yùn)行的計(jì)算機(jī)設(shè)備的工作存儲(chǔ)器中。在此,根據(jù)本發(fā)明的一個(gè)實(shí)施例包括一個(gè)裝置,該裝置包括用于存儲(chǔ)計(jì)算機(jī)程序指令的存儲(chǔ)器和用于執(zhí)行程序指令的處理器,其中,當(dāng)該計(jì)算機(jī)程序指令被該處理器執(zhí)行時(shí),觸發(fā)該裝置運(yùn)行基于前述根據(jù)本發(fā)明的多個(gè)實(shí)施例的方法和/或技術(shù)方案。
對(duì)于本領(lǐng)域技術(shù)人員而言,顯然本發(fā)明不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本發(fā)明的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本發(fā)明。因此,無論從哪一點(diǎn)來看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本發(fā)明的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本發(fā)明內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。裝置權(quán)利要求中陳述的多個(gè)單元或裝置也可以由一個(gè)單元或裝置通過軟件或者硬件來實(shí)現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。