2번 바벨 포스팅에 이어서 웹팩을 셋팅해보자! 웹팩3(3.8.1) 환경에서 테스트하였다.
우선 node express에 웹팩을 붙여보자.
1 2 3 4 npm i express --save npm i babel-register --save-dev mkdir src/server touch src/server/main.js src/server/express.js
1 2 require ("babel-register" )require ("./express" )
babel-register를 선언해주면, 다른 require 에서도 babel을 적용시킬 수 있다. require('./express')
안에서 ES6 문법인 import를 사용할 것이다. nodejs는 해당 문법을 디폴트로 제공해주지 않는데, babel-register
를 통해 require를 사용하는 모듈들 안에도 최신 JS 문법을 사용할 수 있게 해준다!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import express from "express" import path from "path" const server = express()const webpack = require ('webpack' )const staticMiddleWare = express.static("dist" );const config = require ("../../config/webpack.dev.js" )const compiler = webpack(config);const webpackDevMiddleware = require ("webpack-dev-middleware" )( compiler, config.devServer ) server.use(webpackDevMiddleware); server.use(staticMiddleWare); server.listen(8080 , () => { console .log("Server is Listening" ) });
자 그럼 node src/server/main.js
를 실행해서 express 서버를 구동시켜보자.
localhost:8080
포트를 통해 dist 파일 내용들을 확인할 수 있다.
핫 리로딩 매우 경이롭게 자동으로 파일들이 다시 리로드되는 셋팅이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import express from "express" import path from "path" const server = express()const webpack = require ('webpack' )const staticMiddleWare = express.static("dist" );const config = require ("../../config/webpack.dev.js" )const compiler = webpack(config);const webpackDevMiddleware = require ("webpack-dev-middleware" )( compiler, config.devServer ) const webpackHotMiddleware = require ("webpack-hot-middleware" )(compiler) server.use(webpackDevMiddleware); server.use(webpackHotMiddleware); server.use(staticMiddleWare); server.listen(8080 , () => { console .log("Server is Listening" ) });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 const path = require ("path" )const webpack = require ("webpack" )const HTMLWebpackPlugin = require ('html-webpack-plugin' );module .exports = { entry: { main: ["./src/main.js" ] }, output: { filename: "[name]-bundle.js" , path: path.resolve(__dirname, "../dist" ) }, devServer: { contentBase: "dist" , overlay: true , stats: { colors: true }, hot: true }, module : { rules: [ { test: /\.js$/ , use: [ { loader: "babel-loader" } ], exclude: /node_modules/ }, { test: /\.css$/ , use: [ { loader: "style-loader" }, { loader: "css-loader" } ] }, { test: /\.html$/ , use: [ { loader: "html-loader" , options: { attrs: ["img:src" ] } } ] }, { test: /\.(png|jpg|gif)$/ , use: [ { loader: "file-loader" , options: { name: "images/[name].[ext]" } } ] } ] }, plugins: [ new webpack.HotModuleReplacementPlugin(), new HTMLWebpackPlugin({ template: "./src/index.html" }) ] }
/main.js : 클라이언트 main.js 파일에 핫 리로드 되는 결과를 전달받을 수 있게한다.
1 2 3 4 require ("babel-runtime/regenerator" )require ("webpack-hot-middleware/client?reload=true" )require ("./main.css" );require ("./index.html" );
config/webpack.dev.js와 server 파일들 자동 리로딩
서버측 파일 및 config파일은 위 셋팅으로 자동으로 리로딩 되지 않는다. 서버측 파일을 리로딩 시키기 위해서는 nodemon을 활용한다.
npm i -g nodemon
nodemon –watch config –watch src/server src/server/main
서버와, 프론트 코드 모두가 새로고침 없이 리로딩 되는것을 확인할 수 있다!!
Reference https://www.udemy.com/webpack-beyond-the-basics
nodejs의 import 지원 : https://stackoverflow.com/questions/39436322/node-js-syntaxerror-unexpected-token-import
babel-register : https://jaeyeophan.github.io/2017/05/16/Everything-about-babel/