Webpackì JavaScript 모ëì ì»´íì¼í ë ì¬ì©ë©ëë¤. ì¤ì¹íë©´, CLI ëë APIë¡ webpackê³¼ ìí¸ ìì©í ì ììµëë¤. ìì§ webpackì´ ìµìíì§ ìì ê²½ì° íµì¬ ê°ë ê³¼ ë¹êµ ë´ì©ì íµí´ 커뮤ëí°ì ë¤ë¥¸ ëêµ¬ë³´ë¤ ì webpackì ì¬ì©í´ì¼ í ì§ ììë³´ì¸ì.
먼ì ëë í°ë¦¬ë¥¼ ìì±í©ëë¤. ê·¸ ë¤ì npmì ì´ê¸°ííê³ , webpackì ë¡ì»¬ë¡ ì¤ì¹í í webpack-cli(커맨ë-ë¼ì¸ìì webpackì ì¤íí ë ì¬ì©ëë ë구)를 ì¤ì¹í©ëë¤.
mkdir webpack-demo
cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-devê°ì´ë ì ë°ì ê±¸ì³ diff ë¸ë¡ì ì¬ì©íì¬ ëë í°ë¦¬, íì¼ ì½ëì ë³ê²½ì ë³´ì¬ì¤ëë¤. ì를 ë¤ë©´,
+ ì´ê²ì ì½ëì ë³µì¬í ìë¡ì´ ë¼ì¸ ì
ëë¤.
- ê·¸ë¦¬ê³ ì´ê²ì ì½ëìì ìì ë ë¼ì¸ ì
ëë¤.
ê·¸ë¦¬ê³ ì´ê²ì ìëì§ ë§ìì¼ í ë¼ì¸ ì
ëë¤.ì´ì ë¤ìì ëë í°ë¦¬ 구조ì íì¼, ì½í ì¸ ë¥¼ ìì±í©ëë¤.
project
webpack-demo
|- package.json
|- package-lock.json
+ |- index.html
+ |- /src
+ |- index.jssrc/index.js
function component() {
const element = document.createElement('div');
// ì´ ë¼ì¸ì´ ëìíë ¤ë©´ íì¬ ì¤í¬ë¦½í¸ë¥¼ íµí´ í¬í¨ë Lodashê° íìí©ëë¤.
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}
document.body.appendChild(component());index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Getting Started</title>
<script src="https://unpkg.com/[email protected]"></script>
</head>
<body>
<script src="./src/index.js"></script>
</body>
</html>ëí í¨í¤ì§ë¥¼ privateë¡ í기íê³ main í목ì ì ê±°í기 ìí´ package.json íì¼ì ì¡°ì í´ì¼ í©ëë¤. ì´ê²ì ì¤ìë¡ ì½ëê° ì¶ìëë ê²ì ë°©ì§í기 ìí ê²ì
ëë¤.
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
- "main": "index.js",
+ "private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
"webpack": "^5.38.1",
"webpack-cli": "^4.7.2"
}
}ìììì <script> íê·¸ ì¬ì´ìë ììì ì¸ ìì¡´ì±ì´ ììµëë¤. index.js íì¼ì ì¤íë기 ì ì íì´ì§ì í¬í¨ëë lodashì ì°ê´ì´ ììµëë¤. ì´ë index.jsê° lodashì íìì±ì ëª
ìì ì¼ë¡ ì ì¸íì§ ìì기 ë문ì
ëë¤. ë¨ì§ ì ì ë³ìì¸ _ê° ì¡´ì¬íëì§ ì¶ì í ë¿ì
ëë¤.
ì´ë¬í ë°©ìì¼ë¡ JavaScript íë¡ì í¸ë¥¼ ê´ë¦¬íë ê²ì 문ì ê° ììµëë¤.
ëì webpackì ì¬ì©íì¬ ì´ë¬í ì¤í¬ë¦½í¸ë¥¼ ê´ë¦¬í ì ììµëë¤.
먼ì ëë í°ë¦¬ 구조를 ì½ê° ìì íì¬ "ë°°í¬" ì½ë(./dist)를 "ìì¤" ì½ë(./src)ì ë¶ë¦¬í©ëë¤. "ìì¤" ì½ëë ì°ë¦¬ê° ìì±íê³ í¸ì§íë ì½ëì
ëë¤. "ë°°í¬" ì½ëë ë¹ë ê³¼ì ì íµí´ ìµìííê³ ìµì íëì´ ê¶ê·¹ì ì¼ë¡ ë¸ë¼ì°ì ìì ë¡ëë ì¶ë ¥ë¬¼ ì
ëë¤. ë¤ìê³¼ ê°ì´ ëë í°ë¦¬ 구조를 ë³ê²½í©ëë¤.
project
webpack-demo
|- package.json
|- package-lock.json
+ |- /dist
+ |- index.html
- |- index.html
|- /src
|- index.jslodashì ìì¡´ì±ì index.jsì í¨ê» ë²ë¤ë§ íë ¤ë©´, ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë¡ì»¬ìì ì¤ì¹í´ì¼ í©ëë¤.
npm install --save lodashì§ê¸ë¶í° ì¤í¬ë¦½í¸ë¡ lodash를 ê°ì ¸ì¤ê² ìµëë¤.
src/index.js
+import _ from 'lodash';
+
function component() {
const element = document.createElement('div');
- // ì´ ë¼ì¸ì´ ëìíë ¤ë©´ íì¬ ì¤í¬ë¦½í¸ë¥¼ íµí´ í¬í¨ë Lodashê° íìí©ëë¤.
+ // ì´ì Lodash를 ì¤í¬ë¦½í¸ë¡ ê°ì ¸ììµëë¤.
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}
document.body.appendChild(component());ì´ì ì¤í¬ë¦½í¸ë¡ ë²ë¤ë§ í ê²ì´ë¯ë¡ index.htmlì ì
ë°ì´í¸í´ì¼ í©ëë¤. íì¬ importí lodash <script>를 ìì íê³ ìëì ./src íì¼ ëì ë¤ë¥¸ <script> íê·¸ë¡ ë²ë¤ì ë¡ëíëë¡ ìì í©ëë¤.
dist/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Getting Started</title>
- <script src="https://unpkg.com/[email protected]"></script>
</head>
<body>
- <script src="./src/index.js"></script>
+ <script src="main.js"></script>
</body>
</html>ì´ ì¤ì ìì index.jsë ëª
ìì ì¼ë¡ lodashê° ìì´ì¼ íë©°, ì´ê²ì _ì ë°ì¸ë©í©ëë¤.(ì ì ì¤ì½íì ì¤ì¼ ìì) 모ëì íìí ìì¡´ì±ì ëª
ìí¨ì¼ë¡ì¨ webpackì ì´ ì 보를 ì¬ì©íì¬ ëíëì ê·¸ëí를 ë§ë¤ ì ììµëë¤. ê·¸ë° ë¤ì ê·¸ëí를 ì¬ì©íì¬ ì¤í¬ë¦½í¸ê° ì¬ë°ë¥¸ ììë¡ ì¤íëë ìµì íë ë²ë¤ì ìì±í©ëë¤.
ê·¸ë¼ npx webpackì ì¤íí´ ë³´ê² ìµëë¤. ì´ ì¤í¬ë¦½í¸ë src/index.js를 ìí¸ë¦¬ í¬ì¸í¸ë¡ ì¬ì©íê³ outputì¼ë¡ dist/main.jsì ìì±í©ëë¤. npx ëª
ë ¹ì´ë Node 8.2/npm 5.2.0 ì´ì ë²ì ìì ì ê³µëë©°, ì²ìì ì¤ì¹íë webpack í¨í¤ì§ì webpack ë°ì´ë리(./node_modules/.bin/webpack)를 ì¤íí©ëë¤.
$ npx webpack
[webpack-cli] Compilation finished
asset main.js 69.3 KiB [emitted] [minimized] (name: main) 1 related asset
runtime modules 1000 bytes 5 modules
cacheable modules 530 KiB
./src/index.js 257 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 1851 msë¸ë¼ì°ì ìì dist ëë í°ë¦¬ì index.htmlì ì´ì´ë´
ëë¤. 모ë ê²ì´ ì ëë¡ ëìë¤ë©´ 'Hello webpack' ê¸ìê° íìë ê²ì
ëë¤.
import 문과 export 문ì ES2015ìì íì¤íëììµëë¤. íì¬ë ëë¶ë¶ì ë¸ë¼ì°ì ìì ì§ìëì§ë§, ëªëª ë¸ë¼ì°ì ììë ì 구문ì ì¸ìíì§ ëª»í©ëë¤. íì§ë§ webpackì ë°ë¡ ì¬ì©í ì ìëë¡ ì§ìí´ì£¼ë ê±±ì íì§ ë§ì¸ì.
ë³´ì´ì§ìë ê³³ìì webpackì´ ì¤ì ë¡ ì½ë를 "í¸ëì¤íì¼" íì¬ ì´ì ë¸ë¼ì°ì ììë ì¤í í ì ìëë¡ í©ëë¤. dist/main.jsì ë³´ë©´ webpackì´ ì´ë»ê² í¸ëì¤íì¼ íëì§ ë³¼ ì ìì ê²ì
ëë¤. ë§¤ì° ë
ì°½ì ì
ëë¤! importì export ì¸ìë webpackì ë¤ìí 모ë 구문ì ì§ìí©ëë¤. ìì¸í ë´ì©ì Module APIìì ë³¼ ì ììµëë¤.
webpackì importì export 문 ì´ì¸ë ì½ë를 ë³ê²½íì§ ììµëë¤. ë¤ë¥¸ ES2015 기ë¥ì ì¬ì©íë¤ë©´ webpackì ë¡ë ìì¤í
ì¸ Babelì í¸ëì¤íì¼ë¬ë¡ ì¬ì©í´ì¼ í©ëë¤.
ë²ì 4ë¶í° webpackì ì´ë í ì¤ì ë íìíì§ ììµëë¤. íì§ë§ ëë¶ë¶ì íë¡ì í¸ë ì¢ ë ë³µì¡í ì¤ì ì´ íìíë¯ë¡ webpackìì ì¤ì íì¼ì ì ê³µí©ëë¤. ì´ê²ì í°ë¯¸ëìì ë§ì ëª ë ¹ì´ë¥¼ ìëì¼ë¡ ì ë ¥íë ê²ë³´ë¤ í¨ì¬ í¨ì¨ì ì ëë¤. ë¤ìê³¼ ê°ì´ ìì±í´ ë³´ê² ìµëë¤.
project
webpack-demo
|- package.json
|- package-lock.json
+ |- webpack.config.js
|- /dist
|- index.html
|- /src
|- index.jswebpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
};ì´ì ìë¡ì´ ì¤ì íì¼ì ì´ì©íì¬ ë¤ì ë¹ë를 ì¤íí´ ë³´ì¸ì.
$ npx webpack --config webpack.config.js
[webpack-cli] Compilation finished
asset main.js 69.3 KiB [compared for emit] [minimized] (name: main) 1 related asset
runtime modules 1000 bytes 5 modules
cacheable modules 530 KiB
./src/index.js 257 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 1934 msì¤ì íì¼ì ë¨ìí CLI ì¬ì©ë³´ë¤ í¨ì¬ ë§ì ì ì°ì±ì ì ê³µí©ëë¤. ë¡ëì ê·ì¹, íë¬ê·¸ì¸, í´ì ìµì ë° ê¸°í ì¬ë¬ í¥ìë 기ë¥ì ì§ì í ì ììµëë¤. ë ìì¸í ê²ì ì¤ì 문ì를 ì°¸ê³ íì¸ì.
CLIìì webpackì ë¡ì»¬ ì¬ë³¸ì ì¤íí기 ìí´ ì½ê°ì ë¨ì¶ ëª ë ¹ì´ë¥¼ ì¤ì í ì ììµëë¤. npm script를 ì¶ê°íì¬ package.jsonì ìì í´ ë³´ê² ìµëë¤.
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"private": true,
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.4.0",
"webpack-cli": "^4.2.0"
},
"dependencies": {
"lodash": "^4.17.20"
}
}ì´ì ì´ì ì ì¬ì©í npx ëª
ë ¹ ëì npm run build ëª
ë ¹ì ì¬ì©í ì ììµëë¤. scriptsììë npxì ëì¼í ë°©ìì¼ë¡ ë¡ì»¬ìì ì¤ì¹ë npm í¨í¤ì§ë¥¼ ì´ë¦ì¼ë¡ 참조í ì ììµëë¤. ì´ ê·ì¹ì 모ë 컨í¸ë¦¬ë·°í°ê° ëì¼í ê³µíµì ì¤í¬ë¦½í¸ ì¸í¸ë¥¼ ì¬ì©í ì ìëë¡ íë¯ë¡ ëë¶ë¶ì npm ê¸°ë° íë¡ì í¸ìì íì¤ì
ëë¤.
ì´ì ë¤ì ëª ë ¹ì ì¤ííê³ ì¤í¬ë¦½í¸ì ë³ì¹ì´ ìëíëì§ íì¸íì¸ì.
$ npm run build
...
[webpack-cli] Compilation finished
asset main.js 69.3 KiB [compared for emit] [minimized] (name: main) 1 related asset
runtime modules 1000 bytes 5 modules
cacheable modules 530 KiB
./src/index.js 257 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 1940 msì´ì 기본 ë¹ë를 í¨ê» ìë£íììµëë¤. ë¤ì ê°ì´ëì¸ Asset Managementë¡ ì´ëíì¬ webpackì ì´ì©í ì´ë¯¸ì§ë í°í¸ ê°ì ì ì
ê´ë¦¬ ë°©ë²ì ììë³´ê² ìµëë¤. ì´ ìì ìì íë¡ì í¸ë ìëì ê°ìì¼ í©ëë¤.
project
webpack-demo
|- package.json
|- package-lock.json
|- webpack.config.js
|- /dist
|- main.js
|- index.html
|- /src
|- index.js
|- /node_modulesWebpack ëìì¸ì ëí´ ìì¸í ììë³´ê³ ì¶ì¼ë©´ basic conceptsê³¼ configuration íì´ì§ë¥¼ íì¸íì¸ì. ëí APIìì webpackì´ ì ê³µíë ë¤ìí ì¸í°íì´ì¤ë¥¼ ìì¸í ì´í´ë´ ëë¤.