Vue CLI 產(chǎn)生的背景在Vue CLI出現(xiàn)之前,,你可能要花費(fèi)好幾天的時(shí)間搭建項(xiàng)目的開(kāi)發(fā)環(huán)境,如果你事先不了解webpack,,你可能會(huì)又花費(fèi)大把的時(shí)間熟悉webpack,。就這樣,一周過(guò)去了,,你的項(xiàng)目還沒(méi)有真正啟動(dòng)起來(lái),。 為了讓開(kāi)發(fā)者從糾結(jié)配置中解放出來(lái),專注于撰寫(xiě)應(yīng)用程序,。Vue CLI也就因此而產(chǎn)生,。它不僅確保了各種構(gòu)建工具能夠基于智能的默認(rèn)配置即可平穩(wěn)銜接,還提供了配置調(diào)整的靈活性,。 Vue CLI歷史Vue CLI到目前為止經(jīng)歷了兩個(gè)大版本,,CLI 2 和 CLI 3。很多人可能會(huì)好奇從 CLI 2升級(jí)到CLI 3會(huì)有哪些新的改變,,接下來(lái)就一邊回顧CLI 2,,一邊為大家解讀CLI 3的新特性。 創(chuàng)建一個(gè)項(xiàng)目CLI 2和CLI 3第一個(gè)區(qū)別是npm包的包名,CLI 3并沒(méi)有沿用CLI 2的vue-cli,,而是另起為@vue/cli,。創(chuàng)建項(xiàng)目方面也發(fā)生了變化,CLI 2 可以選擇根據(jù)模板初始化項(xiàng)目,,而CLI 3并未重新開(kāi)發(fā)模板,,如果開(kāi)發(fā)者想要像CLI 2一樣使用模板初始化項(xiàng)目,可全局安裝一個(gè)橋接工具@vue/cli-init,。 1,、CLI 2 全局安裝并創(chuàng)建項(xiàng)目
注意:這里的CLI 2是2.9.6。 <template-name>:表示模板名稱,,可以通過(guò)vue list查看可用的模板,,在這里官方提供了6種模板,分別為:
圖1 官方提供的6種模板 初始化過(guò)程中會(huì)確認(rèn)項(xiàng)目的項(xiàng)目名、作者等信息,,大家可根據(jù)需求自行修改,。 2、CLI 3全局安裝并創(chuàng)建一個(gè)項(xiàng)目
當(dāng)我們用CLI 3的方式創(chuàng)建項(xiàng)目,,輸入vue create vue-3.0-demo命令后,,你會(huì)發(fā)現(xiàn)在創(chuàng)建項(xiàng)目的路上總是有位“記者大哥”橫路攔截,問(wèn)你這問(wèn)你那,,你還必須做出選擇,。
記者大哥:“歡迎進(jìn)入CLI 3的世界,,首先你得選取一個(gè) preset,。選擇默認(rèn)的設(shè)置可以快速創(chuàng)建一個(gè)新項(xiàng)目的原型,而手動(dòng)設(shè)置則提供了更多的選擇。你是選擇默認(rèn)配置,,還是手動(dòng)選擇特性呢,?” 你:(心里活動(dòng):“來(lái)都來(lái)了,為何不看看記者大哥到底搞什么鬼”)“我選擇了手動(dòng)選擇屬性” 圖2 手動(dòng)選取特性 你:什么鬼,?還給我來(lái)個(gè)多選題,!首先Babel是必要的,不然拿什么來(lái)轉(zhuǎn)換ES6語(yǔ)法,,TypeScript,?不會(huì),略過(guò),。漸進(jìn)式的程序應(yīng)用,,暫時(shí)也不涉及這個(gè)。Router勾上,,作為一個(gè)移動(dòng)M站,,得有人來(lái)管理路由呀。Vuex一個(gè)狀態(tài)管理器,,后期要用再加上吧,,反正也跑不了。css 預(yù)處理器,,習(xí)慣使用Less,,也加一。Linter / Formatter也加一,,作為一個(gè)團(tuán)隊(duì),,沒(méi)有人統(tǒng)一代碼風(fēng)格可不行。最后兩個(gè)分別是單元測(cè)試和端對(duì)端測(cè)試,,這里我就不加上了,,沒(méi)用過(guò),期待今后有大神分享,。 選擇完特性后,,你以為就結(jié)束了,沒(méi)想到,,一步選錯(cuò)步步要你選,。 對(duì)于css預(yù)處理器方面,你毅然決然選擇了Less,; 但linter / formatter 配置,,你懵逼了。這都是什么,?,?記者大哥介紹了一下: ESLint 是一個(gè)語(yǔ)法規(guī)則和代碼風(fēng)格的檢查工具,可以檢測(cè)出你代碼中潛在的問(wèn)題,可以保證寫(xiě)出語(yǔ)法正確和風(fēng)格統(tǒng)一的代碼,。 圖3 選擇linter配置
等他介紹完,,你心里大概有點(diǎn)譜了,這里你選擇了 ESLint Standard config,。 lint有兩種檢查時(shí)機(jī),,一是用戶保存文件的時(shí)候,二是用戶提交文件到git的時(shí)候,。你就選了Lint on save,,有錯(cuò)及時(shí)解決嘛。 終于“記者大哥”告訴你接下來(lái)這個(gè)問(wèn)題是最后一個(gè)問(wèn)題咯,。 記者大哥:你是喜歡把Babel,、ESLint等配置信息全放在package.json文件里呢,還是單獨(dú)文件管理,? 你:一個(gè)一個(gè)文件比較好,,根據(jù)文件名就知道這是誰(shuí)的配置,方便維護(hù),。 記者大哥:那你是否想把今天你手動(dòng)選擇的preset保存為未來(lái)項(xiàng)目的preset呢,? 你: 說(shuō)好的最后一個(gè)呢!,! ......保存,!
溫馨提示:如果你是用window,在進(jìn)行創(chuàng)建項(xiàng)目的時(shí)候,,最好使用cmd,,在cmd里你可以通過(guò)箭頭上下選擇和空格選中。如果你用git bash 可能會(huì)出現(xiàn)箭頭和空格都沒(méi)有請(qǐng)選擇和選中作用,。 這里通過(guò)一個(gè)漫長(zhǎng)的對(duì)話我們自定義的一個(gè)preset,,此時(shí)如果你需要?jiǎng)?chuàng)建新工程,,這時(shí)候你就會(huì)發(fā)現(xiàn)多了一個(gè)preset,就是最初你自己設(shè)置的,。你可以選擇自己之前保存preset的,,也可以再次開(kāi)啟“采訪模式”,。 圖4 新添的preset CLI 2 的項(xiàng)目結(jié)構(gòu)圖5 vue cli 2.9.6項(xiàng)目結(jié)構(gòu) 對(duì)于CLI 2這個(gè)項(xiàng)目結(jié)構(gòu),,主要的也是最重要的在于bulid和config者兩個(gè)目錄。bulid是項(xiàng)目構(gòu)建的相關(guān)代碼,,config是項(xiàng)目開(kāi)發(fā)環(huán)境配置,。 接下來(lái)就先從webpack.base.conf.js開(kāi)始依次介紹build和config兩個(gè)目錄下的相關(guān)功能。 webpack.base.conf.jswebpack.base.conf.js是webpack的基礎(chǔ)配置,,是dev和prod的公共配置文件,。
在這個(gè)文件里一共實(shí)現(xiàn)了兩個(gè)方法,。一是合并path路徑的,,另一個(gè)是創(chuàng)建Eslint的Rules。而剩余部分就是webpack的基礎(chǔ)配置,,這里簡(jiǎn)化了webpack結(jié)構(gòu),,簡(jiǎn)化的結(jié)果其實(shí)就是webpack的一個(gè)骨架,如果在配置上遇到問(wèn)題,,可去webpack查證,。
關(guān)于path有興趣的可前往node學(xué)習(xí),,接下來(lái)重點(diǎn)介紹下utils.js,,config和vue-loader.conf。 utils.jsutils.js文件中總共實(shí)現(xiàn)了4個(gè)方法:assetsPath,、cssLoaders,、styleLoaders、createNotifierCallback,。
configconfig關(guān)鍵文件是index.js,。這個(gè)文件是開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境的基本配置。在這個(gè)文件里開(kāi)發(fā)者可在dev設(shè)置開(kāi)發(fā)環(huán)境的靜態(tài)路徑,、本地服務(wù)器配置項(xiàng),、Eslint、SourceMaps和代理,,也可在build設(shè)置生產(chǎn)環(huán)境是否開(kāi)啟gzip壓縮,,以及壓縮后綴名的設(shè)置等。
vue-loader.conf這個(gè)文件的內(nèi)容相對(duì)比較少,。首先,,vue文件中的css loader將在生產(chǎn)環(huán)境下把css文件抽取到一個(gè)獨(dú)立的文件中,;其次是根據(jù)不同的環(huán)境,引入不同的source map配置文件,;最后設(shè)置是否開(kāi)啟緩存破壞,。
關(guān)于webpack公共配置講完了,接下來(lái)我們就一起學(xué)習(xí)下在dev和prod環(huán)境各自的配置吧,。 webpack.dev.conf.js這個(gè)文件引入了webpack-merge,,意在將公共配置文件和dev配置合并。從代碼里我們可以發(fā)現(xiàn),,dev環(huán)境又新增了一些配置項(xiàng),。
最后一個(gè)函數(shù)是為了確保啟動(dòng)程序時(shí),,如果端口被占用時(shí),會(huì)通過(guò)portfinder來(lái)發(fā)布新的端口,。
webpack.prod.conf.js相比 webpack.dev.conf.js,,這個(gè)文件多引入了幾個(gè)依賴,主要是為了壓縮CSS和JS,。在文件配置上多了一個(gè)output,,將js文件打包成多個(gè)chuck,用hash值命名,,來(lái)解決緩存策略,。 到這里CLI 2的整個(gè)配置也就接近尾聲了。剩下的還有check-version.js和bulid.js兩個(gè)文件,。 check-version.js這個(gè)文件主要是用來(lái)檢測(cè)當(dāng)前環(huán)境中的node和npm版本和我們需要的是否一致的,。 bulid.js這個(gè)文件剛開(kāi)始通過(guò)check-versions判斷當(dāng)前的node和npm版本號(hào),如果現(xiàn)有的npm或者node的版本比定義的版本低,,則生成一段警告,。接下來(lái),,先刪除打包目標(biāo)目錄下的文件,再進(jìn)行打包,,直至打包完成,。 我們走馬觀花的學(xué)習(xí)了CLI 2的配置,估計(jì)大家也都累了,。那接下來(lái)就來(lái)一段采訪吧~~期待不,,哈哈。 CLI 3的項(xiàng)目結(jié)構(gòu)圖6 CLI 3項(xiàng)目結(jié)構(gòu) 從CLI 3的整個(gè)項(xiàng)目結(jié)構(gòu)我們可以發(fā)現(xiàn),,這個(gè)結(jié)構(gòu)很簡(jiǎn)單,,沒(méi)有相關(guān)的配置文件或復(fù)雜的目錄結(jié)構(gòu),。CLI 3僅生成構(gòu)建應(yīng)用程序所需的文件,,讓使用者不用關(guān)心這些工具的具體配置,從而降低了工具的使用難度,。 其實(shí)通過(guò)閱讀CLI 3的官方文檔,,你可能已經(jīng)知道,官方內(nèi)置了一個(gè)CLI服務(wù)(@vue/cli-service),,作為一個(gè)開(kāi)發(fā)環(huán)境的依賴,,局部安裝在@vue/cli創(chuàng)建的項(xiàng)目中。如果你真想修改webpack的相關(guān)配置,,可在項(xiàng)目的根目錄下(和package.json同級(jí))創(chuàng)建一個(gè)vue.config.js配置文件,,這個(gè)文件一旦存在就會(huì)被@vue/cli-service自動(dòng)加載。也可直接使用package.json中的vue字段,。
如果你已經(jīng)滿足于官方的介紹,,那也就到此結(jié)束漫長(zhǎng)的閱讀之旅啦(偷偷告訴你后面還有新特性的精彩內(nèi)容),。如果你也像我一樣,充滿了好奇心,,就跟我再去探索一番,。 從CLI 2到CLI 3,初期可能沒(méi)有官方文檔,。如果你真想探個(gè)究竟,,可以從啟動(dòng)項(xiàng)目入手。 CLI 2啟動(dòng)方式是webpack-dev-server --inline --progress --config build/webpack.dev.conf.js這里用webpack-dev-server搭一個(gè)服務(wù),。
CLI 3啟動(dòng)方式是vue-cli-service serve vue-cli-service就是CLI服務(wù),,你可全局搜索一下,位于node_modules\@vue\cli-service\bin vue-cli-service.js
這個(gè)文件首先是判斷了當(dāng)前node的版本和vue-cli-service要求的版本是否一致,,如果版本太低就得升級(jí)node版本,。 緊接著就起了個(gè)服務(wù),,這個(gè)服務(wù)是位于lib/Service。 Service.js
在loadUserOptions這個(gè)函數(shù)中,,你可以看到官方提到的vue.config.js,。 這個(gè)函數(shù)主要是加載用戶的配置。如果vue.config.js和package.json的vue字段同時(shí)存在,,會(huì)忽略package.json的vue字段配置,,而選取vue.config.js的配置。 這里粗略介紹了何處加載了 vue.confg.js 文件,,有興趣可以繼續(xù)深究,。經(jīng)過(guò)安裝CLI、創(chuàng)建項(xiàng)目到整個(gè)項(xiàng)目結(jié)構(gòu)介紹,,我們可以大致了解了兩者的區(qū)別,。接下來(lái)大家一起圍觀一下CLI 3給我們帶來(lái)的哪些新特性吧~~~ 新特新CLI插件的出現(xiàn)據(jù)我所知,在CLI 3之前是沒(méi)有CLI插件這個(gè)概念的,,人們?cè)陂_(kāi)發(fā)Vue項(xiàng)目時(shí),,若是需要實(shí)現(xiàn)功能都是引用npm的相關(guān)包。CLI 3的出現(xiàn),,帶來(lái)了CLI插件這個(gè)概念,,也帶來(lái)了統(tǒng)一的命名方式:@vue/cli-plugin-(內(nèi)建插件)/ vue-cli-plugin-(社區(qū)插件)開(kāi)頭。 圖7 CLI 3出現(xiàn)前包名 圖8 CLI插件 即刻創(chuàng)建原型有時(shí)候你想快速創(chuàng)建一個(gè)原型,,不需要添加一大堆樣板,。Vue CLI就提供了一個(gè)運(yùn)行原型的開(kāi)發(fā)服務(wù)器。 要想使用這個(gè)開(kāi)發(fā)服務(wù)器,,前提是安裝@vue/cli-service-global
你可以用IDE創(chuàng)建.vue文件,,并添加vue代碼。如果你對(duì)命令行掌握良好,,也能輕松創(chuàng)建,。
然后將HelloWorld.vue 修改為標(biāo)準(zhǔn)的vue文件結(jié)構(gòu)就行。
緊接著你就可以運(yùn)行vue serve src/views/HelloWorld.vue 就能看效果啦~ 圖9 快速原型開(kāi)發(fā) 配置時(shí)無(wú)需Eject如果你曾經(jīng)是一位React的忠實(shí)用戶,,或許使用過(guò)create-react-app(react的腳手架),,那你對(duì)eject的理解可能就很深刻了??上∨徊?,早期與React只有一面之緣,也就沒(méi)此機(jī)會(huì)接觸create-react-app,。為了理解eject到底是何物,,我查看了react的相關(guān)文檔,終于明白了,。 在react中,,使用CRA( create-react-app簡(jiǎn)稱)創(chuàng)建完項(xiàng)目,,我們可以在package.json看到這里一個(gè)script命令。
執(zhí)行完npm run eject會(huì)將封裝在CRA里的配置全部反編譯到當(dāng)前項(xiàng)目,,換句話就是把之前好不容易藏好了config文件暴露出來(lái)了,,用戶也就獲取到了控制權(quán),想怎么改隨你,。這樣react-scripts就以文件的形式存在于項(xiàng)目中,,就無(wú)法升級(jí)啦。
好在CLI 3并沒(méi)有像CRA一樣,,開(kāi)發(fā)者你要是想自己修改配置,也是可以的,,我不需要你eject,,你想改就去vue.config.js里改吧。 如果你想看看默認(rèn)的webpack配置,,可執(zhí)行vue inspect查看,,默認(rèn)情況下,,會(huì)將配置輸出到控制臺(tái),,你也可以將結(jié)果指向一個(gè)文件,例如:vue inspect > webpack.config.js,。 新特性到此就介紹完畢了,。 參考資料
關(guān)于奇舞周刊《奇舞周刊》是360公司專業(yè)前端團(tuán)隊(duì)「奇舞團(tuán)」運(yùn)營(yíng)的前端技術(shù)社區(qū)。關(guān)注公眾號(hào)后,,直接發(fā)送鏈接到后臺(tái)即可給我們投稿,。
|
|