Tạo dự án React Typescript với React Router & ESLint Prettier

Châm ngôn của mình là học để kiếm tiền.

Vì thế mình build các khóa học của mình để giúp anh em tiến bộ nhanh hơn x10 lần , để kiếm được nhiều tiền hơn

  • 🏆 React.js Super: Trở thành React.js Developer trong 7 ngày với mức thu nhập 20 triệu/tháng
  • 🏆 Node.js Super: Giúp bạn học cách phân tích, thiết kế, deploy 1 API Backend bằng Node.js
  • 🏆 Next.js Super: Mình sẽ chia sẻ từ A-Z kiến thức về Next.js, thứ giúp mình kiếm hơn 1 tỉ/năm
  • 🏆 Deploy Super: CI/CD Deploy tự động React, Node, Next lên VPS qua Github Actions kết hợp Telegram Bot

Ngày xưa nếu mà để setup một dự án React thì chúng ta có thể dùng Create React App, hoặc Webpack kết hợp Babel, sau này thì có Vite.

Nhưng hiện nay thì theo tài liệu mới nhất của React, họ khuyến khích chúng ta setup theo kiểu fullstack như Next.js, hoặc React Router.

Với những trải nghiệm của mình về Next.js một thời gian khá dài thì mình cảm thấy Next.js không ổn định, vì

  • Cập nhật lớn thường xuyên mỗi năm, phiên bản mới phá vỡ cách code của phiên bản cũ. Dev đuổi theo rất mệt

  • Nhiều bug và lỗi tồn tại từ phiên bản này qua phiên bản nọ nhưng không được sửa

  • Hiệu suất kém

  • Code Next.js thì máy tính nóng rang, dễ lỗi CPU 100% 🙏🏻

  • Phải Deploy ở một server cài Node.js, không thể quăng source lên một số nơi như Github page được.

Đó là lý do mình chọn React Router (Remix.js sau này gộp chung vào React Router luôn), bởi vì

  • Đơn giản, vì đơn giản nên ít bug

  • Có thể chuyển đổi client side rendering và server side rendering dễ dàng, vậy nên nó không kén chọn nơi deploy như Next.js

  • Tốt độ nhanh (cảm quan cá nhân)

Với câu lệnh cài đặt của React Router thì chúng ta sẽ có sẵn

  • React TypeScript
  • Tailwindcss
  • Vite
  • Alias import

Cũng khá đầy đủ, nhưng mình sẽ cập nhật thêm một số thứ để cho nó hoàn thiện hơn. Đó là:

  • EditorConfig
  • Prettier
  • ESLint
  • Ngoài ra sẽ có vài thứ nho nhỏ giúp quá trình code "sướng" hơn

🥇Bước 1 - Tạo dự án React TypeScript với React Router

Mở terminal lên, chạy câu lệnh sau

Sửa my-react-router-app bằng tên folder bạn muốn tạo, lưu ý là tiếng anh, không dấu cách

bash
npx create-react-router@latest my-react-router-app

Nếu có hỏi gì thì cứ chọn Yes rồi Enter tiếp tục nhé

Khi mà tạo như thế này nghĩa là các bạn đang sử dụng React Router ở mode Framework

🥇Bước 2 - Fix lỗi

🥈Error: No route matches URL

Nếu bạn mở devtool console trên chrome mà thấy terminal của bạn xuất hiện lỗi này

text
Error: No route matches URL "/.well-known/appspecific/com.chrome.devtools.json"

thì fix như sau:

Cài thư viện Vite Plugin for DevTools

bash
npm install -D vite-plugin-devtools-json

Và thêm vào Vite config

ts
import { defineConfig } from 'vite'
import devtoolsJson from 'vite-plugin-devtools-json'

export default defineConfig({
  plugins: [
    devtoolsJson()
    // ...
  ]
})

🥈A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used

Nếu màn hình console dev tool trên trình duyệt của bạn xuất hiện lỗi sau

text
root.tsx:28 A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:

- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.

It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.

https://react.dev/link/hydration-mismatch

Đơn giản là các bạn chỉ cần tắt extension chrome xung đột là được, tắt từng cái đến khi nào phát hiện là oke nhé. Như mình thì nguyên nhân là do Urban VPN Proxy

🥇Bước 3: Thêm EditorConfig

  1. Cài extension EditorConfig for VS Code trên VS Code để đọc được file .editorconfig

  2. Tạo file .editorconfig với nội dung như sau ở thư mục root (ngang cấp với package.json)

text
[*]
indent_size = 2
indent_style = space

🥇Bước 4: Thêm Prettier để chuẩn hóa format

  1. Cài đặt Extension Prettier - Code formatter cho VS Code

  2. Tạo file .prettierrc trong thư trong thư mục root với nội dung dưới đây

