webpack的使用

認(rèn)識(shí)webpack

什么是webpack

? webpack是一個(gè)前端的模塊化打包(構(gòu)建)的工具

功能:
?- 1.打包(構(gòu)建)
?- 2.模塊化

特點(diǎn)
? webpack將一切繁雜的、重復(fù)的痹兜、機(jī)械的工作自動(dòng)處理清女,開發(fā)者只需要關(guān)注于功能的實(shí)現(xiàn)的

打包(構(gòu)建)

?- 1.語法轉(zhuǎn)換

? ES6--->ES5 供瀏覽器的解析

? less/sass---->css 供瀏覽器的解析

? TS------> ES5 供瀏覽器的解析

?- 2.文件壓縮和合并

? js / html /css 文件壓縮拍顷,刪除所有的注釋和空格验夯,變量名簡寫

? js / css 文件合并 魁蒜,將多個(gè)js文件或則css文件合并成一個(gè)js文件或則css文件

?- 3.提供開發(fā)期間的服務(wù)器

? 能夠自動(dòng)打開瀏覽器,監(jiān)聽文件變化烁挟,自動(dòng)刷新瀏覽器的

模塊化

? 在webpack中麻惶,所有的資源都是模塊

webpack 為前端提供了模塊化開發(fā)環(huán)境,有了webpack之后信夫,我們可以像寫 NodeJS 代碼一樣,寫前端代碼卡啰。
? 引入 js/css/圖片 文件:

const Vue = require('vue')

require('./css/index.css')

require('./imgs/a.png')

? 每個(gè)js文件都是一個(gè)獨(dú)立的模塊静稻,模塊之間的作用域是隔離的,需要通過導(dǎo)入和導(dǎo)出 來實(shí)現(xiàn)兩個(gè)模塊之前的數(shù)據(jù)共享
?webpack 能夠識(shí)別現(xiàn)在前端所有的模塊化語法匈辱,也就是說:不管你用的
require.js(AMD)振湾、NodeJS(CommonJS)、ES6(import/export) 哪種語法亡脸,webpack全都認(rèn)識(shí)押搪,全都可以解析
? webpack 不僅實(shí)現(xiàn) JS 的模塊化树酪,也實(shí)現(xiàn)了 CSS、圖片大州、視頻 等所有前端資源续语,全部都可以使用模塊化的方式來處理。

// CSS:
@import './common/base.css';

// CSS:
background-img: url(./imgs/a.png);

// HTML:
<img src="./imgs/a.png" />

注意點(diǎn):
? webpack 自身沒有提供新的模塊化語法厦画,但是疮茄,它能夠處理所有的前端模塊化語法

使用webpack

初始化package.json

  • 1 創(chuàng)建一個(gè)文件夾:webpack-basic

  • 2 通過 npm init -y 初始化一個(gè)package.json文件

  • 3 安裝webpack:npm i -D webpack webpack-cli

  • 4 在 package.json 文件中的 scripts 配置項(xiàng)中,添加一個(gè)腳本命令

build 表示構(gòu)建根暑、打包
webpack 入口文件路徑 --output 出口文件路徑

"scripts": {
  "build": "webpack ./src/js/main.js --output ./dist/bundle.js"
},
  • 5 在終端中力试,通過 npm run build 來執(zhí)行上面配置好的 build 命令
  • 最終,打包好的內(nèi)容就會(huì)放在 dist/bundle.js 目錄中

實(shí)現(xiàn)依賴項(xiàng)加載的原理:
? 采用的是遞歸的查詢的方式排嫌,查找依賴項(xiàng)畸裳,找完所有的依賴項(xiàng),然后將依賴項(xiàng)全部打包合并到一個(gè)文件中

打包執(zhí)行的過程

問題

1.為什么 webpack 打包后淳地,就可以在瀏覽器中運(yùn)行了怖糊??薇芝?
? 答:webpack 能夠識(shí)別和處理所有的 模塊化 語法蓬抄,能夠?qū)⑦@些模塊化語法,轉(zhuǎn)化為瀏覽器能夠執(zhí)行的代碼

webpack中的兩個(gè)環(huán)境

(開發(fā)環(huán)境)development

?作用
? 開發(fā)期間的環(huán)境夯到,在項(xiàng)目沒有上線之前使用嚷缭,代碼不會(huì)壓縮
?配置
? "build":"webpack ./src/js/main.js --output ./dist/bundle.js --mode development"
?特點(diǎn)
? 打包的文件是未壓縮的

(生產(chǎn)環(huán)境)production

? 作用

? 項(xiàng)目上線的時(shí)候使用,將代碼打包壓縮

? 配置

