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"> 코드는 필요 없으므로 지운다.