初識(shí)webpack

什么是webpack收奔?

webpack官網(wǎng)上這樣介紹webpack——本質(zhì)上掌呜,webpack是一個(gè)用于現(xiàn)代JavaScript應(yīng)用程序的 靜態(tài)模塊打包工具。當(dāng) webpack 處理應(yīng)用程序時(shí)坪哄,它會(huì)在內(nèi)部構(gòu)建一個(gè)依賴圖(如下圖所示)质蕉,此依賴圖對(duì)應(yīng)映射到項(xiàng)目所需的每個(gè)模塊,并生成一個(gè)或多個(gè)bundle翩肌。

image.png

我們可以這樣簡(jiǎn)單概括下:webpack是一個(gè)打包模塊化Javascript的工具模暗,他會(huì)從入口模塊出發(fā),識(shí)別出代碼中的模塊化導(dǎo)入語(yǔ)句摧阅,遞歸的找出入口文件的所有依賴,將入口和其所有依賴打包到一個(gè)單獨(dú)的文件中绷蹲,他是工程化棒卷,自動(dòng)化思想在前端開發(fā)中的提現(xiàn)顾孽。

webpack初體驗(yàn)

1.安裝node環(huán)境

webpack依賴于node環(huán)境,所以安裝webpack前請(qǐng)確保你已安裝node環(huán)境比规,推薦安裝node的最新版本若厚,可以提升webpack的打包速度。

2.安裝webpack

webpack可以局部安裝蜒什,也可以全局安裝测秸。全局安裝webpack會(huì)將你項(xiàng)目中的webpack鎖定到指定版本,造成不同項(xiàng)目因?yàn)橐蕾嚥煌姹径鴮?dǎo)致沖突灾常,構(gòu)建失敗霎冯,所以我們只介紹局部安裝的方式。

  1. 初始化npm配置文件 npm init -y
  2. 安裝核心庫(kù) npm install --save-dev webpack
  3. 安裝命令行工具 npm install --save-dev webpack-cli

3.啟動(dòng)webpack

接下來(lái)我們編寫一段代碼來(lái)看看webpack會(huì)怎樣運(yùn)行钞瀑。

  1. 在工程項(xiàng)目中新建src文件夾沈撞,在src目錄下新增index.js和hello.js

hello.js

export function helloWebpack() {
   return 'hello Webpack'
}

index.js

import { helloWebpack } from './hello';
document.write(helloWebpack())
  1. 在命令行執(zhí)行命令./node_modules/.bin/webpack,執(zhí)行完成后命令行輸出為:
image.png

查看工程項(xiàng)目雕什,可以看到webpack命令執(zhí)行后輸出了文件夾dist缠俺,文件夾下有一個(gè)main.js文件,內(nèi)容為:
(()=>{"use strict";document.write("hello Webpack")})();贷岸。main.js就是webpack根據(jù)我們代碼的入口和模塊依賴打包出來(lái)的代碼壹士。

  1. 在dist文件夾下新建index.html文件,引入main.js,查看運(yùn)行效果
    index.html
<!DOCTYPE html>
<html lang="en">

<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>hello wepack</title>
</head>

<body>
   <script src="./main.js"></script>
</body>

</html>

在瀏覽器打開index.html,瀏覽器視口顯示hello Webpack

image.png

至此我們一個(gè)webpack初體驗(yàn)就完成了偿警。正如官網(wǎng)所說(shuō)躏救,webpack 開箱即用可以無(wú)需使用任何配置文件户敬。webpack 會(huì)假定項(xiàng)目的入口起點(diǎn)為 src/index.js落剪,然后會(huì)在 dist/main.js 輸出結(jié)果。并且在生產(chǎn)環(huán)境開啟壓縮和優(yōu)化尿庐。

webpack基礎(chǔ)配置結(jié)構(gòu)

在上面的webpack初體驗(yàn)中忠怖,我們體驗(yàn)到了webpack開箱即用的快樂,然而通常我們的項(xiàng)目中還需要繼續(xù)擴(kuò)展webpack的能力抄瑟,從而達(dá)到定制化的項(xiàng)目需求凡泣。webpack也為我們提供了默認(rèn)的配置文件,我們可以在項(xiàng)目根目錄下創(chuàng)建一個(gè)webpack.config.js文件皮假,然后再執(zhí)行webpack命令時(shí)鞋拟,webpack會(huì)自動(dòng)使用它。

