An open API service indexing awesome lists of open source software.

https://github.com/junh0328/ts-slack-clone

๐Ÿ’ป ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ์Šฌ๋ž™ ํด๋ก  ์ฝ”๋”ฉ
https://github.com/junh0328/ts-slack-clone

react socket-io swr typescript

Last synced: 2 months ago
JSON representation

๐Ÿ’ป ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ์Šฌ๋ž™ ํด๋ก  ์ฝ”๋”ฉ

Awesome Lists containing this project

README

          

# ๋ผ์ด๋ธŒ๊ฐ•์ขŒ ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌํ•ด์„œ ์—ฌ๊ธฐ(README.md)์— ์˜ฌ๋ ค๋‘์—ˆ์Šต๋‹ˆ๋‹ค~ ๋‹ค์‹œ๋ณด๊ธฐํ•˜๋ฉด์„œ ๊ฐ™์ด ์ฝ๊ณ  ๋ณต์Šตํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

# ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„ธํŒ…

0. node 14๋ฒ„์ „(12๋‚˜ 15๋„ ๊ดœ์ฐฎ์Œ)๊ณผ MySQL์„ ๋ฏธ๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ
1. cd back (๋ฉ€ํ‹ฐ์บ ํผ์Šค ๊ฐ•์ขŒ ์ˆ˜๊ฐ•์ž๋ผ๋ฉด cd multicampus-back)
2. npm i
3. .env ์ž‘์„ฑํ•˜๊ธฐ(COOKIET_SECRET๊ณผ MYSQL_PASSWORD ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •)
4. config/config.json ์„ค์ •(MYSQL ์ ‘์† ์„ค์ •)
5. npx sequelize db:create(์Šคํ‚ค๋งˆ ์ƒ์„ฑ)
6. npm run devํ–ˆ๋‹ค๊ฐ€ ctrl + c๋กœ ๋„๊ธฐ(ํ…Œ์ด๋ธ” ์ƒ์„ฑ)
7. npx sequelize db:seed:all(๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ)
8. npm run dev
9. localhost:3095์—์„œ ์„œ๋ฒ„ ๋Œ์•„๊ฐ€๋Š” ์ค‘
10. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ API.md์™€ typings/db.ts๋ฅผ ๋‚จ๊ฒจ๋‘” ์ƒํ™ฉ

# ๊ฐ•์ขŒ ์ˆœ์„œ

## 1์ผ์ฐจ

1. package.json

- npm init์œผ๋กœ ์ƒ์„ฑ
- npm i react react-dom
- npm i typescript @types/react @types/react-dom
- ์„ค์น˜ ํ›„ package-lock.json๊ณผ node_modules ํด๋”๊ฐ€ ์ƒ์„ฑ๋จ

2. .eslintrc

- eslint ์„ค์ • ํŒŒ์ผ
- ์ฝ”๋“œ ์ ๊ฒ€ ๋„๊ตฌ, ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด ํŒ€์›๊ฐ„ ์˜๊ฒฌ ์ถฉ๋Œ์ด ์žˆ์œผ๋‹ˆ prettier์— ์œ„์ž„
- npm i -D eslint

3. .prettierrc

- prettier ์„ค์ • ํŒŒ์ผ
- ์ €์žฅํ•˜๋ฉด ์•Œ์•„์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์คŒ(์—๋””ํ„ฐ ์„ค์ • ํ•„์š”)
- npm i -D prettier eslint-plugin-prettier eslint-config-prettier

4. tsconfig.json

- ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ •
- ์–ธ์–ด ๋ฌธ๋ฒ•๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฒฐ๊ณผ๋ฌผ์ด ์–ด๋–ป๊ฒŒ ๋‚˜์™€์•ผํ•˜๋Š”์ง€ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ
- lib์€ ES2020, DOM(๋ธŒ๋ผ์šฐ์ €), module์€ esnext์ฒ˜๋Ÿผ ์ตœ์‹  ์„ค์ •์ด์ง€๋งŒ target์€ es5๋กœ IE ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜
- strict: true๋ฅผ ์ผœ๋†“์•„์•ผ ํƒ€์ž… ์ฒดํ‚น์„ ํ•ด์ค˜์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ.