json
{
  "arrowParens": "always",
  "semi": false,
  "trailingComma": "none",
  "tabWidth": 2,
  "endOfLine": "auto",
  "useTabs": false,
  "singleQuote": true,
  "printWidth": 120,
  "jsxSingleQuote": true
}
  1. Tạo file .prettierignore trong thư mục root với nội dung sau
ignore
node_modules/
dist/
  1. Cài thư viện prettier cho mã nguồn dự án bằng câu lệnh npm i prettier -D

  2. Thêm 2 dòng sau vào "script" trong package.json

text
"prettier": "prettier --check .",
"prettier:fix": "prettier --write ."

Từ nay muốn format bằng terminal thì chỉ cần chạy câu lệnh npm run prettier:fix

🥇Bước 5: Thêm ESLint để code chặt chẽ hơn

  1. Cài đặt extension ESLint trên VS Code

  2. Tạo file eslint.config.js ở thư mục root. File này mình tham khảo bên Vite và tắt vài rule

js
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { globalIgnores } from 'eslint/config'

export default tseslint.config([
  globalIgnores(['dist', 'build', '.react-router']),
  {
    files: ['**/*.{ts,tsx}'],
    extends: [
      js.configs.recommended,
      tseslint.configs.recommended,
      reactHooks.configs['recommended-latest'],
      reactRefresh.configs.vite
    ],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser
    },
    rules: {
      'react-refresh/only-export-components': 'off',
      'no-empty-pattern': 'off'
    }
  }
])
  1. Cài các thư viện sau
bash
npm i @eslint/js globals eslint-plugin-react-hooks eslint-plugin-react-refresh typescript-eslint eslint -D
  1. Thêm 2 dòng sau vào "script" trong package.json
text
"lint": "eslint .",
"lint:fix": "eslint . --fix"

Từ nay muôn check lỗi ESLint trên bằng terminal thì chạy câu lệnh npm run lint

🥇Bước 6: Enable Source map css khi dev

Thêm option này vào defineConfig({}) trong file vite.config.ts

ts
css: {
  devSourcemap: true
}

🥇Bước 7: Bổ sung để việc code tuyệt vời hơn

  • Kích hoạt Format On Save ở setting VS Code
  • Ưu tiên import alias trên VS Code: Mở Setting VS Code rồi tìm import module specifier, kích hoạt nó ở JavaScript và TypeScript là được
  • Nếu chỉ muốn client side rendering (CSR) thì cho ssr:false ở file react-router.config.ts. Muốn preview production khi CSR thì thêm dòng này vào "script"package.json
text
"start:csr": "vite preview"

Sau đó chỉ cần build source rồi chạy npm run start:csr là được

React Router Template: https://github.com/duthanhduoc/react-router-template


👉 Kiến thức trong khóa học Next.js này đã giúp mình kiếm hơn 1 tỉ đồng/năm

Phew! Cuối cùng bạn cũng đã đọc xong. Bài viết này có hơi dài một tí vì mình muốn nó đầy đủ nhất có thể 😅

Website bạn đang đọc được viết bằng Next.js TypeScript và tối ưu từng chi tiết nhỏ như SEO, hiệu suất, nội dung để đảm bảo bạn có trải nghiệm tốt nhất.

Với lượt view trung bình là 30k/tháng (dù website rất ít bài viết). Website này đem lại doanh thu 1 năm vừa qua là hơn 1 tỉ đồng

Đó chính là sức mạnh của SEO, sức mạnh của Next.js.

Mình luôn tin rằng kiến thức là chìa khóa giúp chúng ta đi nhanh nhất.

Mình đã dành hơn 6 tháng để phát triển khóa học Next.js Super | Dự án quản lý quán ăn & gọi món bằng QR Code. Trong khóa này các bạn sẽ được học mọi thứ về framework Next.js, các kiến thức từ cơ bản cho đến nâng cao nhất, mục đích của mình là giúp bạn chinh phục mức lương 25 - 30 triêu/tháng

Nếu bạn cảm thấy bài viết này của mình hữu ích, mình nghĩ bạn sẽ thích hợp với phong cách dạy của mình. Không như bài viết này, khóa học là sự kết hợp giữa các bài viết, video, bài tập nhỏ và dự án lớn có thể xin việc được ngay. Học xong mình đảm bảo bạn sẽ lên tay ngay. 💪🏻

Avatar Dư Thanh Được

Dư Thanh Được

Một developer thích nghiên cứu và chia sẻ kiến thức về lập trình, blockchain, marketing. Chuyên code và dạy lập trình website