webpack 學(xué)習(xí)筆記之七,圖片處理.

在前端開發(fā)中,圖片是經(jīng)常使用到的資源.

在使用圖片的時(shí)候,我們一般會(huì)有兩種方式.

  • 使用圖片地址 url
  • 使用 base64 編碼.

對(duì)于小圖片而言,我們一般直接使用 base64 編碼,把圖片寫入到 css 代碼中.
這樣的好處是可以減少一個(gè)http請(qǐng)求.

之前我們打包的是jscss 文件.

結(jié)構(gòu)是從我們寫代碼的 app 目錄,將所需要的資源打包進(jìn) dist 目標(biāo)目錄.

image.png

我們已經(jīng)知道了如何將 .js|.css 文件,利用 webpack 工具打包到 dist 文件.

但開發(fā)的時(shí)候,又有很多圖片等靜態(tài)資源,我們?nèi)绾位?webpack

打包到目標(biāo)目錄中去呢?


新建一個(gè)基于webapck的項(xiàng)目.

有個(gè)點(diǎn)說(shuō)一下

不管你干了什么蓖救!
只要代碼里出現(xiàn)了 import require 或者在樣式中使用了 url .
webpack 眼里,這些玩意都叫模塊旁理。
除了 .js|.json 外责球,其他的通過這些方式導(dǎo)入的模塊
(不管你是.jpg,.css 還是.xxx 亂七八招的什么東西)
webpack 都不認(rèn)識(shí)翅睛。
它不認(rèn)識(shí),就會(huì)去找看你有沒有配置對(duì)應(yīng) xx.xx 模塊(文件)的 loader.

step 1.

安裝 url-loader & file-loader .
url-loader 依賴 file-loader

npm i --save-dev @url-loader@1.1.2 file-loader@2.0.0

step 2.

編寫 .css 文件,在內(nèi)部寫上一段需要使用到背景圖片的樣式.

body {
  background-color: rgba(0, 0, 0, 0.9);
  background-image: url('../images/beijing.jpg');
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

step 3.

webpack.config.js 中,定義這個(gè)處理圖片文件的loader.

{
        test: /\.(jpg|jpeg|png|gif|svg|webp)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 1024 * 100, // 小于100kb --> url --> base64編碼
              // 這里如果只寫一個(gè)文件名,那么圖片將打包到  entry.output.path 路徑下,也就是 dist/name.ext
              // name: '[name].[ext]',// 大于100KB 把 url(xx) 替換成 ../images/[name].[ext]
              // 如果,這里寫的名字包含路徑,那么也是相對(duì)于 entry.ouput.path 路徑
              // 同時(shí)這個(gè)名字將會(huì)作為生成的css中url中的圖片地址.
              name:'images/[name].[ext]', // -> 存儲(chǔ)路徑是 dist/images/name.ext
              publicPath: '/webpack-demo-img/dist/' // 加上這個(gè)配置,就等于是 pulblicPath + name = css.url中的鏈接地址.
            }
          },

