webpack-dev-serverë ì í리ì¼ì´ì ì ë¹ ë¥´ê² ê°ë°íë ë° ì¬ì©í ì ììµëë¤. ê°ë° ê°ì´ë 문ì를 íµí´ ììí´ ë³´ì¸ì.
ì´ íì´ì§ë webpack-dev-server(ì½ì¹: dev-server)version >= 5.0.0ì ëìì ìí¥ì 미ì¹ë ìµì
ì ê´í´ ì¤ëª
í©ëë¤. v4
ìì v5
ë¡ì ë§ì´ê·¸ë ì´ì
ê°ì´ëë ì¬ê¸°ë¥¼ ì°¸ê³ íì¸ì.
object
ì´ ìµì
ì¸í¸ë webpack-dev-serverìì ì ííë©° ë¤ìí ë°©ìì¼ë¡ ëìì ë³ê²½íë ë° ì¬ì©í ì ììµëë¤. ë¤ìì íë¡ì í¸ ë£¨í¸ì ìë public/
ëë í°ë¦¬ì 모ë ê²ì gzipì¼ë¡ ìì¶íê³ ì ê³µíë 기본ì ì¸ ìì
ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'public'),
},
compress: true,
port: 9000,
},
};
ìë²ê° ììëë©´, í´ìë 모ë ëª©ë¡ ìì ë©ìì§ê° íìë©ëë¤.
<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:9000/
<i> [webpack-dev-server] On Your Network (IPv4): http://197.158.164.104:9000/
<i> [webpack-dev-server] On Your Network (IPv6): http://[fe80::1]:9000/
<i> [webpack-dev-server] Content not from webpack is served from '/path/to/public' directory
ì´ë¥¼ íµí´ ìë²ê° ì´ëì ìê³ ë¬´ìì ì ê³µíëì§ì ëí ë°°ê²½ì§ìì ì»ì ì ììµëë¤.
Node.js API를 íµí´ dev-server를 ì¬ì©íë ê²½ì° devServer
ì ìµì
ì 무ìë©ëë¤. ëì ë¤ì ìµì
ì 첫 ë²ì§¸ 매ê°ë³ìë¡ ì ë¬í©ëë¤. new WebpackDevServer({...}, compiler)
. Node.js API를 íµí´ webpack-dev-server를 ì¬ì©íë ë°©ë²ì ìë ì¬ê¸°ë¥¼ ì°¸ê³ íì¸ì.
ë¤ìê³¼ ê°ì´ CLI를 íµí´ webpack-dev-server를 í¸ì¶í ì ììµëë¤.
npx webpack serve
serve
ì ëí CLI ìµì
목ë¡ì ì¬ê¸°ìì íì¸í ì ììµëë¤.
CLI를 íµí´ webpack-dev-server
를 ì¤ííë ê²ì´ ê¶ì¥ëì§ë§, API를 íµí´ ìë²ë¥¼ ììíëë¡ ì íí ìë ììµëë¤.
webpack-dev-server
ê´ë ¨ API 문ì를 ì°¸ê³ íì¸ì.
function
'connect', 'fastify' ë±ê³¼ ê°ì ì¬ì©ì ì ì ìë² ì í리ì¼ì´ì ì ì¬ì©í ì ììµëë¤. ì¬ì©ëë 기본 ì í리ì¼ì´ì ì 'express'ì ëë¤.
webpack.config.js
const connect = require('connect');
module.exports = {
//...
devServer: {
app: () => connect(),
},
};
'auto' | 'all'
[string]
ê°ë° ìë²ì ì ê·¼í ì ìë ìë¹ì¤ë¥¼ íì©ëª©ë¡ì ì¶ê°í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
allowedHosts: [
'host.com',
'subdomain.host.com',
'subdomain2.host.com',
'host2.com',
],
},
};
Djangoì ALLOWED_HOSTS
를 모방íì¬, .
ë¡ ììíë ê°ì íì ëë©ì¸ ìì¼ëì¹´ëë¡ ì¬ì©í ì ììµëë¤. .host.com
ì host.com
, www.host.com
, ë° host.com
ì ë¤ë¥¸ íì ëë©ì¸ê³¼ ì¼ì¹í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
// ì´ê²ì ì íì ëë©ì¸ì´ ê°ë° ìë²ì ì ê·¼í´ì¼ íë ê²½ì°
// ì¤ì ì ì
ë°ì´í¸í íìê° ìë¤ë ë³´ëì¤ì í¨ê»
// 첫 ë²ì§¸ ìì ëì¼í í¨ê³¼ë¥¼ ì»ìµëë¤
allowedHosts: ['.host.com', 'host2.com'],
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --allowed-hosts .host.com --allowed-hosts host2.com
'all'
ë¡ ì¤ì íë©´ í¸ì¤í¸ ê²ì¬ë¥¼ 무ìí©ëë¤. í¸ì¤í¸ë¥¼ íì¸íì§ ìë ì±ì DNS 리ë°ì¸ë© 공격ì ì·¨ì½í기 ë문ì ê¶ì¥íì§ ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
allowedHosts: 'all',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --allowed-hosts all
'auto'
ë¡ ì¤ì íë©´ íì localhost
, host
, ë° client.webSocketURL.hostname
를 íì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
allowedHosts: 'auto',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --allowed-hosts auto
boolean = false
object
ì´ ìµì ì ììí ë ZeroConf ë¤í¸ìí¬ë¥¼ íµí´ ìë²ë¥¼ ë¸ë¡ëìºì¤í¸í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
bonjour: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --bonjour
ë¹íì±í íëë².
npx webpack serve --no-bonjour
커ì¤í ìµì ì bonjourì ì ë¬í ìë ììµëë¤. ì를 ë¤ë©´ ìëì ê°ìµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
bonjour: {
type: 'http',
protocol: 'udp',
},
},
};
'log' | 'info' | 'warn' | 'error' | 'none' | 'verbose'
ë¸ë¼ì°ì ìì ë¡ê·¸ ìì¤ì ì¤ì í ì ììµëë¤. ì를 ë¤ë©´, ë¤ì ë¡ëí기 ì , ì¤ë¥ ì ëë Hot Module Replacementê° íì±íë ê²½ì°ì ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
logging: 'info',
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-logging info
boolean = true
object
ì»´íì¼ë¬ ì¤ë¥ ëë ê²½ê³ ê° ìë ê²½ì° ë¸ë¼ì°ì ì ì ì²´ íë©´ ì¤ë²ë ì´ë¥¼ íìí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
overlay: true,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-overlay
ë¹íì±í íëë².
npx webpack serve --no-client-overlay
ë³´ë¤ ì¸ë¶íë ì ì´ë¥¼ ìí´ ë¤ì ìì±ì ê°ì§ ê°ì²´ë¥¼ ì ê³µí ì ììµëë¤.
ìì± | ì¤ëª |
---|---|
errors | ì»´íì¼ ì¤ë¥ |
runtimeErrors | ì²ë¦¬ëì§ ìì ë°íì ì¤ë¥ |
warnings | ì»´íì¼ ê²½ê³ |
모ë ìì±ì ì í ì¬íì´ë©° ì ê³µëì§ ìì ê²½ì° ê¸°ë³¸ê°ì 'true'ì ëë¤.
ì를 ë¤ì´ ì»´íì¼ ê²½ê³ ë¥¼ ë¹íì±ííë ¤ë©´ ë¤ì ì¤ì ì ì ê³µí ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
overlay: {
errors: true,
warnings: false,
runtimeErrors: true,
},
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-overlay-errors --no-client-overlay-warnings --client-overlay-runtime-errors
ë°ìí ì¤ë¥ë¥¼ 기ì¤ì¼ë¡ íí°ë§íë ¤ë©´ error
매ê°ë³ì를 íì©íê³ boolean ê°ì ë°ííë í¨ì를 ì ë¬í ì ììµëë¤.
ì를 ë¤ì´, AbortController.abort()
ì ìí´ ë°ìí ì¤ë¥ë¥¼ 무ìíë ¤ë©´ ë¤ìì ìííì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
overlay: {
runtimeErrors: (error) => {
if (error instanceof DOMException && error.name === 'AbortError') {
return false;
}
return true;
},
},
},
},
};
boolean
ë¸ë¼ì°ì ìì ì»´íì¼ ì§íë¥ ì ë°±ë¶ì¨ë¡ ì¶ë ¥í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
progress: true,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-progress
ë¹íì±í íëë².
npx webpack serve --no-client-progress
boolean = true
number
í´ë¼ì´ì¸í¸ ì¬ì°ê²°ì ìëí´ì¼ íë íì를 dev-serverì ìë ¤ì¤ëë¤. true
ë¼ë©´ 무ì í ì¬ì°ê²°ì ìëí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
reconnect: true,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-reconnect
false
ë¡ ì¤ì íë©´ ë¤ì ì°ê²°ì ìëíì§ ììµëë¤.
module.exports = {
//...
devServer: {
client: {
reconnect: false,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --no-client-reconnect
í´ë¼ì´ì¸í¸ê° ë¤ì ì°ê²°ì ìëí´ì¼ íë ì íí íì를 ì§ì í ìë ììµëë¤.
module.exports = {
//...
devServer: {
client: {
reconnect: 5,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-reconnect 5
'ws' | 'sockjs'
string
í´ë¼ì´ì¸í¸ì ëí íì¬ devServer
ì ì¡ ëª¨ë를 ê°ë³ì ì¼ë¡ ì ííê±°ë 커ì¤í
í´ë¼ì´ì¸í¸ 구íì ì ê³µí ì ììµëë¤. ì´ë¥¼ íµí´ ë¸ë¼ì°ì ë ë¤ë¥¸ í´ë¼ì´ì¸í¸ê° devServer
ì íµì íë ë°©ë²ì ì§ì í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketTransport: 'ws',
},
webSocketServer: 'ws',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-web-socket-transport ws --web-socket-server-type ws
커ì¤í
í´ë¼ì´ì¸í¸ 구íì ìì±íë ¤ë©´ BaseClient
를 íì¥íë í´ëì¤ë¥¼ ìì±í©ëë¤.
í¸íëë 'ws'
ìë²ì í¨ê» 커ì¤í
ì¹ ìì¼ í´ë¼ì´ì¸í¸ 구íì¸ CustomClient.js
ì ëí ê²½ë¡ë¥¼ ì¬ì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketTransport: require.resolve('./CustomClient'),
},
webSocketServer: 'ws',
},
};
커ì¤í ì ì¬ì©íì¬, í¸í ê°ë¥í ì¹ ìì¼ í´ë¼ì´ì¸í¸ ë° ìë² êµ¬íë².
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketTransport: require.resolve('./CustomClient'),
},
webSocketServer: require.resolve('./CustomServer'),
},
};
string
object
ì¹ ìì¼ ìë²ì ëí URLì ì§ì í ì ììµëë¤. ê°ë° ìë²ë¥¼ íë¡ìíê³ í´ë¼ì´ì¸í¸ ì¤í¬ë¦½í¸ê° ì°ê²° ìì¹ë¥¼ íì ìì§ ëª»íë ê²½ì°ì ì ì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketURL: 'ws://0.0.0.0:8080/ws',
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --client-web-socket-url ws://0.0.0.0:8080/ws
ë¤ì íë¡í¼í°ë¤ì ì¬ì©íì¬ ê°ì²´ë¥¼ ì§ì í ìë ììµëë¤.
hostname
: ì ê³µë í¸ì¤í¸ ì´ë¦ì ì¬ì©íëë¡ devServerì ì°ê²°ë í´ë¼ì´ì¸í¸ì ì§ìí©ëë¤.pathname
: devServerì ì°ê²°ë í´ë¼ì´ì¸í¸ìê² ì ê³µë ê²½ë¡ë¥¼ ì¬ì©íì¬ ì°ê²°íëë¡ ì§ìí©ëë¤.password
: devServerì ì°ê²°ë í´ë¼ì´ì¸í¸ìê² ì ê³µë ë¹ë°ë²í¸ë¥¼ ì¬ì©íì¬ ì¸ì¦íëë¡ ì§ìí©ëë¤.port
: devserverì ì°ê²°ë í´ë¼ì´ì¸í¸ìê² ì ê³µë í¬í¸ë¥¼ ì¬ì©íëë¡ ì§ìí©ëë¤.protocol
: devserverì ì°ê²°ë í´ë¼ì´ì¸í¸ìê² ì ê³µë íë¡í ì½ì ì¬ì©íëë¡ ì§ìí©ëë¤.username
: devserverì ì°ê²°ë í´ë¼ì´ì¸í¸ìê² ì ê³µë ì¬ì©ì ì´ë¦ì ì¬ì©íì¬ ì¸ì¦íëë¡ ì§ìí©ëë¤.webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketURL: {
hostname: '0.0.0.0',
pathname: '/ws',
password: 'dev-server',
port: 8080,
protocol: 'ws',
username: 'webpack',
},
},
},
};
boolean = true
ì ê³µëë 모ë í목ì ëí´ gzip ìì¶ì íì±íí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
compress: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --compress
ë¹íì±í íëë².
npx webpack serve --no-compress
object
Webpack ì ì ì ì²ë¦¬íë webpack-dev-middlewareì ìµì ì ì ê³µí©ëë¤.
webpack.config.js
module.exports = {
devServer: {
devMiddleware: {
index: true,
mimeTypes: { phtml: 'text/html' },
publicPath: '/publicPathForDevServe',
serverSideRender: true,
writeToDisk: true,
},
},
};
array
function
object
모ë ìëµì í¤ë를 ì¶ê°í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
headers: {
'X-Custom-Foo': 'bar',
},
},
};
ë°°ì´ì ì ë¬í ìë ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
headers: [
{
key: 'X-Custom',
value: 'foo',
},
{
key: 'Y-Custom',
value: 'bar',
},
],
},
};
í¨ì를 ì ë¬í ìë ììµëë¤.
module.exports = {
//...
devServer: {
headers: () => {
return { 'X-Bar': ['key1=value1', 'key2=value2'] };
},
},
};
boolean = false
object
HTML5 History API를 ì¬ì©í ë, index.html
íì´ì§ë 404
ìëµ ëì ì ê³µëì´ì¼ í©ëë¤. true
ë¡ ì¤ì íì¬ devServer.historyApiFallback
ì íì±íí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
historyApiFallback: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --history-api-fallback
ë¹íì±í íëë².
npx webpack serve --no-history-api-fallback
ê°ì²´ë¥¼ ì ê³µíë©´ rewrites
ì ê°ì ìµì
ì ì¬ì©íì¬ ì´ ëìì ì¶ê°ë¡ ì ì´í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
historyApiFallback: {
rewrites: [
{ from: /^\/$/, to: '/views/landing.html' },
{ from: /^\/subpage/, to: '/views/subpage.html' },
{ from: /./, to: '/views/404.html' },
],
},
},
};
ê²½ë¡ì ì ì ì¬ì©í ë(Angularì ê³µíµ), disableDotRule
ì ì¬ì©í´ì¼ í ìë ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
historyApiFallback: {
disableDotRule: true,
},
},
};
ë ë§ì ìµì ê³¼ ì ë³´ë, connect-history-api-fallback 문ì를 ì°¸ê³ íì¸ì.
'local-ip' | 'local-ipv4' | 'local-ipv6'
string
ì¬ì©í í¸ì¤í¸ë¥¼ ì§ì í©ëë¤. ì¸ë¶ìì ìë²ì ì ê·¼í ì ìëë¡ íë ¤ë©´, ë¤ìê³¼ ê°ì´ ì§ì í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
host: '0.0.0.0',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --host 0.0.0.0
IPv6ììë ìëí©ëë¤.
npx webpack serve --host ::
local-ip
를 í¸ì¤í¸ë¡ ì§ì íë©´ í¸ì¤í¸ ìµì
ì ì¬ì© ê°ë¥í ê²½ì° ë¡ì»¬ IPv4
주ìë¡ íì¸íë ¤ê³ ìëíê³ , IPv4
를 ì¬ì©í ì ìë ê²½ì° ë¡ì»¬ IPv6
주ì를 íì¸íë ¤ê³ ìëí©ëë¤.
npx webpack serve --host local-ip
local-ipv4
를 í¸ì¤í¸ë¡ ì§ì íë©´ í¸ì¤í¸ ìµì
ì ë¡ì»¬ IPv4
주ìë¡ íì¸íë ¤ê³ ìëí©ëë¤.
npx webpack serve --host local-ipv4
local-ipv6를 í¸ì¤í¸ë¡ ì§ì íë©´ í¸ì¤í¸ ìµì ì ë¡ì»¬ IPv6 주ìë¡ íì¸íë ¤ê³ ìëí©ëë¤.
npx webpack serve --host local-ipv6
'only'
boolean = true
Webpackì Hot Module Replacement 기ë¥ì íì±íí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
hot: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --hot
ë¹íì±í íëë².
npx webpack serve --no-hot
ë¹ë ì¤í¨ì ê²½ì° ëì²´ë¡ íì´ì§ ìë¡ ê³ ì¹¨ ìì´ Hot Module Replacement를 íì±ííë ¤ë©´ hot: 'only'
를 ì¬ì©íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
hot: 'only',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --hot only
true
string
(host
ëì ) ìì í Unix ìì¼.
true
ë¡ ì¤ì íë©´ /your-os-temp-dir/webpack-dev-server.sock
ìì ìì¼ì ìì í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
ipc: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --ipc
ë¤ìì ì¬ì©íì¬ ë¤ë¥¸ ìì¼ì ìì í ìë ììµëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
ipc: path.join(__dirname, 'my-socket.sock'),
},
};
boolean = true
기본ì ì¼ë¡, dev-serverë íì¼ ë³ê²½ì´ ê°ì§ëë©´ íì´ì§ë¥¼ ë¤ì ë¡ëíê³ ìë¡ê³ 침 í©ëë¤. liveReload
를 ì ì©íë ¤ë©´ devServer.hot
ìµì
ì ë¹íì±ííê±°ë devServer.watchFiles
ìµì
ì íì±íí´ì¼ í©ëë¤. false
ë¡ ì¤ì íì¬ devServer.liveReload
를 ë¹íì±íí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
liveReload: false,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --live-reload
ë¹íì±í íëë².
npx webpack serve --no-live-reload
function (devServer)
Webpack-dev-serverê° í¬í¸ìì ì°ê²° ìì ì ììí ë 커ì¤í í¨ì를 ì¤ííë 기ë¥ì ì ê³µí©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
onListening: function (devServer) {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
const port = devServer.server.address().port;
console.log('Listening on port:', port);
},
},
};
boolean
string
object
[string, object]
ìë²ê° ììë í ë¸ë¼ì°ì 를 ì´ëë¡ dev-serverì ì§ìí©ëë¤. 기본 ë¸ë¼ì°ì 를 ì´ë ¤ë©´ true
ë¡ ì¤ì íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
open: true,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --open
ë¹íì±í íëë².
npx webpack serve --no-open
ë¸ë¼ì°ì ìì ì§ì ë íì´ì§ë¥¼ ì¬ëë².
webpack.config.js
module.exports = {
//...
devServer: {
open: ['/my-page'],
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --open /my-page
ë¸ë¼ì°ì ìì ì§ì ë ì¬ë¬ íì´ì§ë¥¼ ì¬ëë².
webpack.config.js
module.exports = {
//...
devServer: {
open: ['/my-page', '/another-page'],
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --open /my-page --open /another-page
기본 ë¸ë¼ì°ì ëì ì¬ì©í ê²½ì°ì ë¸ë¼ì°ì ì´ë¦ ì ê³µë².
webpack.config.js
module.exports = {
//...
devServer: {
open: {
app: {
name: 'google-chrome',
},
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --open-app-name 'google-chrome'
ê°ì²´ë 모ë open ìµì ì íì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
open: {
target: ['first.html', 'http://localhost:8080/second.html'],
app: {
name: 'google-chrome',
arguments: ['--incognito', '--new-window'],
},
},
},
};
'auto'
string
number
ìì²ì ìì í í¬í¸ ë²í¸ë¥¼ ì§ì íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
port: 8080,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --port 8080
port
ìµì
ì null
ì´ê±°ë ë¹ ë¬¸ìì´ì¼ ì ìì¼ë¯ë¡, ìëì¼ë¡ ì¬ì í¬í¸ë¥¼ ì¬ì©íë ¤ë©´ port: 'auto'
를 ì¬ì©íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
port: 'auto',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --port auto
[object, function]
ë³ëì ë°±ìë API ê°ë° ìë²ê° ìê³ ëì¼í ëë©ì¸ìì API ìì²ì ë³´ë´ë ¤ë ê²½ì° ì¼ë¶ URLì íë¡ìíë ê²ì´ ì ì©í ì ììµëë¤.
dev-serverë ê°ë ¥í http-proxy-middleware í¨í¤ì§ë¥¼ ì¬ì©í©ëë¤. ê³ ê¸ ì¬ì©ë²ì ëí 문ì를 íì¸íì¸ì. http-proxy-middleware
ì ì¼ë¶ 기ë¥ììë target
í¤ê° íìíì§ ììµëë¤, ì를 ë¤ì´ router
기ë¥ì´ ìì§ë§, ì¬ê¸°ì ì¤ì ì target
í¤ë¥¼ í¬í¨í´ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´ webpack-dev-server
ê° ì´ë¥¼ http-proxy-middleware
ì ì ë¬íì§ ììµëë¤.
localhost:3000
ì ë°±ìëìì, ë¤ìì ì¬ì©íì¬ íë¡ì를 íì±íí ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/api'],
target: 'http://localhost:3000',
},
],
},
};
/api/users
ì ëí ìì²ì ì´ì http://localhost:3000/api/users
ì ëí ìì²ì íë¡ì ì²ë¦¬í©ëë¤.
/api
ê° ì ë¬ëë ê²ì ìíì§ ìì¼ë©´ ê²½ë¡ë¥¼ ë¤ì ìì±í´ì¼ í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/api'],
target: 'http://localhost:3000',
pathRewrite: { '^/api': '' },
},
],
},
};
ì ìíì§ ìì ì¸ì¦ìë¡ HTTPSìì ì¤íëë ë°±ìë ìë²ë 기본ì ì¼ë¡ íì©ëì§ ììµëë¤. ìíë ê²½ì°, ë¤ìê³¼ ê°ì´ ì¤ì ì ìì íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/api'],
target: 'http://localhost:3000',
secure: false,
},
],
},
};
ëë¡ë 모ë ê²ì íë¡ìë¡ ì²ë¦¬íê³ ì¶ì§ ìì ëê° ììµëë¤. í¨ìì ë°í ê°ì ë°ë¼ íë¡ì를 ì°íí ì ììµëë¤.
í¨ììì ìì², ìëµ ë° íë¡ì ìµì ì ì ê·¼í ì ììµëë¤.
null
ëë undefined
를 ë°íí©ëë¤.false
를 ë°íí©ëë¤.ì를 ë¤ì´ ë¸ë¼ì°ì ìì²ì ê²½ì° HTML íì´ì§ë¥¼ ì ê³µíê³ ì¶ì§ë§, API ìì²ì ê²½ì° íë¡ì를 ì¬ì©íë ¤ê³ í ê²½ì° ë¤ìê³¼ ê°ì´ í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/api'],
target: 'http://localhost:3000',
bypass: function (req, res, proxyOptions) {
if (req.headers.accept.indexOf('html') !== -1) {
console.log('Skipping proxy for browser request.');
return '/index.html';
}
},
},
],
},
};
ëì¼í ëìì ëí ì¬ë¬ í¹ì ê²½ë¡ë¥¼ íë¡ì íë ¤ë©´ context
íë¡í¼í°ê° ìë íë ì´ìì ê°ì²´ ë°°ì´ì ì¬ì©í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/auth', '/api'],
target: 'http://localhost:3000',
},
],
},
};
루í¸ì ëí ìì²ì 기본ì ì¼ë¡ íë¡ìëì§ ììµëë¤. ë£¨í¸ íë¡ì를 íì±ííë ¤ë©´, devMiddleware.index
ìµì
ì ê±°ì§ ê°ì¼ë¡ ì§ì í´ì¼ í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
devMiddleware: {
index: false, // ë£¨í¸ íë¡ì를 ì¬ì©íëë¡ ì§ì
},
proxy: [
{
context: () => true,
target: 'http://localhost:1234',
},
],
},
};
í¸ì¤í¸ í¤ëì ì¶ì²ë 기본ì ì¼ë¡ íë¡ì ë ë ì ì§ëë©°, changeOrigin
ì true
ë¡ ì¤ì íì¬ ì´ ëìì ì¬ì ìí ì ììµëë¤. ì´ë¦ ê¸°ë° ê°ì í¸ì¤í
ì¬ì´í¸ë¥¼ ì¬ì©íë ê²ê³¼ ê°ì ê²½ì°ì ì ì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
proxy: [
{
context: ['/api'],
target: 'http://localhost:3000',
changeOrigin: true,
},
],
},
};
'http' | 'https' | 'spdy'
string
object
ìë² ë° ìµì ì ì¤ì í ì ììµëë¤(기본ê°ì 'http').
webpack.config.js
module.exports = {
//...
devServer: {
server: 'http',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --server-type http
ìì²´ ìëª
ë ì¸ì¦ìë¡ HTTPS
를 íµí´ ìë¹ì¤íëë².
webpack.config.js
module.exports = {
//...
devServer: {
server: 'https',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --server-type https
ìì²´ ìëª
ë ì¸ì¦ìì í¨ê» spdy를 ì¬ì©íì¬ HTTP/2
íµì íë ë².
webpack.config.js
module.exports = {
//...
devServer: {
server: 'spdy',
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --server-type spdy
ê°ì²´ 구문ì ì¬ì©í ê³ ì í ì¸ì¦ì ì ê³µë².
webpack.config.js
module.exports = {
//...
devServer: {
server: {
type: 'https',
options: {
ca: './path/to/server.pem',
pfx: './path/to/server.pfx',
key: './path/to/server.key',
cert: './path/to/server.crt',
passphrase: 'webpack-dev-server',
requestCert: true,
},
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --server-type https --server-options-key ./path/to/server.key --server-options-cert ./path/to/server.crt --server-options-ca ./path/to/ca.pem --server-options-passphrase webpack-dev-server
ëí minVersion
ê³¼ ê°ì ì¶ê° TLS ìµì
ì ì¤ì í ì ìì¼ë©° ê° íì¼ì ë´ì©ì ì§ì ì ë¬í ì ììµëë¤.
webpack.config.js
const fs = require('fs');
const path = require('path');
module.exports = {
//...
devServer: {
server: {
type: 'https',
options: {
minVersion: 'TLSv1.1',
key: fs.readFileSync(path.join(__dirname, './server.key')),
pfx: fs.readFileSync(path.join(__dirname, './server.pfx')),
cert: fs.readFileSync(path.join(__dirname, './server.crt')),
ca: fs.readFileSync(path.join(__dirname, './ca.pem')),
passphrase: 'webpack-dev-server',
requestCert: true,
},
},
},
};
boolean = true
ê°ë° ìë²ë¥¼ ë«ê³ SIGINT
ë° SIGTERM
ì í¸ìì íë¡ì¸ì¤ë¥¼ ì¢
ë£í ì ììµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
setupExitSignals: true,
},
};
function (middlewares, devServer)
커ì¤í í¨ì를 ì¤ííê³ ì»¤ì¤í 미ë¤ì¨ì´ë¥¼ ì ì©íë 기ë¥ì ì ê³µí©ëë¤.
webpack.config.js
module.exports = {
// ...
devServer: {
setupMiddlewares: (middlewares, devServer) => {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
devServer.app.get('/setup-middleware/some/path', (_, response) => {
response.send('setup-middlewares option GET');
});
// ë¤ë¥¸ 모ë 미ë¤ì¨ì´ë³´ë¤ 먼ì 미ë¤ì¨ì´ë¥¼ ì¤ííë ¤ë©´ `unshift` ë©ìë를 ì¬ì©íì¸ì
// ëë `onBeforeSetupMiddleware` ìµì
ìì ë§ì´ê·¸ë ì´ì
í ë ì¬ì©íì¸ì
middlewares.unshift({
name: 'first-in-array',
// `path`ë ìµì
ëì
ëë¤
path: '/foo/path',
middleware: (req, res) => {
res.send('Foo!');
},
});
// ë¤ë¥¸ 모ë 미ë¤ì¨ì´ ì´íì 미ë¤ì¨ì´ë¥¼ ì¤ííë ¤ë©´ `push` ë©ìë를 ì¬ì©íì¸ì
// ëë `onBeforeSetupMiddleware` ìµì
ìì ë§ì´ê·¸ë ì´ì
í ë ì¬ì©íì¸ì
middlewares.push({
name: 'hello-world-test-one',
// `path`ë ìµì
ëì
ëë¤
path: '/foo/bar',
middleware: (req, res) => {
res.send('Foo Bar!');
},
});
middlewares.push((req, res) => {
res.send('Hello World!');
});
return middlewares;
},
},
};
boolean
string
object
[string, object]
ëë í°ë¦¬(기본ì ì¼ë¡ 'public' ëë í°ë¦¬)ìì ì ì íì¼ì ì ê³µí기 ìí ìµì
ì 구ì±í ì ììµëë¤. ë¹íì±ííë ¤ë©´ false
ë¡ ì¤ì íì¸ì:
webpack.config.js
module.exports = {
//...
devServer: {
static: false,
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --static
ë¹íì±í íëë².
npx webpack serve --no-static
ë¨ì¼ ëë í°ë¦¬ ì¤ì .
webpack.config.js
module.exports = {
// ...
devServer: {
static: ['assets'],
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --static assets
ë¤ì¤ ëë í°ë¦¬ ì¤ì .
webpack.config.js
module.exports = {
// ...
devServer: {
static: ['assets', 'css'],
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --static assets --static css
string = path.join(process.cwd(), 'public')
ìë²ì ì½í
ì¸ ë¥¼ ì ê³µí ìì¹ë¥¼ ìë ¤ì¤ëë¤. ì´ê²ì ì ì íì¼ì ì ê³µíë ¤ë ê²½ì°ìë§ íìí©ëë¤. static.publicPath
ë ë²ë¤ì ì ê³µí´ì¼ íë ìì¹ì ì°ì ìì를 ê²°ì íë ë° ì¬ì©ë©ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'public'),
},
},
};
ì¬ë¬ ê°ì ì ì í´ëê° ìë ê²½ì° ê°ì²´ ë°°ì´ì ì ê³µí©ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: [
{
directory: path.join(__dirname, 'assets'),
},
{
directory: path.join(__dirname, 'css'),
},
],
},
};
object
static.directory
ìì ì ì íì¼ì ì ê³µí기 ìí ê³ ê¸ ìµì
ì 구ì±í ì ììµëë¤. ê°ë¥í ìµì
ì Express 문ì를 ì°¸ê³ íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
static: {
staticOptions: {
redirect: true,
},
},
},
};
string = '/'
[string]
static.directory
ì½í
ì¸ ë¥¼ ì ê³µí URLì ìë²ì ìë ¤ì£¼ì¸ì. ì를 ë¤ë©´ /serve-public-path-url/manifest.json
ìì assets/manifest.json
íì¼ì ì ê³µíë ¤ë©´, ì¤ì ì ë¤ìê³¼ ê°ìì¼ í©ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'assets'),
publicPath: '/serve-public-path-url',
},
},
};
ì¬ë¬ ê°ì ì ì í´ëê° ìë ê²½ì° ê°ì²´ ë°°ì´ì ì ê³µí©ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: [
{
directory: path.join(__dirname, 'assets'),
publicPath: '/serve-public-path-url',
},
{
directory: path.join(__dirname, 'css'),
publicPath: '/other-serve-public-path-url',
},
],
},
};
boolean
object = { icons: true }
dev-serverê° íì±íëë©´ serveIndex
미ë¤ì¨ì´ë¥¼ ì¬ì©íëë¡ ì§ìí©ëë¤.
serveIndex
미ë¤ì¨ì´ë index.html
íì¼ì´ ìë ëë í°ë¦¬ë¥¼ ë³¼ ë ëë í°ë¦¬ 목ë¡ì ìì±í©ëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'public'),
serveIndex: true,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --static-serve-index
ë¹íì±í íëë².
npx webpack serve --no-static-serve-index
boolean
object
dev-serverìê² static.directory
ìµì
ì´ ì ê³µíë íì¼ì ê°ìíëë¡ ì§ìí©ëë¤. ì´ë 기본ì ì¼ë¡ íì±íëì´ ìì¼ë©°, íì¼ ë³ê²½ ì ì ì²´ íì´ì§ê° ìë¡ê³ 침ë©ëë¤. ì´ê²ì watch
ìµì
ì false
ë¡ ì¤ì íì¬ ë¹íì±íí ì ììµëë¤.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'public'),
watch: false,
},
},
};
CLI를 íµí ì¬ì©ë².
npx webpack serve --static-watch
ë¹íì±í íëë².
npx webpack serve --no-static-watch
static.directory
ìì ì ì íì¼ì 보기 ìí ê³ ê¸ ìµì
ì 구ì±í ì ììµëë¤. ê°ë¥í ìµì
ì chokidar
문ì를 ì°¸ê³ íì¸ì.
webpack.config.js
const path = require('path');
module.exports = {
//...
devServer: {
static: {
directory: path.join(__dirname, 'public'),
watch: {
ignored: '*.txt',
usePolling: false,
},
},
},
};
string
object
[string, object]
íì¼ ë³ê²½ ì¬íì ê°ìí globs/directories/files 목ë¡ì 구ì±í ì ììµëë¤. ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
watchFiles: ['src/**/*.php', 'public/**/*'],
},
};
íì¼ ê°ì를 ìí ê³ ê¸ ìµì
ì 구ì±í ì ììµëë¤. ê°ë¥í ìµì
ì chokidar
문ì를 ì°¸ê³ íì¸ì.
webpack.config.js
module.exports = {
//...
devServer: {
watchFiles: {
paths: ['src/**/*.php', 'public/**/*'],
options: {
usePolling: false,
},
},
},
};
false | 'sockjs' | 'ws'
string
function
object
íì¬ ì¹ ìì¼ ìë²ë¥¼ ì ííê±°ë 커ì¤í ì¹ ìì¼ ìë²ë¥¼ ì ê³µí ì ììµëë¤.
íì¬ ê¸°ë³¸ 모ëë 'ws'
ì
ëë¤. ì´ ëª¨ëë ws
를 ìë²ë¡ ì¬ì©íê³ , 기본 WebSocketì í´ë¼ì´ì¸í¸ë¡ ì¬ì©í©ëë¤.
webpack.config.js
module.exports = {
//...
devServer: {
webSocketServer: 'ws',
},
};
커ì¤í
ìë²ë¥¼ 구ííë ¤ë©´, BaseServer
를 íì¥íë í´ëì¤ë¥¼ ìì±íì¸ì.
í¸íëë 'ws'
í´ë¼ì´ì¸í¸ì í¨ê» 커ì¤í
WebSocket ìë²ê° 구íëì´ ìë CustomServer.js
ì ëí ê²½ë¡ ì¬ì©ë².
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketTransport: 'ws',
},
webSocketServer: require.resolve('./CustomServer'),
},
};
í¸í ê°ë¥í 커ì¤í WebSocket í´ë¼ì´ì¸í¸ ë° ìë² êµ¬í ì¬ì©ë².
webpack.config.js
module.exports = {
//...
devServer: {
client: {
webSocketTransport: require.resolve('./CustomClient'),
},
webSocketServer: require.resolve('./CustomServer'),
},
};