來聊聊 Vue CLI 3

Vue CLI 3

https://cli.vuejs.org/zh/guide/

Vue CLI 是一個基于 Vue.js 進行快速開發的完整系統,提供:

  • 通過 @vue/cli 搭建交互式的項目腳手架。

  • 通過 @vue/cli + @vue/cli-service-global 快速開始零配置原型開發。

  • 一個運行時依賴 (@vue/cli-service),該依賴:

    1. 可升級;
      基于 webpack 構建,并帶有合理的默認配置;
    2. 可以通過項目內的配置文件進行配置;也就是我們的 vue.config.js,vue/config.js 創建
    3. 可以通過插件進行擴展。
  • 一個豐富的官方插件集合,集成了前端生態中最好的工具。

  • 一套完全圖形化的創建和管理 Vue.js 項目的用戶界面。

Vue CLI 致力于將 Vue 生態中的工具基礎標準化。它確保了各種構建工具能夠基于智能的默認配置即可平穩銜接,這樣你可以專注在撰寫應用上,而不必花好幾天去糾結配置的問題。與此同時,它也為每個工具提供了調整配置的靈活性,無需 eject。

CLI

CLI (@vue/cli) 是一個全局安裝的 npm 包,提供了終端里的 vue 命令。它可以通過 vue create 快速創建一個新項目的腳手架,或者直接通過 vue serve 構建新想法的原型。

你也可以通過 vue ui 通過一套圖形化界面管理你的所有項目。vue ui 擁有一套強大的圖形分析功能可以提供項目優化選項

CLI 服務

CLI 服務 (@vue/cli-service) 是一個開發環境依賴。它是一個 npm 包,局部安裝在每個 @vue/cli 創建的項目中。

CLI 服務是構建于 webpackwebpack-dev-server 之上的。它包含了:

  • 加載其它 CLI 插件的核心服務;
  • 一個針對絕大部分應用優化過的內部的 webpack 配置;
  • 項目內部的 vue-cli-service 命令,提供 serve、buildinspect 命令。

npm run serve 會增加開發環境變量,符合原有的 webpack 開發運行服務策略,不會生成實體 dist 目錄文件、提供熱加載功能已優化開發效率。

npm run build 會增加生產環境變量

CLI 插件

CLI 插件是向你的 Vue 項目提供可選功能的 npm 包,例如 Babel/TypeScript 轉譯、ESLint 集成、單元測試和 end-to-end 測試等。

當你在項目內部運行 vue-cli-service 命令時,它會自動解析并加載 package.json 中列出的所有 CLI 插件。

創建一個項目

命令新建 vue 項目

vue create demo

使用圖形化界面

你也可以通過 vue ui 命令以圖形化界面創建和管理項目

瀏覽器兼容性

browserslist https://github.com/browserslist/browserslist

你會發現有 package.json 文件里的 browserslist 字段 (或一個單獨的 .browserslistrc 文件),指定了項目的目標瀏覽器的范圍。這個值會被 @babel/preset-envAutoprefixer 用來確定需要轉譯的 JavaScript 特性和需要添加的 CSS 瀏覽器前綴。

Polyfill

一個默認的 Vue CLI 項目會使用 @vue/babel-preset-app ,它通過 @babel/preset-envbrowserslist 配置來決定項目需要的 polyfill

Babel https://babeljs.io/

生成的配置內容:

module.exports = {
  presets: [
    '@vue/app',
  ],
  plugins: [
  ]
};

HTML 和靜態資源