webpack.config.js配置基礎(chǔ)結(jié)構(gòu)如下:

module.exports = {
    entry: "./src/index.js",  // 打包入口文件
    output: "./dist", //輸出目錄
    mode: "production",  // 打包環(huán)境
    module: {
        rules: [
        //loader模塊處理
        ]
    },  
    plugins: [] //插件配置 
};
  1. entry:指定webpack打包入口文件
    Webpack執(zhí)行構(gòu)建的第一步將從 entry 開始惹资,可抽象理解成輸入
//單入口 SPA贺纲,本質(zhì)是個(gè)字符串 
entry:{
    main: './src/index.js'
}
==相當(dāng)于簡(jiǎn)寫=== entry:"./src/index.js"

//多入口 entry是個(gè)對(duì)象 
entry:{
    index:"./src/index.js",
    login:"./src/login.js" 
}

2.output: 打包轉(zhuǎn)換后的文件輸出到磁盤位置
在 Webpack經(jīng)過(guò)一系列處理并得出最終想要的代碼后輸出結(jié)果。

 
output: {
    filename: "bundle.js",//輸出文件的名稱
    path: path.resolve(__dirname, "dist")//輸出文件到磁盤的目錄褪测,必須是絕對(duì)路徑
},

//多入口的處理 
output: {
    filename: "[name][chunkhash:8].js",//利用占位符猴誊,文件名稱不要重復(fù)
    path: path.resolve(__dirname, "dist")//輸出文件到磁盤的目錄潦刃,必須是絕對(duì)路徑
},

3.mode:用來(lái)指定當(dāng)前的構(gòu)建環(huán)境
有三個(gè)可選項(xiàng):production, development懈叹, none乖杠。默認(rèn)是production。設(shè)置mode可以自動(dòng)觸發(fā)webpack內(nèi)置的函數(shù)澄成,達(dá)到優(yōu)化的效果胧洒。

 
mode: 'development'

//也可以從CLI參數(shù)中傳遞
webpack --mode=development
選項(xiàng) 描述
development 會(huì)將 DefinePlugin 中 process.env.NODE_ENV 的值設(shè)置為 development. 為模塊和 chunk 啟用有效的名。
production 會(huì)將 DefinePlugin 中 process.env.NODE_ENV 的值設(shè)置為 production墨状。為模塊和 chunk 啟用確定性的混淆名稱卫漫,F(xiàn)lagDependencyUsagePlugin,F(xiàn)lagIncludedChunksPlugin歉胶,ModuleConcatenationPlugin汛兜,NoEmitOnErrorsPlugin 和 TerserPlugin 。
none 不默認(rèn)使用任何優(yōu)化選項(xiàng)
  1. loader: 模塊解析通今,或者也叫模塊解析器粥谬。
    用于把模塊原內(nèi)容按照要求轉(zhuǎn)換為新內(nèi)容。webpack默認(rèn)只知道如何處理js和json模塊辫塌,那么其他格式的模塊處理就需要loader來(lái)做漏策。一個(gè)loader只做一件事情

常見的loader如下:

style-loader  //會(huì)把css-loader生成的內(nèi)容,以style掛載到?面的heade部分
css-loader  //分析css模塊之間的關(guān)系臼氨,并合成一個(gè)css
less-loader  // 將less轉(zhuǎn)換為css
sass-loader  // 將sass轉(zhuǎn)換為css
ts-loader  //將Ts轉(zhuǎn)換成js 
babel-loader  //轉(zhuǎn)換ES6掺喻、7等js新特性語(yǔ)法 
file-loader  //處理圖片子圖 
eslint-loader  //eslint
...
  1. module: 模塊,在 Webpack里一切皆模塊储矩,一個(gè)模塊對(duì)應(yīng)著一個(gè)文件感耙。Webpack會(huì)從配置的 Entry 開始遞歸找 出所有依賴的模塊。當(dāng)webpack處理到不認(rèn)識(shí)的模塊時(shí)持隧,需要在webpack中的module處進(jìn)行配置即硼,當(dāng)檢測(cè)到是什么格式的 模塊,使用什么loader來(lái)處理屡拨。
 
