h e 1 1 o !

๋ฒˆ๋“ค๋ง&์›นํŒฉ / ์›นํŒฉ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ๋ณธ๋ฌธ

p r o g r a m m i n g

๋ฒˆ๋“ค๋ง&์›นํŒฉ / ์›นํŒฉ์˜ ํ•ต์‹ฌ ๊ฐœ๋…

hee.hee 2022. 7. 25. 11:32

 

 

๐Ÿ“‚  ์›นํŒฉ์˜ ํ•ต์‹ฌ ๊ฐœ๋…


  • Entry
  • Output
  • Loaders
  • Plugins
  • Mode
  • Browser Compatibility

 

 

๐Ÿ“„  webpack์˜ config ํŒŒ์ผ ์˜ˆ์‹œ

module.exports = {
  target: ["web", "es5"], //
  entry: "./src/script.js", //
  output: {  //
    path: path.resolve(__dirname, "docs"),
    filename: "app.bundle.js",
    clean: true
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"], //
        exclude: /node_modules/,
      },
    ],
  },
  plugins: [ //
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),
    new MiniCssExtractPlugin(),
  ],
  optimization: { //
    minimizer: [
      new CssMinimizerPlugin(),
    ]
  }
};

 

 

๐Ÿ“Ž  Target

Webpack์€ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ๊ณผ target์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. target์˜ ๊ธฐ๋ณธ๊ฐ’์€ web์ž…๋‹ˆ๋‹ค. ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ์ด ๋ถ€๋ถ„์—๋Š” web ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์„ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, esX๋ฅผ ๋„ฃ์œผ๋ฉด ์ง€์ •๋œ ECMAScript ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

module.exports = {
  target: ["web", "es5"],
};

ํ•ด๋‹น config ํŒŒ์ผ์—์„œ๋Š” es5๋ฅผ ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด config ํŒŒ์ผ์€ ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ปดํŒŒ์ผํ•  ๊ฒƒ์ด๋ฉฐ, ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ es5 ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๊ฒ ๋‹ค๊ณ  ์ง€์ •ํ•œ ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Browser Compatibility์™€ ์—ฐ๊ด€๋œ ์†์„ฑ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Browser Compatibility

The term browser compatibility refers to the ability of a certain website to appear fully functional on different browsers that are available in the market. This means that the website's HTML coding, as well as the scripts on that website, should be compatible to run on the browsers.

์ปดํŒŒ์ผ์ด๋ž€?

๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์‹ค์ œ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด, ์ค‘๊ฐ„ ์ฝ”๋“œ, ๋˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

 

 

 

๐Ÿ“Ž  Entry

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ “์‹œ์ž‘์ ". React๋„ index.js์—์„œ HTML ์—˜๋ฆฌ๋จผํŠธ ํ•˜๋‚˜์— React ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. (์‹ค์ œ webpack์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.)

Entry ์†์„ฑ์€ Entry point๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, webpack์ด ๋‚ด๋ถ€์˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค. Webpack์€ ์ด Entry point๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

//๊ธฐ๋ณธ ๊ฐ’
module.exports = {
	...
  entry: "./src/index.js",
};

//์ง€์ • ๊ฐ’
module.exports = {
	...
  entry: "./src/script.js",
};

๊ธฐ๋ณธ ๊ฐ’์€ ./src/index.js์ด์ง€๋งŒ webpack ์„ค์ •์—์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ Entry ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋ฅธ (๋˜๋Š” ์—ฌ๋Ÿฌ entry point)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๐Ÿ“Ž  Output

Output ์†์„ฑ์€ ์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ webpack์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

const path = require('path');

module.exports = {
	...
  output: {
    path: path.resolve(__dirname, "docs"), // ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์„ค์ •์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
    filename: "app.bundle.js",
    clean: true
  },
};

๊ธฐ๋ณธ ์ถœ๋ ฅ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist/main.js๋กœ, ์ƒ์„ฑ๋œ ๊ธฐํƒ€ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist ํด๋”๋กœ ์„ค์ •๋œ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” output.filename๊ณผ output.path ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ webpack์— ๋ฒˆ๋“ค์˜ ์ด๋ฆ„๊ณผ ๋‚ด๋ณด๋‚ผ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. path ์†์„ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” path ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

 

 

