關於版本,咱們講述的是 webpack 4.0 版本javascript
我但願你們在用 webpack 前,要搞清楚,咱們爲何要用 webpack ,它存在的意義是什麼?css
webpack 能夠把它理解爲一款工具,一款幫助咱們打包的工具,也能夠稱之爲前端構建工具。html
簡單來講 webpack 作的事情就是將一些特別複雜且瀏覽器沒法識別東西,經過 webpack 編譯、打包後,生成了瀏覽器能夠識別的靜態資源。前端
webpack 都能作哪些事情,舉幾個栗子:java
咱們須要作的就是在配置文件中寫好配置,而後剩下的工做 webpack 會幫咱們自動處理。node
在使用 webpack 前,咱們須要安裝 Node.js
與 npm
,webpack 是基於node
編寫的,而npm
則用來安裝依賴。jquery
在安裝開始前,我先說兩個文件,以及它們的做用。webpack
在安裝 webpack 前,咱們須要初始化一個 package.json 文件,它是項目的描述文件,它的內容是一個json
對象。es6
例如:web
package.json 能夠手工編寫,也能夠用npm
命令自動生成。
{
//項目名稱
"name": "chom",
//版本號
"version": "1.0.4",
//項目描述
"description": "前端基礎工具庫",
//入口文件
"main": "dist/chom.min.js",
//依賴模塊,生產模式
"dependencies": {},
//項目開發所須要的模塊,以及版本,開發模式
"devDependencies": {
"@babel/cli": "^7.7.4",
"@babel/core": "^7.7.4",
"babel-loader": "^8.0.6",
"eslint": "^6.7.1",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10"
},
//npm 命令行縮寫
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
//好比 npm run build
"build": "webpack --config build/webpack.config.js",
"lint": "eslint src/**"
},
//做者
"author": "Zhangwenqiang",
//項目許可證
"license": "ISC"
}
複製代碼
webpack 默認會讀取 webpack.config.js 文件的配置信息,能夠在webpack 源碼中修改默認文件名,也能夠按環境區分將webpack.config.js 拆分紅多個文件,例如:webpack.base.js 、webpack.dev.js 、webpack.prod.js
在瞭解 webpack 使用配置時,咱們必須首先要熟悉 webpack 中幾個的核心概念。
在 webpack 中有兩種常見的模式,一種是 development
(開發模式),一種是 production
(生產模式)
module.exports = {
mode: 'development'
}
複製代碼
entry
是 webpack 的入口文件
// 單個入口文件的簡寫語法
module.exports = {
entry: './src/index.js' // entry 屬性指定入口文件路徑
};
複製代碼
output
是 webpack 打包以後輸出的文件
// 單個入口文件的簡寫語法
module.exports = {
entry: './src/index.js',
output: { // output 屬性指定打包以後的文件放在什麼位置
// filename 屬性指定輸出文件的文件名稱
filename: 'bundle.js',
// path 屬性指定輸出目錄的絕對路徑
path: '/dist'
}
};
複製代碼
loader
用於對模塊的源代碼進行轉換
由於 webpack 只能理解 JavaScript
,因此須要 loader
將其它類型的文件轉化爲 webpack 可以處理的有效模塊
不一樣的 loader
完成不一樣的任務,下面的例子指定使用 css-loader
處理 CSS
文件
npm install --save-dev css-loader
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: 'css-loader' }
]
}
};
複製代碼
plugin
用於處理一些拓展任務,從打包優化和壓縮,一直到從新定義環境中的變量
// 在打包過程當中會使用UglifyJsPlugin這個插件來對代碼進行一些壓縮整理等
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.optimize.UglifyJsPlugin()
]
}
複製代碼
具體的安裝流程 webpack的安裝和配置 .
大概流程是下載node.js
,初始化項目,安裝 webpack 與 webpack-cli
這裏我會介紹一些 webpack 經常使用插件的概念以及爲何要使用這些插件。
簡單來講 html-webpack-plugin 的基本做用就是生成html
文件。
前面提到過,webpack 默認只能處理 javascript
文件,顯然咱們的項目中不可能只存在js
文件,咱們須要 webpack 將html
也進行打包處理,這個時候就須要用到 html-webpack-plugin
html-webpack-plugin 還有一個重要的做用是會將html
文件中引入的外部資源,自動建立一個正確的路徑。
例如a.html
引入了 a.js
,但經過 webpack 打包會把a.js
與其餘js
文件進行打包,而a.html
引入的路徑已經失效,此時 html-webpack-plugin 會自動將a.html
引入的文件路徑修改爲已經打包後的文件路徑。
具體的使用方法 html-webpack-plugin的使用
webpack 處理css
文件通常須要用到 css-loader
與 style-loader
css-loader
的做用是解析css
中的import
、url
、require
之類的語法,幫咱們分析出各個css
文件之間的關係,把各個css文件合併成一段css
style-loader
的做用是將css-loader
生成的css
代碼掛載到頁面的header
部分,見下圖:
若是項目中用到了scss
或者less
,都須要安裝想對應的loader
,具體的使用方法 webpack 打包樣式
爲何要處理es6
語法?
es6
語法並非全部瀏覽器都支持、都能運行,一些瀏覽器若是不支持那麼就會報錯,致使用戶體驗很是糟糕,這個時候咱們就須要使用babel
來將es6
語法處理成es5
語法,好比箭頭函數
、map()
等語法特性,轉換成瀏覽器可以識別的,低級的JS
語法,就能夠解決這個問題。
關於es6
的兼容性,大概是這個樣子滴:
Chrome 51
版起即可以支持 97%
的 ES6
新特性。Firefox 53
版起即可以支持 97%
的 ES6
新特性。Safari 10
版起即可以支持 99%
的 ES6
新特性。IE Edge 15
能夠支持 96%
的 ES6
新特性。Edge 14
能夠支持 93%
的 ES6
新特性。(IE7~11
基本不支持ES6
)win10
以後的瀏覽器是edge
。以前的是IE
。具體的使用方法 webpack編譯ES6
提到js語法校驗,不得不提到 eslint
eslint
是什麼?爲何咱們要在項目中使用 eslint
eslint
是一個語法規則和代碼風格的檢查工具
它能夠檢測咱們編寫的代碼,給代碼一個規範,項目中的代碼必須按照這個規範編寫
統一代碼規範對咱們有哪些好處?
具體使用的方法 webpack引入eslint詳解
作項目時咱們可能會遇到這種場景:一個變量不少文件中都會用到,這變量多是第三方包(好比 Jquery
),也多是本身定義的一個工具類。
這種狀況咱們怎麼辦?難道要在全部頁面中都引用這個變量嗎?答案是否認的,這樣會形成項目的維護成本很高。
那麼咱們該如何高效便捷的引入全局變量呢,其實有兩種方式。
window
對象 成爲全局變量這裏要注意一下,webpack 是一個工具,在這個工具裏面,有一個同名的模塊,叫作 webpack,咱們就用這個模塊給每個頁面或者組件注入一個對象。
//以jquery爲例
let Webpack = require('webpack') // 引入webpack模塊
module.exports = {
plugins: [ // 這是一個插件,因此要在plugins屬性中配置
new Webpack.ProvidePlugin({
$: 'jquery'
})
],
}
複製代碼
這樣咱們直接就能夠在頁面或組件中直接使用jquery
,例如:
console.log($)
複製代碼
第二種方法,我在這裏就不闡述了,感興趣的同窗能夠自行搜索,我我的仍是比較喜歡用第一種方法的(主要是懶,有點寫不動了)。
webpack 在處理圖片上一般會使用 file-loader
、url-loader
file-loader
的做用
file-loader
能夠用來幫助 webpack 打包處理 png
jpg
jepg
等格式的圖片;
file-loader
打包圖片會生成一個hash
值做爲圖片的名字;
url-loader
的做用
url-loader
能夠將圖片轉換成base64
的圖片格式,能夠減小網站的http
請求,可是如果相同圖片被引用屢次,每一次都轉換成base64
,會形成js
性能損耗,所以是將圖片資源轉換爲base64
仍是採用 http
的方式,要看圖片具體的使用方式了。
這裏要注意一下,url-loader
內部封裝了file-loader
,url-loader
不依賴於file-loader
,即便用url-loader
時,只須要安裝url-loader
便可,不須要安裝file-loader
。
在使用 webpack 打包時,可能要將css
歸類到css
目錄下,img
歸類到img
目錄下,咱們也可能會在引用資源的時候加上域名前綴,這時候就用到了咱們的打包文件分類。
給圖片歸類到img
目錄下
rules:[
{
test:/\.(png|jpg|gif)$/,
use:{
loader:'url-loader',
options:{ limit:2,//200k,小於200k使用base64來轉換
outputPath:'/img/'//大於上面的limit的圖片就會生成到dist下的img文件夾下,同時全部路徑都會加上這個img/
}
}
}
]
複製代碼
給css
歸類到css
目錄下
plugins:[
new MiniCssExtractPlugin({
filename:'/css/[name].[chunkhash:8].css',//抽離出來的css的文件名稱,並在dist下生成css文件夾,將該文件放到該css目錄下,引入的時候會自動加上/css/
})
]
複製代碼
對全部輸出資源加域名前綴,在引用的資源前,統一加上這個額publicPath
,好比打包後的css
路徑是 /css/main.css
,那麼引用的時候就會成爲publicPath
值+ /css/main.css
output:{
filename:'bundle.[hash:8].js',
path:path.resolve(__dirname,'./dist'),
publicPath:'http://www.yuhua.com',//在引用的資源前,統一加上這個額publicPath,好比打包後的css路徑是css/main.css,那麼引用的時候就會成爲publicPath值+'css/main.css'
},
複製代碼
文章斷斷續續大概用了兩週左右完成的,全當是本身對 webpack 知識點的複習與總結了,在這裏吐槽一句(寫文章真的很累),後續會更新 webpack 核心配置篇、webpack 性能優化篇.
感謝看到這篇文章的你,煩請幫忙爲個人文章點幾個贊同,讓更多須要的朋友看到,很是感謝。
已工做的,祝您工做順利,事業有成!還在學習的,祝您一切順利,學業有成!