Giter VIP home page Giter VIP logo

fwywd-task-lv1's Introduction

Getting Started

パッケージのインストール

Git から Clone 後に必要なパッケージのインストールを行います。

yarn install

2022/03/15 現在 storybook の依存パッケージの部分で問題が起きています。npm 経由でインストールを行うと「X 件の高い脆弱性が発見されました(found X high severity vulnerabilities)」と警告がでます。yarn ではこの問題を自動的に解消してくれるため yarn の利用を推奨しています。

サーバーの立ち上げ

yarn dev

http://localhost:3000 にブラウザでアクセスすれば OK です。

Storybook の立ち上げ

まず始めに src フォルダ直下に component フォルダを作成しましょう(src/component)。作成後以下のコマンドを叩きます。

yarn sb

これで Storybook が http://localhost:6006 で立ち上がります。

テスト

Jest でのテストは以下の通りです。

yarn test

Tips

バージョン情報

主なパッケージのバージョンは以下の通りです。

  • TypeScript:4.5.5
  • React:17.0.39
  • Next.js:12.1.0
  • Tailwind CSS:3.0.23
  • React Hook Form:7.27.1
  • Zod:3.12.0
  • ESLint:8.9.0
  • Prettier:2.5.1
  • Storybook:6.4.14
  • Plop:3.0.5
  • Jest:27.5.1
  • React Testing Library:12.1.3

Form

Form 関連は React Hook Form をメインで利用しています。React Hook Form を利用することでコーディング量を減らすことができるだけでなく、レンダリングを効率的に行うことができます。React Hook Form 自体でバリデーションを行えますが、Zod もしくは Yup のようなバリデーション専用のライブラリと連携させることもでき Zod を利用します。

デプロイ

現状では Vercel と接続すると良いでしょう。アップロード先の GitHub リポジトリを選択すれば問題なくデプロイできるはずです。

CI/CD

GitHub Actions での CI/CD が標準で設定されています。main ブランチに Pull Request or Push した場合に Jest でのテストが動作します。詳細な設定は.github/workflows.test.yml を確認してください。

ESLint/Prettier

Next.js が推奨する方法を基本として設定しています。VSCode で保存時に Prettier が適用されるようにもなっているので便利です。ESLint の設定は .eslintrc に、Prettier の設定は package.json に記載されています。

コンポーネントの雛形

PLOP を使って Atomic デザインのコンポーネント開発に必要な雛形が自動的に生成できるように設定してあります。以下のコマンドで対話的にコンポーネントの雛形が作成できるため試してみましょう。

yarn generate

PLOP の設定は generator ディレクトリを確認してください。

プロジェクト

命名規則

pages など Next.js で決められているものを除き、英語は単数形を使います。複数形で書くことも海外では多いのですが、日本人だけのチームの時は単数形と複数形で迷う場合が多く、この思考のストレスを少しでも減らすために単数形にしています。今のところは大きな問題に遭遇したことがありません。

コンポーネントの単位

Atomic デザインを基本としてコンポーネントを設計していきます。

  • Atom (Presentational Component)
    • コンポーネントの実装は行わず Tailwind CSS の @apply などで決められる範囲内が目安
  • Molecule (Presentational Component)
    • 複数の Atom をまとめて使いやすくする程度
  • Organism (Presentational Component)
    • SSR / CSR でデータ挿入前の最大の単位
  • Template (Container Component)
    • Client Sider Rendering (CSR) でデータ挿入
  • Page (Container Component)
    • SSR でデータ挿入

Presentational Component としての実装の最大は Organism として、小:中:大= Atom:Molecule:Organism 考えると楽かと思います。Organism に const を含んだ CSR でデータ挿入を行えば Template になり、SSR でデータ挿入を行う場合には Page で管理するイメージです。

ディレクトリ構造

kikagaku-next-starter-kit
# ソースコード
├── src
# ファイル置き場
├── public
# Next.js
├── next.config.js
├── next-env.d.ts
# Tailwind CSS
├── tailwind.config.js
├── postcss.config.js
# Jest
├── jest.config.js
├── jest.setup.js
# PLOP
├── generator
# プロジェクトの設定
├── README.md
├── node_modules
├── package.json
├── yarn.lock
└── tsconfig.json

ソースコード src のディレクトリ構造は以下の通りです。

