webpack 學習之路

webpack的幾個核心屬性

一饥臂、entry
指定入口文件占贫,webpack將根據(jù)入口文件來建立依賴關系從而進行打包構(gòu)建

entry分為單入口和多入口

單入口
 entry: "./src/main.js",
多入口則以對象的形式
entry:{
    index:"./src/main.js",
    util:"./src/util/index.js",
    ...
}

二记劝、output
打包后的輸出

    output: {
        //所有文件的輸出路徑,__dirname: nodejs的變量,代表當前文件的文件夾目錄
        path: path.resolve(__dirname, "dist"),//絕對路徑
        //最終產(chǎn)物的文件名,可以指定 也可以使用[name]占位 這樣的話就會使用入口文件的名字大猛,多入口的時候必須以占位的形式
        filename: "bundle.js",
        //代碼塊的文件名
        chunkFilename:"[name].chunk.js",
        clean:true //自動刪除上次打包的結(jié)果
    },

三、loader
webpack原生只支持解析js和json文件次哈,而在我們?nèi)粘i_發(fā)中除了這兩種文件還有其他的如 css less scss vue ts jsx 圖片 音視頻等等種類的文件胎署,loader就是用來解析這類文件將他們轉(zhuǎn)成webpack可解析的格式。loader是一個函數(shù) 接收源文件為參數(shù) 最終輸出一個webpack認識的東西窑滞。
下面是一些常見的loader


image.png

webpack本身是單線程的模式去打包構(gòu)建的 thread-loader可以讓webpack多進程打包 從而加快打包速度

loader語法

module: {
        rules: [
    //rules是一個數(shù)組里面可以配置多個loader琼牧,每個對象表示對一個loader的描述
          {
//當前l(fā)oader對哪些文件生效 ,是一個正則匹配規(guī)則
          test:'',
          use:[]
//use里可以放置多個loader哀卫,
//執(zhí)行順序:從右到左或者從下到上巨坊,最末尾的loader最先執(zhí)行
            }
        ]
}

四、Plugins
字面意思就是插件此改。通常一些loader沒辦法完成的事情都可以通過插件來完成趾撵,他主要用于對構(gòu)建產(chǎn)物的優(yōu)化,資源管理以及環(huán)境變量的注入共啃。
注:在整個構(gòu)建環(huán)節(jié)都可以去使用plugins占调,他作用于整個構(gòu)建過程,webpack會在構(gòu)建過程中不停的去廣播一些事件移剪,而plugins可以監(jiān)聽這些事件 從而進行相對應的處理
一些常見的plugins


image.png

五究珊、mode
webpack構(gòu)建模式,有三個可選值
development纵苛,production剿涮,none
設置不同的模式webpack會為你默認啟動一些優(yōu)化選項


image.png

了解完了以上幾個webpack的關鍵點之后 讓我們來做個小小的練習吧言津。
打包構(gòu)建一個vue應用。
基本配置

首先分析一下想要打包vue文件肯定是需要能夠解析vue的loader的取试,這里vue官方就給我們提供了這樣一個loader vue-loader悬槽,下面是官方文檔
https://vue-loader.vuejs.org/zh/guide/#vue-cli
根據(jù)官網(wǎng)的教程,可以得到以下的基本配置

const path = require('path');//nodejs的核心模塊瞬浓,專門用來處理路徑問題
const {VueLoaderPlugin} = require("vue-loader");

module.exports = {
    //入口
    entry: "./src/main.js",//相對路勁
    //輸出
    output: {
        //所有文件的輸出路徑
        //__dirname: nodejs的變量初婆,代表當前文件的文件夾目錄
        path: path.resolve(__dirname, "dist"),//絕對路徑
        //最終產(chǎn)物的文件名,可以指定 也可以使用[name]占位 這樣的話就會使用入口文件的名字瑟蜈,多入口的時候必須以占位的形式
        filename: "bundle.js",
        //代碼塊的文件名
        // chunkFilename:"[name].chunk.js",
        clean:true //自動刪除上次打包的結(jié)果
    },
    //加載器
    module: {
        rules: [
            //loader的配置
            {//通過babel-loader解析es6es7語法轉(zhuǎn)為es5
                test:/\.js$/,
                use:[
                    "babel-loader"
                ]
            },
            {
              //通過vue-loader解析vue文件
              test:/\.vue$/,
                use:[
                    "vue-loader"
                ]
            },
        ]
    },
    //插件
    plugins: [
        //plugin的配置
        new VueLoaderPlugin()
    ],
    //模式
    mode: "development",
    // devtool: "source-map"http://輸出源代碼
}

要注意可不是只用上一個vue-loader就行了哦烟逊,還需要配合VueLoaderPlugin插件才能完成對vue文件的打包渣窜。
接下來我們準備一個入口文件以及一個vue文件作為跟組件铺根。

