換個角度學(xué)習(xí) VUE CLI 3

簡介

vue cli 3 是一個類似于 create-react-app 的可以用例命令行快速配置和生成一個 vue 項(xiàng)目劫拗。]vue cli 3 與之前版本最大的幾個變化變化是:

  • 選擇項(xiàng)目插件界面更友好了辜妓。如選擇 eslint 類型、是否需要 router 和 vuex 等行為碌宴。
  • 實(shí)現(xiàn)了界面化創(chuàng)建和操作項(xiàng)目,使用 $ vue ui 啟動教授架頁面贰镣。
  • 將常用配置項(xiàng)進(jìn)行了封裝,統(tǒng)一使用 vue-config.js 來進(jìn)行配置碑隆。
  • 給出 vue-cli-plugin 插件來快速改變項(xiàng)目目錄結(jié)構(gòu)和Webpack配置。

可以說 vue cli 3 是基于之前腳手架的大幅優(yōu)化和改進(jìn)上煤,并提供了各種貼心的功能。真正實(shí)現(xiàn)一鍵生成、一鍵調(diào)試拴疤、一鍵發(fā)布這些快捷的行為。方便開發(fā)者將注意力更聚焦于業(yè)務(wù)層面呐矾。

了解 vue cli

我們使用問答的方式來有針對性的解決 vue cli 相關(guān)問題。

vue cli 可以具體做些什么蜒犯?

具體細(xì)節(jié)建議去仔細(xì)看文檔下面列舉出一些可以做的行為:

  • 便捷的創(chuàng)建項(xiàng)目
  • 添加 vue 插件快速配置項(xiàng)目
  • 啟動服務(wù)調(diào)試開發(fā)
  • 瀏覽器兼容
  • HTML和靜態(tài)資源 assets 的處理
  • 配置 CSS
  • 配置 Webpack
  • 配置環(huán)境變量和環(huán)境模式
  • 針對不同環(huán)境進(jìn)行打包
  • 發(fā)布項(xiàng)目

就這么多罚随,我覺得工作中常用的都已經(jīng)涵蓋進(jìn)去了。

vue cli 的插件是什么毫炉?

插件其實(shí)是一個 npm 上的小項(xiàng)目。使用 $ vue add 命令去執(zhí)行下載插件包瞄勾,并且調(diào)用插件包去修改 Webpack 配置并執(zhí)行一些 command 命令。add 行為可以拆開為兩部 —— 安裝和調(diào)用进陡,以 @vue/cli-plugin-eslint 為例:

npm install @vue/cli-plugin-eslint --save-dev
vue invoke  @vue/eslint

我們也可以自行開發(fā) vue 插件,具體請看文檔趾疚。
簡單說下插件安裝
注意安裝插件是有簡寫的,到安裝的時候會補(bǔ)全插件名稱糙麦。簡寫方式如下:

# 簡寫
vue add @vue/eslint
# 全名
vue add @vue/cli-plugin-eslint

# 簡寫
vue add apollo
# 全名
vue add vue-cli-plugin-apollo

而 router 和 vuex 插件比較特殊,它沒有相應(yīng)的插件赡磅,所以使用 add 的形式有所不同。

vue add router
vue add vuex

以上兩個命令會為項(xiàng)目安裝 vue-router 和 vuex焚廊,并且改變項(xiàng)目目錄結(jié)構(gòu)以便更快的進(jìn)行路由和狀態(tài)管理的開發(fā)操作。

vue cli 的插件在哪里找咆瘟?都有哪些官方插件?源碼在哪里袒餐?

其實(shí)這些插件是放在了 npm 中的须肆,和其他模塊類似。下面是從尤大的npm中找到的插件包:

這些插件項(xiàng)目源碼都包含在 vue-cli 項(xiàng)目中泄隔。
所以拒贱,插件包這東西得從 npm 找佛嬉,或者自己寫插件!

vue cli 搭建的項(xiàng)目中如何配置 sass暖呕、stylus?