./src
├── component
│   ├── atom
│   │   └── [ComponentName]
│   │        ├── index.tsx                    # barrel
│   │        ├── [ComponentName].tsx          # Component
│   │        └── [ComponentName].stories.tsx  # Storybook
│   ├── molecule
│   │   └── [ComponentName]
│   │        ├── index.tsx                    # barrel
│   │        ├── [ComponentName].tsx          # Component
│   │        ├── [ComponentName].type.ts      # Prop Types
│   │        ├── [ComponentName].props.ts     # props for Test & Storybook
│   │        ├── [ComponentName].test.tsx     # Test
│   │        └── [ComponentName].stories.tsx  # Storybook
│   ├── organism
│   │   └── [ComponentName]
│   │        ├── index.tsx                    # barrel
│   │        ├── [ComponentName].tsx          # Component
│   │        ├── [ComponentName].type.ts      # Prop Types
│   │        ├── [ComponentName].props.ts     # props for Test & Storybook
│   │        ├── [ComponentName].test.tsx     # Test
│   │        └── [ComponentName].stories.tsx  # Storybook
│   └── template
│   │   └── [ComponentName]
│   │        ├── index.tsx                    # Container Component
│   │        ├── [ComponentName].tsx          # Presentational Component
│   │        ├── [ComponentName].type.ts      # Presentational Component's Prop Types
│   │        ├── [ComponentName].props.ts     # Presentational props for Test & Storybook
│   │        ├── [ComponentName].test.tsx     # Test for Presentational Component
│   │        └── [ComponentName].stories.tsx  # Storybook
├── pages
│   ├── _app.tsx
│   └── index.tsx
└── style
    └── globals.css  # Tailwind CSS の設定(Atom で使う)

fwywd-task-lv1's People

Contributors

koichi-omae avatar

Watchers

 avatar

fwywd-task-lv1's Issues

Componentsの作成

  • PageHeaderの作成
  • PageFooterの作成
  • Hero1の作成
  • Main(夢を叶える仲間が欲しい、あなたへ)
  • Main(あなたが本気で変わるために必要な
    2つの条件)
  • Main(料金)
  • Hero2の作成
  • Pagesに完成したcomponentの配置

SWR は API の先が見えてしまうためセキュリティ的に脆弱性を持つ可能性があります。

SWR は Client Side Rendering (CSR) でデータを毎度フェッチしてきます。
そのため、クライアント側でどこの API を取ってきているかがわかってしまいます。
Stein では URL からある程度使い方が想像できてしまうため、SSR や ISR で API のフェッチ先を隠すか、pages/api に入れて URL を隠すなどの工夫が必要でしょう。
今回の要件であれば ISR がベストでしょう。

AtomとTemplateの修正

  • Atom Textのテキスト文の修正
  • Atom UnderLineのテキスト文の修正とglobals.cssにテンプレート追加
  • Template SympathyとBenefitにUnderLineのテンプレートに変更
  • Template Pricingのカードの箇所のtailwindcssをcursor-pointerを追加

画像のファイル命名規則を統一しましょう

img というディレクトリに格納していて素晴らしいですね!
意外とここに手を抜いてしまうことがあるので public/img/** とできているのは良いことです!

ファイル名が Camel や kebase-case の混在がありましたので、ここを統一しましょう!
基本的には kebab-case で良いのでは無いかと思います。

Pagesの作成

  • 資料ダウンロード のLink先設定
  • useSWRを使って資料をダウンロードした人数を取得する実装
  • Template PageFooterのtailwindcssの変更
  • React Scrollの実装完了

Atomsの作成

  • Textの作成
  • ボタンの作成
  • TailwindCSSのColorの設定
  • UnderLineの作成
  • Iconの作成
  • Logoの作成
  • Tagの作成
  • global.cssにてTextのテンプレートを作成

文字の apply はない方が良いでしょう

primary-xl などはばらした方が良いでしょう。
理由としては Tailwind CSS の標準ではなく、他の人がプロジェクトに入ったときに可読性を下げてしまうためです(チームを前提に理解のコストも考慮していきましょう)

逆に btn-sm のようにボタンは共通項を設けて、btn-green などをオプションでつけると良いでしょう。

component は `atom`, `molecule` , `project` 単位でまとめている

Atomic Design では atom, molecule, organism, template, page となっていますが、現実のプロジェクトではもう少しうまく分けたほうが良いでしょう。
例えば、私が最近組んでいる中でたどり着いた結論は以下のとおりです。

  • atom で CSS レベルの実装
  • molecule で必要最低限必要な要素の組み合わせ(多くのプロジェクトで共通して利用するもの)
  • project で Presentational/Container Component の実装(プロジェクト名は適宜合わせる)
  • common は今回使用しませんが、必要に応じて共通プロジェクトで利用するコンポーネントを格納すると良いでしょう。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.