기존에 ES 모듈 방식으로 프로젝트를 진행하면서 여러 가지 모듈을 생성한 후 엔트리 파일에 imoprt해서 사용했었는데, 그때 마다 html이 랜더링 될 때 이 많은 모듈들을 다 불러와야 되는 건가?? 라는 생각이 들긴 무슨..아무 생각 없이 ES 모듈 방식으로 개발하고 있었다!🤦♀️ 다행히 이번 미션에서 Webpack과 Babel을 사용할 기회가 있었기에, 그 과정에서 배운 Webpack의 장점과 어떻게 express 서버와 webpack을 연동해서 쓸 수 있었는지를 기록해보려 한다.
위 그림에서 처럼 webpack에은 엔트리 파일을 시작으로 의존 관계에 있는 모듈을 엮어서 하나의 번들 파일을 만든다.
$ npm install --save-dev webpack webpack-cli
$ npm install --save-dev babel-loader
$ npm install @babel/polyfill
webpack.config.js 파일의 entry 배열에 추가한다.
// webpack.config.js
const path = require('path');
module.exports = {
// entry files
entry: ['@babel/polyfill', './src/js/main.js'],
...
컴파일된 css를 bundle.js 파일에 포함시키자
$ npm install node-sass style-loader css-loader sass-loader --save-dev
ES 모듈 형식으로 개발할 때 시작이 되는 지점을 넣어주는 곳이다. 웹팩은 엔트리로 지정된 파일을 통해 필요한 모듈을 로딩해서 하나로 묶을 수 있다.
module.exports = {
entry: {
main: "./src/main.js",
},
}
그럼 js 랑 scss를 같이 번들링하고 싶다면?
entry: ["./public/src/main.js", "./public/sass/main.scss"],
배열로 entry를 적어주면 된다!
번들된 결과물(bundle.js)가 저장될 곳이다.
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
publicPath: "http://localhost:3000/dist",
},
webpack middleware는 이미 존재하는 express서버에 webpack에서 컴파일한파일을 전달해준다.메모리에서 bundling된 파일을 이용하기 때문에 실제로 file 구조상에서 확인하기 어렵다.
const webpack = require("webpack");
const webpackDevMiddleware = require("webpack-dev-middleware");
const webpackConfig = require("./webpack.config.js");
const compiler = webpack(webpackConfig);
const express = require("express");
const port = 3000;
const app = express();
app.use(express.json());
app.get("/", (req, res, next) => {
next();
});
app.use(
webpackDevMiddleware(compiler, {
publicPath: webpackConfig.output.publicPath,
stats: { colors: true },
})
);
app.use(express.static(__dirname));
app.listen(port, () => {
console.log(`서버 구동중 http://localhost:${port}`);
});
https://d2.naver.com/helloworld/0239818
https://hoony-gunputer.tistory.com/entry/webpack-middleware [후니의 컴퓨터]
https://poiemaweb.com/es6-babel-webpack-2
https://foglove.tistory.com/6