webpack基礎(chǔ)使用(二)

五、處理圖片

file-loader

  1. 通過(guò)src使用圖片, 有三種方式
// ===========================1===========================
// image.js
// webpack 5以后require返回的是一個(gè)對(duì)象
img.src = require('../img/1-icon.png').default

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 'file-loader' ]
      }

// ===========================2===========================
// image.js
img.src = require('../img/1-icon.png')

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'file-loader',
            options: {
              // 導(dǎo)出的內(nèi)容是否轉(zhuǎn)化為esMoudle 
              esModule: false
            }
          } 
        ]
      }

// ===========================3===========================
// image.js
import imgSrc from '../img/1-icon.png'
img.src = imgSrc

// webpack.config.js
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 'file-loader' ]
      }
  1. 通過(guò)url使用圖片峰弹,注意要關(guān)閉 css-loader轉(zhuǎn)為esModule的功能假哎。
// bgImg.css
.bgImg {
  background-image: url('../img/2-message.jpg');
}

// image.js
bgImg.className = 'bgImg'

// css-loader 看到url,或轉(zhuǎn)成require處理
{
        test: /\.less$/,
        use: ['style-loader', {
          loader: 'css-loader',
          options: {
            // 代表向前找一個(gè)loader處理
            importLoaders: 1,
            esModule: false
          }
        }, 'postcss-loader', 'less-loader']
      }
  1. 設(shè)置文件名稱輸出
{
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'file-loader',
            options: {
              name: 'img/[name].[hash:6].[ext]',
              // outputPath: 'img'
            }
          } 
        ]
      }

常見(jiàn)屬性配置:
[ext]:擴(kuò)展名
[name]:文件名
[hash]:文件內(nèi)容md4
[contentHash]:文件hash虱疏, 和hash一樣
[hash:<length>]:限定長(zhǎng)度的hash
[path]:路徑

url-loader

yarn add url-loader --dev
url-loader 和 file-loader類似妆兑,只是url-loader默認(rèn)使用base64加載圖片魂拦。
優(yōu)點(diǎn)可以減少一次請(qǐng)求的次數(shù), 但是文件大的時(shí)候搁嗓,一次性請(qǐng)求就會(huì)很慢芯勘。
不過(guò)url-loader可以通過(guò)limit來(lái)控制加載方式。

{
        test:/\.(png|svg|gif|jpe?g)$/,
        use: [ 
          {
            loader: 'url-loader',
            options: {
              name: 'img/[name].[hash:6].[ext]',
              // 可以限制小于這個(gè)大小的才使用base64
              limit: 20 * 1024
            }
          } 
        ]
      }

asset module

  1. 處理圖片
    a. asset/resource (類似file-loader)
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset/resource'
      }

    // 1.圖片字體都放在一個(gè)地方谱姓,不建議
    // assetModuleFilename: 'img/[name].[hash:4][ext]'

   // 2.單獨(dú)配置
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset/resource',
        generator: {
          filename: 'img/[name].[hash:4][ext]'
        }
      }

b. asset/inline (類似url-loader)

// 全部轉(zhuǎn)成base64
      // {
      //   test:/\.(png|svg|gif|jpe?g)$/,
      //   type: 'asset/inline'
      // }
      // 根據(jù)條件轉(zhuǎn)成base64
      {
        test:/\.(png|svg|gif|jpe?g)$/,
        type: 'asset',
        generator: {
          filename: 'img/[name].[hash:4][ext]'
        },
        parser: {
          dataUrlCondition: {
            maxSize: 20 * 1024
          }
        }
      }

c. asset/source (raw-loader 不常用)

  1. 處理圖標(biāo)字體
// font.js
  const oSpan = document.createElement('span')
  oSpan.className = 'iconfont icon-linggan lg-icon'
  oEle.appendChild(oSpan)

// webpack.config.js
{
        test: /\.(ttf|woff2?)$/,
        type: 'asset/resource',
        generator: {
          filename: 'font/[name].[hash:4][ext]'
        }
      }
六借尿、插件使用
  • loader: 負(fù)責(zé)轉(zhuǎn)換 特定類型 。
  • plugin: 可以做更多事情屉来,每個(gè)插件都是一個(gè)類路翻。
    plugin是通過(guò)鉤子機(jī)制實(shí)現(xiàn), 鉤子必須是一個(gè)函數(shù)或者一個(gè)包含apply方法的對(duì)象茄靠。
  1. clean-webpack-plugin 清除目標(biāo)目錄
    yarn add clean-webpack-plugin --dev
// webpack.config.js
  const { CleanWebpackPlugin } = require('clean-webpack-plugin')

  plugins: [
    new CleanWebpackPlugin()
  ]
  1. html-webpack-plugin 生成默認(rèn)html
    yarn add html-webpack-plugin --dev

默認(rèn)有個(gè)ejs模板茂契,我們也可以自定義模板,新建public/index.html

<!DOCTYPE html>
<html lang="">

<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">

  <link rel="icon" href="<%= BASE_URL %>favicon.ico">

  <title>
    <%= htmlWebpackPlugin.options.title %>
  </title>
</head>

<body>
  <noscript>
    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
        Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->
</body>

</html>
const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins: [
    new CleanWebpackPlugin(),
    // 可以定義多個(gè)HtmlWebpackPlugin插件用于生成多個(gè)html文件
    new HtmlWebpackPlugin({
      title: 'jerry-webpack-plugin',
      template: './public/index.html'
    })
  ]
  1. DefinePlugin定義常量( webpack自帶)