Work with CSS中已有答案湾揽,在項(xiàng)目中調(diào)用:

# Sass
npm install -D sass-loader node-sass

# Less
npm install -D less-loader less

# Stylus
npm install -D stylus-loader stylus

即可實(shí)現(xiàn)對 stylus 這類 CSS 語法的支持。

vue cli 的 vue.config.js 具體能做什么库物?

用新的腳手架搭建的項(xiàng)目少了 webpack.config.js 文件和其他一些配置文件,那么我們?nèi)绾涡薷南嚓P(guān)的配置呢戚揭?答案就是 vue.config.js。vue.config.js 可以配置項(xiàng)如下:

  • baseUrl —— 域名民晒,可根據(jù)環(huán)境變量來配置不同域名。
  • outputDir —— 項(xiàng)目導(dǎo)出文件夾
  • assetsDir —— 靜態(tài)資源文件夾
  • pages —— 多頁應(yīng)用中配置各個頁面入口文件
  • lintOnSave —— eslint 是否在保存行為的時候檢查代碼潜必。默認(rèn)為 warning,如果配置為 error 則有錯誤直接報 eslint 錯誤刮便。
  • runtimeCompiler —— 是否使用 runtime 版本的 vue 文件绽慈。設(shè)為 true 可以使用 template 配置項(xiàng)目恨旱。
  • transpileDependencies —— 用于修改 babel 配置
  • productionSourceMap —— 如果不需要產(chǎn)品的 source map坝疼,設(shè)為 false 可以加速構(gòu)建。
  • configWebpack —— 用于配置 Webpack钝凶,將與默認(rèn)的 Webpack 配置合并唁影。
  • chainWebpack —— Webpack鏈,用于配置 loader rules 和 plugins
  • css.modules —— css 模塊化
  • css.extract —— 從組件中取出 css
  • css.sourceMap —— 是否需要 css 的 sourceMap据沈,會影響構(gòu)建效果。
  • css.loaderOptions —— 配置 CSS 相關(guān) loader锌介,如 sass-loader、stylus-loader孔祸。
  • devServer —— 開發(fā)服務(wù)器配置
  • devServer.proxy —— 開發(fā)服務(wù)器代理配置
  • parallel —— 是否對 Babel 或 TypeScript 使用 thread-loader
  • pwa —— pwa 配置
  • pluginOptions —— 這是一個不經(jīng)過任何模式驗(yàn)證的對象,因此它可以用于將任意選項(xiàng)傳遞給第三方插件崔慧。比如寫一個 options.pluginOptions.foo 插件配置對象隨時調(diào)用。

如何配置 Webpack惶室?

正如我們上面提到的,使用 vue.config.js 的 configWebpack 和 chainWebpack 來配置 Webpack拇涤。請參考 Working With Webpack
如果想查看 Webpack 具體配置結(jié)果可使用以下命令導(dǎo)出具體配置:

vue inspect > output.js

更多 Webpack 檢查方式在這里

vue cli 的 UI 怎么玩鹅士?

使用命令行啟動 vue ui 項(xiàng)目:

vue ui

啟動腳手架圖形化項(xiàng)目并自動打開 http://localhost:8000 頁面惩坑,在這個頁面中可以進(jìn)行插件安裝掉盅、依賴庫查看以舒、命令執(zhí)行趾痘、全局配置蔓钟、項(xiàng)目導(dǎo)入等操作。很有意思滥沫,值得一玩。

界面詳情

vue-cli 源碼簡單介紹

vue cli 項(xiàng)目內(nèi)容還是很多的兰绣,大概包括了:

  • cli
  • cli service
  • vue plugin
  • utils
  • ui(就是個 Vue 單頁應(yīng)用)
  • eslint config

核心代碼就在 cli 目錄下了~

對于 cmd 行為的定義,源碼中使用了 commander.js 來具體實(shí)現(xiàn)缀辩。并且調(diào)用各種 js 來命令行對應(yīng)的具體功能踪央。

看看 vue add 的具體步驟