module:{
  rules:[
    {
        test:/\.xxx$/,  //指定匹配規(guī)則 
        use:{
            loader: 'xxx-load' //指定使用的loader 
        }
    }
  ] 
}

6.plugins: webpack的擴(kuò)展插件

  • plugins作用于webpack打包整個(gè)過(guò)程
  • webpack的打包過(guò)程是有(生命周期概念)鉤子只酥。
    plugin 可以在webpack運(yùn)行到某個(gè)階段的時(shí)候,幫你做一些事情呀狼,類似于生命周期的概念 擴(kuò)展插件裂允,在 Webpack 構(gòu)建流程中的特定時(shí)機(jī)注入擴(kuò)展邏輯來(lái)改變構(gòu)建結(jié)果或做你想要的事情。作用于整個(gè)構(gòu)建過(guò)程哥艇。

總結(jié)

在webpack系列專欄《帶你從零構(gòu)建webpack知識(shí)體系》的第一片中介紹了webpack的安裝及基礎(chǔ)配置绝编,下節(jié)我們將一起通過(guò)實(shí)踐這些配置,來(lái)進(jìn)一步學(xué)習(xí)webpack。

webpack專欄相關(guān)代碼地址:https://github.com/wanganni1014/zl-webpack.git 切換到對(duì)應(yīng)分支即可十饥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怎棱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绷跑,更是在濱河造成了極大的恐慌,老刑警劉巖凡资,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砸捏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隙赁,警方通過(guò)查閱死者的電腦和手機(jī)垦藏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伞访,“玉大人掂骏,你說(shuō)我怎么就攤上這事『裰溃” “怎么了弟灼?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)冒黑。 經(jīng)常有香客問我田绑,道長(zhǎng),這世上最難降的妖魔是什么抡爹? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任掩驱,我火速辦了婚禮,結(jié)果婚禮上冬竟,老公的妹妹穿的比我還像新娘欧穴。我一直安慰自己,他們只是感情好泵殴,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布涮帘。 她就那樣靜靜地躺著,像睡著了一般袋狞。 火紅的嫁衣襯著肌膚如雪焚辅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天苟鸯,我揣著相機(jī)與錄音同蜻,去河邊找鬼。 笑死早处,一個(gè)胖子當(dāng)著我的面吹牛湾蔓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砌梆,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼默责,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贬循!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桃序,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杖虾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后媒熊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奇适,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年芦鳍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚷往。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柠衅,死狀恐怖皮仁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菲宴,我是刑警寧澤贷祈,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站喝峦,受9級(jí)特大地震影響付燥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愈犹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一键科、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漩怎,春花似錦勋颖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叁执,卻和暖如春茄厘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈宛。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工次哈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吆录。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓窑滞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哀卫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 工作目錄 接下來(lái)創(chuàng)建 /src 目錄巨坊、 /src/index.js 文件 在使用vue-cli、react-cli...
    聯(lián)旺閱讀 398評(píng)論 0 0
  • webpack初識(shí) webpack是什么此改? 前端資源加載/打包工具趾撵。根據(jù)模塊的依賴關(guān)系進(jìn)行靜態(tài)分析,將模塊按照指定...
    佛系少女不佛系閱讀 266評(píng)論 0 0
  • 為什么需要構(gòu)建工具共啃? 瀏覽器的支持情況尚不統(tǒng)一 使用構(gòu)建工具可以幫助我們 1.轉(zhuǎn)換ES6語(yǔ)法2.轉(zhuǎn)換JSX3.cs...
    fallfilm閱讀 243評(píng)論 0 1
  • 前言 本人也是剛開始學(xué)習(xí)webpack的小白勋磕,之前在平時(shí)的工作中也只是知道一些簡(jiǎn)單常規(guī)的配置,沒有一個(gè)深入和具體的...
    防御塔保安閱讀 553評(píng)論 1 15
  • 使用SASS敢靡、Babel命令行 工程化:我們需要對(duì)之前沒有任何分工的代碼進(jìn)行自動(dòng)化挂滓,模塊化以及性能優(yōu)化 我們之前寫...
    MrTon_1965閱讀 248評(píng)論 0 0