이 포스트에서는 Vite를 사용한 모노레포 환경에서 공통 모듈을 설정하고 개별 프로젝트에서 사용하는 방법을 단계별로 알아보겠습니다. 이 방법은 Redux 스토어, 유틸리티 함수, 공통 컴포넌트 등 다양한 종류의 공통 코드에 적용할 수 있습니다.
root/
├── apps/
│ └── projectA/
├── packages/
│ ├── components/
│ ├── pages/
│ └── common/
└── vite.config.js
apps에는 개별 프로젝트 폴더가
packages에는 공통으로 사용되는 파일들을 위치 시킵니다.
먼저, root/vite.config.js
파일에 다음과 같이 별칭(alias)을 설정합니다:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
"@components": path.resolve(__dirname, "./packages/components"),
"@pages": path.resolve(__dirname, "./packages/pages"),
"@common": path.resolve(__dirname, "./packages/common"),
},
},
});
이렇게 하면 @common과 같은 별칭을 사용하여 공통 모듈에 쉽게 접근할 수 있습니다.
packages/common 디렉토리에 package.json 파일을 생성합니다:
{
"name": "@projectA/common",
"version": "1.0.0",
"main": "index.js",
"private": false
}
패키지의 이름입니다.
@projectA/common에서 projectA 부분은 네임스페이스로, 여러분의 조직이나 프로젝트를 나타냅니다.
이 부분은 자유롭게 변경할 수 있습니다. 예를 들어, @myproject/common, @companyname/common 등으로 설정할 수 있습니다.
주의: npm에 패키지를 공개할 계획이라면, 이미 사용 중인 이름과 충돌하지 않도록 주의해야 합니다.
패키지의 버전을 나타냅니다.
시맨틱 버저닝 규칙을 따르는 것이 좋습니다.
1.0.0은 첫 번째 주요 릴리스를 의미합니다.
패키지를 업데이트할 때마다 이 버전을 적절히 증가시켜야 합니다.(동료들간 버전 표기 방식을 결정해야합니다)
패키지의 주요 진입점(entry point)을 지정합니다.
"main": "index.js"는 이 패키지를 import할 때 index.js 파일이 로드된다는 의미입니다.
만약 TypeScript를 사용한다면 "main": "index.ts"로 변경할 수 있습니다.
이 필드가 true로 설정되면 npm에 실수로 패키지를 공개하는 것을 방지합니다.
false로 설정하면 npm에 패키지를 공개할 수 있습니다.
내부용 패키지라면 "private": true로 설정하는 것이 안전합니다.
description: 패키지에 대한 간단한 설명을 추가할 수 있습니다.
author: 패키지 작성자의 정보를 추가할 수 있습니다.
license: 패키지의 라이선스를 지정할 수 있습니다.
packages/common/utils.js 파일을 생성하고 공통 기능을 구현합니다. :
export const formatDate = (date) => {
return new Date(date).toLocaleDateString();
};
packages/common/index.js 파일을 생성하고 다음 내용을 추가합니다:
export * from "./utils"; (전체 내보내기)
export { formatDate } from "./utils"; (일부 내보내기)
각 개별 프로젝트에(apps/projectA)의 package.json 에 공통 모듈 의존성 추가합니다.
{
"dependencies": {
"@projectA/common": "1.0.0",
// ... 기타 의존성
}
}
프로젝트 루트 디렉토리에서 npm i 로 설치를 진행합니다. (yarn,pnpm 등 자신이 사용하는 설치방식에 맟춰서 사용)
개별 프로젝트의 컴포넌트(예: apps/projectA/src/App.jsx)에서 공통 모듈을 사용합니다.
import React from 'react';
import { formatDate } from '@projectA/common';
function App() {
const today = new Date();
return (
<div>
<h1>Common Module Test</h1>
<p>Today's date: {formatDate(today)}</p>
</div>
);
}
export default App;