"pro":"webpack ./src/js/main.js --output ./dist/bundle.js --mode production"

? 特點(diǎn)

? 打包的文件是壓縮的

? 使用的場景

? 開發(fā)期間 npm run build

上線時(shí) npm run pro

webpack命令行的簡寫

簡寫語法
"build":"webpack 入口文件路徑 --mode 模式"
實(shí)例
"build":"webpack ./src/js/main.js --mode development"
"pro":"webpack ./src/js/main.js --mode production"

使用的命令
開發(fā)期間 命令:npm run build
上線打包 命令:npm run pro

注意點(diǎn)
簡寫模式中沒有指定出口路徑耍贾,服務(wù)器會(huì)默認(rèn)在根目錄下創(chuàng)建一個(gè)dist目錄阅爽,存放的文件名稱,和入口問文件名相同

webpack的配置文件的使用

什么叫配置文件

功能
這個(gè)文件將所有的配置項(xiàng)導(dǎo)出荐开,webpack會(huì)讀取這個(gè)配置文件付翁,根據(jù)配置文件中的配置項(xiàng),執(zhí)行相應(yīng)的操作
使用的步驟

  • 1.在項(xiàng)目的根目錄下創(chuàng)建一個(gè)webpack.config.js文件
  • 2.在webpack.config.js中配置參數(shù)
  • 3.完成基本配置后晃听,到package.json文件中修改build的參數(shù)值
  • 4.在終端中輸入命令:npm run build
webpack.config.js的基本配置項(xiàng)
  • 1.入口文件
    entry:path.join(__dirname,"./src/js/main.js")
  • 2.出口文件
    output:{
    path:path.join(__dirname,"./src/js/main.js"),
    filename:"bundle.js"
    }
  • 3.使用的模式
    mode:"development"
    在package.json配置文件中
    "build":"webpack"
    使用的命令
    npm run build

webpack-dev-server

使用的步驟

  • 1.安裝 npm i -D webpack-dev-server
  • 2.使用webpack-dev-server
    命令行的方式
    配置文件的方式
  • 3.在終端中輸入命令:npm run dev
    webpack-dev-server命令行的使用
    作用
    提供了開發(fā)期間的運(yùn)行服務(wù)器的環(huán)境

在package.json配置項(xiàng)

  "dev":"webpack-dev-server  --open  --contentBase ./src  --port  3000 --hot"

配置項(xiàng)說明

--open
  打開瀏覽器
--contentBase
  默認(rèn)打開的目錄
--port
  打開的端口號(hào)
--hot
  熱更新

使用的命令

 npm run dev
webpack-dev-server的配置文件的使用
**作用**
  提供了開發(fā)期間的運(yùn)行服務(wù)器的環(huán)境
使用的步驟 -webpack.config.js配置文件的配置項(xiàng)
配置項(xiàng)說明
  devServer
    dev-server配置
  open
    自動(dòng)打開瀏覽器
  contentBase
    默認(rèn)打開的目錄
  port
    打開的端口號(hào)
  hot
    熱更新
  使用的命令
    npm run dev
webpack-dev-server 做了什么百侧?
  • 1.在項(xiàng)目的根目錄開啟了一個(gè)新的服務(wù)器,這個(gè)新的服務(wù)器的地址為:http://localhsot:8080/

  • 2.自動(dòng)打開瀏覽器

  • 3.打開指定的目錄下的index.html

  • 4.能夠修改默認(rèn)的端口號(hào)

  • 5.熱更新

  • 6.自動(dòng)監(jiān)視文件的變化能扒,自動(dòng)刷新瀏覽器
    配置項(xiàng)功能詳細(xì)描述

webpack和webpack-dev-server的區(qū)別
  • wepack
    它是項(xiàng)目打包上線時(shí)使用的佣渴,能夠?qū)⒋虬鼔嚎s好的文件保存到dist文件夾中,輸出保存到磁盤中
  • webpack-dev-server
    它提供了開發(fā)期間的服務(wù)器的環(huán)境初斑,也能夠?qū)?xiàng)目進(jìn)行打包辛润,但是不壓縮代碼,將打包好的文件緩存到服務(wù)器的根目錄见秤,但是不會(huì)存儲(chǔ)到磁盤中砂竖,可以通過服務(wù)器直接讀取并使用
注意點(diǎn)
緩存的打包的文件和入口的文件名相同

應(yīng)用場景
開發(fā)期間使用webpack-dev-server真椿,上線打包使用webpack

html-webpack-plugin插件的使用