async function add (pluginName, options = {}, context = process.cwd()) {
  // 安裝 vue-router 和 vuex
  if (/^(@vue\/)?router$/.test(pluginName)) {
    return addRouter(context)
  }
  if (/^(@vue\/)?vuex$/.test(pluginName)) {
    return addVuex(context)
  }
  
  const packageName = resolvePluginId(pluginName)

  log()
  log(`??  Installing ${chalk.cyan(packageName)}...`)
  log()

  const packageManager = loadOptions().packageManager || (hasProjectYarn(context) ? 'yarn' : 'npm')
  // 安裝插件
  await installPackage(context, packageManager, null, packageName)

  stopSpinner()

  log()
  log(`${chalk.green('?')}  Successfully installed plugin: ${chalk.cyan(packageName)}`)
  log()
  // 獲取插件
  const generatorPath = resolveModule(`${packageName}/generator`, context)
  if (generatorPath) {
    // 調(diào)用插件
    invoke(pluginName, options, context)
  } else {
    log(`Plugin ${packageName} does not have a generator to invoke`)
  }
}

和我在介紹插件時說的一樣瓢阴,add 執(zhí)行了安裝和調(diào)用兩個步驟來添加插件~.
另外比較有意思的是這個 chalk 模塊,可以讓 cmd 打印出不同顏色的 log荣恐。我們在 cmd 中看到五顏六色的命令行就靠它了。

總結(jié)下腳手架項(xiàng)目

看了下源碼募胃,從我的認(rèn)知出發(fā)說下腳手架的具體做法旗唁。

  • 使用 commander.js 來定義命令行痹束。
  • 使用命令行執(zhí)行腳本進(jìn)行相關(guān)操作。
  • 使用 node 的 log 來展示安裝情況祷嘶、進(jìn)度屎媳,甚至是做一些選擇操作论巍。
  • 搭建項(xiàng)目其實(shí)也是從服務(wù)器下載來的模板項(xiàng)目。
  • vue ... 命令本質(zhì)上就是執(zhí)行腳本的行為嘉汰。
  • 腳手架可以使用 npm 和 yarn 幫我們安裝好依賴包。
  • 五顏六色的 log 來自于 chalk 模塊

最后

至此鞋怀,我們了解了 vue-cli 的豐富的各種功能的使用和原理,也簡單介紹了類似這種腳手架的創(chuàng)建形式下次讓我們自己搭個腳手架玩玩

最后打個內(nèi)推廣告

鏈家上海研發(fā)中心招聘前端密似、后端、測試残腌,主要負(fù)責(zé)貝殼找房社區(qū)服務(wù)相關(guān)的開發(fā)工作。
機(jī)會不多抛猫,需要內(nèi)推機(jī)會的請將簡歷發(fā)送至 dingxiaojie001@ke.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邑滨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掖看,更是在濱河造成了極大的恐慌,老刑警劉巖哎壳,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異归榕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刹泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盅蝗,“玉大人,你說我怎么就攤上這事姆蘸。” “怎么了逞敷?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裂问。 經(jīng)常有香客問我,道長牛柒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任戴甩,我火速辦了婚禮,結(jié)果婚禮上甜孤,老公的妹妹穿的比我還像新娘。我一直安慰自己畏腕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布把夸。 她就那樣靜靜地躺著,像睡著了一般恋日。 火紅的嫁衣襯著肌膚如雪膀篮。 梳的紋絲不亂的頭發(fā)上岂膳,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音谈截,去河邊找鬼。 笑死簸喂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喻鳄。 我是一名探鬼主播扼倘,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诽表,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竿奏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤泛啸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后候址,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗仑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稳其。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡既鞠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘱蛋,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布龄恋,位于F島的核電站,受9級特大地震影響篙挽,放射性物質(zhì)發(fā)生泄漏荆萤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一链韭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敞峭,春花似錦、人聲如沸旋讹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞭呕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葫松,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工腋么, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咕娄,地道東北人珊擂。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像未玻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扳剿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容