const { DefinePlugin } = require('webpack')

plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      title: 'jerry-webpack-plugin',
      template: './public/index.html'
    }),
    new DefinePlugin({
    // 定義常量
    new DefinePlugin({
      // 這里要添加雙引號(hào)慨绳,DefinePlugin會(huì)把數(shù)據(jù)原封不動(dòng)返回
      BASE_URL: '"./"'
    })
  ]
  1. copy-webpack-plugin拷貝資源
    有些資源只需要拷貝掉冶,不需要打包。
    yarn add copy-webpack-plugin --dev
const CopyWebpackPlugin = require('copy-webpack-plugin')

new CopyWebpackPlugin({
      patterns: [
        {
          // 省略了to脐雪,to默認(rèn)output.path的文件夾
          from: 'public',
          globOptions: {
            // index.html上面已經(jīng)操作過(guò)了厌小,需要排除。
            // 默認(rèn)從項(xiàng)目根找战秋, **代表從當(dāng)前目錄找
            ignore: ['**/index.html']
          }
        }
      ]
    })
七璧亚、babel
  • babel負(fù)責(zé)處理JS兼容,比如JSX脂信、TS癣蟋、ES6+。
    和postcss 很像狰闪, 不過(guò)postcss主要處理是css兼容疯搅。
  1. 命令行使用
    yarn add @babel/core @babel/cli @babel/preset-env --dev
    @babel/core:核心模塊
    @babel/cli:命令行使用babel
    @babel/preset-env:預(yù)設(shè)
    npm babel src --out-dir build --presets=@babel/preset-env

  2. babel-loader, 同樣依據(jù).browserslistrc里面配置
    yarn add babel-loader --dev

      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env']
              // presets: [ 
              //   [
              //     '@babel/preset-env', 
              //     // 這里的配置為準(zhǔn)
              //     {targets: 'chrome 91'}
              //   ]
              // ],
            }
          }
        ]
      }
  1. 使用配置文件
    使用 babel.config.js(json cjs mjs), 一般就是.js后綴埋泵。

babel 7之前使用babelrc.json(js)類似配置文件

// webpack.config.js
      {
        test: /\.js$/,
        use: [ 'babel-loader' ]
      }

// babel.config.js
module.exports = {
    presets: ['@babel/preset-env']
}
八幔欧、polyfill
  • webpack 4自動(dòng)包含polyfill,打包產(chǎn)出比較大, webpack 5 就移出去了琐馆。
    preset-env對(duì)于新語(yǔ)法不能全部轉(zhuǎn)換规阀,所以需要polyfill來(lái)打補(bǔ)丁恒序。
    yarn add core-js regenerator-runtime
    babel-polyfill進(jìn)行了拆分瘦麸,不建議直接使用了,
// babel.config.js
module.exports = {
    presets: [
      [
        '@babel/preset-env',
        {
          // false: 不對(duì)當(dāng)前的JS處理做 polyfill 的填充
          // usage: 依據(jù)用戶源代碼當(dāng)中所使用到的新語(yǔ)法進(jìn)行填充
          // entry: 依據(jù)我們當(dāng)前篩選出來(lái)的瀏覽器決定填充什么
          // 使用entry歧胁,需要在使用的地方導(dǎo)入頭文件
          // import "core-js/stable";
          // import "regenerator-runtime/runtime"
          useBuiltIns: 'usage',
          // 默認(rèn)版本2
          corejs: 3
        }
      ]
    ]
  }

// webpack.config.js
    {
        test: /\.js$/,
        // 防止node_modules中的庫(kù)也使用了babel滋饲,導(dǎo)致干擾
        exclude: /node_modules/,
        use: [ 'babel-loader' ]
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喊巍,隨后出現(xiàn)的幾起案子屠缭,更是在濱河造成了極大的恐慌,老刑警劉巖崭参,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵曹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡何暮,警方通過(guò)查閱死者的電腦和手機(jī)奄喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)海洼,“玉大人跨新,你說(shuō)我怎么就攤上這事』捣辏” “怎么了域帐?”我有些...
    開(kāi)封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)是整。 經(jīng)常有香客問(wèn)我肖揣,道長(zhǎng),這世上最難降的妖魔是什么浮入? 我笑而不...
    開(kāi)封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任龙优,我火速辦了婚禮,結(jié)果婚禮上舵盈,老公的妹妹穿的比我還像新娘陋率。我一直安慰自己,他們只是感情好秽晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布瓦糟。 她就那樣靜靜地躺著,像睡著了一般赴蝇。 火紅的嫁衣襯著肌膚如雪菩浙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音劲蜻,去河邊找鬼陆淀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛先嬉,可吹牛的內(nèi)容都是我干的轧苫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疫蔓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼含懊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起衅胀,我...
    開(kāi)封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岔乔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后滚躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雏门,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年掸掏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茁影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阅束,死狀恐怖呼胚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情息裸,我是刑警寧澤蝇更,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呼盆,受9級(jí)特大地震影響年扩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜访圃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一厨幻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腿时,春花似錦况脆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至徽鼎,卻和暖如春盛末,著一層夾襖步出監(jiān)牢的瞬間弹惦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工悄但, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棠隐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓檐嚣,卻偏偏與公主長(zhǎng)得像助泽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子净嘀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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