最近這段時間 ,一直在研究webpack相關的一些知識點,同時,公司正在作兼容ie8的官網,因此藉此,把webpack相關知識點進行總結,同時最終目的是使用webpack4.x從0打造一個兼容ie8的腳手架,這樣之後若是有這樣的兼容瀏覽器的需求,你們就能夠直接像使用vue-cli等腳手架同樣,直接安裝就能夠生成模版文件(雖然可能都2019了,但還有兼容ie8的需求,心裏一萬個....)css
本節,咱們說一下webpack最基礎的6個配置項:vue
- entry入口配置
- output輸出配置
- module
- resolve
- plugin
- devServer
- 三種易混淆知識點
首先,要你們清楚一點:webpack是採用模塊化的思想,全部的文件或者配置都是一個個的模塊,同時全部模塊聯繫在一塊兒,能夠理解爲就是一個簡單的樹狀結構,那麼最頂層的入口是什麼呢?答案就是entry,node
因此,webpack在執行構建的時候,第一步就是找到入口,從入口開始,尋找,遍歷,遞歸解析出全部入口依賴的模塊。react
實例代碼以下:jquery
module.exports = {
entry: {
app: './src/main.js'
},
//還有output,module等其餘配置項
}
複製代碼
咱們來講明一下entry的類型: webpack
固然,除了上面三種靜態類型,咱們還能夠動態配置entry: 即採用箭頭函數動態返回。此處,關於entry, 咱們只須要記住,它有多種配置類型,並且能夠動態配置,能夠爲入口設置別名,具體用法在實際開發中再查便可。web
前面說到entry能夠是一個字符串,數組,也能夠是對象,可是output只是一個對象,裏面包含一系列輸出配置項。面試
module 主要用於配置處理模塊的規則,主要有三點:正則表達式
咱們經過代碼來講明:vue-cli
module: {
rules: [
{
test: /\.js$/,
include: path.resolve(__dirname, 'src'),
//use能夠是普通字符串數組,也能夠是對象數組
use: ['babel-loader?cacheDirectory'],
use: [
{
loader: 'babel-laoder',
options: {
cacheDirectory:true,//
},
enforce: 'post'
}
]
},
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
exclude: path.resolve(__dirname, 'node_modules')
}
{
//對非文本文件採用 file-loader 加載
test: /\ . (gif Ipng Ijpe?g Ieot Iwoff Ittf Isvg Ipdf) $/, use: [’ file-loader ’],
},
//配置更多的其餘loader
]
}
複製代碼
屬性說明:
noParse能夠用於讓webpack忽略哪些沒有采用模塊化的文件,不對這些文件進行編譯處理,這樣作能夠提升構建性能,由於例如一些庫:如jquey自己是沒有采用模塊化標註的,讓webpack去解析這些文件即耗時,也沒什麼意義。
module: {
rules: [],
noParse: /jquery|lodash/,
noParse: (content) => {
return /jquery/.test(content);
}
}
複製代碼
說明:
由於 Webpack 是以模塊化的 JavaScript 文件爲入口的,因此內置了對模塊化 JavaScript 的解析功能,支持 AMO, CornmonJS、 SystemJS、 ES6。 parser 屬性能夠更細粒度地配置 哪些模塊語法被解析、哪些不被解析。同 noParse 配置項的區別在於, parser 能夠精確到 語法層 面,而 noParse 只能控制哪些文件不被解析。
module: {
rules: [
test: /\.js$/,
use: [ ’ babel-loader ’],
parse: [
amd: false, //禁用AMD
commonjs : false , //禁用 CommonJS
system : false, //禁用 SystemJS
harmony: false, //禁用 ES6 import/export
requireinclude: false, // 禁用require.include
requireEnsure: false, // 禁用require.ensure
requireContext: false, // 禁用require.context
browserify: false, //禁用 browserify requireJs : false, //禁用 requirejs: false, //禁用requirejs
]
]
}
複製代碼
說明:
resolve配置webpack如何去尋找模塊所對應的文件, 咱們平時經過import導入的模塊,resolve能夠告訴webpack如何去解析導入的模塊,
resolve: {
alias: {
'components': './src/components/',
'react$': '/path/to/react.js'
}
}
複製代碼
配置之後,咱們就能夠經過:
import Button from 'components/button', 實際上就是 import Button from ' ./src/components/button ' ,
react$只會命中以 react 結尾的導入語句,即只會將 import ’ react ’關鍵 字替換 成 import ’ / path/to/react .min.j s’ 。
咱們可能在導入模塊的時候,都遇到這種狀況,例如 require (’. /data ’); 此時,咱們發現導入的文件實際上是沒有後綴名的,爲何不用寫後綴名呢?緣由就是咱們配置了resolve-extensions 後綴列表。默認是:
resolve : {
extension: ['.js', '.json']
}
複製代碼
也就是說,當遇到 require (’. /data ’)這樣的導入語句時, Webpack會先尋找./ data . js 文件,若是該文件不存在 , 就去尋找 . /data .json 文件,若是還 是找不到,就報錯 。
假如咱們想讓 Webpack優先使用目錄下的 Typescript文件,則能夠這樣配置:
resolve : {
extension: [’.ts’,’.j5 ’,’.json’]
}
複製代碼
resolve.modules 配置 Webpack 去哪些目錄下尋找第三方模塊,默認只會去 node modules 目錄下尋 找 。有時咱們的項目裏會有一些模塊被其餘模塊大量依賴和導入,因爲 其餘模塊 的位置不定,針對不一樣的文件都要計算被導入的模塊文件的相對路徑 ,這個路徑 有時會很長,
例如:就像import’../../../components/button’,這時能夠利用modules 配置項優化 。假如那些被大量導入的模塊都在./ src/components 目錄下,則將 modules配置成、
resolve: {
modules : [’./ src/cornponents ’,' node modules ’] } 複製代碼
此時,咱們就能夠簡單地 經過import ’button ’ 導入 。
注意:請分清modules和alias的區別,modules是用來配置一些公共模塊,這些公共模塊和nodemodules相似,配置之後,咱們就能夠直接引用模塊,前面不須要再加路徑,而alias做用是配置路徑別名,目的是可讓路徑簡化。二者是不同的。
除此以外,還有
plugins 其實包括webpack自己自帶的插件,也有開源的其餘插件,均可以使用,它的做用就是解決loader以外的其餘任何相關構建的事情。
const CommonsChunkPlugin =require ('webpack/lib/optimize/ CommonsChunkPlugin') ;
modules: {
plugins: [
new CommonsChunkPlugin ((
name :’ coπunon ’ ,
chunks: [’a’,’b’] }) ,
}),
//也能夠配置其餘插件
]
}
複製代碼
至此,咱們須要明白:
devServe 主要用於本地開發的時候,配置本地服務的各類特性,下面列舉一些常見的配置項
module,chunk 和 bundle 其實就是同一份邏輯代碼在不一樣轉換場景下的取了三個名字:咱們直接寫出來的是 module,webpack 處理時是 chunk,最後生成瀏覽器能夠直接運行的 bundle。
filename 指列在 entry 中,打包後輸出的文件的名稱。 chunkFilename 指未列在 entry 中,卻又須要被打包出來的文件的名稱。
具體能夠參考: juejin.im/post/5cede8…
經過本節介紹的6個常見的基礎配置項:entry,output,module,plugins, resolve, devServe , 咱們掌握的目標就是要清楚這幾個配置項的基本功能,以及咱們能夠在哪些場景下使用他們便可,不須要去記具體怎麼配,這些在實際開發中若是須要用到再查文檔便可。
接下, 第二節 [webpack 16個常見的實際場景] 咱們將結合具體實際案例,去近一步熟悉和掌握咱們第一節學到的這些配置,敬請期待吧。