5. webpack.config.ts

- ์›นํŒฉ ์„ค์ •
- ts, css, json, ์ตœ์‹  ๋ฌธ๋ฒ• js ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์คŒ.
- npm i -D webpack @types/webpack @types/node
- entry์—์„œ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋ฉด module์— ์ •ํ•ด์ง„ rules๋Œ€๋กœ js๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์คŒ(output). plugins๋Š” ํ•ฉ์น˜๋Š” ์ค‘ ๋ถ€๊ฐ€์ ์ธ ํšจ๊ณผ๋ฅผ ์คŒ
- ts๋Š” babel-loader๋กœ, css๋Š” style-loader์™€ css-loader๋ฅผ ํ†ตํ•ด js๋กœ ๋ณ€ํ™˜
- babel์—์„œ๋Š” @babel/preset-env(์ตœ์‹ ๋ฌธ๋ฒ• ๋ณ€ํ™˜) @babel/preset-react(๋ฆฌ์•กํŠธ jsx ๋ณ€ํ™˜), @babel/preset-typescript(ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ณ€ํ™˜)
- npm i -D css-loader style-loader @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/preset-typescript
- publicPath๊ฐ€ /dist/๊ณ  [name].js์—์„œ [name]์ด entry์— ์ ํžŒ๋Œ€๋กœ app์œผ๋กœ ๋ฐ”๋€Œ์–ด /dist/app.js๊ฐ€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋จ.

6. index.html ์ž‘์„ฑ

- ์•„์ด์ฝ˜, ํฐํŠธ, ํŒŒ๋น„์ฝ˜๊ฐ™์€ ๊ฒƒ์€ ์Šฌ๋ž™์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
- client.tsx์— ๊ฐ„๋‹จํ•œ tsx ์ž‘์„ฑ
- #app ํƒœ๊ทธ์— ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง๋จ.
- ./dist/app.js๋กœ ์›นํŒฉ์ด ๋งŒ๋“ค์–ด๋‚ธ jsํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ด

7. tsconfig-for-webpack-config.json

- webpackํ•  ๋•Œ webpack.config.ts๋ฅผ ์ธ์‹ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
- npm i cross-env
- package.json์˜ scripts์˜ build๋ฅผ cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack
- npm run build
- index.html ์‹คํ–‰ํ•ด๋ณด๊ธฐ

8. ์›นํŒฉ ๋ฐ๋ธŒ ์„œ๋ฒ„ ์„ค์น˜

- ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„์ธ devServer ์˜ต์…˜ ์ถ”๊ฐ€(port๋Š” 3090, publicPath๋Š” /dist/๋กœ)
- webpack serveํ•  ๋•Œ webpack.config.ts๋ฅผ ์ธ์‹ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
- npm i -D ts-node webpack-dev-server @types/webpack-dev-server webpack-cli
- package.json์˜ scripts์˜ dev๋ฅผ cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack serve --env development
- npm run devํ•˜๋ฉด localhost:3090์—์„œ ์„œ๋ฒ„ ์‹คํ–‰๋จ.

9. hot reloading ์„ค์ •

- npm i -D @pmmmwh/react-refresh-webpack-plugin react-refresh
- webpack์˜ babel-loader ์•ˆ์— ์„ค์ •(env) ๋ฐ plugin์œผ๋กœ ์ถ”๊ฐ€

10. fork-ts-checker-webpack-plugin

- webpack์€ ts์ฒดํฌ ํ›„ eslint์ฒดํฌ ํ›„ ๋นŒ๋“œ ์‹œ์ž‘
- ts๋ž‘ eslint๋Š” ๋™์‹œ์— ์ฒดํฌํ•˜๋ฉด ๋” ํšจ์œจ์ 
- ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋™์‹œ์— ์ง„ํ–‰ํ•˜๊ฒŒ ํ•ด์คŒ.

11. ํด๋” ๊ตฌ์กฐ ์„ธํŒ…

- ํŽ˜์ด์ง€๋“ค์€ pages
- ํŽ˜์ด์ง€๊ฐ„ ๊ณตํ†ต๋˜๋Š” ํ‹€์€ layouts
- ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋Š” components
- ์ปค์Šคํ…€ํ›…์€ hooks, ๊ธฐํƒ€ ํ•จ์ˆ˜๋Š” utils
- ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ํด๋” ์•„๋ž˜ index.tsx(JSX)์™€ styles.tsx(์Šคํƒ€์ผ๋ง)

