你們好,本人名叫蘇日儷格,如今不少的項目都使用了webpack,如今最火的也就是vue和webpack結合來完善一個項目,因爲介入了一個有幾年歷史的產品,第一步不得不看看webpack的配置項,看看項目中的哪些部分被模塊化了,由於想要更多的理解webpack,查找了一些資料看了不少教程和API,測試了一個沒有使用vue腳手架的項目(ps:強烈建議新手務必遠離vue-cli,這東西是給有不少年開發經驗的老手來提升開發效率的,並不適合學習),下面我會把我對webpack的理解跟你們分享一下,本文純屬我的理解,有哪裏不對的地方請在評論區指出,你們一塊兒學習共同進步。javascript
聽到webpack這個詞,就會有不少人也包括我都會想到gulp,認爲兩者都是自動化構建工具;其實不是這樣的,在這裏我先介紹兩者的異同:css
webpack特色html
- Webpack 有兩種組織模塊依賴的方式,同步和異步。異步依賴做爲分割點,造成一個新的塊。在優化了依賴樹後,每個異步區塊都做爲一個文件被打包。
- Webpack 自己只能處理原生的 JavaScript 模塊,可是 loader 轉換器能夠將各類類型的資源轉換成 JavaScript 模塊。這樣,任何資源均可以成爲 Webpack 能夠處理的模塊。
- Webpack 有一個智能解析器,幾乎能夠處理任何第三方庫,不管它們的模塊形式是 CommonJS、 AMD 仍是普通的 JS 文件。甚至在加載依賴的時候,容許使用動態表達式 require(「./templates/」 + name + 「.jade」)。
- Webpack 還有一個功能豐富的插件系統。大多數內容功能都是基於這個插件系統運行的,還能夠開發和使用開源的 Webpack 插件,來知足各式各樣的需求。
- Webpack 使用異步 I/O 和多級緩存提升運行效率,這使得 Webpack 可以以使人難以置信的速度快速增量編譯。
在這裏不得不說一下:
webpack、gulp和grunt都是在nodeJs的環境下運行的,而在中大型項目或產品中,nodeJs通常用作中間層,作數據處理和轉發,而後再由底層語言進行底層開發,好比咱們公司的產品就是這種架構,C++做爲底層系統的開發;vue
看了上面的內容,咱們雖然知道了它在項目中用到的好處,但是咱們沒有見過,沒有真憑實據,能夠參考一下這個項目的demo(https://segmentfault.com/a/1190000012848772),一步一步讓你的項目愈來愈快;那麼webpack具體怎麼用的呢?下面就來逐步介紹一下,爲了你們能學到,我這裏新建一個項目作示範:java
npm init
來初始化工程,一路回車下來會有一個package.json配置文件生成npm i vue
安裝上vuenpm i webpack vue-loader -D
安裝webpack和vue-loadernpm i style-loader css-loader url-loader file-loader vue-template-compiler -D
npm i webpack-cli -D
以上四步安裝完是這個效果:node
app.vue文件:react
<template> <div id="app"></div> </template> <script type="text/javascript"> export default { } </script> <style> </style>
index.js文件:webpack
import Vue from 'vue'; import App from './app.vue'; import './assets/style/test.css'; var vm = new Vue({ el: '#app', render: (h) => h(App) // 經過建立DOM元素返回參數h將App掛載,h即爲hyperscript,用來實現虛擬DOM的 });
webpack.config.js文件:git
const Path = require('path'); // 從node上導入path const VueLoaderPlugin = require('vue-loader/lib/plugin'); // webpack 4版本以後加的,以前的版本不須要這個 let config = { entry: Path.resolve(__dirname, './src/index.js'), // 以join拼接path的形式配置絕對路徑,相對路徑打包後找不到會報錯 output: { filename: 'vendor.build.js', path: Path.join(__dirname, 'dist') }, module: { rules: [{ test: /\.vue$/, loader: 'vue-loader' }, { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.(png|jpg|jpeg|gif)$/, use: { loader: 'url-loader', options: { limit: 1024, // 判斷圖片的大小 若是小於1024就會轉換成base64 name: '[name].[ext]' // 輸出圖片的名字 ext是擴展名 } } }] }, plugins: [ new VueLoaderPlugin() ] }; module.exports = config;
上面配置好了以後還差最後一步,就是用webpack來執行配置跑項目,在scripts裏面加上build:github
"build": "webpack --config webpack.config.js"
npm run build
來打包項目到dist下面的vendor.build.js:這個時候會看到咱們的項目中多了個dist,就是咱們打包好的項目,這一步就省去了咱們不少的http請求,達到更優化的效果。
在打包這一過程當中,若是出現了打包失敗,檢查完問題後再次打包,若是顯示的是打包失敗,那麼請刪了以前打的包,從新build就會好了
npm i webpack-dev-server
,再往scripts裏面加上這個"dev": "webpack-dev-server --config webpack.config.js"
:咱們會看到有兩個webpack.config.js,可是咱們如今安裝的是咱們開發環境須要用到的,接下來增長一些開發模式須要用到的webpack的配置,這些配置我會逐步分析:
target: 'web',
放在全局的webpack的配置裏面npm i cross-env
,在打包和運行以前都加上環境變量標識:"build": "cross-env NODE_ENV=production webpack --config webpack.config.js", "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js",
我的習慣:喜歡運行start,因此把run dev替換掉了:"start": "npm run dev"
效果以下:
首先用一個變量表明是開發環境:const isDev = process.env.NODE_ENV === 'development';
在package.json scripts裏面設置的生產和開發環境的環境變量都存在於cross-dev,咱們設置腳本的時候啓動的環境變量全都存在於process.env裏面,這樣咱們在以後能夠隨意調用它
而後在最下面給module.exports賦值以前,加個判斷:
if (isDev) { config.devServer = { port: 8088, // webpack服務須要監聽的端口號 host: '0.0.0.0', // 能夠經過本機內網ip訪問,這樣別人也能夠訪問,手機也可訪問,若是設置成localhost則否則 overlay: { errors: true // 這個無關緊要,webpack編譯出現的錯誤會出如今網頁中,便於更改 } }; }
上述代碼中的配置項咱們在webpack官網中均可以看獲得,每一步的緣由我已在後面加了相關注釋。
const Webpack = require('webpack');
用法和以前的同樣,全部的插件都是須要引入並建立實例這一過程;下面根據以前配置好的環境變量在webpack編譯的過程當中,對寫的js代碼都會判斷環境,根據不一樣環境對代碼進行打包(咱們只想要"development",因此外面會加上單引號),代碼以下:
new Webpack.DefinePlugin({ 'process-env': { NODE_ENV: isDev ? '"development"' : '"production"' } })
webpack有個支持熱加載功能的插件HotModuleReplacementPlugin,再經過vue-loader讀取vue的組件,在devServer裏面配置一個hot: true
,就造成了熱加載;
還一個是映射工具devtool,使用source-map作映射,將咱們壓縮文件中的代碼映射回源文件中的原始位置的方法,更輕鬆調試,谷歌和火狐都已經支持,文件大效率低,致使webpack編譯慢,而eval解析出來的會很亂,二合一是webpack提出來的有效的方法;
在CLI下的devServer下還有一個compress是用在全部服務端gzip 壓縮,這個在Yahoo雅虎軍規上有提到;
更多的好用的插件就去webpack官網瞭解吧
若是是本身建的html的小夥伴就能夠在html-webpack-plugin裏面配置它,以後再把帶有id是app的div放進html裏面,在app.vue裏面渲染的dom就會生成在html中:
用完了這個webpack我感受棒極了,之後項目必備品!
參考☟☟☟:
https://blog.csdn.net/c_kite/article/details/71279853
http://www.javashuo.com/article/p-ndhculqd-gw.html
http://www.javashuo.com/article/p-bovvnnty-gt.html
webpack官網
**若是喜歡本文的話單擊愛心加關注謝謝O(∩_∩)O~**
本文的全部內容均是一字一句敲上去的,但願你們閱讀完本文能夠有所收穫,由於能力有限,掌握的知識也是不夠全面,歡迎你們提出來一塊兒分享!謝謝O(∩_∩)O~
歡迎來個人GitHub,喜歡的能夠star,項目隨意fork,支持轉載但要下標註,同時恭候:個人簡書 Resume