Skip to content

Luganic/frontend-starter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

34 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“‘ ํ”„๋กœ์ ํŠธ ๊ธฐ์ดˆ ์„ธํŒ… ๊ฐ€์ด๋“œ

1. ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ…

๐Ÿงฉ Git ์ดˆ๊ธฐ ์„ธํŒ…
# README ์ƒ์„ฑ
echo "# ์ œ๋ชฉ" >> README.md

# Git ์ดˆ๊ธฐํ™”
git init

# ํŒŒ์ผ Git ๋“ฑ๋ก
git add README.md

# ์ฒซ ์ปค๋ฐ‹
git commit -m "first commit"

# ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜๋ฅผ main์œผ๋กœ ๋ณ€๊ฒฝ
git branch -M main

# ์›๊ฒฉ ์ €์žฅ์†Œ ์—ฐ๊ฒฐ
git remote add origin <๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฃผ์†Œ>

# ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ฒซ push
git push -u origin main
โš™๏ธ Next.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
npx create-next-app@latest .

# ์‹คํ–‰ ์ค‘ ์„ ํƒ ์ถ”์ฒœ:
# TypeScript: Yes โ†’ ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด
# ESLint: Yes โ†’ ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์œ ์ง€
# Tailwind CSS: ์„ ํƒ/Yes โ†’ ๋น ๋ฅธ UI ์Šคํƒ€์ผ๋ง
# src/ directory: Yes โ†’ ๊ตฌ์กฐ ๊น”๋”
# App Router: ์„ ํƒ/Yes โ†’ ์ตœ์‹  ๊ตฌ์กฐ ์‚ฌ์šฉ
# Import alias: Yes โ†’ @/*
# Turbopack: No โ†’ ์•ˆ์ •์„ฑ ์šฐ์„ 

2. ์ฝ”๋“œ ํ’ˆ์งˆ & ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ๋„๊ตฌ

๐Ÿš‚ ESLint
# 1. ESLint ์„ค์น˜
npm install -D eslint
# JS/TS ์ฝ”๋“œ ๋ฌธ๋ฒ•๊ณผ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ

# 2. TypeScript ESLint Parser ์„ค์น˜
npm install -D @typescript-eslint/parser
# ESLint๊ฐ€ TypeScript ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋„๋ก ํ•จ

# 3. TypeScript ESLint Plugin ์„ค์น˜
npm install -D @typescript-eslint/eslint-plugin
# TypeScript ์ „์šฉ ๊ทœ์น™ ์ œ๊ณต
# ESLint ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ
npx eslint --init
# ์ž๋™์œผ๋กœ .eslintrc.js ๋˜๋Š” eslint.config.mjs ์ƒ์„ฑ
// eslint.config.mjs
import tsPlugin from '@typescript-eslint/eslint-plugin';
import parser from '@typescript-eslint/parser';
import pluginImport from 'eslint-plugin-import';
import perfectionist from 'eslint-plugin-perfectionist';
import simpleImportSort from 'eslint-plugin-simple-import-sort';

export default [
  {
    files: ['**/*.{js,jsx,ts,tsx}'],
    ignores: ['node_modules', '.next', 'dist'],
    languageOptions: {
      parser,
      parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
        ecmaFeatures: { jsx: true },
        project: './tsconfig.json',
      },
    },
    plugins: {
      import: pluginImport,
      'simple-import-sort': simpleImportSort,
      '@typescript-eslint': tsPlugin,
      perfectionist,
    },
    rules: {
      'simple-import-sort/imports': 'error',
      'simple-import-sort/exports': 'error',
      'perfectionist/sort-jsx-props': [
        'error',
        {
          type: 'natural',
          order: 'asc',
          groups: ['multiline', 'unknown', 'shorthand'],
        },
      ],
      'perfectionist/sort-objects': [
        'error',
        { type: 'natural', order: 'asc' },
      ],
      'perfectionist/sort-array-includes': 'off',
      'no-unused-vars': 'warn',
      '@typescript-eslint/no-unused-vars': [
        'warn',
        { argsIgnorePattern: '^_' },
      ],
    },
  },
];
โœจ Prettier
# Prettier ์„ค์น˜
npm install -D prettier

# ESLint + Prettier ์ถฉ๋Œ ๋ฐฉ์ง€ ์„ค์ •
npm install -D eslint-config-prettier