public/index.html 文件是一個會被 html-webpack-plugin 處理的模板。在構建過程中,資源鏈接會被自動注入。另外,Vue CLI 也會自動注入 resource hint (preload/prefetchmanifest 和圖標鏈接 (當用到 PWA 插件時) 以及構建過程中處理的 JavaScript 和 CSS 文件的資源鏈接。

插值

因為 index 文件被用作模板,所以你可以使用 lodash template 語法插入內容:

  • <%= VALUE %> 用來做不轉義插值;
  • <%- VALUE %> 用來做 HTML 轉義插值;
  • <% expression %> 用來描述 JavaScript 流程控制。

除了被 html-webpack-plugin 暴露的默認值 之外,所有客戶端環境變量也可以直接使用。

Preload

<link rel="preload"> 是一種 resource hint,用來指定頁面加載后很快會被用到的資源,所以在頁面加載的過程中,我們希望在瀏覽器開始主體渲染之前盡早 preload。

默認情況下,一個 Vue CLI 應用會為所有初始化渲染需要的文件自動生成 preload 提示。

這些提示會被 @vue/preload-webpack-plugin 注入,并且可以通過 chainWebpackconfig.plugin('preload') 進行修改和刪除。

Prefetch

<link rel="prefetch"> 是一種 resource hint,用來告訴瀏覽器在頁面加載完成后,利用空閑時間提前獲取用戶未來可能會訪問的內容。

默認情況下,一個 Vue CLI 應用會為所有作為 async chunk 生成的 JavaScript 文件 (通過動態 import() 按需 code splitting 的產物) 自動生成 prefetch 提示。

這些提示會被 @vue/preload-webpack-plugin 注入,并且可以通過 chainWebpackconfig.plugin('prefetch') 進行修改和刪除。

示例:

// vue.config.js
module.exports = {
  chainWebpack: config => {
    // 移除 prefetch 插件
    config.plugins.delete('prefetch')
 
    // 或者
    // 修改它的選項:
    config.plugin('prefetch').tap(options => {
      options[0].fileBlacklist = options[0].fileBlacklist || []
      options[0].fileBlacklist.push(/myasyncRoute(.)+?\.js$/)
      return options
    })
  }
}

prefetch 插件被禁用時,你可以通過 webpack 的內聯注釋手動選定要提前獲取的代碼區塊:

import(/* webpackPrefetch: true */ './someAsyncComponent.vue')

webpack 的運行時會在父級區塊被加載之后注入 prefetch 鏈接。

提示

Prefetch 鏈接將會消耗帶寬。如果你的應用很大且有很多 async chunk,而用戶主要使用的是對帶寬較敏感的移動端,那么你可能需要關掉 prefetch 鏈接并手動選擇要提前獲取的代碼區塊。

Vue template - lodash https://lodash.com/docs/4.17.10#template

構建一個多頁應用

不是每個應用都需要是一個單頁應用。Vue CLI 支持使用 vue.config.js 中的 pages 選項構建一個多頁面的應用。構建好的應用將會在不同的入口之間高效共享通用的 chunk 以獲得最佳的加載性能。

靜態資源可以通過兩種方式進行處理:

  • 在 JavaScript 被導入或在 template/CSS 中通過相對路徑被引用。這類引用會被 webpack 處理。

  • 放置在 public 目錄下或通過絕對路徑被引用。這類資源將會直接被拷貝,而不會經過 webpack 的處理。

環境變量和模式

你可以替換你的項目根目錄中的下列文件來指定環境變量:

.env                # 在所有的環境中被載入
.env.local          # 在所有的環境中被載入,但會被 git 忽略
.env.[mode]         # 只在指定的模式中被載入
.env.[mode].local   # 只在指定的模式中被載入,但會被 git 忽略

一個環境文件只包含環境變量的“鍵=值”對:

FOO=bar
VUE_APP_SECRET=secret

被載入的變量將會對 vue-cli-service 的所有命令、插件和依賴可用。

模式是 Vue CLI 項目中一個重要的概念。默認情況下,一個 Vue CLI 項目有三個模式:

  • development 模式用于 vue-cli-service serve
  • production 模式用于 vue-cli-service build 和 vue-cli-service test:e2e
  • test 模式用于 vue-cli-service test:unit

只有以 VUE_APP_ 開頭的變量會被 webpack.DefinePlugin 靜態嵌入到客戶端側的包中。你可以在應用的代碼中這樣訪問它們:

console.log(process.env.VUE_APP_SECRET)

除了 VUE_APP_* 變量之外,在你的應用代碼中始終可用的還有兩個特殊的變量:

  • NODE_ENV - 會是 "development"、"production" 或 "test" 中的一個。具體的值取決于應用運行的模式。
  • BASE_URL - 會和 vue.config.js 中的 baseUrl 選項相符,即你的應用會部署到的基礎路徑。

所有解析出來的環境變量都可以在 public/index.html 中以 HTML 插值中介紹的方式使用。

提示

你可以在 vue.config.js 文件中計算環境變量。它們仍然需要以 VUE_APP_ 前綴開頭。這可以用于版本信息 process.env.VUE_APP_VERSION = require('./package.json').version。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容

  • 簡介 vue cli 3 是一個類似于 create-react-app 的可以用例命令行快速配置和生成一個 vu...
    VioletJack閱讀 9,491評論 3 22
  • vue-cli 是 vue 官方團隊推出的一款快速開發 vue 項目的構建工具,具有開箱即用并且提供簡潔的自定義配...
    洛卿九閱讀 4,979評論 0 7
  • 創作于2009年9月17日 風吹散了誰 雨淋濕了誰 我捅了誰一刀 卻自己在流血 風被誰吹散 雨被誰淋濕 我被誰捅了...
    令狐林閱讀 236評論 0 3
  • 落在孔孟之地圣人之鄉,晚風習習,涼意綿綿,入秋的天格外觸目驚心,是一粒綻破的豌豆莢兒,裸露給人們的是神奇和喜悅,它...
    白太狼閱讀 460評論 4 2
  • 前段時間開發一直在使用idea這個工具,從eclipse過度過來還不太習慣,下面是本人自己總結的比較實用的快捷鍵:...
    燃燒星星之火閱讀 2,507評論 0 0