我如何构建我的 React /TS 应用程序(2021)
(代码托管于: https: //github.com/djamaile/react-boilerplate-2021)
(去年的帖子:https ://dev.to/djamaile/how-i-structure-my-react-ts-applications-160g )
去年,我写了一篇关于如何构建我的 ReactJS 项目的文章。现在又到了暑假,我对项目结构做了一些调整。不过说实话,改动不大,因为 React 最终变化不大(这倒是件好事)。所以,在这篇文章中,我会重点介绍一下我修改/添加的内容。
让我们首先从整个文件夹结构的图片开始!
现在让我们讨论一下变化:)
📖 API
在 API 文件夹中,我现在只有一个通用的请求函数,我添加的是 react-query。如果你不熟悉 react-query,它是一个用于获取服务器状态的库。React-query 具有很多强大的功能,例如缓存、数据同步等。
在这个项目中,我通过仅添加一个来保持 react-query 非常简单defaultQueryFn
,如下所示:
import axios, { Method, AxiosResponse } from "axios";
const api = axios.create({
// baseURL: process.env.REACT_APP_HOST_BACKEND,
baseURL: "https://rickandmortyapi.com/api",
});
const request = <T>(
method: Method,
url: string,
params: any
): Promise<AxiosResponse<T>> => {
return api.request<T>({
method,
url,
params,
});
};
// Define a default query function that will receive the query key
export const defaultQueryFn = async ({ queryKey }: any): Promise<unknown> => {
const data = await request(queryKey[0], queryKey[1], queryKey[2]);
return data;
};
如你所见,defaultQueryFn
正在调用该request
函数。现在我们可以将其添加到我们的主视图中,并像这样QueryClient
调用该功能:useQuery
import React from "react";
import "../../styles/home.css";
import { useQuery } from "react-query";
import { Header } from "../../components";
const Home: React.FC = () => {
const { data, error, isFetching } = useQuery(["GET", "/character", {}]);
if (isFetching) return <p>Is loading...</p>;
if (error) return <p>${error}</p>;
console.log(data);
return (
<div className="App">
<Header />
</div>
);
};
export default Home
我仍在尝试使用 React-Query,看看如何更好地使用它。目前为止,我的使用方法如下。
🧪 测试/Cypress
是的,就是那个臭名昭著的测试文件夹。我最后居然把它删掉了!我还留着测试,但我直接把它们放到了 views/[view] 文件夹里。
我必须承认,我不再像以前那样频繁地使用 Jest 了。我已经改用 Cypress 了。Cypress 是一款端到端测试工具,到目前为止我都很喜欢它。所以,cypress/integration/404_page.ts
你可以看到我有一个规范测试,测试当用户访问到 404 页面时,是否可以返回主页。
describe('404 page', function() {
it('should give the option to return to home', function() {
cy.visit("/does-not-exists");
cy.contains('Return to Home');
cy.get('a')
.click()
cy.contains('Learn React', {timeout: 10000})
});
});
🐳 Docker
我还在我的默认仓库中添加了 Dockerfiles。我有两个独立的 Dockerfiles,一个用于开发,一个用于生产。
FROM node:15-alpine AS builder
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn build
FROM nginx:stable-alpine
WORKDIR /usr/share/nginx/html
RUN rm -rf *
COPY --from=builder /app/build .
ENTRYPOINT ["nginx", "-g", "daemon off;"
要构建图像,请使用:
$ docker build -t djam97/react-boilerplate-2021:prod -f docker/Dockerfile.prod .
☸️ Kubernetes
我每天都使用 Kubernetes,所以我也添加了一些 k8s 清单。它们虽然非常简陋,但足以完成工作,而且易于扩展。
apiVersion: apps/v1
kind: Deployment
metadata:
name: react-boiler-plate
labels:
app: react-boiler-plate
spec:
replicas: 1
selector:
matchLabels:
app: react-boiler-plate
template:
metadata:
labels:
app: react-boiler-plate
spec:
containers:
- name: react-boiler-plate
image: djam97/react-boilerplate-2021:prod
imagePullPolicy: Never
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: react-boiler-plate-service
spec:
selector:
app: react-boiler-plate
ports:
- protocol: TCP
port: 3000
targetPort: 3000
要应用清单,请使用:
$ kubectl apply -f k8s/
😺 Github 工作流程
我还添加了一个 Github 操作,用于将你的 React 应用部署到 Github 页面。这对于初始测试或你的网站不在自己的服务器上运行的情况非常有用。
name: Deploy site
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
continue-on-error: true
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: "14.x"
- name: Get yarn cache
id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache dependencies
uses: actions/cache@v1
with:
path: ${{ steps.yarn-cache.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Yarn installation
run: yarn install && CI='' yarn build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.ACCESS_TOKEN }}
publish_dir: ./buil
如果你也想使用它,需要执行以下步骤。首先,你需要在 GitHub 中创建一个个人访问令牌,并将其作为 secret 添加到你的仓库中ACCESS_TOKEN
。最后,在package.json
-
"homepage": "https://djamaile.github.io/react-boilerplate-2021",
-
"homepage": "https://<your username>.github.io/react-boilerplate-2021",
🗄️ 额外文件
除了常见的 Prettier、eslint 和 Husky 设置外,我还添加了一项功能,@commitlint/config-conventional
以确保每次提交都符合约定式提交的要求。如果您不知道约定式提交是什么,可以在这里阅读:https://www.conventionalcommits.org/en/v1.0.0/#summary