作用

  • 1.根據(jù)指定的模板,在內(nèi)存中生成一個(gè)頁面
  • 2.在這個(gè)頁面中自動(dòng)引入了js/css/img/..等文件乎澄,然后在內(nèi)存中將頁面重構(gòu)突硝,最終渲染在瀏覽器的是渲染完成頁面

為什么能夠自動(dòng)引入js/css等文件?

首先在配置項(xiàng)中設(shè)置了模板文件三圆,webpack默認(rèn)可以處理js的引入的狞换,所以講所有的引入和依賴項(xiàng)全都寫在了main.js中,當(dāng)webpack舟肉,使用模塊化引入修噪,就可以將js/css/image等文件全部打包放在了一起,然后webpack默認(rèn)的又引入了這個(gè)js文件路媚,所以到了不需要手動(dòng)引入

html-webpack-plugin使用的步驟

  • 1.下載安裝
    1-1 安裝: npm i -D html-webpack-plugin
    1-2.引入使用

  • 2.webpack-config.js配置項(xiàng)
    2-1引入模塊
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    2-2在plugin屬性中指定插件
    new HtmlWebpackPlugin
    template:path.join(__dirname,"./src/js/index.html")
    )
    2-3配置項(xiàng)的說明
    new HtmlWebpackplugin
    添加插件的實(shí)例
    template
    指定的模板文件
    特點(diǎn)

  • 1.如果使用了html-webpack-plugin這個(gè)插件黄琼,在處dev-server配置中,可以省略contentBase這個(gè)選項(xiàng)

  • 2.使用了這個(gè)插件整慎,不用在模板的html中使用sript等方式引入js/css等文件

loader的使用

打包處理非靜態(tài)資源

webpack.config.js的配置項(xiàng)

 module{
   rules:[
     {test:正則匹配項(xiàng)脏款,use:[‘使用的loader1’,‘使用的loader2’,    ...]  },
     {test:正則匹配項(xiàng),use:[‘使用的loader1’,‘使用的loader2’,    ...]  },
   ]
 }

非靜態(tài)資源注意點(diǎn)

  • 1.use的執(zhí)行順序
    默認(rèn)是從右往左執(zhí)行的裤园,例如['style-loader','css-loader'],會(huì)先執(zhí)行css-loader撤师,然后將結(jié)果給style-loader處理。

webpack處理靜態(tài)文件(例如css)的過程

  • 1.webpack會(huì)處理main.js入口文件
  • 2.執(zhí)行到require('index.css'),會(huì)使用引入模塊方式引入文件
  • 3.webpack會(huì)到webpack.config.js中拧揽,找到module中的rules這一屬性剃盾,然后通過text中的正則匹配文件
  • 4.找到這個(gè)文件會(huì)按照use中的loader方式處理文件
  • 5.處理完成后,這個(gè)文件就生效了

css-loader

css-loader 使用的步驟
- 1.下載安裝
  npm i -D style-loader css-loader
- 2.在 webpack.config.js 中淤袜,添加配置項(xiàng)來打包處理 CSS 文件
  
  正則的匹配項(xiàng)
      /\.css$/
  使用的loader
      ['style-loader','css-loader']
  配置項(xiàng)
      {test:'/\.css/',use:['style-loader','css-loader']}
  loader的說明
    css-loader
      讀取css文件的內(nèi)容痒谴,然后將讀取的內(nèi)容轉(zhuǎn)化為一個(gè)模塊
    style-loader
      讀取css-loader的模塊,在html的head標(biāo)簽中铡羡,創(chuàng)建一個(gè)style標(biāo)簽积蔚,然后將模塊的內(nèi)容放到這個(gè)style標(biāo)簽中

less-loader

  正則的匹配項(xiàng)
    /\.less$/
  使用的loader
    ['style-loader','css-loader','less-loader']
  配置項(xiàng)
    {test:'/\.css/',use:['style-loader','css-loader','less-loader']}
  loader的說明
  less-loader
    將less的內(nèi)容轉(zhuǎn)成編譯后的css文件內(nèi)容

url-loader/file-loader

url-loader
    正則的匹配項(xiàng)
      /\.(jpg|jpeg|png|gif)$/
    使用的loader
      'url-loader'
    配置項(xiàng)
{
  test:/\.(jpg|jpeg|png|gif)$/
  use:{
    loader: 'url-loader',
    options:{
      limit:8106
    }
  }
}

配置項(xiàng)的說明
loader
使用的模塊
options
配置規(guī)則
limit字節(jié)數(shù)
file-loader
配置項(xiàng)
{test:/\.(png|jpg|jpeg|gif)$/,use:"file-loader"}
file-loader注意點(diǎn)
  • 使用url-loader,一定要安裝file-loader烦周,因?yàn)閡rl-loader依賴于file-loader尽爆,不一定要寫在loader中,會(huì)自動(dòng)引入
  • 使用url-loader读慎,會(huì)默認(rèn)將圖片轉(zhuǎn)成base64格式的字節(jié)碼
  • 使用file-loader教翩,會(huì)對(duì)文件名重命名
