ข้ามไปยังเนื้อหา

บล็อก

จากแนวคิดสู่การเปิดตัว: การสร้างเว็บแอปสมัยใหม่ด้วย React

จากแนวคิดสู่การเปิดตัว

  • อ่าน 5 นาที
  • Updated

การสร้างเว็บแอปพลิเคชันสมัยใหม่ด้วย React เกี่ยวข้องมากกว่าการเขียนส่วนประกอบต่างๆ ตั้งแต่แนวคิดเริ่มแรกไปจนถึงการใช้งานจริง แต่ละขั้นตอนต้องมีการวางแผนอย่างรอบคอบและใช้เครื่องมือที่เหมาะสม คู่มือนี้จะอธิบายวงจรการใช้งานทั้งหมดของแอปพลิเคชัน React โดยให้คำแนะนำเชิงปฏิบัติและตัวอย่างโค้ดในทุกขั้นตอน

1. การวางแผนโครงการและการวางโครงร่าง

วงจรการพัฒนาเว็บแอป💡ความคิดเรื่องราวของผู้ใช้ข้อกำหนด✏️Wireframeจำลอง UIการสร้างต้นแบบ⚡พัฒนาส่วนประกอบAPIs & amp; สถานะ✅การทดสอบหน่วย / บูรณาการE2E / Visual🚀DeployCI/CD ไปป์ไลน์Vercel / Docker📊MonitorWeb Vitalsการติดตามข้อผิดพลาดเครื่องมือสำคัญในแต่ละเฟสFigma / ExcalidrawFigma / StorybookVS Code / GitJest / นักเขียนบทละครGitHub ActionsSentry / Lighthouseลูปข้อเสนอแนะอย่างต่อเนื่อง — การตรวจสอบข้อมูลเชิงลึกทำให้เกิดการทำซ้ำใหม่

ก่อนที่จะเขียนโค้ดบรรทัดเดียว ให้ลงทุนในการวางแผน กำหนดคุณสมบัติหลัก โฟลว์ผู้ใช้ และข้อกำหนดด้านข้อมูลของแอปพลิเคชันของคุณ เครื่องมือต่างๆ เช่น Figma, Excalidraw หรือแม้แต่ภาพร่างด้วยปากกาและกระดาษ ช่วยให้คุณเห็นภาพอินเทอร์เฟซผู้ใช้ก่อนที่จะตัดสินใจนำไปใช้งาน

สิ่งที่ส่งมอบในการวางแผนที่สำคัญ ได้แก่:

  • เรื่องราวของผู้ใช้- กำหนดสิ่งที่ผู้ใช้จำเป็นต้องบรรลุผลสำเร็จ
  • Wireframes- เค้าโครงที่มีความเที่ยงตรงต่ำของแต่ละหน้าจอ
  • Data Model- ระบุเอนทิตี ความสัมพันธ์ และจุดสิ้นสุด API
  • สถาปัตยกรรมทางเทคนิค- เลือกสแต็ก โฮสติ้ง และบริการจากบุคคลที่สามของคุณ
  • ขอบเขต MVP- ตัดสินใจว่าจะจัดส่งอะไรในเวอร์ชัน 1.0

2. การเลือกกรอบงาน React ของคุณ

Full-Stack React สถาปัตยกรรมแอปพลิเคชันส่วนหน้าReact / Next.jsTypeScriptTailwind CSSReact เราเตอร์TanStack QueryZustandAPI เลเยอร์REST / GraphQLJSON การตอบสนองการรับรองความถูกต้องอัตราจำกัดการตรวจสอบAPI เวอร์ชันแบ็กเอนด์Node.js / ExpressตรรกะทางธุรกิจMiddlewareการจัดการข้อผิดพลาดการบันทึกการแคชฐานข้อมูลMySQL / PostgreSQLSequelize ORMMigrationsพูลการเชื่อมต่อการทำดัชนีการสำรองข้อมูลเมฆAWS / VercelDocker / K8sCI/CDCDNSSL/TLSการตรวจสอบข้อกังวลแบบตัดขวางTypeScriptESLint/Prettierการทดสอบ (Jest)การติดตามข้อผิดพลาดความปลอดภัยประสิทธิภาพกระแสข้อมูลผู้ใช้โต้ตอบกับ UIAPI คำขอ(HTTP/WS)กระบวนการธุรกิจ ตรรกะแบบสอบถาม/กลายพันธุ์ข้อมูลให้บริการ & scale

ระบบนิเวศ React มีจุดเริ่มต้นที่ดีเยี่ยมหลายประการ ซึ่งแต่ละจุดเหมาะสมกับความต้องการของโครงการที่แตกต่างกัน

สร้างแอป React (CRA)

