레이블이 webpack인 게시물을 표시합니다. 모든 게시물 표시
레이블이 webpack인 게시물을 표시합니다. 모든 게시물 표시

migrate webpack to vite

요즘은 yarn 대신 bun(https://github.com/oven-sh/bun) 을 쓰게 된다.(예전에 bower -> yarn 으로 바뀐지가 몇년 되지 않은것 같은데 트렌드가 참 빠르다.)
그리고 webpack 대신 vite(https://github.com/vitejs/vite) 쓰게 된다.
둘의 공통점을 빠르다(여기엔 효율적이다라는 의미도 포함된다. 예로 webpack 처럼 모든것 다시 번들링하는게 아닌 필요한 부분만 하는등)

bun 그냥 설치만 하면 사용방법도 yarn 과 거의 같아서 별 신경쓸게 없다.
그런데 webpack, vite 은 각각 설정 파일이 있고 다르다.
webpack 설정 -> vite 설정을 만들어 보자.

# vite 설치(package.json 에도 vite 가 명시된다.)
bun install vite vite-plugin-node @vitejs/plugin-react @babel/core babel-preset-env --save-dev

# 참고 새로운 프로젝트를 만들때는 프로젝트 이름의 디렉토리에 전체 설정들이 생성된다.
bun create vite

# 이미 프로젝트가 있는 상태
# 다음과 vite.config.js 파일을 만들고 수정하거나 변경되는 부분을 수정하거나
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': '/src',
    },
  },
})
# 아니면 webpack.config.js chat-gpt 같은 LLM에서 변환시키면 편하다.

# webpack -> vite 변경되는 설정들
webpack                    vite
babel-loader              필요 없음 (ESBuild로 기본 트랜스파일링)
style-loader              기본 지원
css-loader, sass-loader   필요 시 bun install sass --save-dev 설치
file-loader, url-loader   기본 지원
html-webpack-plugin       필요 없음

# webpack -> vite 변경되는 코드들
webpack              vite
process.env.NODE_ENV import.meta.env.MODE
require()            import (ECMAScript Modules(ESM) JavaScript의 공식 모듈 시스템)
require.context()    지원 안됨

# 클라이언트 번들링은 webpack, vite 둘다 된다.
# 서버 번들링은 
# webpack.config.js 설정으로 target: "node" 명시하면되지만
# vite 는 기본적으로 안되고 vite-plugin-node 같은 플러그인을 이용해야 한다.

vue local devserver proxy

# 예시
# 현재 로컬 서버 http://localhost:8080
# 요청 서버 http://my.ysoftman.com:443

# 로컬에서 vue 개발시, 도메인이 다른 호스트 요청시 발생하는
# cors(Cross-origin resource sharing) 에러 해결을 위해
# vue.config.js (webpack) proxy 를 설정한다.
 
module.exports = {
  // 로컬 개발시(이 파일 수정시 npm run serve 로 다시 시작해야함)
  devServer: {
    https: true,
    // /api 로 시작하는 경로 요청을 target 으로 요청
    proxy: {
      '^/api': {
        target: 'https://my.ysoftman.com:443',
        changeOrigin: true,
      },
    disableHostCheck: true,
  },
};

# 위와 같이 프록시 설정하면, cors 이슈도 없고, 쿠키등의 헤더도 잘 전달된다.

# 주의사항
# xmlhttprequest, axios 등으로 요청 호스트명을 빼서 로컬 호스트로 요청해야 한다.
# 그래야 위 (로컬서버에 대한) 프록시 처리가 된다.

#####

# 만약 호스트명이 필요한 실제 서비스 환경과 로컬 develop 개발 환경 구분이 필요한 경우
# host 변수을 두고 다음과 같이 process.env.NODE_ENV 에 따라 '' 로 설정해 처리하자.

let host = "http://my.ysoftman.com:443"
if (process.env.NODE_ENV != null && process.env.NODE_ENV == 'development')
{
  return '';
}

vue https local test

# vue 로컬 테스트시
npm run serve

# webpack 설정으로 https, http2 기능을 사용해 띄울 수 있다.
https://webpack.js.org/configuration/dev-server/#devserverhttps
https://webpack.js.org/configuration/dev-server/#devserverhttp2
# http2 는 node 버전 10 부터 사용할 수 없고, express framework 에서 쓸 수 있다.
# vue.config.js 에 설정하면
module.exports = {
  //...
  devServer: {
    http2: true,
    https: true,

# http2, https 로 테스트 할 수 있다.
  App running at:
  - Local:   https://localhost:8080/

Prev