webpack學(xué)習(xí)筆記(1)

webpack:前端的構(gòu)建工具弧腥,由很多小工具構(gòu)建組合而成。靜態(tài)資源打包器,將前端的所有資源文件(js/css/json/img/less/...)都作為模塊進(jìn)行處理孤页,這個(gè)處理過(guò)程叫打包。

為什么要用到webpack涩馆?
前端開(kāi)發(fā)越來(lái)越復(fù)雜行施,越來(lái)越多的頁(yè)面擁有復(fù)雜的js代碼和一大堆的依賴(lài)包。有些還使用了基于js開(kāi)發(fā)的語(yǔ)言魂那,TypeScript蛾号,這種新語(yǔ)言很多瀏覽器還不能識(shí)別。還有像less這張預(yù)處理器涯雅,瀏覽器也不認(rèn)識(shí)鲜结,不能呈現(xiàn)css樣式,需要一種工具轉(zhuǎn)為css語(yǔ)法活逆。還有比如在js文件中通過(guò)es6的import引入其它模塊精刷,瀏覽器也不能識(shí)別import命令。
那為了讓瀏覽器能識(shí)別這些語(yǔ)法或者命令蔗候,需要構(gòu)建一個(gè)大工具怒允,將這些小的模塊工具進(jìn)行處理,轉(zhuǎn)換成瀏覽器能認(rèn)識(shí)的語(yǔ)法锈遥。所以就出現(xiàn)了webpack這個(gè)構(gòu)建工具纫事。

webpack打包流程:
把項(xiàng)目當(dāng)做一個(gè)整體——>找到入口文件index.js——>分析index.js中引入的項(xiàng)目結(jié)構(gòu),形成一個(gè)依賴(lài)關(guān)系樹(shù)狀圖——>根據(jù)依賴(lài)關(guān)系的先后順序引入對(duì)應(yīng)資源所灸,形成chunk(代碼塊)——>
對(duì)chunk代碼塊處理(處理過(guò)程叫打包)丽惶,比如將less文件編譯成css文件,將es6編譯成es5——>打包結(jié)束后爬立,輸出一個(gè)名為bundle.js的文件

webpack的五個(gè)核心概念:
Entry:指示webpack以哪個(gè)入口文件打包钾唬。
Output:指示webpack打包后的資源輸出到哪里,以及如何命名。
Loader:處理非js文件知纷,比如把scss/less轉(zhuǎn)為css壤圃、es6轉(zhuǎn)為es5、Typescript轉(zhuǎn)為es5琅轧、img圖片等處理成webpack能識(shí)別的文件伍绳。webpack只認(rèn)識(shí)js。
Plugins:執(zhí)行范圍更廣的任務(wù)乍桂,打包優(yōu)化冲杀、文件壓縮等
Mode:分為開(kāi)發(fā)者模式、生產(chǎn)者模式

webpack初體驗(yàn):
npm init要依賴(lài)Node.js的話(huà)睹酌,最好通過(guò)npm init初始化得到package.json文件权谁。
npm i webpack webpack-cli -g:全局安裝webpack和webpack-cli兩個(gè)包。
webpack-cli是干嘛的憋沿?為什么要安裝這兩個(gè)包旺芽?
npm i webpack webpack-cli -D:將這兩個(gè)包添加到開(kāi)發(fā)時(shí)依賴(lài)。
新建src文件夾和dist文件夾——>在src文件夾下新建index.js入口文件辐啄,在dist文件夾下新建index.html采章。(沒(méi)有index.html文件的情況下,可直接在命令行輸入node ./dist/budle.js查看輸出結(jié)果)
在index.js文件中執(zhí)行簡(jiǎn)單的測(cè)試:

//運(yùn)行命令:
    //- 開(kāi)發(fā)環(huán)境:webpack ./src/index.js -o ./dist/bundle.js --mode=development
        // -webpack會(huì)以index.js為入口文件進(jìn)行打包壶辜,打包后輸出bundle.js文件到dist文件夾下悯舟。整體打包環(huán)境是開(kāi)發(fā)環(huán)境
    //- 生產(chǎn)環(huán)境:webpack ./src/index.js -o ./dist/bundle.js --mode=production
        // -webpack會(huì)以index.js為入口文件進(jìn)行打包,打包后輸出到dist文件夾下的bundle.js文件砸民。整體打包環(huán)境是生產(chǎn)環(huán)境抵怎,在生產(chǎn)環(huán)境下bundle.js內(nèi)的代碼會(huì)被壓縮。