CRA เป็นเครื่องมือบูตสแตรปแบบดั้งเดิม มีการตั้งค่าที่ไม่มีการกำหนดค่าด้วย Webpack ภายใต้ประทุน อย่างไรก็ตาม จะไม่มีการบำรุงรักษาอีกต่อไป และไม่แนะนำสำหรับโครงการใหม่

Vite

Vite กลายเป็นตัวเลือกที่ต้องการสำหรับการใช้งานแบบหน้าเดียว มีการเปลี่ยนโมดูลร้อน (HMR) ที่รวดเร็วอย่างเห็นได้ชัดและกระบวนการสร้างแบบลีนที่ขับเคลื่อนโดย Rollup

npm create vite@latest my-app -- --template react
cd my-app
npm install
npm run dev

Next.js

สำหรับแอปพลิเคชันที่ต้องการการเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR), การสร้างไซต์แบบสแตติก (SSG) หรือเส้นทาง API Next.js คือมาตรฐานอุตสาหกรรม มันมีการกำหนดเส้นทางตามไฟล์ การเพิ่มประสิทธิภาพรูปภาพในตัว และประสิทธิภาพที่ยอดเยี่ยมตั้งแต่แกะกล่อง

npx create-next-app@latest my-app
cd my-app
npm run dev

เลือก Vite สำหรับ SPA ล้วนๆ และแดชบอร์ดที่แสดงผลโดยไคลเอ็นต์ เลือก Next.js เมื่อคุณต้องการ SEO, SSR หรือเฟรมเวิร์กฟูลสแตก

3. สถาปัตยกรรมส่วนประกอบและองค์ประกอบ

ส่วนประกอบที่มีโครงสร้างที่ดีเป็นรากฐานของแอปพลิเคชัน React ที่สามารถบำรุงรักษาได้ ปฏิบัติตามหลักการเหล่านี้:

  • ความรับผิดชอบเดี่ยว- แต่ละองค์ประกอบควรทำสิ่งหนึ่งให้ดี
  • Composition over Inheritance- สร้าง UI ที่ซับซ้อนโดยการรวมส่วนประกอบง่ายๆ
  • Container/Presentational split- แยกตรรกะการดึงข้อมูลออกจากการเรนเดอร์
  • Colocation- เก็บไฟล์ที่เกี่ยวข้อง (ส่วนประกอบ สไตล์ การทดสอบ ประเภท) ไว้ด้วยกัน

โครงสร้างโปรเจ็กต์ที่แนะนำมีลักษณะดังนี้:

src/
  components/
    Button/
      Button.jsx
      Button.test.jsx
      Button.module.css
      index.js
    Header/
      Header.jsx
      Header.test.jsx
  features/
    auth/
      LoginForm.jsx
      useAuth.js
      authSlice.js
    dashboard/
      Dashboard.jsx
      DashboardCard.jsx
  hooks/
    useLocalStorage.js
    useDebounce.js
  utils/
    formatDate.js
    api.js

4. React Hooks Deep Dive

Hooks เป็นแกนหลักของการพัฒนา React สมัยใหม่ การทำความเข้าใจอย่างลึกซึ้งเป็นสิ่งสำคัญสำหรับการสร้างแอปพลิเคชันที่มีประสิทธิภาพ

useState และ useReducer

ใช้useStateสำหรับค่าสถานะที่เรียบง่ายและเป็นอิสระ สลับไปที่useReducerเมื่อตรรกะของสถานะซับซ้อนหรือเมื่อสถานะถัดไปขึ้นอยู่กับลอจิกก่อนหน้า

import { useReducer } from 'react';

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error('Unknown action');
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, { count: 0 });
  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
    </div>
  );
}

useEffect และ useLayoutEffect

ใช้useEffectสำหรับผลข้างเคียง เช่น การดึงข้อมูล การสมัครสมาชิก และการเปลี่ยนแปลง DOM ใช้useLayoutEffectเฉพาะเมื่อคุณต้องการวัดหรือเปลี่ยน DOM ก่อนที่เบราว์เซอร์จะเริ่มต้นใช้งาน

useMemo และ useCallback

hooks เหล่านี้จะบันทึกค่าและฟังก์ชันตามลำดับ ใช้สิ่งเหล่านี้เมื่อส่งการเรียกกลับไปยังคอมโพเนนต์ย่อยที่ได้รับการปรับปรุงหรือคำนวณค่าที่ได้รับที่มีราคาแพง อย่าใช้มากเกินไป - การปรับให้เหมาะสมก่อนกำหนดจะเพิ่มความซับซ้อนโดยไม่มีประโยชน์ที่วัดได้

Hooks แบบกำหนดเอง

แยกตรรกะที่นำมาใช้ซ้ำได้ลงใน hooks แบบกำหนดเอง นี่เป็นหนึ่งในรูปแบบที่ทรงพลังที่สุดของ React:

