src > index.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> <main> <h1>Shout Lorem Ipsum Once</h1> <div id="app"></div> </main> <script src="index.js"></script> // require를 사용한 파일과 연결되어 있기 때문에 에러 </body> </html>
👉🏽 아무것도 뜨지 않고 아래 에러가 난다.
src/index.js
에서 사용한require
문법은 Node.js 문법으로, 브라우저에서는 지원하지 않기 때문.
index.html
파일을 dist
디렉토리로 옮기고app.bundle.js
)과 연결시킨다. dist > index.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> <main> <h1>Shout Lorem Ipsum Once</h1> <div id="app"></div> </main> <script src="app.bundle.js"></script> // 번들 파일 연결 </body> </html>
src/index.js
수정 (DOM 관련 코드 추가)index.js
(entry) 또는 이와 연결된(의존성 있는) 코드가 수정된 경우에는 번들링을 다시 진행해야 한다. (npm run build
)src > index.js
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);
dist
디렉토리에 CSS 파일 추가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; }
style.css
연결dist > index.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"> <link rel="stylesheet" href="style.css"> // css 파일 연결 <title>Shout Lorem Ipsum Once</title> </head> <body> <main> <h1>Shout Lorem Ipsum Once</h1> <div id="app"></div> </main> <script src="app.bundle.js"></script> </body> </html>
dist/style.css
파일의 위치를 src/style.css
로 옮기고index.js
에서 불러온다. src > index.js
const _ = require('./underbar.js'); require('./style.css'); // css 파일 불러오기 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);
👉🏽
node src/index.js
로 Node.js에서 실행시키면
❌ Node.js는 그 자체만으로는 CSS를 읽을 수 없어 문법에러 발생
👉🏽
npm run build
로 웹팩을 통해 번들링 하려고 하면
❌ 웹팩에 CSS 파일을 처리하기 위한 로더가 설정되어 있지 않기 때문에 에러 발생
loader
가 필요하다는 에러 메시지You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
css-loader
: CSS를 JS파일 내에서 불러오는 로더
style-loader
: 불러온 CSS를 style 요소 내에 적용하는 로더
참고 : 다양한 Styling 로더들...
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/, }, ], }, };
npm run build
로 번들링 다시 하기app.bundle.js
파일에서 alt+shift+F
실행
style
요소를 자동 생성하고 지금까지 작성한 CSS를 넣는 방식
dist/index.html
파일 실행<link rel="stylesheet" href="style.css">
코드는 필요 없으므로 지운다.