function add(x,y){
    return x + y
}
console.log(add(2,2))

//測(cè)試json文件能不能打包
import hh from './data.json'
console.log(hh)
//測(cè)試css文件能不能打包——>報(bào)錯(cuò)
import './index.css'

在index.html中引入index.js

<script src='./bundle.js'></script>

執(zhí)行完打包命令后岭参,查看index.html的控制臺(tái)反惕,可以看到add()輸出的結(jié)果以及data.json的數(shù)據(jù)。但是打包index.css報(bào)錯(cuò)演侯,因?yàn)閣ebpack不能識(shí)別css文件承璃。要能識(shí)別css文件,必須定義webpack.config.js配置文件:打包c(diǎn)ss文件必須在開(kāi)發(fā)環(huán)境下

//所有的構(gòu)建工具都是基于Node.js構(gòu)建的蚌本,所以它們都遵循commonJS規(guī)范。
// 引入node中的path核心模塊
const path = require("path")

module.exports = {
//入口起點(diǎn)
  entry:"./src/main.js",
  output:{
    //在node中通過(guò)__dirname動(dòng)態(tài)獲取絕對(duì)路徑隘梨,__dirname是Node.js中的變量
    path:path.resolve(__dirname,'dist'),
    //輸出文件
    filename:"bundle.js"
  },
//模塊的配置
    module:{
        rules: [
            {
                test: /\.css$/,
          //css-loader:將css文件變成commonJS模塊加載到JS文件中程癌,里面的內(nèi)容是樣式的字符串
          //style-loader:創(chuàng)建style標(biāo)簽,將js中的樣式字符串添加到標(biāo)簽內(nèi)轴猎,再將style標(biāo)簽插入到head標(biāo)簽中
                use: [ 'style-loader', 'css-loader' ]
            },
            {
                test: /\.less$/,
          //less-loader:將less文件編譯成css文件
          //css-loader:將css文件變成commonJS模塊加載到JS文件中嵌莉,里面的內(nèi)容是樣式的字符串
          //style-loader:創(chuàng)建style標(biāo)簽,將js中的樣式字符串添加到標(biāo)簽內(nèi)捻脖,再將style標(biāo)簽插入到head標(biāo)簽中
                use: [ 'style-loader', 'css-loader' ,'less-loader']
            }
        ]
    }
//插件配置
Plugins:{

}
//模式配置(二選一)
mode:"development"
//mode:"production"
{

配置好后锐峭,安裝css-loader中鼠、style-loader兩個(gè)包钻蔑。
npm install css-loader --save-dev
npm install style-loader --save-dev
打包less文件枉长,還需額外下載less-loader玖媚、less兩個(gè)包严望。
npm install less-loader --save-dev
npm install less --save-dev

打包HTML資源

//插件配置
//(1.先下載(npm i html-webpack-plugin -D)  2.引入(const HtmlWebpackPlugin = require('html-webpack-plugin')) 3.使用)
plugins:[
//功能:默認(rèn)會(huì)創(chuàng)建一個(gè)空的html文件努隙,自動(dòng)引入打包后輸出的資源
//需求:生成的空html文件能保留./src/index.html文件內(nèi)的內(nèi)容
    new HtmlWebpackPlugin({
        template:'./src/index.html'
    })
],
mode:'development' //注意轮听,在生產(chǎn)環(huán)境下剥哑,html文件打包后會(huì)被壓縮的掠拳,開(kāi)發(fā)環(huán)境下不會(huì)

打包圖片資源(必須在開(kāi)發(fā)環(huán)境下打包蚕涤,生產(chǎn)環(huán)境打包不生效)
分兩種情況:第一種是打包background:url(...)中的背景圖片筐赔,第二種是打包HTML中<img>標(biāo)簽內(nèi)的圖片。

//在module/rules/下配置:
//第一種情況:
{
    test:/'\.(jpg|png|gif|jpeg)$'/,
    use:[
      //需要安裝url-loader揖铜、file-loader
      {
          loader:'url-loader',
          options:{
//如果要顯示的圖片大小小于8kb(8192),則會(huì)將圖片轉(zhuǎn)為base64格式的字符串,在頁(yè)面中的url顯示的就是base64格式的url
    優(yōu)點(diǎn):減少圖片請(qǐng)求次數(shù)
    缺點(diǎn):增大圖片體積
    limit的值設(shè)為多大茴丰,根據(jù)項(xiàng)目使用的圖片大小來(lái)確定。
//如果圖片大小大于8kb,則要安裝npm install --save-dev file-loader天吓,file-loader會(huì)把這個(gè)圖片打包到dist文件夾下
              limit:8 * 1024,
            // 給打包后的圖片重新命名
              name:'img/[name].[hash:8].[ext]'贿肩,
            //使用html-loader存在的問(wèn)題:因?yàn)閔tml-loader是遵循commonJS編譯圖片的,url-loader默認(rèn)是使用es6模塊化解析圖片的
            //所以導(dǎo)致解析出的圖片的src='[object Module]',咋辦
            //設(shè)置esModule:false
              esModule:false
          }
       }
  ]  
},
//第二種情況:
{
    test:/\.html$/,
//html-loader:處理html中<img>標(biāo)簽引入的圖片,然后由url-loader解析
//需要安裝html-loader
    loader:'html-loader'
}

關(guān)于name:'img/[name].[hash:8].[ext]'的說(shuō)明失仁。
img:所有圖片都打包到img文件夾下
name:獲取圖片原來(lái)的名字尸曼,放在該位置
hash:8:為了防止圖片名稱(chēng)沖突,依然使用hash萄焦,但是我們只保留8位
ext:使用圖片原來(lái)的擴(kuò)展名

打包其它資源(開(kāi)發(fā)環(huán)境下打包)
除css/js/html文件外的其它資源控轿,比如字體圖標(biāo)。

{
exclude:/\.(css|js|html|less|jpg|png|jpeg|gif)$/,//打包其它資源
use:[
    {
        loader:'file-loader',
        options:{
            name:'other/[hash:8].[ext]'
        }
    }  
   ]
}

報(bào)錯(cuò):Refusing to install package with name "webpack" under a package
原因:npm init初始化的時(shí)候把包的名字設(shè)置成了webpack拂封,導(dǎo)致和webpack這個(gè)包的名字一樣茬射,報(bào)錯(cuò)。所以初始化的時(shí)候不要命名成webpack冒签。
https://www.bilibili.com/video/BV1e7411j7T5?p=2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末在抛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萧恕,更是在濱河造成了極大的恐慌刚梭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件票唆,死亡現(xiàn)場(chǎng)離奇詭異朴读,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)走趋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)衅金,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事氮唯〖担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵惩琉,是天一觀的道長(zhǎng)豆励。 經(jīng)常有香客問(wèn)我,道長(zhǎng)琳水,這世上最難降的妖魔是什么肆糕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮在孝,結(jié)果婚禮上诚啃,老公的妹妹穿的比我還像新娘。我一直安慰自己私沮,他們只是感情好始赎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仔燕,像睡著了一般造垛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰搀,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天五辽,我揣著相機(jī)與錄音,去河邊找鬼外恕。 笑死杆逗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鳞疲。 我是一名探鬼主播罪郊,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尚洽!你這毒婦竟也來(lái)了悔橄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腺毫,失蹤者是張志新(化名)和其女友劉穎癣疟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體潮酒,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睛挚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澈灼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叁熔,靈堂內(nèi)的尸體忽然破棺而出委乌,到底是詐尸還是另有隱情,我是刑警寧澤荣回,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布遭贸,位于F島的核電站,受9級(jí)特大地震影響心软,放射性物質(zhì)發(fā)生泄漏壕吹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一删铃、第九天 我趴在偏房一處隱蔽的房頂上張望耳贬。 院中可真熱鬧,春花似錦猎唁、人聲如沸咒劲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腐魂。三九已至,卻和暖如春逐纬,著一層夾襖步出監(jiān)牢的瞬間蛔屹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工豁生, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔毒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓沛硅,卻偏偏與公主長(zhǎng)得像眼刃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摇肌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354