๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

๐Ÿ”งWebpack : url-loader ๋ณธ๋ฌธ

โš›๏ธReact/๐Ÿ”งFront-Dev-Environment

๐Ÿ”งWebpack : url-loader

4:Bee 2024. 7. 19. 04:00
728x90

  url-loader์˜ ์—ญํ• ์€ ์ด๋ฏธ์ง€๋ฅผ base-64๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ด๋ฏธ์ง€ ์†Œ์Šค์— ๋„ฃ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ๋ฅผ url-loader๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋‹ด์ด ์žˆ๊ณ  ์„œ๋น„์Šค ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ์ฐธ๊ณ ๋กœ ์ž‘์€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Data URI Scheme์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค.


file-loader : 2

  ํ˜„์žฌ ์ž‘์„ฑ์ž‘์˜ webpack ํ™˜๊ฒฝ์€ ์•Œ๋‹ค์‹œํ”ผ webpack 5์ด๋‹ค. ์ด์— ๋”ฐ๋ผ file-loader๋‚˜ url-loader๋Š” ์ด๋ฏธ assets/resource์— ๋‚ด์žฅ์ด ๋˜์–ด ์žˆ์–ด์„œ ์ˆ˜์—…์—์„œ ์ฒ˜๋Ÿผ ๋”ฐ๋กœ ์„ค์ • ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋‹ค๋งŒ webpack.config์— ์ง€๋‚œ๋ฒˆ๊ณผ ๊ฐ™์€ ํ˜•์‹๊ณผ ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ png๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํฌ๋ฉง๋„ ์„ค์ •ํ•ด์•ผ ํ•˜๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

// webpack.config.js (5 ๋ฒ„์ „ ์ด์ƒ)

{
    test: /\.(png|jpg|gif|svg)$/,
    type: 'asset/resource',
    generator: {
      publicPath: './dist/',
      filename: 'assets/[name].[ext]?[hash]',
    },
}

  ์ด์ „๊ณผ ๋ณ€๊ฒฝ๋œ๊ฒŒ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ hash๊ฐ’์œผ๋กœ ๋ณ€ํ™˜์ด ๋œ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ [name].[hash][ext] ์ด์™€ ๊ฐ™์ด ์ž‘์„ฑ์„ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—” [name].[ext]?[hash]๊ณผ ๊ฐ™์ด ์ž‘์„ฑ์„ ํ–ˆ๋‹ค. ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • [name].[hash][ext] / ๊ฒฐ๊ณผ ํŒŒ์ผ ์ด๋ฆ„: example.1234567890abcdef.png
  • [name].[ext]?[hash] / ๊ฒฐ๊ณผ ํŒŒ์ผ ์ด๋ฆ„: example.png?1234567890abcdef

๊ฐ ์š”์†Œ๋“ค์˜ ์„ค๋ช…์„ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • [name]: ์›๋ณธ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • [ext]: ์›๋ณธ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • [hash]: ํŒŒ์ผ ๋‚ด์šฉ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ํ•ด์‹œ ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  ๊ทธ๋ ‡๋‹ค๋ฉด '?'๋Š” ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€ ์šฐ์„  ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹ ๊ธฐ๋ฒ•์ด์ง€๋งŒ webpack 5์ด์ƒ๋ถ€ํ„ฐ๋Š” ์ด๋ฅผ ์ง€์› ํ•˜์ง€ ์•Š์•„์„œ '?'๋ถ€ํ„ฐ ์ผ์ ˆ ๋ฌด์‹œ๋ฅผ ํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ์„œ ์›๋ณธ ํŒŒ์ผ๋ช…์œผ๋กœ dist ํด๋”์— ์ €์žฅ์ด๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ€๊ธฐ ๋‘ ํ˜•์‹์œผ๋กค buildํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

[name].[hash][ext]

dist
โ”œโ”€โ”€ assets
โ”‚   โ”œโ”€โ”€ git-logo-icon.e6cb70b6c44cc2e8835a.png
โ”‚   โ””โ”€โ”€ npm-icon.1c616bc0f7d12cf5f824.png
โ”‚  
โ””โ”€โ”€ main.js

[name].[ext][hash]

dist
โ”œโ”€โ”€ assets
โ”‚   โ”œโ”€โ”€ git-logo-icon..pnge6cb70b6c44cc2e8835a
โ”‚   โ””โ”€โ”€ npm-icon..png1c616bc0f7d12cf5f824
โ”‚  
โ””โ”€โ”€ main.js

[name].[ext]?[hash]

dist
โ”œโ”€โ”€ assets
โ”‚   โ”œโ”€โ”€ git-logo-icon.png
โ”‚   โ””โ”€โ”€ npm-icon.png
โ”‚  
โ””โ”€โ”€ main.js

์ค‘๊ฐ„ ์ ๊ฒ€์œผ๋กœ ๋‚˜์˜ pcakge.json ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด file-loader, url-loader๋Š” ํ˜„์žฌ ์—†๋‹ค. ๋ฌผ๋ก  yarn install๋„ ํ•ด์ฃผ์—ˆ๋‹ค.

// package.json

  "devDependencies": {
    "webpack": "^5.75.0",
    "webpack-cli": "^4.10.0"
  },
  "dependencies": {
    "css-loader": "^6.7.1",
    "style-loader": "^3.3.1"
  }

 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ yarn run build๋ฅผ ํ•ด์ฃผ๋ฉด ์ž˜ build ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.