12. ts์™€ webpack์—์„œ alias ์ง€์ •

- npm i -D tsconfig-paths
- tsconfig์—์„œ baseUrl์™€ paths ์„ค์ •
- webpack์—์„œ๋Š” resolve์•ˆ์— alias ์„ค์ •
- ../layouts/App๊ฐ™์€ ๊ฒƒ์„ @layouts/App์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

13. emotion ์„ธํŒ…

- styled components์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์„ค์ •์ด ๊ฐ„๋‹จํ•จ.
- npm i @emotion/react @emotion/styled
- npm i -D @emotion/babel-plugin (์›นํŒฉ์— babel ์„ค์ • ์ถ”๊ฐ€)
- ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค ๋•Œ ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ๋งŒ๋“œ๋Š” ์…ˆ์ด๋ฏ€๋กœ & ๊ฐ™์€ ์„ ํƒ์ž ์ ๊ทน ํ™œ์šฉํ•ด์•ผ ๋ณ€์ˆ˜ ์ด๋ฆ„์ง“๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ.

14. @layouts/App ์ž‘์„ฑ

- ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ์ ์šฉํ•˜๊ธฐ
- npm i react-router react-router-dom
- npm i -D @types/react-router @types/react-router-dom
- client.tsx์—์„œ App์„ BrowserRouter๋กœ ๊ฐ์‹ธ๊ธฐ
- @layouts/App์— Switch, Redirect, Route ๋„ฃ๊ธฐ

15. @loadable/component

- ๋ผ์šฐํ„ฐ๋ฅผ ์ฝ”๋“œ์Šคํ”Œ๋ฆฌํŒ… ํ•ด์คŒ
- ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•œ ์‚ฌ๋žŒ์€ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ JS๋งŒ ๋ฐ›์Œ
- 3์ดˆ ๋ฃฐ ๊ธฐ์–ตํ•˜์ž!
- npm i @loadable/component @types/loadable\_\_component

16. @pages/SignUp ์ž‘์„ฑ

## 2์ผ์ฐจ

17. ํšŒ์›๊ฐ€์ž… axios๋กœ ์ง„ํ–‰

- npm i axios
- CORS ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ devServer์— proxy ์„ธํŒ…
- CORS๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒ
- ๊ฐ™์€ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, ์„œ๋ฒ„๋ผ๋ฆฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
- ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๋„๋ฉ”์ธ์ธ proxy์„œ๋ฒ„๋ฅผ ๋„์›Œ CORS๋ฅผ ํ”ผํ•ด๊ฐˆ ์ˆ˜ ์žˆ์Œ.

18. useInput ์ปค์Šคํ…€ ํ›… ๋งŒ๋“ค๊ธฐ

- ์ปค์Šคํ…€ ํ›…์œผ๋กœ ํ›…๋“ค๊ฐ„์— ์ค‘๋ณต๋œ ๊ฒƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
- ํ›… ๋‚ด๋ถ€์— ํ›…์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ผ€์ด์Šค
- useCallback์€ return ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ํ•จ์ˆ˜์— ๊ผญ ์ ์šฉํ•ด์ฃผ์ž
- useMemo๋Š” return ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์— ์ ์šฉํ•˜์ž

19. @pages/LogIn ์ž‘์„ฑ ๋ฐ SWR

- ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ๋žŒ์ด ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด?
- GET ์š”์ฒญ์€ SWR๋กœ ํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์Œ
- npm i swr
- SWR์— fetcher(axios๋ฅผ ์‚ฌ์šฉ)๋ฅผ ๋‹ฌ์•„์คŒ.
- ๋กœ๊ทธ์ธํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด withCredentials: true ์žŠ์œผ๋ฉด ์•ˆ ๋จ.

20. @layouts/Workspace ์ž‘์„ฑ

