🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

블로그

nextjs 12에서 emotion과 함께하는 tailwindcss

Nextjs 12 is coming...nextjs 12에서 놀라운 소식이 전해졌습니다. 컴파일러로 swc를 채택했다는 것을요! 여러가지 이유가 있겠지만 가장 중요한 건 기존에 사용하던 babel보다 빌드가 최대 5배나 빨라졌다는 겁니다. 참고로 fast refresh는 최대 3배나 빨라졌다네요!좋은 소식입니다. 하지만 변화에는 언제나 문제가 발생하기 마련입니다. swc를 활성화하기 위해서는 .babelrc와 같은 바벨 설정 파일을 완전히 제거해야 합니다. 이런, 그럼 무조건 바벨을 설정해야 하는 경우는요?그렇습니다. 문제의 발생입니다! 특히 twin.macro을 아끼는 저는 그만 눈물을 닦아낼 수 밖에 없었습니다. 어떤 분께서 이를 대체하는 stailwc를 만들었지만 아직은 이르다는 느낌이 어렴풋이 들고 맙니다. 그렇다면, twin.macro를 포기할 수 밖에 없는 걸까요? 아닙니다!emotionyarn add @emotion/react @emotion/styled or npm install @emotion/react @emotaion/styledemotion을 설치합니다.tailwindcssyarn add tailwindcss or npm install tailwindcss tailwindcss만 설치하면 됩니다.twin.macropackagesyarn add twin.macro babel-loader babel-plugin-macros @babel/plugin-syntax-typescript @babel/preset-react or npm install twin.macro babel-loader babel-plugin-macros @babel/plugin-syntax-typescript @babel/preset-reacttwin.macro와 함께 설정에 필요한 babel 관련 패키지를 설치합니다. 상황에 따라 더 늘어날 수도 있습니다.configurationwithTwin.jsconst path = require("path"); const includedDirs = [ path.resolve(__dirname, "components"), path.resolve(__dirname, "pages"), path.resolve(__dirname, "styles"), ]; module.exports = function withTwin(nextConfig) { return { ...nextConfig, webpack(config, options) { const { dev, isServer } = options; config.module = config.module || {}; config.module.rules = config.module.rules || []; config.module.rules.push({ test: /\.(tsx|ts)$/, include: includedDirs, use: [ options.defaultLoaders.babel, { loader: "babel-loader", options: { sourceMaps: dev, presets: [ [ "@babel/preset-react", { runtime: "automatic", importSource: "@emotion/react" }, ], ], plugins: [ require.resolve("babel-plugin-macros"), require.resolve("@emotion/babel-plugin"), [ require.resolve("@babel/plugin-syntax-typescript"), { isTSX: true }, ], ], }, }, ], }); if (!isServer) { config.resolve.fallback = { ...(config.resolve.fallback || {}), fs: false, module: false, path: false, os: false, crypto: false, }; } if (typeof nextConfig.webpack === "function") { return nextConfig.webpack(config, options); } else { return config; } }, }; };babel 설정 파일을 대신해 babel을 설정합니다.next.config.jsconst withTwin = require("./withTwin"); const nextConfig = withTwin({ // <<- `withTwin` 함수 적용 reactStrictMode: true, swcMinify: true, }); module.exports = nextConfig;작성한 withTwin 함수를 적용해 nextjs를 설정합니다.typestsconfig.json{ ..., "types": [ "@types" ] }타입을 인식할 디렉토리를 설정합니다.@types/twin.d.tsimport "twin.macro"; import { css as cssImport } from "@emotion/react"; import styledImport from "@emotion/styled"; import { CSSInterpolation } from "@emotion/serialize"; // `twin.macro`에 다음 타입을 넣음 declare module "twin.macro" { const styled: typeof styledImport; const css: typeof cssImport; } // DOM의 attribute에 다음 타입을 넣음 declare module "react" { interface DOMAttributes<T> { tw?: string; css?: CSSInterpolation; } }twin.macro와 관련된 타입을 설정합니다.TMI사용하고 있는 tailwindcss에 적용할 수 있나요?네, class로 tailwindcss를 사용하고 있더라도 설치, 설정을 통해 twin.macro를 사용할 수 있습니다.왜 css 관련 설정을 하지 않나요?twin.macro는 입력받은 클래스들을 독립적으로 사용 가능한 css로 변환합니다. 따로 정의된 css의 도움을 받지 않고서요.이 때 변환은 twin.macro로 이뤄집니다. class로도 tailwindcss를 사용해야 한다면 css 설정을 거쳐야 합니다.도움이 됐나요?됐다구요? 다행입니다!즐거운 개발이 되길 바랄게요!reference[GitHub - ben-rogerson/twin.macro: 🦹‍♂️ Twin blends the magic of Tailwind with the flexibility of css-in-js (emotion, styled-components, stitches and goober) at build time.](https://github.com/ben-rogerson/twin.macro)[Enable SWC on next examples · ben-rogerson/twin.examples@36ac8c6 · GitHub](https://github.com/ben-rogerson/twin.examples/commit/36ac8c6dcfa80fcf9cfd65b5c4835b8f3aa79c00#diff-8e7430aee7d110ee12e0366c43b2e8328e0eae8fe870a88eae4bbb7532ec26e1)[Support SWC · Discussion #516 · ben-rogerson/twin.macro · GitHub](https://github.com/ben-rogerson/twin.macro/discussions/516)[How to config Nextjs for Babel Plugin Macros like twin.macro without disabling swc complier](https://blog.mrcatdev.com/how-to-config-nextjs-for-babel-plugin-macros-like-twinmacro-without-disabling-swc-compiler)

프론트엔드nextjstailwindcssemotionswctwin.macro

nextjs는 typescript가 무섭대요

서론어느 한 겨울의 이야기 입니다. 그는 nextjs와 함께 즐겁게 코드를 짜고 있었습니다. 어느 때와 같이 리덕스 스토어에 사용되는 union type을 수정하고 저장을 한 다음 정상적으로 컴파일된 걸 확인합니다.그 순간 그의 등줄기를 타고 소름이 돋습니다. 무언가 이상함을 느낍니다.그는 스크롤을 내립니다. 드르륵- 드드륵- 한 오브젝트가 보입니다. 그는 떨리는 눈으로 오브젝트의 타입을 봤습니다. mapped type, 그는 오래 전에 어느 타입을 이 오브젝트의 키로 사용할 수 있게 만든겁니다. 그렇습니다. 그가 방금 수정한 타입이었습니다. 그는 이윽고 오브젝트를 선명하게 가로지르는 구불구불한 빨간색 선을 보게 됩니다.그는 키보드에 툭 떨어진 식은땀을 볼 틈도 없이 모니터에 온 신경을 집중합니다. 이게 무슨, 타입 에러가 있다면.. 대체 어떻게 컴파일이 된거지? 으아악! ...... 이라는 괴담을 아시나요?대부분 타입을 등한시한 타입스크립트의 저주라고 웃고 넘기지만 사실 더 큰 비밀이 숨겨져 있습니다.사실 nextjs는.. 타입 체킹을 안합니다!!!! 으아아악!dev와 타입 체킹nextjs가 타입 체킹을 지원하지 않는다니 이게 무슨 소리인가요, 빌드에서 타입 에러가 뜨는 걸 이 두 눈으로 똑똑히 봤는데!여러분의 말이 맞습니다. 빌드 때 타입 에러가 잡힙니다. 그렇다면 dev는 어떨까요? 위의 오싹오싹한 괴담과 같은 상황을 만들고 저장을 해보겠습니다.new의 경우를 입력하지 않았습니다. 여러분은 someObject를 가로지르는 빨간 선을 보게 될 겁니다. 타입 에러가 발생했습니다!터미널에는 어떤 일이 일어났을까요?우리의 dev는 그런 건 상관하지 않습니다. 미동없이 고요한 터미널을 볼 수 있을 겁니다.맞습니다. dev는 타입 체킹을 하지 않습니다. 이럴수가...nextjs는 fast refresh가 필요해요모든 일은 nextjs 9.4에서 fast refresh가 정식으로 적용되며 일어났습니다. 기존의 핫 리로딩 방식은 변경이 생길 때마다 앱 전체를 리로드 했습니다. 이런 방식은 느리고 에러 해결에도 좋지 않았습니다. 그걸 극복하기 위해 등장한 것이 fast refresh 입니다.좋은 변화였습니다. 수정한 코드로 인한 변화를 즉각적으로 확인할 수 있음과 더불어 더 정확하게 런타임 에러를 확인할 수 있게 되었습니다. 그런데요, 문제가 발생합니다. 타입 체킹은 너무 시간이 오래 걸렸던 겁니다. 최대한 빠른 리로딩 경험을 제공하고 싶었던 nextjs는 타입 체킹을 빼 버립니다!이를 되돌리는 옵션도 제공하지 않았습니다. nextjs 개발자 분들의 의지는 확고했던 겁니다.우리는 타입 체킹이 필요해요그 확고함과는 달리 항상 typescript의 든든함에 기대고 있던 저는 수정한 즉시 진행되는 타입 체킹이 그리웠습니다. 하지만 nextjs의 버전이 13이 될 때까지도 타입 체킹 지원은 까마득히 멀기만 합니다. 방법을 찾아야만 합니다. 타입 체킹을 다시 불러낼 방법을요. 다행히 저와 같은 생각을 가지고 있는 분들이 꽤 있었습니다.여러분들에게 두가지 방법을 소개합니다.vscodetypescript.tsserver.experimental.enableProjectDiagnosticsvscode는 자체적으로 타입 체킹을 지원하지만 열려있는 파일만 가능합니다. 그렇다면 모든 파일을 체크하게 만든다면 어떨까요?typescript.tsserver.experimental.enableProjectDiagnostics가 가능하게 합니다. 프로젝트의 파일들을 열지 않아도 발생하는 에러를 확인할 수 있게 만들어 줍니다.다만 이 기능은 실험적입니다. 에러들이 발생할 가능성이 높으며 개선될 여지는 낮습니다.tasksvscode의 tasks를 사용하는 방법도 있습니다. tasks는 실행 중 발생한 에러를 Problems view에 띄워줄 수 있습니다. 이를 통해 tsc를 실행하면 어떻게 될까요?tsc로 변경된 파일들을 감시하고 발생한 오류를 Problems view에 표시되게 만들 수 있습니다.terminal잠시만요, 타입 체킹 후 발생한 에러를 vscode를 통해 확인하는 게 마음에 들지 않는 경우는요? 수상할 정도로 터미널을 사랑하는 분들은 오직 터미널에서 모든 걸 확인하고 처리하고 싶을 겁니다.그렇다면 이 방법을 사용하세요.concurrently 패키지는 명령어의 동시 실행과 함께 [TS]와 같은 접두사로 어떤 명령어에서 나온 로그인지 구별하기 쉽게 만들어 줍니다. 이를 사용해 nextjs dev 서버와 tsc를 동시에 실행시켜 로그를 확인할 수 있습니다.TMItsconfig.json을 확인하세요tsconfig.json가 다음처럼 설정되어 있는지 확인하세요.noEmit이 true가 되어야 출력 파일을 만들지 않습니다. tsc를 타입 체킹의 용도로만 사용할 것이기 때문입니다incremental이 true여야 incremental compilation이 됩니다. 속도가 더 빠릅니다타입 에러 발생 시 중단은 안됩니다 사실 타입 에러가 발생했을 때 앱의 실행을 막고 싶었습니다. 무심코 지나치는 일 없이 확실히 해결할 수 있게요!안타깝게도 그런 방법은 찾을 수 없었습니다. nextjs 자체에서 지원해야 될텐데 현재로서는 가망이 없다고 생각이 듭니다. 타입 체킹 자체가 굉장히x3 빨라지는 날이 온다면 가능할 수도 있지만요! 그 날이 오기까지는 마음 한 켠에 담아두는 걸로 했습니다. 흑흑...도움이 되었나요?되었다고요? 다행입니다!!날씨가 아직도 꽤 춥네요. 오늘도 따뜻하고 즐거운 개발이 되셨음 합니다.Referencetasks[Tasks in Visual Studio Code](https://code.visualstudio.com/Docs/editor/tasks#_examples-of-tasks-in-action)[Visual Studio Code Tasks Appendix](https://code.visualstudio.com/docs/editor/tasks-appendix)[Blog - Next.js 9.4 | Next.js](https://nextjs.org/blog/next-9-4)(https://github.com/microsoft/vscode/issues/13953)[TypeScript: Documentation - tsc CLI Options](https://www.typescriptlang.org/ko/docs/handbook/compiler-options.html)[enableProjectDiagnostics problem · Issue #168410 · microsoft/vscode](https://github.com/microsoft/vscode/issues/168410)[Feature Request: Show all errors and warnings in project for all JavaScript and TypeScript files, not just opened ones · Issue #13953 · microsoft/vscode](https://github.com/microsoft/vscode/issues/13953)[Typescript \`next dev\` error reporting · Discussion #33634 · vercel/next.js](https://github.com/vercel/next.js/discussions/33634) 

프론트엔드nextjstypescriptvscode

rlwjd31

[인프런 워밍업 스터디 클럽 4기_FE] 1주차 발자국 회고

워밍업 클럽을 시작하기 앞서 react로 프로젝트를 하고 nextjs로 마이그레이션을 해보고 싶은 계획이 있었다. 하지만, 개인 블로그의 필요성을 느끼고 있었고 요새 컴퓨터 앞에 앉으면 바이브 코딩이다 노코드로 수익을 창출을 했다~와 같은 글들을 계속 볼 수 있었다. 시대가 ai를 활용하여 효율을 극대화 시키는 길목으로 들어서 감을 체감하는 도중 cursor ai + 블로그 + notion ai강의가 올라왔다!!!난 대부분 공부 내용을 notion으로 정리한 것이 많고 notion api를 활용하여 블로그를 만들 기회를 엿보고 있었는데 마침 딱 이런 강의가 올라오다니 삼박자가 맞아떨어졌다. 주저 없이 강의를 아니..... 사실 강의비가 비싸 주저없이 하진 않았다....하지만, 워밍업 클럽과 연계하는 것 같아 신청을 한 계기가 됐다. 수 많은 강의를 들어보면서 강의는 등대와 같이 가이드의 역할로 생각한다. 강의는 내 실력을 올려주겠지만 자신이 어떤 방식으로 하기 나름에 따라 개개인 마다 얻을 수 있는 부분의 갭의 격차가 많이 난다고 생각한다. 따라서, 아래와 같이 스스로 가이드를 통해 강의를 수강했다. 단순히 따라치지 말 것결과를 보고 혼자 해 볼 것nextjs와 관련된 공식 문서를 훑어보고 공부할 것능숙한 개발자가 아니기에 개발을 하고 나서 ai와의 차이점을 통해 스스로 인사이트를 기를 것              들어가며    스터디가 시작하기 전에 틈틈히 공부를 하다 보니 이미 수강률이 80%에 가까워졌다. 따라서 스터디 기간에는 혼자 모든 것을 해보기로 마음먹었다. 그 전에 UI........를 해결해야 했는데 .... 이왕 블로그를 만드는 김에 같은 스타일은 죽어도 싫었다. 마침 figma도 AI를 제공하길래 figma AI를 사용해 봤다.....결론부터 말하자면 figma의 기본 기능을 모른다면 아직 사용은 추천하지 않는다...개발자가 ai의 도움을 얻어 디테일 한 것은 직접 수정해야 하듯이 figma ai또한 마찬가지이다.figma ai?   figma ai는 유료이다. 한 달 안에 블로그를 완성 시킬 것이기에 따라서 딱 한달만 사용해보자는 마인드로 결제를 질러버렸다.    "블로그 페이지 만들어줘~!!"  figma ai를 활용한 블로그 페이지이다. 하지만 보면 알겠지만, 이미지는 밖으로 삐져 나가 디테일한 부분은 직접 수정을 해주어야 한다. 그나마 다행인건 모든 layout을 "auto layout"으로 만들어줌은 편하단 건데....블로그 카테고리 리스트를 추가하기 위해 다시 한 번 명령어를 내렸지만......원하는 곳에 배치가 죽어도 안 되어 직접 넣어줬다.이미지를 수정하기 위해선 frame선택이 아닌 image를 클릭하여 image생성하기라는 tab 기능을 이용해야 한다.낫 뱃? figma ai와 하루를 투닥거리다가 다음날에 드는 생각은 아직 figma ai를 통해 모든 것을 할 수 있는 것은 아니다라는 결론에 도달했다. 따라서, figma coummunity에서 shadcn ui component를 찾아 import후 figma ai가 만들어둔 초안을 대체해 가면서 만들고 있다.(아직 진행 중....)하다보니 uizard ai도 알게되었고 난 uizard가 훨씬 뛰어나다고 생각한다. 하지만 이 또한 제한이 있기 때문에 유료로 전환은 하지 않고 "dribble과 pinterest" + "figma ai" + "shadcn component" 조합으로 ui를 으쌰으쌰 해 보고 있다. NextJS learn 해당 강의는 ai를 활요한 강의이기 때문에 nextjs에 대해서 깊게 다루지 않는다. 따라서 "nextjs learn doc site"에서 nextjs를 공부하면서 병행하고 있다.관련 resource와 guide가 친절하며 nextjs를 배우고자 하는 사람은 이것부터 해보는 것을 강력히 추천한다. 쏟아지는 에러와 무지 공부를 하면 할 수록 무지를 깨닫고 만나게되는 수 많은 에러를 타파하기 위해 수 많은 고민을 한다.....😖😖😖아래는 지금까지 nextjs 강의를 수강하며 겪은 에러와 지식들이다. streaming이 무엇인가?nextjs에서 prefetching을 하는 시점nextjs에서 Image & Link componentclient와 server에서의 생성 날짜로 인한 hydration error -> time zone(UTC로 해결)객체 자체를 component key로 넘길 시nextjs에서 client, server component  등등 많지만 나에게 impact가 남은 것을 작성하였다.그리고 꼭 공유하고 싶은 것이 있는데 commit title과 body를 작성하는데 시간이 너무 오래 걸려 cursor ai 도움을 받을 수 있을까 하여 찾아보았는데 있었다!!!vscode의 git tab에서 별표를 눌러서 작성하는 방법도 있지만 자주 사용할 것 같아 단축키로 등록해서 사용하고 있다.vscode 명령에서 shortcut json에 들어가서 아래와 같이 추가해주면 staged된 변경 사항에 대해자동으로 작성해준다. 난 gitmessage template을 사용하는데 이 template 맥락에 맞춰서 작성해준다. 개꿀! {"key": "cmd+m","command": "cursor.generateGitCommitMessage"} 마치며사실 이 강의를 통해 다시 공부하기 전에 슬럼프로 인해 cs공부를 조금씩 하면서 부모님 일을 도우며 시간을 보내고 있었다. 취준을 1월부터 시작하여 합격한 곳도 불합격 한 곳도 있었지만, 경기가 안 좋은 탓인가 내가 느낀 것은 기업들에 대한 인식들이 생각보다 좋진 않다 ㅜㅜ 하지만, 나에게 맞는 곳을 찾을 때까지 내가 하고자 하는 바를 이루며 내 할일을 하고 있으면 된다는 생각이다. 갑자기 생각난 말인데 완벽한 뱅기를 만들기 위해 5년간 투자하여 망한 보잉사?에 비해 일론 머스크와 같이 실패를 두려워하지 않고 도전하는 것이 좋다라는 인용구이다. 원래 난 완벽주의자 성격이 있어 완벽하게 한 후 다른 것으로 넘어가는 성격이었는데 개발하는데 있어 이것은 매우 큰 단점으로 인식하고 계속 고쳐나가는 중에 강의에서 강사님이 빠르게 개발해보고 수정하는 것이 좋다는 말에 격한 공감을 하면서 1주차를 마무리한다. 참고https://nextjs.org/learnhttps://velog.io/@2ast/React-%EC%84%9C%EB%B2%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8React-Server-Component%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0https://docs.cursor.com/more/ai-commit-message 

프론트엔드워밍업클럽fontendnextjscursorAI

jhworld

인프런 워밍업 클럽 Frontend - 1주차 발자국 👣

📚 1주차 공부 내용 정리Next.js 렌더링CSR : React App의 기본적인 렌더링 방식으로 클라이언트인 브라우저에서 렌더링을 진행하는 방식이다.SSR : 서버에서 완성된 HTML을 만들어 브라우저에 보내주는 방식이다.SSG : 빌드 타임에 미리 페이지를 생성해두는 렌더링 방식이다.ISR : SSG 페이지를 일정 시간마다 주기적으로 새로 생성해주는 방식이다.Cursor AITabAI가 코드를 자동으로 완성해주는 강력한 기능여러 줄의 코드를 한 번에 작성할 수 있음TabChat코드 관련 질문에 정확한 답변을 제공컨텍스트를 이해하고 관련 조언을 제공Ctrl/⌘ + L인라인 코드 편집편집기 창에서 새로운 코드를 생성하거나 기존 코드를 변경 가능Ctrl/⌘ + K프로젝트 세팅Next.js App 프로젝트 생성npx create-next-app@latest # 최신 버전 설치 npx create-next-app@15.2.5 # 강의시 최신 버전 (권장) npx create-next-app@15.2.5 ./ # 현재 디렉토리를 프로젝트로 설정TypeScript 설정Next.js TypeScript Plugin : VS Code에서 Next.js 프로젝트 개발 시 타입스크립트 지원을 자동화해주는 확장 프로그램ESLint, Prettier 설정ESLint : 코드의 품질을 검사하고 오류를 검사하는 도구Prettier : 코드를 일관된 스타일로 자동으로 정리해주는 도구Tailwind CSS, shadcn/ui 설정shadcn/ui : Tailwind CSS를 기반으로 한 현대적이고 아름다운 컴포넌트 모음 (오픈소스 UI 시스템) 🏃‍♀ 미션미션을 해결할 때는 주로 공식 문서를 참고했다. 내용을 완전히 나의 언어로 표현하는 데 어려움도 있었지만, 직접 글로 정리해보면서 이해를 더 깊게 할 수 있었다.😵‍💫 회고(혼자서만) 눈물나는 스토리이번 워밍업 클럽 4기에는 Frontend뿐만 아니라 CS 과정도 참여했다. 하지만 워밍업 외에도 따로 준비하고 있는 중요한 일정(가장 중요한 ⭐️)이 있어서 모든 걸 병행하기엔 꽤 벅찼다.그래서 Frontend는 완주 러너를 목표로, CS는 기간 내 완강을 목표로 달리기로 결정했다.다행히도(?) 지난 기수에서는 우수 러너로 선정된 덕분에, 이번에는 모든 걸 욕심내기보다는 포기할 건 과감히 포기하고, 선택과 집중을 하자고 마음먹었다.우수 러너는 안녕........ 그래도 완주와 완강은 포기 못 해!!!!짐코딩 코치님의 강의 완전 짱짱이번에 처음으로 짐코딩 코치님의 강의를 들었는데......마치 내가 갓난아기가 된 것 같은 기분이랄까....걸음마부터 손잡고 하나하나 알려주시는 친절함에 감동받았다...... 👶🍼👍Cursor AI와의 첫만남이번 강의를 통해 처음으로 Cursor AI를 사용해봤다.아직은 낯설고 어색하지만, 써보니 정말 대박이다…! 앞으로 더 잘 활용해서 작업 속도도 높이고, 학습에도 적극 활용해보고 싶다.

인프런워밍업frontendnextjs

채널톡 아이콘