兩個(gè)問題
  • 為什么要將圖片轉(zhuǎn)成base64格式的

將文件轉(zhuǎn)成base.64格式的數(shù)據(jù)能夠?qū)⒉煌愋偷母袷降臄?shù)據(jù),嵌入到j(luò)s文件中贪壳,打包的時(shí)候,能夠?qū)⒁氲膱D片放到j(luò)s中蚜退。

  • 為什么file-loade會(huì)對(duì)文件重名

使用了MD5的特征碼提取闰靴,一個(gè)文件只要內(nèi)容沒有發(fā)生改變彪笼,MD5的特征碼始終唯一且不會(huì)改變

  • base64和MD5的應(yīng)用場景

一般用于小圖片的轉(zhuǎn)換,如果一個(gè)圖片文件過于龐大蚂且,無異于增加了js的大小
MD5適用于一個(gè)頁面多次用到相同的圖片配猫,可能名稱不同,但只需要發(fā)送一次請(qǐng)求圖片杏死。

細(xì)節(jié)補(bǔ)充

  • 未設(shè)置mode時(shí)泵肄,打包的警告

mode 配置項(xiàng)沒有指定, webpack 默認(rèn)將 mode 設(shè)置為 production

打包字體

配置項(xiàng)

   {test:‘/\.(eot|svg|ttf|woff|woff2|otf)$/’,use('url-loader')}

打包字體使用的步驟

  • 1 安裝: npm i -D url-loader file-loader
  • 2 在 webpack.config.js 中添加規(guī)則
    字體圖標(biāo)的使用:
    1 導(dǎo)入 字體圖標(biāo) 庫的樣式
    2 在 index.html 頁面中淑翼,給元素添加 字體圖標(biāo) 提供的樣式名稱

處理ES6以及其他的js語法

使用的背景條件

默認(rèn)情況下腐巢,只能打包處理 JS 這一類的靜態(tài)資源

babel的作用
  • 1 將 ES6 語法轉(zhuǎn)化為 ES5 的語法
  • 2 實(shí)現(xiàn)瀏覽器兼容
babel的使用步驟
  • 1.安裝
  • 2 在 webpack.config.js 中添加 打包JS 文件規(guī)則
  • 3 在項(xiàng)目根目錄中創(chuàng)建一個(gè) babel 配置文件: .babelrc
    補(bǔ)充說明
    babel-preset-env 表示用來解析所有的標(biāo)準(zhǔn)JS語法,包括了: ES2015/ES2016/ES2017/ES2018...
    不標(biāo)準(zhǔn)但是經(jīng)常會(huì)使用的語法玄括,此時(shí)冯丙,推薦使用babel-preset-stage-2 這個(gè)包,來處理
    安裝: npm i -D babel-preset-stage-2
    JS語法提案遭京,需要經(jīng)過 5 個(gè)階段胃惜,才會(huì)被采納為正式標(biāo)準(zhǔn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哪雕,隨后出現(xiàn)的幾起案子船殉,更是在濱河造成了極大的恐慌,老刑警劉巖斯嚎,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件利虫,死亡現(xiàn)場離奇詭異,居然都是意外死亡孝扛,警方通過查閱死者的電腦和手機(jī)列吼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苦始,“玉大人寞钥,你說我怎么就攤上這事∧把。” “怎么了理郑?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咨油。 經(jīng)常有香客問我您炉,道長,這世上最難降的妖魔是什么役电? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任赚爵,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冀膝。我一直安慰自己唁奢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布窝剖。 她就那樣靜靜地躺著麻掸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赐纱。 梳的紋絲不亂的頭發(fā)上脊奋,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音疙描,去河邊找鬼诚隙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淫痰,可吹牛的內(nèi)容都是我干的最楷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼待错,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼籽孙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起火俄,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤犯建,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瓜客,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适瓦,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谱仪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玻熙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疯攒,死狀恐怖嗦随,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敬尺,我是刑警寧澤枚尼,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站砂吞,受9級(jí)特大地震影響署恍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜻直,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一盯质、第九天 我趴在偏房一處隱蔽的房頂上張望袁串。 院中可真熱鬧,春花似錦唤殴、人聲如沸般婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乡范,卻和暖如春配名,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晋辆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工渠脉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓶佳。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓芋膘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霸饲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子为朋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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