//main.js
import Home from './vue/Home.vue'
import {createApp} from 'vue'
console.log(createApp,Home,123)
const app = createApp(Home).mount('#app')
console.log(app)


//Home.vue
<template>
<div>{{msg}}</div>
</template>

<script>
import {ref} from "vue";

export default {
  name: "Home",
  setup(){
    const msg = ref('Home test')
    return{
      msg
    }
  }
}
</script>

<style scoped>

</style>
最后在準備一個html文件引入我們打包后的js文件即可
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>hello webpack</div>
<div id="app"></div>
<script src="../dist/bundle.js"></script>
</body>
</html>
注意引入的js的文件要么異步加載要么放在跟標簽后面,不然就會出現(xiàn)vue找不到跟標簽掛在元素了
image.png

這樣就完成了一個簡單的編譯打包vue文件的過程乔宿。

下面看看webpack是如何解析css和字體圖片文件的

首先 解析css 需要用到兩個loader位迂,一個是css-loader用來將css資源編譯成common.js的模塊到js中,第二個 style-loader將js中的css通過創(chuàng)建style標簽的形式添加到html中详瑞,以生效

            {
                test: /\.css$/, //只檢測.css文件
                use: [ //執(zhí)行順序:從右到左或者從下到上掂林,最末尾的loader最先執(zhí)行
                    "style-loader",//將js中的css通過創(chuàng)建style標簽的形式添加到html中,以生效
                    "css-loader", //將css資源編譯成common.js的模塊到js中
                ]
            },

這樣就可以完成對css的解析坝橡。


image.png

打包圖片資源和字體資源
使用到file-loader或者url-loader

            //打包圖片資源
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                use:[
                    {
                        loader: "url-loader",
                        options: {
                            limit:10*1024
                        }
                    }
                ]
            },

這里使用了url-loader泻帮,因為url-loader可以配置將小于多少大小的文件打包成base64,其內(nèi)部也是使用的file-loader计寇,只不過功能做了一些擴展锣杂。
PS:base64格式有利于減少http請求,但是如果文件過大 生成的base64也會特別大番宁。所以只適合讓小文件轉(zhuǎn)成base64格式

接下來去學習webpack中的文件監(jiān)聽元莫。
webpack提供了一個watch屬性當他為true的時候 文件改變就會自動觸發(fā)webpack的重新構(gòu)建,這和我們?nèi)粘i_發(fā)中的熱更新不同蝶押,他只是重新生成了構(gòu)建產(chǎn)物 但是并不會觸發(fā)瀏覽器的刷新踱蠢,所以還需要我們手動刷新瀏覽器。
也可以在webpack運行命令后面加上--watch開啟監(jiān)聽模式

"watch-build": "npx webpack --watch"
這樣執(zhí)行這個命令就可以開啟監(jiān)聽模式

原理分析


image.png

講到了文件監(jiān)聽那就不得不提webpack的熱更新了棋电。熱更新需要用到兩個包
webpack-dev-server和hot-module-replacement-plugin
以下簡稱WDS和HMR
熱更新的原理就是通過WDS啟動一個本地服務器茎截,此時構(gòu)建出的東西就不會輸出實際的文件了 而是會被放到本地的服務器上。然后HMR會在bundle里注入一個HMR runtime赶盔,這個東西是存在于瀏覽器端的企锌,他會和WDS建立一個scoket連接。當有文件被修改的時候會再次經(jīng)過webpack編譯招刨,webpack編譯后就會將最新的代碼發(fā)送至本地服務器上霎俩,本地服務器就會通知runtime runtime再去修改局部的變更哀军。(PS:所以我們在開發(fā)項目式 run dev是看不到dist文件夾的,如果想查看run dev生成了什么東西可以在本地服務端口后面拼上webpack-dev-server即可)打却。


image.png

文件指紋

在webpack中所謂的文件指紋其實就是指打包生成的文件名后的hash值杉适。那這個哈希值有什么用呢。在每次構(gòu)建項目的時候可能只是改動了一兩個文件柳击,如果文件名不發(fā)生變化猿推,那在瀏覽器上是會被緩存下來的,所以用戶沒辦法第一時間看到更新之后的資源捌肴。而如果我們給發(fā)生了變化的文件加上新的哈希值蹬叭,瀏覽器就會去下載最新的。而那些沒發(fā)生變化的則繼續(xù)沿用緩存里的状知。這樣可以極大的利用瀏覽器緩存秽五。


image.png