# Tailwind Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
npm install -D prettier-plugin-tailwindcss
// .prettierrc
{
  "semi": true,
  "singleQuote": true,
  "trailingComma": "es5",
  "tabWidth": 2,
  "useTabs": false,
  "printWidth": 80,
  "arrowParens": "always",
  "endOfLine": "lf",
  "plugins": ["prettier-plugin-tailwindcss"]
}
๐Ÿช ESLint + Prettier
# ์„ค์ • ํ†ตํ•ฉ : ํ•œ ๋ฒˆ์— ์„ค์น˜ ๊ฐ€๋Šฅ
npm install -D eslint prettier eslint-config-prettier @typescript-eslint/parser @typescript-eslint/eslint-plugin prettier-plugin-tailwindcss eslint-plugin-simple-import-sort eslint-plugin-perfectionist
๐Ÿถ Husky
# Husky ์„ค์น˜
npm install -D husky

# Husky ์ดˆ๊ธฐํ™”
npx husky install
// package.json ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€, Git Hook ๊ด€๋ฆฌ ๋„๊ตฌ
"scripts": {
  "prepare": "husky install"
}
๐Ÿ“ lint-staged
# lint-staged ์„ค์น˜
npm install -D lint-staged
# pre-commit ํ›… ์ƒ์„ฑ
mkdir -p .husky
echo "npx lint-staged" > .husky/pre-commit
chmod +x .husky/pre-commit
// package.json์— lint-staged ์„ค์ •
// ์ปค๋ฐ‹ ๋Œ€์ƒ ํŒŒ์ผ๋งŒ ์ž๋™์œผ๋กœ ESLint + Prettier ์ ์šฉ
// Husky pre-commit ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ
"lint-staged": {
  "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
  "*.{json,css,md}": ["prettier --write"]
}
โš™๏ธ VSCode settings.json
// ์ €์žฅํ•  ๋•Œ ESLint + Prettier ์ž๋™ ์‹คํ–‰
// import ์ •๋ ฌ๊ณผ ์ฝ”๋“œ ํฌ๋งท ์ ์šฉ
{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.organizeImports": "explicit"
  },
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact"
  ],
  "eslint.useFlatConfig": true
}

3. UI & ์Šคํƒ€์ผ ์‹œ์Šคํ…œ

๐ŸŒน Tailwind CSS (v4)
# Tailwind CSS ์„ค์น˜
npm install tailwindcss

# globals.css ํŒŒ์ผ ์ƒ๋‹จ์— Tailwind import ์ถ”๊ฐ€
@import "tailwindcss";
# layout.tsx ๋˜๋Š” ์•ฑ entry ํŒŒ์ผ์— globals.css import
import './globals.css';
๐ŸŒท shadcn/ui
# shadcn/ui ์„ค์น˜
npx shadcn@latest init
๐Ÿฉน clsx + cva
# className ์กฐ๊ฑด๋ถ€ ํ•ฉ์น˜๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
npm install clsx

# Tailwind + Variants ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ (cva)
npm install class-variance-authority
๐ŸŒŸ SVGR
# SVGR ์„ค์น˜
npm install @svgr/webpack --save-dev
// next.config.ts ์„ค์ •
import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  webpack(config) {
    config.module.rules.push({
      test: /\.svg$/i,
      issuer: /\.[jt]sx?$/,
      use: ['@svgr/webpack'],
    });
    return config;
  },
};

export default nextConfig;
// svg.d.ts ์ƒ์„ฑ
declare module '*.svg' {
  import React from 'react';
  export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
  const src: string;
  export default src;
}

4. ์ƒํƒœ ๊ด€๋ฆฌ & ์„œ๋ฒ„ ์ƒํƒœ

๐Ÿงธ Zustand
# Zustand ์„ค์น˜
npm install zustand
๐Ÿ›น React Query + QueryProvider
# React Query ์„ค์น˜
npm install @tanstack/react-query
npm install @tanstack/react-query-devtools
// src/components/QueryProvider.tsx
'use client';

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { ReactNode, useState } from 'react';

export default function QueryProvider({ children }: { children: ReactNode }) {
  const [queryClient] = useState(() => new QueryClient());

  return (
    <QueryClientProvider client={queryClient}>
      {children}
      <ReactQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  );
}

5. ํผ / ๊ฒ€์ฆ / ์• ๋‹ˆ๋ฉ”์ด์…˜ / ์•„์ด์ฝ˜ / ์œ ํ‹ธ

๐Ÿ”ฉ Zod
# Zod ์„ค์น˜
npm install zod
๐Ÿ”ง React Hook Form + @hookform/resolvers
# React Hook Form ์„ค์น˜
npm install react-hook-form

# Resolvers ์„ค์น˜ (Zod ๋“ฑ ์—ฐ๋™์šฉ)
npm install @hookform/resolvers
๐Ÿงญ Axios
# Axios ์„ค์น˜
npm install axios
๐Ÿ–๏ธ Framer Motion
# Framer Motion ์„ค์น˜
npm install framer-motion
๐Ÿคน๐Ÿปโ€โ™‚๏ธ Lucide React
# Lucide React ์„ค์น˜
npm install lucide-react

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published