對(duì)于 url-loader 補(bǔ)充說(shuō)明:(有個(gè)坑,關(guān)于為什么配置publicPath)

  • webpack打包過程中,如果遇到了 import (xxx.jpg) require(xxx.jpg) 或者是樣式代碼中的 background-image:url(xxxx) 時(shí),會(huì)把這個(gè)內(nèi)容交給 url-loader 處理.

  • url-loader 根據(jù) options 里的兩項(xiàng)配置對(duì)圖片進(jìn)行相關(guān)處理.

    • limit : 數(shù)字,單位字節(jié). 102400 = 102400bytes = 100KB. 對(duì)于小于 100 KB 的圖片,url-loader 會(huì)對(duì)其進(jìn)行 base64 編碼,并用來(lái)替換cssurl這塊代碼部分.比如 background-image: url('../images/beijing.jpg'); ===> background-image: url('base64xxxxxxx');
    • name: 對(duì)于大于 limit 設(shè)置的值的圖片,如果文件名中包含路徑,那么就會(huì)以 webpack.config.js 中配置的輸出目標(biāo)路徑為根路徑,來(lái)配置這里的路徑.比如 : options.name="images/[name].[ext]" ===> dist/images/[name].[ext]. 同時(shí)將css代碼中的 background-image:(url)**url部分替換成dist/images/[name].[ext]**這樣的格式.
  • publicPath: 這是一個(gè)非常重要的參數(shù).它解決了當(dāng) url-loader 在打包大于 options.limit 值的圖片,同時(shí)設(shè)置background-image:url(options.name) 而導(dǎo)致的最終打包出來(lái)的css文件中,url 訪問錯(cuò)誤,而出現(xiàn)圖片無(wú)法訪問的問題.

    • 一般情況下,在dist目錄,我們都是以一個(gè) images 文件夾放圖片. 一個(gè) css 文件夾放樣式.

    .
    ├── app
    │ ├── assets
    │ │ ├── images
    │ │ │ └── beijing.jpg
    │ │ └── style
    │ │ └── index.less
    │ └── index.js
    ├── dist
    ├── bundle.js
    ├── css
    │ └── style.css
    ├── images
    │ └── beijing.jpg
    └── index.html

  • 在上述例子中,我們最后打包的 css 文件存放路徑在 dist/css/style.css 文件中. new ExtractTextPlugin('css/style.css'),

  • 圖片文件我們?cè)O(shè)置 images/beijing.png 的時(shí)候,圖片會(huì)打包進(jìn) dist/images/beijing.jpg

  • url-loader.options.name 我們?cè)O(shè)置的是 images/beijing.jpg -> 這就會(huì)導(dǎo)致 css 文件中的 background-url:(images/beijing.png)

  • 所以,對(duì)于 css 文件中的 images/beijing.png 是在同級(jí)目錄下找 images/beijing.png ,將無(wú)法獲取到圖盤內(nèi)容.應(yīng)該改成 ../images/beijing.png 就可以成功獲取.

  • 但是如果修改 url-loader.options.name../images/beijing.png 又會(huì)導(dǎo)致圖片文件夾存儲(chǔ)路徑發(fā)生變化.

  • 所以,這里需要使用絕對(duì)路徑在替換css文件中的background-image:(url)

    • 圖片仍然進(jìn)入 dist/images/beijing.png
    • 樣式還是進(jìn)入 dist/css/style.css
    • 但是url-loader替換background-image:url(/webpack-demo/dist/images/beijing.jpg) 才行.
    • 于是就是配置替換的根目錄 publicPath:/webpack-demo-img/dist/ 為網(wǎng)站根目錄.
    • 最終url-loader替換的目錄為 /webpack-demo-img/dist/images/beijing.jpg ===> publicPath + name

step 4.

運(yùn)行 npm run build

image.png

step 5.

打開瀏覽器,查看效果.

image.png

對(duì)于圖片尺寸大于 url-loader.options.limit 的圖片,已經(jīng)測(cè)試通過,并url鏈接也是對(duì)的.

那么現(xiàn)在添加一張小于 url-loader.options.limit(100KB) 的圖片.

image.png

改寫 index.html 文件和 .less 文件.

index.html
<div class="img"></div>

index.less
 .img {
    width: 200px;
    height: 200px;
    background-image: url('../images/1-44kb.jpg');
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
  }

重新運(yùn)行 npm run build

查看結(jié)果

image.png

打開 webpack 打包生成的 style.css 文件.

image.png

url-loader 確實(shí)將小于 options.limit 值的圖片文件設(shè)置成了 base64 編碼,并寫入到了 css 文件對(duì)應(yīng)的 url 中了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市址儒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衅疙,老刑警劉巖莲趣,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饱溢,居然都是意外死亡喧伞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绩郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潘鲫,“玉大人,你說(shuō)我怎么就攤上這事肋杖「嚷兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵状植,是天一觀的道長(zhǎng)浊竟。 經(jīng)常有香客問我,道長(zhǎng)津畸,這世上最難降的妖魔是什么振定? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮肉拓,結(jié)果婚禮上后频,老公的妹妹穿的比我還像新娘。我一直安慰自己帝簇,他們只是感情好徘郭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布靠益。 她就那樣靜靜地躺著,像睡著了一般残揉。 火紅的嫁衣襯著肌膚如雪胧后。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天抱环,我揣著相機(jī)與錄音壳快,去河邊找鬼。 笑死镇草,一個(gè)胖子當(dāng)著我的面吹牛眶痰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梯啤,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼竖伯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了因宇?” 一聲冷哼從身側(cè)響起七婴,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎察滑,沒想到半個(gè)月后打厘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贺辰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年户盯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饲化。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莽鸭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滓侍,到底是詐尸還是另有隱情蒋川,我是刑警寧澤牲芋,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布撩笆,位于F島的核電站,受9級(jí)特大地震影響缸浦,放射性物質(zhì)發(fā)生泄漏夕冲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一裂逐、第九天 我趴在偏房一處隱蔽的房頂上張望歹鱼。 院中可真熱鬧,春花似錦卜高、人聲如沸弥姻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庭敦。三九已至疼进,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秧廉,已是汗流浹背伞广。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疼电,地道東北人嚼锄。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔽豺,于是被迫代替她去往敵國(guó)和親区丑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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