url-loader

 ์ˆ˜์—…์—์„œ๋Š” webpack 5 ์ดํ•˜ ๋ฒ„์ „์ด๋ผ์„œ limit์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ webpack 5์ด์ƒ ๋ถ€ํ„ฐ๋Š” ์ „ํ˜€ ๋‹ค๋ฅด๊ฒŒ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ํŒŒ์ผ์„ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๋น„๊ตํ•ด๋ณด๋ฉด์„œ ์‚ดํŽด๋ณด์ž.

// webpack.config.js (5 ๋ฒ„์ „ ์ดํ•˜)

 {
    test: /\.(png|jpg|gif|svg)$/,
    loader: 'url-loader',
    options: {
    	publicPath: './dist/',
        name: '[name].[ext]?[hash]',
        limit: 2000, // 2KB
    }
},
// webpack.config.js (5 ๋ฒ„์ „ ์ด์ƒ)

  {
    test: /\.(png|jpg|gif|svg)$/,
    type: 'asset/resource',
    generator: {
      publicPath: './dist/',
      filename: 'assets/[name].[ext]?[hash]',
    },
    dependency: { not: ['url'] },
    parser: {
      dataUrlCondition: {
        maxSize: 20000, // 2KB
      },
    },
  }

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๊ณ  yarn run build๋ฅผ ํ•˜๊ธฐ ์ „ ํ˜„์žฌ ๋‚˜์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

::CMD : ls -l src

-rw-r--r-- 1 rxxxxxxxx 197121    88  -์›” 17 21:21 app.css
-rw-r--r-- 1 rxxxxxxxx 197121   305  -์›” 19 01:15 app.js
drwxr-xr-x 1 rxxxxxxxx 197121     0  -์›” 17 20:11 css
-rw-r--r-- 1 rxxxxxxxx 197121  7040  -์›” 12 23:35 git-logo-icon.png
-rw-r--r-- 1 rxxxxxxxx 197121    47  -์›” 17 22:49 math.js
-rw-r--r-- 1 rxxxxxxxx 197121 32816  -์›” 24 18:35 npm-icon.png

์ด์ œ dist ํด๋”์— ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

dist
โ”œโ”€โ”€ assets
โ”‚   โ””โ”€โ”€ npm-icon..png
โ”‚
โ”œโ”€โ”€ e6cb70b6c44cc2e8835a.png
โ””โ”€โ”€ main.js

  ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฐ๊ณผ๋Š” ์ธ๋ผ์ธ(assets)์— ํฌํ•จ ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋ณ„๋„๋กœ ํŒŒ์ผ์„ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” jsํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ path.resolve๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ฑธ๋Ÿฌ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
์ฐธ๊ณ ๋กœ 'dependency: { not: ['url'] }' ์„ค์ •์€ URL ํ˜ธ์ถœ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์• ์…‹์— ๋Œ€ํ•ด file-loader ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, import 'https://example.com/image.png';์™€ ๊ฐ™์ด URL์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ด๋ฏธ์ง€๋Š” ์ด ๋กœ๋” ๊ทœ์น™์˜ ์ ์šฉ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๋”๋ณด๊ธฐ

(ํ™•์ธ ์ค‘...) file-loader์™€ url-loader๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. webpack 5์—์„œ asset/resoucre๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด์ „ ๋ฒ„์ „๊ณผ ๋‹ฌ๋ฆฌ url-loader์™€ file-loader๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํŽธ๋ฆฌ์„ฑ์€ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ˆ˜์—…์ฒ˜๋Ÿผ limit์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ ์šฉ์„ ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋งˆ file-loader ๋ฐฉ์‹๊ณผ url-loader ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. import ๋ฐฉ์‹๊ณผ css์—์„œ url๋กœ ํ˜ธ์ถœ ํ•˜๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  {
    test: /\.(png|jpg|gif|svg)$/i,
    type: 'asset/resource',
    generator: {
      publicPath: './dist/',
      filename: 'assets/[name].[ext]?[hash]',
    },
    dependency: { not: ['url'] },
    use: [
      {
        loader: 'url-loader',
        options: {
          limit: 8192,
        },
      },
    ],
  },

 

 ์กฐ๊ธˆ ๋” ๋ถ„์„ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. url-loader์™€ file-loader์˜ ์ฐจ์ด๋ฅผ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๊ณ  webpack 5์—์„œ base-64๋กœ ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๊ฒƒ๊ณผ url๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์ฐพ์•„์„œ ๊ณต๋ถ€ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋งŽ์ด ์•„์‰ฌ์šด ๋ถ€๋ถ„ ์ด์ง€๋งŒ ๋งŽ์€ ์‹œ๋„๋กœ ๋Œ€๋žต์ ์ธ ์›นํŒฉ์˜ ์ด๋ฏธ์ง€์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ง› ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


REFERENCE

728x90

'โš›๏ธReact > ๐Ÿ”งFront-Dev-Environment' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ”งWebpack : ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Plugin  (0) 2024.08.20
๐Ÿ”งWebpack : Plugin  (0) 2024.08.20
๐Ÿ”งWebpack : file-loader  (0) 2024.07.17
๐Ÿ”งWebpack : css-loader, style-loader  (0) 2024.07.17
๐Ÿ”งWebpack : Loader  (0) 2024.06.23
Comments