function useLocalStorage(key, initialValue) {
  const [value, setValue] = useState(() => {
    const stored = localStorage.getItem(key);
    return stored ? JSON.parse(stored) : initialValue;
  });

  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value));
  }, [key, value]);

  return [value, setValue];
}

5. การจัดการสถานะ

การเลือกแนวทางการจัดการสถานะที่เหมาะสมขึ้นอยู่กับความซับซ้อนของแอปพลิเคชันของคุณ

React Context

Context มีอยู่ใน React และทำงานได้ดีสำหรับการอัปเดตความถี่ต่ำ เช่น ธีม สถานะการตรวจสอบสิทธิ์ และการตั้งค่าภาษา หลีกเลี่ยงการใช้สำหรับข้อมูลที่เปลี่ยนแปลงบ่อยครั้ง เนื่องจากผู้บริโภคทุกคนจะแสดงผลซ้ำทุกครั้งที่ค่าบริบทเปลี่ยนแปลง

Redux Toolkit

Redux Toolkit ช่วยให้ Redux ง่ายขึ้นอย่างมาก เป็นตัวเลือกที่ดีที่สุดสำหรับการใช้งานขนาดใหญ่ที่มีสถานะซับซ้อนและเชื่อมต่อถึงกัน:

import { createSlice, configureStore } from '@reduxjs/toolkit';

const todosSlice = createSlice({
  name: 'todos',
  initialState: [],
  reducers: {
    addTodo: (state, action) => {
      state.push({ id: Date.now(), text: action.payload, done: false });
    },
    toggleTodo: (state, action) => {
      const todo = state.find(t => t.id === action.payload);
      if (todo) todo.done = !todo.done;
    },
  },
});

export const store = configureStore({
  reducer: { todos: todosSlice.reducer },
});

Zustand

Zustand มอบพื้นที่จัดเก็บแบบ hook-based น้ำหนักเบาพร้อมต้นแบบที่น้อยที่สุด เหมาะสำหรับการใช้งานขนาดกลาง:

import { create } from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((s) => ({ count: s.count + 1 })),
  decrement: () => set((s) => ({ count: s.count - 1 })),
}));

6. การกำหนดเส้นทางด้วยเราเตอร์ React

สำหรับ SPA เราเตอร์ React มีการกำหนดเส้นทางที่ประกาศ เวอร์ชัน 6 เปิดตัว API ที่เรียบง่ายพร้อมเส้นทางที่ซ้อนกันและลิงก์ที่เกี่ยวข้อง:

import { BrowserRouter, Routes, Route } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/dashboard" element={<Dashboard />}>
          <Route path="analytics" element={<Analytics />} />
          <Route path="settings" element={<Settings />} />
        </Route>
        <Route path="*" element={<NotFound />} />
      </Routes>
    </BrowserRouter>
  );
}

สำหรับโครงการ Next.js การกำหนดเส้นทางจะขึ้นอยู่กับระบบไฟล์ และคุณไม่จำเป็นต้องมีเราเตอร์ React เลย

7. การบูรณาการ API เข้ากับ React Query

TanStack Query (เดิมชื่อ React Query) เป็นมาตรฐานสำหรับการจัดการสถานะเซิร์ฟเวอร์ โดยจะจัดการแคช การดึงพื้นหลังใหม่ การแบ่งหน้า และการอัปเดตในแง่ดี:

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';

function useTodos() {
  return useQuery({
    queryKey: ['todos'],
    queryFn: () => fetch('/api/todos').then(res => res.json()),
    staleTime: 5 * 60 * 1000,
  });
}

function useAddTodo() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: (newTodo) =>
      fetch('/api/todos', {
        method: 'POST',
        body: JSON.stringify(newTodo),
      }),
    onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),
  });
}

8. การจัดการแบบฟอร์ม

สำหรับแบบฟอร์มที่นอกเหนือจากอินพุตธรรมดา ให้ใช้ไลบรารีแบบฟอร์ม React Hook Form มีน้ำหนักเบาและมีประสิทธิภาพ:

import { useForm } from 'react-hook-form';

function SignupForm() {
  const { register, handleSubmit, formState: { errors } } = useForm();

  const onSubmit = (data) => console.log(data);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('email', { required: 'Email is required' })} />
      {errors.email && <span>{errors.email.message}</span>}
      <input type="password" {...register('password', { minLength: 8 })} />
      <button type="submit">Sign Up</button>
    </form>
  );
}

9. การทดสอบกับ Jest และ React Testing Library การทดสอบ

ช่วยให้มั่นใจว่าแอปพลิเคชันของคุณทำงานได้อย่างถูกต้องและยังคงทำงานต่อไปเมื่อคุณทำการเปลี่ยนแปลง React Testing Library สนับสนุนให้ทดสอบส่วนประกอบต่างๆ ในลักษณะที่ผู้ใช้โต้ตอบกับองค์ประกอบเหล่านั้น:

import { render, screen, fireEvent } from '@testing-library/react';
import Counter from './Counter';

test('increments counter on button click', () => {
  render(<Counter />);
  const button = screen.getByRole('button', { name: /increment/i });
  fireEvent.click(button);
  expect(screen.getByText(/count: 1/i)).toBeInTheDocument();
});

จัดโครงสร้างการทดสอบของคุณตามพฤติกรรมของผู้ใช้ ไม่ใช่รายละเอียดการใช้งาน ทดสอบสิ่งที่ผู้ใช้เห็นและทำ ไม่ใช่สถานะส่วนประกอบภายใน

10. ไปป์ไลน์ CI/CD

ทำให้กระบวนการสร้าง ทดสอบ และปรับใช้เป็นแบบอัตโนมัติด้วยไปป์ไลน์ CI/CD เวิร์กโฟลว์ GitHub Actions ทั่วไปสำหรับแอป React:

name: CI/CD
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm test -- --coverage
      - run: npm run build

11. การปรับใช้

ตำแหน่งที่คุณปรับใช้จะขึ้นอยู่กับตัวเลือกเฟรมเวิร์กและข้อกำหนดด้านโครงสร้างพื้นฐานของคุณ

Vercel

Vercel เป็นตัวเลือกที่ง่ายที่สุดสำหรับแอปพลิเคชัน Next.js เชื่อมต่อพื้นที่เก็บข้อมูล Git ของคุณ จากนั้น Vercel จะจัดการบิลด์ การแสดงตัวอย่าง และการใช้งานจริงโดยอัตโนมัติ ทุกคำขอดึงจะได้รับ URL ดูตัวอย่าง

AWS

เพื่อการควบคุมที่มากขึ้น ให้ปรับใช้กับ AWS โดยใช้บริการต่างๆ เช่น S3 + CloudFront สำหรับ SPA แบบคงที่ หรือ ECS/Fargate สำหรับแอปพลิเคชันที่แสดงผลแบบเซิร์ฟเวอร์ AWS Amplify มอบประสบการณ์โฮสติ้งที่ได้รับการจัดการที่คล้ายคลึงกับ Vercel

Docker

จัดคอนเทนเนอร์แอปพลิเคชันของคุณเพื่อการปรับใช้ที่สอดคล้องกันข้ามสภาพแวดล้อม:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["npm", "start"]

12. การตรวจสอบประสิทธิภาพ

เมื่อแอปพลิเคชันของคุณอยู่ในการใช้งานจริง ให้ตรวจสอบประสิทธิภาพเพื่อตรวจจับการถดถอยตั้งแต่เนิ่นๆ

  • Core Web Vitals- ติดตาม LCP, FID และ CLS โดยใช้เครื่องมือ เช่น Google Lighthouse หรือไลบรารีweb-vitals
  • การติดตามข้อผิดพลาด- ใช้ Sentry หรือ Bugsnag เพื่อบันทึกและวินิจฉัยข้อผิดพลาดรันไทม์
  • Analytics- ใช้การติดตามเหตุการณ์เพื่อทำความเข้าใจพฤติกรรมของผู้ใช้
  • การวิเคราะห์กลุ่ม- เรียกใช้npx webpack-bundle-analyzerหรือnpx vite-bundle-visualizerเพื่อระบุการอ้างอิงจำนวนมาก

React DevTools Profiler ช่วยระบุการเรนเดอร์ซ้ำที่ไม่จำเป็นในระหว่างการพัฒนา ใช้React.memo,useMemoและuseCallbackอย่างมีกลยุทธ์เพื่อเพิ่มประสิทธิภาพเส้นทางลัด

บทสรุป

การสร้างแอปพลิเคชัน React ที่ใช้งานจริงเป็นการเดินทางผ่านการวางแผน สถาปัตยกรรม การนำไปปฏิบัติ การทดสอบ และการปรับใช้ แต่ละเฟสสร้างขึ้นจากเฟสก่อนหน้า เริ่มต้นด้วยแผนที่ชัดเจน เลือกเครื่องมือที่เหมาะสมสำหรับความต้องการของคุณ เขียนส่วนประกอบที่สะอาดและประกอบได้ ทดสอบอย่างละเอียด ทำให้ไปป์ไลน์ของคุณเป็นแบบอัตโนมัติ และตรวจสอบในการผลิต ระบบนิเวศ React เติบโตเต็มที่และได้รับการสนับสนุนอย่างดี - ใช้ประโยชน์จากจุดแข็งของมัน แล้วคุณจะจัดส่งเว็บแอปพลิเคชันที่มีประสิทธิภาพและเชื่อถือได้ด้วยความมั่นใจ