๐Ÿ“Ž  Loader

Webpack์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript์™€ JSON ํŒŒ์ผ๋งŒ ์ดํ•ดํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ loader๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Webpack์ด ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๊ทธ๋“ค์„ ์œ ํšจํ•œ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

module.exports = {
	...
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"],
        exclude: /node_modules/,
      },
    ],
  },
};

์ƒ์œ„ ์ˆ˜์ค€์—์„œ loader๋Š” webpack ์„ค์ •์— ๋ช‡ ๊ฐ€์ง€ ์†์„ฑ์ด ์žˆ๋‹ค.

  • test: ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ
  • use: ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋กœ๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์†์„ฑ
  • exclude: ๋ฐ”๋ฒจ๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ง€์ •. (๋ฐ˜๋Œ€๋กœ include ์†์„ฑ์„ ์ด์šฉํ•ด ๋ฐ˜๋“œ์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•  ํŒŒ์ผ์ด๋‚˜ ํด๋” ์ง€์ • ๊ฐ€๋Šฅ)

์—ฌ๊ธฐ์„œ test์™€ use ์†์„ฑ์€ ํ•„์ˆ˜ ์†์„ฑ์ด๋‹ค. ์ด๋Ÿฐ ์†์„ฑ์„ ๋„ฃ์–ด ๊ทœ์น™์„ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” module.rules ์•„๋ž˜์— ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ƒฅ rules ์•„๋ž˜์— ์ •์˜ํ•˜๋ฉด webpack์€ ๊ฒฝ๊ณ ๋ฅผ ํ•œ๋‹ค.

 

 

 

 

๐Ÿ“Ž  Plugins

Plugins๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜ ์—์…‹์„ ๊ด€๋ฆฌํ•˜๊ณ , ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… ํ•˜๋Š” ๋“ฑ, ๊ด‘๋ฒ”์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  ...
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),
    new MiniCssExtractPlugin(),
  ],
};

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” require()๋ฅผ ํ†ตํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋จผ์ € ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  plugins ๋ฐฐ์—ด์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ต์…˜์„ ํ†ตํ•ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์ œ์—์„œ html-webpack-plugin ์€ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฒˆ๋“ค์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. mini-css-extract-plugin์€ CSS๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•ด CSS๋ฅผ ํฌํ•จํ•˜๋Š” JS ํŒŒ์ผ ๋‹น CSS ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ฃผ๊ฒŒ๋” ์ง€์›ํ•œ๋‹ค.

 

 

 

 

๐Ÿ“Ž  Optimization

Webpack์€ ๋ฒ„์ „ 4๋ถ€ํ„ฐ๋Š” ์„ ํƒํ•œ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์ตœ์ ํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

module.exports = {
  ...
  optimization: {
    minimizer: [
      new CssMinimizerPlugin(),
    ]
  }
};

์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์ง€์›์ด ๋˜๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ minimize์™€ minimizer ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • minimize : TerserPlugin ๋˜๋Š” optimization.minimize์— ๋ช…์‹œ๋œ plugins๋กœ bundle ํŒŒ์ผ์„ ์ตœ์†Œํ™”(=์••์ถ•)์‹œํ‚ค๋Š” ์ž‘์—… ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
  • minimizer : defualt minimizer์„ ์ปค์Šคํ…€๋œ TerserPlugin ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” mini-css-extract-plugin ์— ๊ด€๋ จ๋œ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ์ง€์‹œํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

 

 

 

 

์ถœ์ฒ˜

์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

https://urclass.codestates.com/content/cc9ff40a-3d8a-4bd9-a99e-f80971e41fea?playlist=2376

'p r o g r a m m i n g' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฒˆ๋“ค๋ง & ์›นํŒฉ  (0) 2022.07.25
git ์˜ค๋ฅ˜ / gitignore  (0) 2022.07.11
chunk, buffer  (0) 2022.06.16
Effect Hook  (3) 2022.06.14
REST API ์„ฑ์ˆ™๋„ ๋ชจ๋ธ(RMM), Open API์™€ API Key  (0) 2022.06.10