- ๋ˆˆ์— ๋„๋Š” ๊ตฌ์—ญ ๋‹จ์œ„๋กœ ์Šคํƒ€์ผ๋“œ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด๋‘ .
- ๊ตฌ์—ญ ๋‚ด๋ถ€์˜ ํƒœ๊ทธ๋“ค์€ ์Šคํƒ€์ผ๋“œ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๋ฉด ๋ณ€์ˆ˜๋ช… ์ง€์–ด์•ผ ํ•˜๋‹ˆ css์„ ํƒ์ž๋กœ ์„ ํƒ

21. ๊ทธ๋ผ๋ฐ”ํƒ€

- npm i gravatar @types/gravatar
- Github๊ฐ™์€ ์•„์ด์ฝ˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

22. typescript ์ •์˜

- ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’์— ํƒ€์ž…์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋จ.
- ๋‚จ์ด ํƒ€์ดํ•‘ํ•ด๋‘” ๊ฒƒ ๋ถ„์„ํ•˜๋Š” ๊ฒŒ ์–ด๋ ค์›€
- Go to Type Definition
- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์™€๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  ts ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ @types๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋“ค

23. @components/DMList ์ž‘์„ฑ

- ํ˜„์žฌ ์ฑ„๋„ ์ฐธ์—ฌ์ž ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

24. @pages/DirectMessage ์ž‘์„ฑ

- Header์™€ ChatList, ChatBox๋กœ ๊ตฌ์„ฑ

25. @components/ChatBox ๋จผ์ € ์ž‘์„ฑ

- react-mentions ํ™œ์šฉ
- DM์—์„œ๋Š” ๋ฉ˜์…˜ ๊ธฐ๋Šฅ์ด ์—†์ง€๋งŒ Channel์—์„œ๋Š” ์žˆ์„ ๊ฒƒ

26. DM ๋ณด๋‚ด๋ณด๊ธฐ

- optimistic UI
- ๋จผ์ € ํ”„๋ก ํŠธ์—์„œ ํ‘œ์‹œํ•˜๊ณ , ์„œ๋ฒ„๋กœ๋Š” ๊ทธ ๋‹ค์Œ์— ์š”์ฒญ๋ณด๋ƒ„
- ์š”์ฒญ ์‹คํŒจํ•˜๋Š” ์ˆœ๊ฐ„ ํ”„๋ก ํŠธ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋„์›€
- ๋ณด๋‚ผ ๋•Œ ์—๋Ÿฌ๊ฐ€๋‚œ ๊ฒƒ์€ ์„œ๋ฒ„์ชฝ์—์„œ socket ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ

27. DM ๋กœ๋”ฉ์€ useSWRInfinite ์‚ฌ์šฉ

- ๊ฒฐ๊ณผ๋ฌผ์ด 2์ฐจ์› ๋ฐฐ์—ด ๊ผด๋กœ ๋‚˜์˜ด.
- ์ฒซ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์ฃผ์†Œ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
- ์ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋“ค์–ด์žˆ์–ด์„œ ํ˜„์žฌ ๋ช‡ ํŽ˜์ด์ง€์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ.

## 3์ผ์ฐจ

28. Workspace์— ์†Œ์ผ“ ์—ฐ๊ฒฐํ•˜๊ธฐ

- socket.emit์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ, socket.on์ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ

29. DMList์— onlineList, dm ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ
30. @components/ChatList ์ž‘์„ฑ ๋ฐ @components/Chat ๊ตฌํ˜„

- npm i react-custom-scrollbars @types/react-custom-scrollbars

31. makeSection ๊ตฌํ˜„

- npm i dayjs
- dayjs๋Š” moment๋ฅผ ๋Œ€์ฒดํ•จ

32. ํ”„๋กœํŒŒ์ผ๋ง ํ•˜๋ฉด์„œ Chat์— memo ์ ์šฉํ•˜๊ธฐ
33. ์ธํ”ผ๋‹ˆํŠธ ์Šคํฌ๋กค๋ง ๊ตฌํ˜„
34. @components/ChannelList ์ž‘์„ฑ
35. @pages/ChannelMessage ์ž‘์„ฑ
36. Channel Chat ๋ณด๋‚ด๋ณด๊ธฐ
37. ๋นŒ๋“œ ์„ค์ •
38. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์ธ JS์™€ html์„ ์„œ๋ฒ„๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