微信小程序打包插件開發

責任編輯:福建福彩快3开奖结果 //www.yhrpv.com/



每個插件都必須有一個webpack引擎的apply方法來執行你想要執行的代碼。 

兩個重要的對象,Compiler和編譯時,可以在將事件掛鉤綁定到webpack以執行該步驟時調用。事件掛鉤可以讀取編譯器掛鉤。 

??楹涂櫓淶墓叵?,我們可以理解每個文件都有一個???,而一個塊由多個??樽槌?。 

 Webpack整個打包過程都有那些事件 

如何編寫一個簡單的加載器 

如果你覺得你不能開始,你可以繼續看看我是如何開發和改進的mini-program-webpack-loader一步步打包小程序。  

福建福彩快3开奖结果有一個固定的例程。首先,您需要有一個app.json文件來定義所有頁面路徑。然后每個頁面有四個文件:.js,.json,.wxml,.wxss。 

所以我使用app.json作為webpack條目。當webpack執行插件\\ u0027s apply時,我得到條目以了解福建福彩快3开奖结果有哪些頁面。 

有兩個插件,MultiEntryPlugin,SingleEntryPlugin。 

你為什么要這樣做? 

因為webpack會根據你的條目配置條目,而不僅僅是webpack配置中的條目,import,require.ensure會生成一個條目來確定生成的文件數,我們不想打包所有的js將頁面轉換為文件,需要

使用SingleEntryPlugin生成新的入口???和那些靜態資源一樣,我們可以使用MultiEntryPlugin插件來處理,使用這些文件作為入口??橐覽?,在加載器中配置文件加載器來放置

靜態文件輸出。 

偽代碼如下:  

 Const MultiEntryPlugin \\ u003d require \\ u0027webpack / lib / MultiEntryPlugin \\ u0027;  

 Const SingleEntryPlugin \\ u003d require \\ u0027webpack / lib / SingleEntryPlugin \\ u0027;   

類MiniPlugin { 

應用編譯器{ 

讓選項\\ u003d compiler.options  ## #Let context \\ u003d compiler.rootContext  

設置條目\\ u003d options.entry  

設置文件\\ u003d loadFilesentry  

讓腳本\\ u003d files.filterfile \\ u003d \\ u003e /\\\\.js$/.testfile\\r\\n 

設置資產\\ u003d files.filterfile \\ u003d \\ u003e!/ \\\\。js $ / .testfile   

新的MultiEntryPlugincontext,assets,\\ _ \\ _設置__ \\ u0027.applycompiler   

 scripts.forEachfile \\ u003d \\ u003e { 

設置fileName \\ u003d relativecontext,file.replaceextnamefile,\\ u0027 \\ u0027;  

 New SingleEntryPlugincontext,file,fileName.applycompiler;  

}  

}  

}  

復制代碼

#n ##當然,如果你執行上述操作,你會發現還會有一個main.js,xxx.js在使用MultiEntryPlugin時使用的名稱,main.js對應于配置的條目生成的文件,以及xxx .js由MultiEntryPlugin生成。 

 

這些文件不是我們需要的,所以我們需要擺脫他。 

如果您熟悉webpack文檔,我們有很多地方可以修改最終的打包文件,例如編譯器

emit事件,optimizeChunks相關的編譯事件可以實現。 

它本質上是修改compilation.assets對象。  

 emit-event用于mini-program-webpack-loader來處理這個不需要的內容。輸出。   

小包裝當然不是那么簡單,你必須支持wxml,wxss,wxs和自定義組件引用,所以這次你需要一個加載器來完成,加載器需要做的事情非常簡單 - 解析依賴文件,例如wxml需要解析導入組件的src,wxs的src,.wxss需要解析導入,需要wxs,最后使用loadModule方法將其添加到加載器中。 

自定義組件最初是在添加條目步驟中直接獲得的,因此不需要加載器來完成它。  


這沒有問題,但是開發經驗相對較差。如果添加自定義組件,頁面,webpack是不可感知的,那么您需要檢查在頁面中.json更改時是否添加了自定義。 

添加了組件或新頁面。 

這時,我遇到了一個問題。 addModule方法無法添加自定義組件的js,因為自定義組件的js必須用作單獨的條目文件。 

它可以在加載器中完成,所以嘗試將文件傳遞給插件,因為插件在加載器之前執行,因此可以建立加載器和插件。  ## #Simple和粗魯的方式:  

 // loader.js  

類MiniLoader {}   

 Module.exports \\ u003d函數content { 

 New MiniLoaderthis,content  

}  

 Module.exports。$ applyPluginInstance \\ u003d function plugin { 

 MiniLoader.prototype。 $ plugin \\ u003d plugin  

}   

 // plugin.js  

 Const loader \\ u003d require \\ u0027./loader \\ u0027  \\ n 

類MiniPlugin { 

應用編譯器{ 

 Loader。$ app 

lyPluginInstancethis;  

}  

}  

復制代碼 

但.... .... 

文件傳遞給插件,但是當你使用SingleEntryPlugin時,你會發現它沒有任何效果。 

因為webpack在編譯器生成后無法識別新???,所以它沒用。這時,我們需要根據文件猜測。我們如何讓webpack感知新??椴⒏菸牡抵械氖錄泄丶植檠?? 

您可以看到編譯完成時會調用編譯needAdditionalPass事件掛鉤:  

 this.emitAssetscompilation,err \\ u003d \\ u003e { 

 if err return finalCallbackerr;   

如果compilation.hooks.needAdditionalPass.call { 

compilation.needAdditionalPass \\ u003d true;   \\ n 

 Const stats \\ u003d新的Statscompilation;  

 stats.startTime \\ u003d startTime;  

 stats.endTime \\ u003d Date.now;  

 this.hooks.done.callAsyncstats, err \\ u003d \\ u003e { 

如果錯誤返回finalCallbackerr;   

 this.hooks.additionalPass.callAsyncerr \\ u003d \\ u003e { 

 if err return finalCallbackerr;  

 this.compileonCompiled;  

};  

};  

 Return;  

}   

 this.emitRecordserr \\ u003d \\ u003e { 

如果錯誤返回finalCallbackerr;   

 Const stats \\ u00 3d new Statscompilation;  

 Stats.s 




澤群一站式網絡服務機構竭誠為您提供:

福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,福建福彩快3开奖结果,SEO優化,模板建站,云服務等服務

相關資訊