loader๋ JavaScript, JSON์ด ์๋ ํ์ผ์ ๋ถ๋ฌ์ค๋ ์ญํ ์ ํ๋ค.
์๋ ์์ ์์๋ CSS ํ์ผ์ ๋ถ๋ฌ์ค๊ณ ์ ํ๋ค.
์ค๋น๋ฌผ : dist/index.js
, src/index.js
, src/style.css
ํ์ผ
๋ธ๋ผ์ฐ์ ์์ ์๋์ํค๊ธฐ ์ํด์ src/index.html ํ์ผ์ ์์ฑํ๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ด script src="index.js"๋ก ์์ฑํ๊ฒ ๋๋ฉด
index.jsํ์ผ์ const _ = require('./underbar.js');
require ๋ฌธ๋ฒ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
(require ๋ฌธ๋ฒ์ node.js์ ๋ฌธ๋ฒ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์๋ ์ง์ํ์ง ์๋๋ค.)
<!DOCTYPE html>
<html lang="en">
<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">
<title>Shout Lorem Ipsum</title>
</head>
<body>
<div id="app"></div>
<script src="index.js"></script>
</body>
</html>
๋ฐ๋ผ์ index.html ํ์ผ์ dist ๋๋ ํฐ๋ฆฌ๋ก ์ฎ๊ฒจ์ ๋ฒ๋ค ํ์ผ์ธ app.bundle.js
ํ์ผ๊ณผ ์ฐ๊ฒฐ์์ผ์ผ ํ๋ค.
<!-- dist/index.html -->
<!DOCTYPE html>
<html lang="en">
<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">
<title>Shout Lorem Ipsum Once</title>
</head>
<body>
<div id="app"></div>
<script src="app.bundle.js"></script>
</body>
</html>
const _ = require('./underbar.js');
const shout = (...sentences) => console.log(...sentences);
const shoutToHTML = (...sentences) => {
const app = document.querySelector('#app');
app.append(...sentences.map(sentence => {
const shoutHere = document.createElement('div');
shoutHere.className = 'shout';
shoutHere.textContent = sentence;
return shoutHere;
}))
return;
};
const loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis egestas feugiat elit, ac tincidunt neque vestibulum at. Mauris a eros sit amet urna efficitur tempus."
const shoutOnce = _.once(shout);
const shoutToHTMLOnce = _.once(shoutToHTML);
shoutOnce(loremIpsum);
shoutOnce(loremIpsum);
shoutOnce(loremIpsum);
shoutOnce(loremIpsum);
shoutToHTMLOnce(loremIpsum);
shoutToHTMLOnce(loremIpsum);
shoutToHTMLOnce(loremIpsum);
shoutToHTMLOnce(loremIpsum);
npm run build ๋ช ๋ น์ด๋ฅผ ํตํด ๋ฒ๋ค๋ง์ ์งํํ๋ฉด app.bundle.js ํ์ผ์ ๋ฒ๋ค๋ง์ด ์ ์ฉ๋์ด dist/index.html ํ์ผ ์คํ์ ์ ๋๋ก ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
css ํ์ผ์ ์์ฑ ํ index.htmlํ์ผ๊ณผ ์ฐ๊ฒฐํด์ค๋ค.
/* dist/style.css */
* {
box-sizing: border-box;
border: 0;
padding: 0;
margin: 0;
}
main {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
div.shout {
padding: 12px;
margin: 4px;
border-radius: 8px;
border: 0.5px solid gray;
}
<link rel="stylesheet" href="style.css">
node src/index.js ๋ก ์คํ์ node.js๋ css ํ์ผ์ ์ฝ์ ์ ์์ด์ ๋ฌธ๋ฒ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์์ง ๋ก๋๋ฅผ ์ค์ ํด์ฃผ์ง ์์์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.
npm i -D css-loader style-loader
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "app.bundle.js",
},
module: { // ๋ก๋
rules: [
{
// ํ์ผ๋ช
์ด .css๋ก ๋๋๋ ๋ชจ๋ ํ์ผ์ ์ ์ฉ
test: /\.css$/,
// ๋ฐฐ์ด ๋ง์ง๋ง ์์๋ถํฐ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์์ผ๋ก ์ ์ฉ
// ๋จผ์ css-loader๊ฐ ์ ์ฉ๋๊ณ , styled-loader๊ฐ ์ ์ฉ๋์ด์ผ ํ๋ค.
// ์์ ์ฃผ์!
use: ["style-loader", "css-loader"],
// loader๊ฐ node_modules ์์ ์๋ ๋ด์ฉ๋ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
// node_modules๋ ์ ์ธํด์ผ ํฉ๋๋ค
exclude: /node_modules/,
},
],
},
};
<link rel="stylesheet" href="style.css">