VueJS學(xué)習(xí)之旅 02

通過(guò)學(xué)習(xí)項(xiàng)目是如何build的,會(huì)有利于我們更好的了解整個(gè)項(xiàng)目的代碼結(jié)構(gòu)。以便于更好的學(xué)習(xí)項(xiàng)目的各個(gè)模塊。
打開package.json,來(lái)看看項(xiàng)目構(gòu)建的script是何樣子的。

"build": "node build/build.js",
"build:ssr": "npm run build -- vue.runtime.common.js,vue-server-renderer",
"build:weex": "npm run build -- weex-vue-framework,weex-template-compiler",

從名字大概就能看出這些build腳本的用途了。我們現(xiàn)在應(yīng)該關(guān)注的就是 node build/build.js 這條命令到底干了什么?
OK,沒(méi)說(shuō)的,直接打開build/build.js文件來(lái)尋找答案。
文件內(nèi)容很簡(jiǎn)單,很容易讀懂。

  1. 首先就是看看有沒(méi)有dist文件夾,沒(méi)有就創(chuàng)建一個(gè)
  2. 在config文件中讀取所有的build任務(wù)配置信息
  3. 根據(jù)命令行參數(shù)對(duì)上面讀取的build任務(wù)進(jìn)行一下過(guò)濾
  4. 然后遍歷build任務(wù)列表,依次進(jìn)行build

那具體是如何完成一個(gè)build任務(wù)的呢?文件中的 buildEntrywrite 兩個(gè)函數(shù)就是了。
結(jié)合上面提到的config文件,我們可以有以下理解:

  1. config中定義了一個(gè)builds對(duì)象,里面包含了一大堆的配置信息(entry,dest,format等)。形如:
// Runtime+compiler development build (Browser)
'web-full-dev': {
  entry: path.resolve(__dirname, '../src/entries/web-runtime-with-compiler.js'),
  dest: path.resolve(__dirname, '../dist/vue.js'),
  format: 'umd',
  env: 'development',
  alias: { he: './entity-decoder' },
  banner
},
  1. 通過(guò)一個(gè) getConfig 函數(shù),我們會(huì)得到一個(gè)形如下面的配置對(duì)象
{
  "entry":"/vue-master/src/entries/web-runtime-with-compiler.js",
  "dest":"/vue-master/dist/vue.js",
  "format":"umd",
  "banner":"/*!\n * Vue.js v2.1.8\n * (c) 2014-2017 Evan You\n * Released under the MIT License.\n */",
  "moduleName":"Vue",
  "plugins":[
    { "name":"replace" }, 
    { "name":"flow-remove-types" }, 
    { "name":"buble" }
  ]
}
  1. 有了build的配置對(duì)象,就可以將其傳遞給 buildEntry 函數(shù)來(lái)完成這個(gè)build任務(wù)了。 buildEntry 函數(shù)之中使用了 rollup 這個(gè)第三方的打包工具來(lái)對(duì)code進(jìn)行打包。

rollup是什么呢? 馬上前往npmjs.com打探一下。

OK, 得到以下比較有用的信息:

  1. Next-generation ES6 module bundler ,下一代ES6 模塊打包工具
  2. rollup提供Javascript API命令行接口
  3. rollup有何魔力。
    • 現(xiàn)有的模塊打包工具Browserify和Webpack在require模塊時(shí),會(huì)引入整個(gè)模塊(其中包含了大量你用不到的代碼)。
    • ES6的模塊系統(tǒng)可以解決這個(gè)問(wèn)題, 使用 import { ajax } from 'utils'; 只引入 ajax 功能,而不引入整個(gè) utils,rollup會(huì)靜態(tài)地分析代碼和依賴,來(lái)確保最小打包。 更多詳細(xì)情況請(qǐng)參考 https://github.com/rollup/rollup

好吧,有了以上知識(shí),我們就明白了 entries 目錄下面的文件是用來(lái)干什么的了。
它們就是打包工具的入口,rollup從它們開始分析代碼的依賴并進(jìn)行打包。
那么我們的關(guān)注點(diǎn)終于切到代碼了,以上面提到的build配置信息為例,我們下面來(lái)分析 src/entries/web-runtime-with-compiler.js 這個(gè)entry文件了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 webpack2和vue2已經(jīng)不是新鮮東西了,滿大街的文章在講解webpack和vue,但是很多內(nèi)容寫的不是...
    技術(shù)宅小青年閱讀 6,691評(píng)論 4 43
  • 前面兩部分介紹了Vuejs的各個(gè)發(fā)布版本,以及它們的區(qū)別。也了解了VueJS源碼的代碼結(jié)構(gòu),以及基本的構(gòu)建過(guò)程。下...
    小A家的銘閱讀 345評(píng)論 0 0
  • 哎,倒霉??!手指頭被刮眉刀割了一條小口子!比平時(shí)的蹭傷玩厲害,我真是夠了!血流到指頭上,心疼啊! 給他打電...
    二苗_5c0f閱讀 337評(píng)論 0 1
  • 《中國(guó)保監(jiān)會(huì)關(guān)于合理購(gòu)買人身保險(xiǎn)產(chǎn)品的公告》建議:保障型產(chǎn)品可以用相對(duì)較低的保費(fèi)獲得較高的保額,通常建議投保人將意...
    Rachel平安閱讀 450評(píng)論 0 0
  • 我現(xiàn)在腦海中那三個(gè)字還是揮之不去,就像影子一樣前后左右的亂晃,真想點(diǎn)根煙,狠狠的吸上一口,然后大喊一聲 :“去你媽...
    留在花果山閱讀 356評(píng)論 0 0

友情鏈接更多精彩內(nèi)容