webpack里得哈希大概分為以上兩種,一般我們打包靜態(tài)文件會選擇Hash 而js則會選擇Chunkhash饥悴,css則是Contenthash坦喘。
用法也很簡單,直接在輸出得文件名里使用占位符即可西设。

 output: {
        //所有文件的輸出路徑
        //__dirname: nodejs的變量瓣铣,代表當前文件的文件夾目錄
        path: path.resolve(__dirname, "dist"),//絕對路徑
        //最終產(chǎn)物的文件名,可以指定 也可以使用[name]占位 這樣的話就會使用入口文件的名字贷揽,多入口的時候必須以占位的形式
        filename: "[name]_[chunkhash:8].js", 這里我們只取前八位就行棠笑,默認是32位
        //代碼塊的文件名
        // chunkFilename:"[name].chunk.js",
        clean:true //自動刪除上次打包的結(jié)果
    },

之前我們得css都是通過style-loader以style標簽得形式插入html,要使用哈希得話我們就得借助另一個loader禽绪,讓css以link標簽得方式引入蓖救。

npm install --save-dev mini-css-extract-plugin

插件文檔:https://webpack.docschina.org/plugins/mini-css-extract-plugin/
具體使用方法看文檔即可

  //使用此插件將css分離出文件通過link引入
        new MiniCssExtractPlugin({
            filename:'[name]_[contenthash:8].css'
        })

代碼壓縮

webpack是自帶了js代碼壓縮的,所以下面主要介紹一下css的壓縮和html的壓縮
css的壓縮主要用到的插件有optimize-css-assets-webpack-plugin以及CssMinimizerPlugin
兩者都是依賴于cssnano的丐一,所以要先安裝一下cssnano藻糖。
使用方法也很簡單,在plugins里new一下就行库车。
html的壓縮需要借助HtmlWebpackPlugin巨柒,配置一下minify對象即可

new HtmlWebpackPlugin({
            filename: 'index.html',
            template: 'public/index.html',
            inject: true,//配置所有js資源放置在html得哪個位置
            minify:{
                //壓縮配置
                collapseWhitespace: true,
                preserveLineBreaks:false,
                html5:true,
                minifyCSS:true,
                minifyJS:true,
                removeComments: true,
            }
        }),

以上就是webpack的基礎入門了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柠衍,隨后出現(xiàn)的幾起案子洋满,更是在濱河造成了極大的恐慌,老刑警劉巖珍坊,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺勾,死亡現(xiàn)場離奇詭異,居然都是意外死亡阵漏,警方通過查閱死者的電腦和手機驻民,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門翻具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人回还,你說我怎么就攤上這事裆泳。” “怎么了柠硕?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵工禾,是天一觀的道長。 經(jīng)常有香客問我蝗柔,道長闻葵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任癣丧,我火速辦了婚禮槽畔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坎缭。我一直安慰自己竟痰,他們只是感情好签钩,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布掏呼。 她就那樣靜靜地躺著,像睡著了一般铅檩。 火紅的嫁衣襯著肌膚如雪憎夷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天昧旨,我揣著相機與錄音拾给,去河邊找鬼。 笑死兔沃,一個胖子當著我的面吹牛蒋得,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乒疏,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼额衙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怕吴?” 一聲冷哼從身側(cè)響起窍侧,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎转绷,沒想到半個月后伟件,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡议经,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年斧账,在試婚紗的時候發(fā)現(xiàn)自己被綠了谴返。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡咧织,死狀恐怖亏镰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拯爽,我是刑警寧澤索抓,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站毯炮,受9級特大地震影響逼肯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桃煎,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一篮幢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧为迈,春花似錦三椿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耿战,卻和暖如春蛋叼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剂陡。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工狈涮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸭栖。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓歌馍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晕鹊。 傳聞我的和親對象是個殘疾皇子松却,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • webpack學習之路 當自己在學習webpack的時候,在網(wǎng)上發(fā)現(xiàn)中文的很詳細的教程很少捏题,于是便想將自己學習we...
    一個胖子的我閱讀 1,861評論 2 20
  • 一. 安裝nodejs玻褪,這個網(wǎng)上已經(jīng)有很多教程就不多說了,按照默認配置安裝以后node里會自帶npm包管理工具 (...
    WolfSheller閱讀 396評論 1 2
  • 本文是本人正式開始學習webpack的記錄文檔公荧,時間:2020-05-16带射,webpack版本:"webpack"...
    Mstian閱讀 593評論 0 5
  • 我有一種感覺,凡是涉及到webpack配置這一塊的東西都是比較晦澀難懂的循狰,也不知道是因為我底子比較薄還是暫時沒有g...
    WolfSheller閱讀 623評論 0 1
  • 安裝開發(fā)服務器webpack-dev-server避免開發(fā)過程中重復的打包操作窟社,自動編譯打包券勺、自動刷新瀏覽器,開發(fā)...
    coder勇閱讀 249評論 0 0