$ npm i -D webpack-dev-server
devServer
객체에 개발 서버 옵션 설정 가능devServer 버전과 웹팩 버전이 올라가면서 설정옵션들도 변경되었다.
관련문서를 참고하자
module.exports = {
devServer: {
contentBase: path.join(__dirname, "dist"),
publicPath: "/",
host: "dev.domain.com",
overlay": true,
port: 8081,
stats: "errors-only",
historyApiFallback: true
}
}
"scripts": {
// --progress 옵션으로 빌드 진행상황을 퍼센트로 확인가능
"start": "webpack-dev-server --progress"
}
module.exports = {
//...
devServer: {
onBeforeSetupMiddleware: function (devServer) {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
devServer.app.get('/some/path', function (req, res) {
res.json({ custom: 'response' });
});
},
},
};
CORS(Cross Origin Resource Shaing) 브라우져와 서버간의 보안상의 정책인데 브라우저가 최초로 접속한 서버에서만 ajax 요청을 할 수 있다는 내용이다
클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템
...
서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
module.exports = {
devServer: {
proxy: {
/*
*개발서버에 들어오는 모든 http 요청중 /api로 시작되는것은
* https://localhost:8081로 요청하는 설정
*/
'/api': 'http://localhost:8081',
}
}
}
module.exports = {
devServer: {
hot: true
}
}
if (module.hot) {
console.log('hot module on');
module.hot.accept('./result' /*감지할 모듈 경로*/, () => {
console.log('감지할 모듈 변경됨');
// 모듈이 변경되면 감지하고 등록한 콜백 실행
// 이 모듈을 사용하는 코드를 콜백에 등록
});
}
mode
옵션을 production으로 설정module.exports = {
mode: 'production'
...
}
외부 환경변수에 따라(NODE_ENV 값) 모드를 설정하는 방법
DefinePlugin
을 사용하면process.env.NODE_ENV
값을 설정하여 어플리케이션 전역변수로 들어간다.- 또는
NODE_ENV=production webpack
실행하여 환경변수 설정// webpack.config.js // 기본 값을 development로 설정 const mode = process.env.NODE_ENV || 'development'; module.exports = { mode, }
$ npm i -D optimize-css-assets-webpack-plugin
$ npm i -D terser-webpack-plugin
const OptimizeCSSAssertPlugin = require('optimize-css-assets-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
// optimization.minimizer => 웹팩이 결과물을 압축할때 사용할 플러그인을 넣는 배열
optimization: {
minimizer: mode === 'production'
? [
new OptimizeCSSAssetsPlugin(),
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 콘솔 로그 제거
}
}
})
]
: []
}
}
module.exports = {
// entry 파일을 여러개로 분리
entry: {
main: './src/app.js',
result: './src/result.js
},
optimization: {
// entry 파일을 나누면 코드가 중복되는데 중복된 코드를 제거하는 설정을 추가
splitChunks: {
chunks: "all"
}
}
}
// Promise 를 반환 하며, export 하는 값들을 가진 객체를 반환한다.
import("module.js").then(module => {
const { default: Component, a, b} = module;
});
module.exports = {
externals:{
axios: 'axios'
}
}
node_modules/library명/dist
에 압축된 파일이 존재npm i -D copy-webpack-plugin
module.exports = {
plugins: [
new CopyPlugin({
patterns: [
// 가져올 파일과 복사할 경로를 옵션으로 설정
{
from: './node_modules/axios/dist/axios.min.js',
to: './axios.min.js'
},
],
})
]
}
<script type="text/javascript" src="axios.min.js"><script>