前端領域框架百花齊放,各類優秀框架出現(react,Vue,ag)等等框架。爲了方便開發者快速開發, 開發對應的 cli 腳手架,來提升產出。然而初中級的前端工程師對項目裏的 webpack 封裝和配置瞭解的不清楚,就容易致使出問題不知如何解決,甚至不會經過 webpack 去擴展新功能,對 webpack + vue 項目到底是怎樣搭建起來的感到一臉困惑,下面咱們就來解決這個問題,揭開 webpack 構建 vue 的面紗。css
酷炫動畫的頁面,高度複雜的頁面功能,頁面內容支持預加載(圖片、骨架屏) ,這些高要求致使了項目的增長更多的代碼。代碼的增多,使得由來代碼須要被組織的需求,由此產生了模塊化。html
模塊化的發展歷程前端
傳統的 <script> 標籤,一個標籤加載一個 js 文件。缺點就是全局變量太多,容易出現衝突,另外依賴順序很重要,太多 js 很差管理 。後面出現了 node.js,有了 CommonJS 規範(同步的 require 請求),即一個模塊是一個文件,想用誰直接 require 誰,想被誰用,就 module.exports 導出去。vue
雖然服務端使用起來方便,可是瀏覽器經過網絡請求獲取文件是異步的,因此出現了矛盾。爲了解決 CommonJS 規範的缺陷,AMD 規範(異步的 require 請求)出現了,知足異步的網絡請求,能夠並行加載多個文件 ES6 modules,ES6 中自帶對應的模塊語法 input/exports,靜態分析容易。但瀏覽器支持度不夠,模塊較少。爲此 webpack 出現解決上述遇到的問題。node
Webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。在 webpack 中全部的文件都將被當作模塊使用,當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序須要的每一個模塊,而後將全部這些模塊打包成一個或多個bundle 。舉例:把你的項目當作一個總體,經過一個給定的主文件(如:mian.js), webpack 將這個文件開始找到你項目的因此依賴文件,使用 loaders 或者是 plugins 去處理它們,最後打包成一個(或者多個)瀏覽器能夠識別的 JavaScript 文件。react
先來看看 webpack 的 3 個優勢:jquery
也不能忽視它的下列缺點:webpack
Webpack 的構建流程是一種事件流機制。整個構建流程能夠當作是一個流水線,每一個環節負責單一的任務,處理完將進入下一個環節。web
Webpack 會在每一個環節上發佈事件,供內置的和自定義的插件有機會干預 Webpack 的構建過程,控制 Webpack 的構建結果json
初始化參數:從配置文件和 Shell 語句中讀取與合併參數,得出最終的參數。
開始編譯:用上一步獲得的參數初始化 Compiler 對象,加載全部配置的插件,執行對象的 run 方法開始執行編譯。 肯定入口:根據配置中的 entry 找出全部的入口文件。
編譯模塊:從入口文件出發,調用全部配置的 Loader 對模塊進行翻譯,再找出該模塊依賴的模塊,再遞歸本步驟直到全部入口依賴的文件都通過了本步驟的處理。
完成模塊編譯:在通過第 4 步使用 Loader 翻譯完全部模塊後,獲得了每一個模塊被翻譯後的最終內容以及它們之間的依賴關係。
輸出資源:根據入口和模塊之間的依賴關係,組裝成一個個包含多個模塊的 Chunk,再把每一個 Chunk 轉換成一個單獨的文件加入到輸出列表,這步是能夠修改輸出內容的最後機會。
輸出完成:在肯定好輸出內容後,根據配置肯定輸出的路徑和文件名,把文件內容寫入到文件系統。
熟悉了 webpack 基本的構建流程那下面咱們就進行實踐操做構建 vue 項目
安裝 webpack
使用版本:webpack5.x
新建 webpack-vue 項目,進入項目根目錄,建立默認的 package.json
安裝 webpack 和 webpack-cli:
新建 src/main.js,裏面隨便寫點 console.log('hello,webpack-vue')
result:
基礎配置
新建一個 build 文件夾,新建一個 vue.config.js
Entry
入口文件,webpack會首先從這裏開始編譯
Output
定義了打包後輸出的位置,以及對應的文件名。[name]是一個佔位符
result:
plugins
當咱們構建項目時生成了 main.js 以後,須要一個 HTML 頁面去展現,而後再 HTML 引入 JavaScript,當咱們配置打包輸出的 bundle 文件都配置了隨機 hash 值,每次手動插入和下一次更新就特麻煩,最好方法是每次構建完成後自動將新的bundle 打包到 HTML 中並刪除上一次舊的 bunble,因此咱們須要 html-webpack-plugin 、clean-webpack-plugin 插件來幫咱們自動引入和刪除歷史 bundle 文件
根目錄新建一個 public/index.html 默認模板
配置 vue.config.js
result:
loaders
webpack 識別 css、sass 安裝 loader,並將解析後的 css 插入到 index.html 裏面的 style
result:
識別壓縮圖片、字體
webpack 識別圖片、視頻、字體、減小圖片字體等打包的大小。咱們可使用 url-loader 將少於指定大小的文件轉換爲 base64,使用 file-loader 將大於指定大小的文件移動到指定的位置
Babel
Babel 是一個 JavaScript 編譯器,能將 ES6 + 代碼轉爲 ES5 代碼,讓你使用最新的語言特性而不用擔憂兼容性問題,
在 Babel 執行編譯的過程當中,會從項目根目錄下的配置文件讀取配置。在根目錄下建立Babel的配置文件 .babelrc
兼容 vue
src文件夾內新建一個APP.vue,內容自定義
熱更新 HMR
配置 package.json
package.json:"dev":"webpack serve --config build/vue.config.js"
result: