Development
ê°ì´ë를 ì°¨ë¡ëë¡ ë°ë¼ìë¤ë©´, webpack 기본 ì¬ì ì¤ ì¼ë¶ë¥¼ íì¤í ì´í´íê³ ìì ê²ì ëë¤. ê³ìí기 ì ì°ë¦¬ì ì¶ì ì¢ ë í¸ìíê² ë§ë¤ ê°ë° íê²½ ì¤ì ì ì´í´ë³´ê² ìµëë¤.
먼ì mode를 'development'ë¡ ì¤ì íê³ titleì 'Development'ë¡ ì¤ì í´ë³´ê² ìµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import HtmlWebpackPlugin from 'html-webpack-plugin';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
+ mode: 'development',
entry: {
index: './src/index.js',
print: './src/print.js',
},
plugins: [
new HtmlWebpackPlugin({
- title: 'Output Management',
+ title: 'Development',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
};Using source maps
webpackì´ ìì¤ ì½ë를 ë²ë¤ë¡ 묶ì ë, ì¤ë¥ì ê²½ê³ ì ìë ìì¹ë¥¼ ì¶ì í기 ì´ë ¤ì¸ ì ììµëë¤. ì를 ë¤ì´, ì¸ ê°ì ìì¤ íì¼(a.js, b.js, ê·¸ë¦¬ê³ c.js)ì íëì ë²ë¤ë¡ ë¬¶ê³ íëì ìì¤ íì¼ì´ ì¤ë¥ê° ìë ê²½ì°, ì¤í ì¶ì ì ë¨ìí bundle.js를 ê°ë¦¬íµëë¤. ì¤ë¥ê° ë°ìí ìì¤ íì¼ì ì íí ìê³ ì¶ê¸° ë문ì íì ëìì´ ëë ê²ì ìëëë¤.
ì¤ë¥ì ê²½ê³ ë¥¼ ì½ê² ì¶ì í ì ìëë¡, JavaScriptë ì»´íì¼ë ì½ë를 ìë ìì¤ë¡ 매ííë ìì¤ë§µì ì ê³µí©ëë¤. b.jsìì ì¤ë¥ê° ë°ìí ê²½ì°, ìì¤ë§µìì ì íí ìë ¤ì¤ëë¤.
ìì¤ë§µê³¼ ê´ë ¨íì¬ ì¬ì©í ì ìë ë¤ë¥¸ ìµì ì´ ë§ì´ ììµëë¤. íìì ë°ë¼ ì¤ì í ì ìëë¡ íì¸íì¸ì.
ì´ ê°ì´ëììë, íë¡ëì
ìë ì í©íì§ ìì§ë§ ì¤ëª
목ì ì¼ë¡ ì ì©í inline-source-map ìµì
ì ì¬ì©íê² ìµëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import HtmlWebpackPlugin from 'html-webpack-plugin';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: './src/index.js',
print: './src/print.js',
},
+ devtool: 'inline-source-map',
plugins: [
new HtmlWebpackPlugin({
title: 'Development',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
};ì´ì ëë²ê¹
í ë´ì©ì´ ìëì§ íì¸íê³ , print.js íì¼ì ì¤ë¥ë¥¼ ìì±í´ ë³´ê² ìµëë¤.
src/print.js
export default function printMe() {
- console.log('I get called from print.js!');
+ cosnole.log('I get called from print.js!');
}npm run build를 ì¤ííë©´, ë¤ìê³¼ ê°ì´ ì»´íì¼ë©ëë¤.
...
[webpack-cli] Compilation finished
asset index.bundle.js 1.38 MiB [emitted] (name: index)
asset print.bundle.js 6.25 KiB [emitted] (name: print)
asset index.html 272 bytes [emitted]
runtime modules 1.9 KiB 9 modules
cacheable modules 530 KiB
./src/index.js 406 bytes [built] [code generated]
./src/print.js 83 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.x.x compiled successfully in 706 msì´ì ë¸ë¼ì°ì ìì index.html íì¼ì ì½ëë¤. ë²í¼ì í´ë¦íê³ , ì¤ë¥ê° íìë ì½ìì íì¸í©ëë¤. ì¤ë¥ë ë¤ìê³¼ ê°ì´ íìëì´ì¼ í©ëë¤.
Uncaught ReferenceError: cosnole is not defined
at HTMLButtonElement.printMe (print.js:2)ì¤ë¥ìì ì¤ë¥ê° ë°ì í íì¼(print.js)ê³¼ ì¤ ë²í¸(2)ì ëí 참조ë í¬í¨ëì´ ììì ì ì ììµëë¤. ì´ì 문ì 를 í´ê²°í기 ìí´ ì´ë를 ë´ì¼ íëì§ ì íí ì ì ììµëë¤.
Choosing a Development Tool
ì½ë를 ì»´íì¼í ëë§ë¤ npm run build를 ìëì¼ë¡ ì¤ííë ê²ì ë²ê±°ë¡ìµëë¤.
webpackìë ì½ëê° ë³ê²½ë ëë§ë¤ ìëì¼ë¡ ì»´íì¼íë ë° ëìì´ ëë ëª ê°ì§ ìµì ì´ ììµëë¤.
- webpackì watch 모ë
- webpack-dev-server
- webpack-dev-middleware
ëë¶ë¶ì ê²½ì°, webpack-dev-server를 ì¬ì©íê³ ì¶ê² ì§ë§, ìì 모ë ìµì
ì ì´í´ë³´ê² ìµëë¤.
Using Watch Mode
webpackì´ ëíëì ê·¸ëí ë´ì 모ë íì¼ììì ë³ê²½ì¬íì "ê°ì"íëë¡ ì§ìí ì ììµëë¤. ì´ë° íì¼ ì¤ íëê° ì ë°ì´í¸ëë©´, ì½ëê° ë¤ì ì»´íì¼ëë¯ë¡ ì ì²´ ë¹ë를 ìëì¼ë¡ ì¤íí íìê° ììµëë¤.
webpackì watch 모ë를 ììíë npm ì¤í¬ë¦½í¸ë¥¼ ì¶ê°í´ ë³´ê² ìµëë¤.
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
+ "watch": "webpack --watch",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^5.6.6",
"webpack": "^5.105.0",
"webpack-cli": "^7.0.0"
},
"dependencies": {
"lodash": "^4.17.21"
}
}커ë©ë ë¼ì¸ìì npm run watch를 ì¤ííê³ webpackì´ ì½ë를 ì»´íì¼íë ë°©ë²ì íì¸íì¸ì.
ì¤í¬ë¦½í¸ê° íì¬ íì¼ì ê°ìíê³ ì기 ë문ì 커ë©ë ë¼ì¸ì ì¢
ë£íì§ ìì ê²ì íì¸í ì ììµëë¤.
ì´ì , webpackì´ íì¼ì ê°ìíë ëì, ììì ìê°í ì¤ë¥ë¥¼ ì ê±°í´ ë³´ê² ìµëë¤.
src/print.js
export default function printMe() {
- cosnole.log('I get called from print.js!');
+ console.log('I get called from print.js!');
}ì´ì íì¼ì ì ì¥íê³ í°ë¯¸ë ì°½ì íì¸íììì¤. webpackì´ ë³ê²½ë 모ëì ìëì¼ë¡ ì¬ì»´íì¼íë ê²ì ë³¼ ì ììµëë¤!
ì ì¼í ë¨ì ì ë³ê²½ì¬íì íì¸íë ¤ë©´ ë¸ë¼ì°ì 를 ìë¡ ê³ ì¹¨í´ì¼ íë¤ë ê²ì
ëë¤. ì´ê²ì´ ìëì¼ë¡ ëë¤ë©´ ë ì¢ì ê²ì´ë¯ë¡, webpack-dev-server를 ì¬ì©í´ ë´
ìë¤.
Using webpack-dev-server
webpack-dev-serverë ê°ë¨í ì¹ ìë²ì ì¤ìê° ë¤ì ë¡ë© 기ë¥ì ì ê³µí©ëë¤. ì¤ì í´ë³´ê² ìµëë¤.
npm install --save-dev webpack-dev-serverì¤ì íì¼ì ë³ê²½íì¬ ê°ë° ìë²ì íì¼ì ì°¾ì ìì¹ë¥¼ ìë ¤ì¤ëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import HtmlWebpackPlugin from 'html-webpack-plugin';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: './src/index.js',
print: './src/print.js',
},
devtool: 'inline-source-map',
+ devServer: {
+ static: './dist',
+ },
plugins: [
new HtmlWebpackPlugin({
title: 'Development',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
+ optimization: {
+ runtimeChunk: 'single',
+ },
};ì´ê²ì webpack-dev-serverìê² dist ëë í°ë¦¬ì íì¼ì localhost:8080ìì ì ê³µíëë¡ í©ëë¤.
ê°ë° ìë²ë¥¼ ì½ê² ì¤íí ì ìë ì¤í¬ë¦½í¸ë¥¼ ì¶ê°í´ë³´ê² ìµëë¤.
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "webpack --watch",
+ "start": "webpack serve --open",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^5.6.6",
"webpack": "^5.105.0",
"webpack-cli": "^7.0.0",
"webpack-dev-server": "^5.2.3"
},
"dependencies": {
"lodash": "^4.17.21"
}
}ì´ì 커ë©ë ë¼ì¸ìì npm start를 ì¤íí ì ìì¼ë©° ë¸ë¼ì°ì ê° ìëì¼ë¡ íì´ì§ë¥¼ ë¡ëíë ê²ì ë³¼ ì ììµëë¤. ì´ì ìì¤ íì¼ì ë³ê²½íê³ ì ì¥íë©´, ì½ëê° ì»´íì¼ë í ì¹ ìë²ê° ìëì¼ë¡ ë¤ì ë¡ëë©ëë¤. ìëí´ ë³´ì¸ì!
webpack-dev-serverìë ì¤ì ê°ë¥í ë§ì ìµì
ì´ ììµëë¤. ìì¸í ë´ì©ì 문ì를 ì°¸ê³ íì¸ì.
Using webpack-dev-middleware
webpack-dev-middlewareë webpackìì ì²ë¦¬í íì¼ì ìë²ë¡ ë´ë³´ë´ë ëí¼ ì
ëë¤. ì´ê²ì ë´ë¶ì ì¼ë¡ webpack-dev-serverìì ì¬ì©ëì§ë§, ì¬ì©ìê° ìíë ê²½ì° ë ë§ì ì¤ì ì íì©í기 ìí´ ë³ëì í¨í¤ì§ë¡ ì¬ì©í ì ììµëë¤. webpack-dev-middlewareì express ìë²ë¥¼ ê²°í©í ì를 ì´í´ë³´ê² ìµëë¤.
ììí기 ì ì expressì webpack-dev-middleware를 ì¤ì¹íê² ìµëë¤.
npm install --save-dev express webpack-dev-middlewareì´ì 미ë¤ì¨ì´ê° ì¬ë°ë¥´ê² ìëíëì§ íì¸í기 ìí´ webpackì ì¤ì íì¼ì ì½ê° ìì í´ì¼ í©ëë¤.
webpack.config.js
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import HtmlWebpackPlugin from 'html-webpack-plugin';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
mode: 'development',
entry: {
index: './src/index.js',
print: './src/print.js',
},
devtool: 'inline-source-map',
devServer: {
static: './dist',
},
plugins: [
new HtmlWebpackPlugin({
title: 'Development',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
+ publicPath: '/',
},
};http://localhost:3000ìì íì¼ì´ ì¬ë°ë¥´ê² ì ê³µëëì§ íì¸í기 ìí´ publicPathê° ìë² ì¤í¬ë¦½í¸ ë´ììë ì¬ì©ë©ëë¤. ëì¤ì í¬í¸ ë²í¸ë¥¼ ì§ì í©ëë¤. ë¤ì ë¨ê³ë 커ì¤í
express ìë²ë¥¼ ì¤ì íë ê²ì
ëë¤.
project
webpack-demo
âââ package.json
âââ package-lock.json
âââ webpack.config.js
+ âââ server.js
âââ /dist
âââ /src
â âââ index.js
â âââ print.js
âââ /node_modulesserver.js
import express from "express";
import webpack from "webpack";
import webpackDevMiddleware from "webpack-dev-middleware";
import config from "./webpack.config.js";
const app = express();
const compiler = webpack(config);
// expressìì webpack-dev-middlewareì webpack.config.js를 ì¬ì©íëë¡ ì¤ì íì¸ì.
// 기본 ì¤ì íì¼
app.use(
webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath,
}),
);
// í¸ 3000ìì íì¼ ì ê³µ
app.listen(3000, () => {
console.log("Example app listening on port 3000!\n");
});ì´ì ìë²ë¥¼ ì¢ ë ì½ê² ì¤íí ì ìëë¡ npm ì¤í¬ë¦½í¸ë¥¼ ì¶ê°í©ëë¤.
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "webpack --watch",
"start": "webpack serve --open",
+ "server": "node server.js",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"express": "^5.2.1",
"html-webpack-plugin": "^5.6.6",
"webpack": "^5.105.0",
"webpack-cli": "^7.0.0",
"webpack-dev-middleware": "^8.0.3",
"webpack-dev-server": "^5.2.3"
},
"dependencies": {
"lodash": "^4.17.21"
}
}ì´ì í°ë¯¸ëìì npm run server를 ì¤ííë©´, ë¤ìê³¼ ì ì¬í ì¶ë ¥ì´ íìë©ëë¤.
Example app listening on port 3000!
...
<i> [webpack-dev-middleware] asset index.bundle.js 1.38 MiB [emitted] (name: index)
<i> asset print.bundle.js 6.25 KiB [emitted] (name: print)
<i> asset index.html 274 bytes [emitted]
<i> runtime modules 1.9 KiB 9 modules
<i> cacheable modules 530 KiB
<i> ./src/index.js 406 bytes [built] [code generated]
<i> ./src/print.js 83 bytes [built] [code generated]
<i> ./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
<i> webpack 5.x.x compiled successfully in 709 ms
<i> [webpack-dev-middleware] Compiled successfully.
<i> [webpack-dev-middleware] Compiling...
<i> [webpack-dev-middleware] assets by status 1.38 MiB [cached] 2 assets
<i> cached modules 530 KiB (javascript) 1.9 KiB (runtime) [cached] 12 modules
<i> webpack 5.x.x compiled successfully in 19 ms
<i> [webpack-dev-middleware] Compiled successfully.ì´ì ë¸ë¼ì°ì 를 ì¤ííê³ http://localhost:3000ë¡ ì´ëí©ëë¤. webpack ì±ì´ ì¤ííê³ ìëíë ê²ì íì¸í ì ììµëë¤!
Adjusting Your Text Editor
ì½ë ìë ì»´íì¼ì ì¬ì©íë©´, íì¼ì ì ì¥í ë 문ì ê° ë°ìí ì ììµëë¤. ì¼ë¶ í¸ì§ê¸°ìë ì ì¬ì ì¼ë¡ ì¬ì»´íì¼ì ë°©í´í ì ìë "ìì í ì°ê¸°" 기ë¥ì´ ììµëë¤.
ì¼ë¶ ì¼ë° í¸ì§ê¸°ìì ì´ ê¸°ë¥ì ë¹íì±ííë ¤ë©´, ìë 목ë¡ì ì°¸ê³ íììì¤.
- Sublime Text 3: ì¬ì©ì íê²½ ì¤ì ì
atomic_save: 'false'를 ì¶ê°íììì¤. - JetBrains IDEs (e.g. WebStorm):
Preferences > Appearance & Behavior > System Settingsìì "Use safe write" ì íì í´ì íììì¤. - Vim: ì¤ì ì
:set backupcopy=yes를 ì¶ê°íììì¤.
Conclusion
ì´ì ìëì¼ë¡ ì½ë를 ì»´íì¼íê³ ê°ë¨í ê°ë° ìë²ë¥¼ ì¤ííë ë°©ë²ì ë°°ì ì¼ë¯ë¡, ì½ë ì¤í리í ì ë¤ë£° ë¤ì ê°ì´ëë¡ ëì´ê° ë³¼ê¹ì?



