摘要:簡(jiǎn)單說(shuō)明原理使用實(shí)現(xiàn)按需引入打包。這里采用多入口配置,實(shí)現(xiàn)各個(gè)功能模塊分別打包成一個(gè)文件,并使用將樣式進(jìn)行抽離后,按入口進(jìn)行打包為對(duì)應(yīng)的文件。只要在指定入口名為。這個(gè)相關(guān)配置已經(jīng)發(fā)布了包。
簡(jiǎn)單說(shuō)明原理:
使用babel-plugin-component實(shí)現(xiàn)按需引入、打包。element源碼關(guān)于按需引入的研究:
將webpack配置成多入口,保證最終打包的目錄結(jié)構(gòu)符合babel-plugin-component插件的要求,實(shí)現(xiàn)按需加載
1、build目錄中是cooking配置文件,cooking是餓了么前端研發(fā)的基于webpack的前端構(gòu)建工具,我們使用原始的webpack實(shí)現(xiàn)。此處源碼忽略。
2、example中是element項(xiàng)目的例子存放,打開(kāi)element網(wǎng)頁(yè),可看見(jiàn)的項(xiàng)目入口。
3、packages目錄中,是所有的功能模塊,以alert模塊為例,分析目錄結(jié)構(gòu)
alert模塊目錄,有一個(gè)index.js作為模塊入口,在入口處,引入src目錄中的主要組件,再對(duì)該組件進(jìn)行拓展,增加install方法,我們知道,在對(duì)vue進(jìn)行擴(kuò)展,使用vue.use(...)時(shí),vue內(nèi)部會(huì)調(diào)用插件的install方法,此處給alert組件增加install方法,則最終打包完成后,按需引入alert功能組件時(shí),可以使用vue.use(alert)進(jìn)行注冊(cè)組件到全局。
其他功能模塊的目錄結(jié)構(gòu)也大同小異,在入口處對(duì)組件進(jìn)行install擴(kuò)展。
4、src目錄中存放一些公共的mixin等工具和一個(gè)index.js入口文件,這個(gè)入口文件是打包后兼具所有功能組件的入口,上源碼,一個(gè)一個(gè)分析:
首先將packages中的各個(gè)功能模塊引入
定義一個(gè)install方法,在此方法中,將所有的功能模塊進(jìn)行注冊(cè)。
components.map(component => { Vue.component(component.name, component); });
遍歷注冊(cè)
Vue.prototype.$loading = Loading.service; Vue.prototype.$msgbox = MessageBox; Vue.prototype.$alert = MessageBox.alert; Vue.prototype.$confirm = MessageBox.confirm; Vue.prototype.$prompt = MessageBox.prompt; Vue.prototype.$notify = Notification; Vue.prototype.$message = Message; Vue.prototype.$ELEMENT = ELEMENT;
對(duì)vue原型進(jìn)行擴(kuò)展,使vue實(shí)例中可直接使用this.$alert等便捷方法。
最后,將所有功能模塊和install方法一起導(dǎo)出。這樣當(dāng)引入element-ui時(shí),便可以使用vue.use(element-ui)進(jìn)行注冊(cè),即將所有的功能組件進(jìn)行全局注冊(cè)。
5、lib目錄是按babel-plugin-component插件要求打包后存放最終代碼的目錄。
詳細(xì)看看這個(gè)目錄中的結(jié)構(gòu)
目錄中,將各個(gè)功能模塊打包成了一個(gè).js文件,在theme-chalk中,存放這名稱(chēng)和功能模塊相同的.css文件。為何要這樣打包??這就進(jìn)入了我們的重點(diǎn),看看babel-plugin-component插件的文檔:
import { Button } from "antd" 會(huì)被解析成同時(shí)引入antd/lib/button/index.js和引入lib/button/style.css
這就是這個(gè)插件為我們帶來(lái)的按需引入的功能。插件會(huì)去解析你的代碼,當(dāng)你引入的是配置的modules中的某一部分時(shí),自動(dòng)為你解析,只為你的項(xiàng)目引入你指定的部分。
這個(gè)插件有幾種目錄結(jié)構(gòu)的配置方案,剛剛解釋的只是其中一種,我們來(lái)看element-ui采用的也是我們要使用的一種:
在lib下,存在幾個(gè)模塊componentA、componentB,當(dāng)引入import {componentA} from "..."時(shí),會(huì)被解析成從lib/componentA,此時(shí),這個(gè)componentA若是目錄,則進(jìn)入目錄找目錄入口,也就是index.js,若componentA是個(gè).js文件,則直接引入這個(gè)文件。
樣式文件會(huì)通過(guò)你的bablerc配置,從lib中指定的目錄中去引入同名文件
看看bablerc中的相關(guān)配置:
在plugins中,增加component配置,component相關(guān)option配置:
看看element官網(wǎng)說(shuō)明的配置:
配置了libraryName和styleLibraryName。
好,到此element的分析及babel-plugin-componentbable插件的說(shuō)明暫時(shí)告一段落。
咱們繼續(xù)看我們?nèi)绾稳?shí)現(xiàn)。
項(xiàng)目是用vue-cli搭建的項(xiàng)目:
1、build中是webpack相關(guān)配置
2、example目錄是開(kāi)發(fā)時(shí)調(diào)試用
3、src目錄中components中是各個(gè)功能模塊,各功能模塊的入口中同element一樣,對(duì)組件進(jìn)行擴(kuò)展,增加install方法,將組件進(jìn)行全局注冊(cè),index.js是入口,其中引入所有功能模塊,同時(shí)導(dǎo)出模塊和install方法,將所有模塊進(jìn)行注冊(cè)。
4、lib中是最終打包的目標(biāo)目錄
5、增加components.json文件
記錄將要打包的功能模塊名稱(chēng)和路徑
規(guī)劃中,需要將各個(gè)模塊打包至lib,一個(gè)功能模塊為一個(gè).js文件,并且在theme目錄中存在一個(gè)同名的.css文件,這樣使用時(shí)借助babel-plugin-component插件就可實(shí)現(xiàn)按需引入。還需要一個(gè)總的index.js包含所有的功能模塊,和一個(gè)index.css包含所有的樣式。
這里采用多入口(entry)配置,實(shí)現(xiàn)各個(gè)功能模塊分別打包成一個(gè).js文件,并使用extract-text-webpack-plugin將樣式進(jìn)行抽離后,按入口chunk進(jìn)行打包為對(duì)應(yīng)的.css文件。
當(dāng)將需要打包至一起是,使用單個(gè)入口,抽離所有css到一個(gè)css文件。
所以完成打包目標(biāo)需要執(zhí)行兩個(gè)打包命令,看package.json相關(guān)配置:
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node build/build.js", "build_all": "node build/build.js all" }
npm run build進(jìn)行將各個(gè)模塊打包為各自的.js文件,樣式文件也同時(shí)抽離處理為同名的.css,npm run build_all將所有的功能打包為index.js和index.css
上webpack詳細(xì)配置更改代碼:
首先在config中將assetsRoot,output的路徑設(shè)置為lib
在build.js中,獲取命令行參數(shù),根據(jù)參數(shù)判斷需要進(jìn)行的打包任務(wù),下面詳細(xì)介紹webpack.prod.conf和webpack.prodAll.conf文件
1、刪除HtmlWebpackPlugin相關(guān)配置,這里只需打包為js文件和css文件,不涉及html
2、引入components.json,根據(jù)配置的模塊及路徑配置入口entrys,配置完后,將入口寫(xiě)入entry配置
3、ExtractTextPlugin插件是進(jìn)行css抽離的,這里不用處理
4、ouput中,出口.js文件的名稱(chēng)不能寫(xiě)死
5、在plugins插件配置處,ExtractTextPlugin相關(guān)配置,filename不能寫(xiě)死,需要根據(jù)chunk名稱(chēng)自動(dòng)生成對(duì)應(yīng)名稱(chēng)。這里設(shè)置為"/theme/[name].css"指定目錄lib/theme存放
1、同樣刪除html相關(guān)配置
注意入口配置,設(shè)置為src/index.js這個(gè)文件中引入了所有的功能模塊。
output和抽離css的配置中的filename寫(xiě)死成index也可,寫(xiě)成[name]按chunk名也可,因?yàn)槿肟谥挥幸粋€(gè)。只要在entry指定入口名為index。
到此,webpack配置就差不多完成了。最后上一個(gè)打包完成后的目錄結(jié)構(gòu):
這樣,在使用時(shí),只需要引入babel-plugin-component插件,并進(jìn)行配置,配置中,指定libraryName為庫(kù)名,指定styleLibraryName為theme即可。
這個(gè)相關(guān)配置已經(jīng)發(fā)布了npm包。其中只有兩個(gè)功能組件,一個(gè)upload,一個(gè)input。
有讀者想要試按需引入功能的可以按如下配置:
1、bable配置:
2、引入時(shí):
本文完成啦,希望能對(duì)你有所幫助~~學(xué)無(wú)止境,大家共勉
特別說(shuō)明1、相關(guān)代碼已經(jīng)發(fā)布至github,地址:https://github.com/yuanalina/installAsRequired
2、打包時(shí)需要注意名稱(chēng)命名需要使用kebab-case (短橫線(xiàn)分隔命名)格式,例如:button-model,在components.json配置中,需要使用短橫線(xiàn)分隔命名;
3、在后續(xù)的配置中我進(jìn)行了優(yōu)化,把整體打包和各組件分離打包整合到了一起,更改的地方為:在components.json中增加"index": "./src/index.js"即可。詳見(jiàn)github
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96595.html
摘要:組件庫(kù)開(kāi)發(fā)總結(jié)由于工作需要,最近在學(xué)習(xí)怎么開(kāi)發(fā)一個(gè)組件庫(kù)。按需打包的使用要使用按需打包,不僅組件庫(kù)的打包需要做處理,項(xiàng)目中也需要做處理。 Vue組件庫(kù)開(kāi)發(fā)總結(jié) 由于工作需要,最近在學(xué)習(xí)怎么開(kāi)發(fā)一個(gè)Vue組件庫(kù)。主要需要實(shí)現(xiàn)以下點(diǎn):1.組件使用npm包引入2.實(shí)現(xiàn)按需引入及按需打包項(xiàng)目中許多實(shí)現(xiàn)是參考的element-ui,特別是webpack打包部分 組織項(xiàng)目 項(xiàng)目生成 項(xiàng)目生成是直接...
摘要:開(kāi)發(fā)完了,并部署到服務(wù)器后,就遇到了一個(gè)非常明顯的問(wèn)題。所以可以利用按需加載來(lái)進(jìn)一步縮小文件的體積。另外圖片還可以去下面這個(gè)網(wǎng)上壓縮一下經(jīng)過(guò)上述的幾步,首頁(yè)的加載速度已經(jīng)比較快了,項(xiàng)目經(jīng)理也比較滿(mǎn)意。初步結(jié)束了首頁(yè)加載慢的問(wèn)題的研究。 本次開(kāi)發(fā)的項(xiàng)目中使用了vue2.5.2和自帶的vue-cli生成了前端的基本架構(gòu)。隨后在項(xiàng)目開(kāi)發(fā)當(dāng)中,添加了自己寫(xiě)的UI組件,和復(fù)雜的業(yè)務(wù)邏輯。整個(gè)項(xiàng)目...
摘要:但是實(shí)際上,回款管理和開(kāi)票管理的組件文件也是加載了。所以下面引用按需加載來(lái)處理。是不是小很多了,然后和是按需加載的,就是需要的時(shí)候才加載。 1.前言 上篇文章(webpack+vue項(xiàng)目實(shí)戰(zhàn)(二,開(kāi)發(fā)管理系統(tǒng)主頁(yè)面)),實(shí)現(xiàn)了,側(cè)邊欄的一個(gè)操作,點(diǎn)擊側(cè)邊欄的一些操作,最重要的就是路由的切換??戳松弦黄幕锇橐膊浑y發(fā)現(xiàn),除了點(diǎn)擊側(cè)邊欄‘首頁(yè)’之外,點(diǎn)擊其它的都是白色的一片。原因我想大家都...
摘要:進(jìn)入主題使用我們?cè)趧?chuàng)建項(xiàng)目時(shí)已經(jīng)選擇安裝了,安裝完就能使用了。 注:文章中的nuxt為2.0.0版本 眾所周知vue單頁(yè)面應(yīng)用的seo很不友好,每次打開(kāi)頁(yè)面先獲取的節(jié)點(diǎn)也就是一個(gè),而這對(duì)想用vue做spa又想擁有友好搜索引擎seo優(yōu)化的人來(lái)說(shuō)就好比雞肋。好在vue的官方出了nuxt,既能讓我們使用spa又能擁有良好的搜索引擎優(yōu)化;nuxt介紹->https://zh.nuxtjs.or...
摘要:先來(lái)看看是怎么做的,官方的的快速手上使用一個(gè)了插件,作用就是代碼轉(zhuǎn)換轉(zhuǎn)換為到這我們可以知道,要搭建一個(gè)按需加載的組件庫(kù)。 按需加載的原理 按需加載,本質(zhì)上是把一個(gè)組件庫(kù)的不同組件拆分成不同文件,按照需要引用對(duì)應(yīng)的文件,而該文件暴露一個(gè)install方法,供Vue.use使用。比如:我只想引用element庫(kù)里的一個(gè)Button組件 import Button from element-...
閱讀 2053·2023-04-25 22:50
閱讀 2859·2021-09-29 09:35
閱讀 3436·2021-07-29 10:20
閱讀 3188·2019-08-29 13:57
閱讀 3386·2019-08-29 13:50
閱讀 3062·2019-08-26 12:10
閱讀 3592·2019-08-23 18:41
閱讀 2663·2019-08-23 18:01