-
Notifications
You must be signed in to change notification settings - Fork 41
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore : 기존 프로젝트를 turborepo 기반 모노레포로 변경합니다. #55
chore : 기존 프로젝트를 turborepo 기반 모노레포로 변경합니다. #55
Conversation
95cfb39
to
873301e
Compare
// eslint-disable-next-line import/named | ||
import { cache } from "react"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
캐시 객체는 React 자체에서 가져오는 것이 아니라 Next.js에서 next 패키지로 부터 가져옵니다.
실제 객체는 올바르게 가져오지만 next 13 app router 와 모노레포를 함께 사용했을 때 의존성을 찾지 못하여 린트를 꺼둡니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호... 신선하네요
"docker:build": "pnpm build && docker build --file ./Dockerfile.dev -t react-world .", | ||
"docker:run": "docker run -p 3000:3000 react-world", | ||
"docker:start": "pnpm docker:build && pnpm docker:run" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
배포 환경을 어떻게 정할지 고민중에 있어 잠시 docker 관련 코드는 제거합니다.
클러스터 구성과 관련하여 사내에서 모노레포를 쓰시고 계신 분들이 있다면 첨언 부탁드립니다.
"use client"; | ||
|
||
export function Button(): JSX.Element { | ||
return ( | ||
<button | ||
onClick={(): void => { | ||
// eslint-disable-next-line no-alert -- alert is being used for demo purposes only | ||
alert("booped"); | ||
}} | ||
type="button" | ||
> | ||
Boop | ||
</button> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
예제 코드입니다. 차후 개발 시 삭제해둘게요
import type { PlopTypes } from "@turbo/gen"; | ||
|
||
// Learn more about Turborepo Generators at https://turbo.build/repo/docs/core-concepts/monorepos/code-generation | ||
|
||
// eslint-disable-next-line import/no-default-export -- Turbo generators require default export | ||
export default function generator(plop: PlopTypes.NodePlopAPI): void { | ||
// A simple generator to add a new React component to the internal UI library | ||
plop.setGenerator("react-component", { | ||
description: "Adds a new react component", | ||
prompts: [ | ||
{ | ||
type: "input", | ||
name: "name", | ||
message: "What is the name of the component?", | ||
}, | ||
], | ||
actions: [ | ||
{ | ||
type: "add", | ||
path: "{{pascalCase name}}.tsx", | ||
templateFile: "templates/component.hbs", | ||
}, | ||
{ | ||
type: "append", | ||
path: "index.tsx", | ||
pattern: /(?<insertion>\/\/ component exports)/g, | ||
template: 'export * from "./{{pascalCase name}}";', | ||
}, | ||
], | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
문서 내에 특정 데이터를 노출시켜야 할 때 직접 DOM을 파싱하고 데이터가 들어갈 공간을 찾아서 넣어주는 작업을 반복해야합니다. 이런 일을 많이해야할 때 템플릿 엔진을 사용합니다.
요것을 Turbo 에서 loader 역할을 해주어 템플릿 엔진을 사용할 수 있게 해줍니다.
import * as React from "react"; | ||
|
||
interface Props { | ||
children?: React.ReactNode; | ||
} | ||
|
||
export const {{ pascalCase name }} = ({ children }: Props) => { | ||
return ( | ||
<div> | ||
<h1>{{ name }}</h1> | ||
{children} | ||
</div> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오래된 사이드 템플릿 엔진이죠! 초기에는 우아한형제들에서도 요뇨속을 통해 어드민을 구축했거든요. 사이드 템플릿 엔진 특성이 서버에 상당히 치우쳐져 있어서... 위에 언급한대로 잘 차용하신 것 같네요!
873301e
to
477ffc1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
모노레포 최초 세팅 때는 정말 변경된 파일이 많네요 🫠
module.exports = { | ||
extends: ["custom/next"], | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
docs에 린트 설정 파일이 있군요? 👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵 https://nextra.site/ 를 이용해서 static 한 docs 사이트를 만들어서 함께 배포할려고합니다.
차후 불필요하면 제거해두도록 할게요
# Logs | ||
logs |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.gitignore도 루트에서 관리하면 더 좋을지도...!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
감사합니다 수정해둘게용
// eslint-disable-next-line import/named | ||
import { cache } from "react"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오호... 신선하네요
import * as React from "react"; | ||
|
||
interface Props { | ||
children?: React.ReactNode; | ||
} | ||
|
||
export const {{ pascalCase name }} = ({ children }: Props) => { | ||
return ( | ||
<div> | ||
<h1>{{ name }}</h1> | ||
{children} | ||
</div> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오래된 사이드 템플릿 엔진이죠! 초기에는 우아한형제들에서도 요뇨속을 통해 어드민을 구축했거든요. 사이드 템플릿 엔진 특성이 서버에 상당히 치우쳐져 있어서... 위에 언급한대로 잘 차용하신 것 같네요!
📌 이슈 링크
📖 작업 배경
🛠️ 구현 내용
turborepo 라는 빌드매니저를 이용하여 모노레포를 구성하였어요.
library
,next.js
,react 내부에서 사용하는 lib, 컴포넌트
세 가지로 나눠 eslint를 설정해주었어요. 이 때 lint 설정들은 custom이 아닌 모두 vercel style guide 에서 가져왔어요tsconfig
는공통
,next.js
,react 내부에서 사용하는 lib, 컴포넌트
세 가지로 나눠 설정해두었어요.모노레포 구성
app/web
,app/docs
packages/eslint-config-custom
,packages/tsconfig
,pakages/ui
💡 참고사항
node 16버전 이상에서 사용가능합니다.
npm install turbo --global
를 해주시고npm install -g pnpm
를 해주세요.이미
pnpm
에서workspace
를 제공하는데 왜turborepo
를 적용하였나요?pnpm workspace
를 통해서 모노레포 환경에서 효율적인 패키지 매니징이 가능합니다. 하지만 패키지 별 빌드 환경 설정과 산출물 관리를 위해서는 각각의 프로젝트마다 설정을 해주어야한다는 불편함이 있습니다. 이를 효과적으로 도와주는 것이nx
,lerna
,turborepo
와 같은 빌드 매니징 툴입니다.빌드 매니징 툴을 쓰기 위한거라면 다른 툴도 많은데 왜
turborepo
를 적용했나요?next.js
기반의 웹 서비스를 개발하고 있기 때문에vercel
에서 만든turborepo
를 통해 모노레포를 구성하였어요. 또한turborepo
는 패키지에 중점을 두고 있기 때문에 설정도 쉽고캐싱
과병렬 빌드 기능
을 제공하기 때문에 차후CI
환경에서 좋은 성능을 낼 수 있을 것이라 생각했어요.🖼️ 스크린샷