React h5架构

发布时间 2023-08-04 13:57:07作者: 半截肥皂

目录

初始化项目架构

一步一步搭建自己的React h5项目架构

React h5架构

文档编写时间为 2023-8-3 注意依赖版本!
项目源码???

工具

  • NodeJs V16.20.0
  • Npm V8.19.4
  • Vite V4.4.8
  • Eslint

技术栈

  • React V18.2.0
  • React-router-dom V6.14.2(路由)
  • TypeScript V5.0.2
  • Ahooks V3.7.8(hooks工具)
  • Axios V1.4.0
  • Styled-components (css样式工具)
  • Tailwindcss (CSS样式)
  • swiper V10.0.4

搭建流程

  • 一、使用 vite 构建项目
  • 二、添加 git
  • 三、运行项目
  • 四、配置 Eslint 校验代码
  • 五、配置 Prettier 格式化代码
  • 六、增加 React-router-dom 路由
  • 七、增加 Tailwindcss (CSS样式)
  • 八、增加 Styled-components (css样式工具)
  • 九、增加 移动端布局 (rem配置)
  • 十、增加 Ahooks (hooks库)
  • 十一、增加 Axios (ajax)
  • 十二、增加 swiper (轮播图库)

一、Vite构建项目

npm create vite@latest h5-demo -- -- template react-ts

二、添加 git

cd h5-demo
git init
git add .
git commit -m "init"

三、运行项目

npm install  # 加载依赖
npm run dev  # 运行项目

四、配置 Eslint 校验代码

说明:使用vite 生成的代码自带了 eslintrc 文件,所以直接修改校验配置即可 (具体配置文件在文末)

五、配置 Prettier 格式化代码

说明:此处我使用的Vscode来配置Prettier, 你需要下载 vscode的 prettier插件, 然后在 setting.json配置 (具体配置文件在文末)

六、配置 React-router-dom 路由

# 安装 
npm i react-router-dom
// main.tsx 修改代码
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";
import "./index.css";

ReactDOM.createRoot(document.getElementById("root")!).render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);
// 增加组件home 路径src/pages/home/index.tsx 
import React from "react";
import "./style.css";

const UseHome: React.FC = () => {
  return (
    <div className="home">
      home
    </div>
  );
};

export default UseHome;
// App.tsx 修改代码
import { FC } from "react";
import { Routes, Route } from "react-router-dom";

import UseHome from "./pages/home";
import "./App.css";

const UseApp: FC = () => {
  return (
    <>
      <Routes>
        <Route path="/" element={<UseHome />}></Route>
      </Routes>
    </>
  );
};

export default UseApp;

七、配置 Tailwindcss (CSS样式)

官方文档介绍比较详细,点击下方???

八、配置 Styled-components

官方文档介绍比较详细,点击下方???
// 简单例子
import React from "react";
import { styled } from "styled-components";
import "./style.css";

// 配置样式
const Title = styled.h1`
  font-size: 0.75rem;
`;

// 配置属性
const GoodsTitle = styled.p.attrs({
  className: "test-p"
})`
  color: red;
`;

const UseHome: React.FC = () => {
  return (
    <div className="home">
      <h1 className="text-3xl font-bold underline">home</h1>

      <Title>Hello</Title>
      <GoodsTitle>Home</GoodsTitle>
    </div>
  );
};

export default UseHome;


九、配置 移动端布局

<script>
    var docEl = document.documentElement;
    docEl.style.fontSize = 100 / 375 * docEl.clientWidth + 'px';
    window.addEventListener('resize', function () {
        docEl.style.fontSize = 100 / 375 * docEl.clientWidth + 'px';
    });
</script>

十、增加 Ahooks

官方文档介绍比较详细,点击下方???

十一、增加 Axios

官方文档介绍比较详细,点击下方???
简单的http封装(文章末尾)

十二、增加 swiper

官方文档介绍比较详细,点击下方???

关于接口设计

接口设计思路,以模块的形式,比如 user是一个模块,商品是一个模块,订单是一个模块 目录结构 ???

关于类型设计

以模块的形式

h5 .eslintrc.cjs

// 修改 .eslintrc.cjs 
module.exports = {
  root: true,
  env: { browser: true, es2020: true },
  extends: [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:react-hooks/recommended"
  ],
  ignorePatterns: ["dist", ".eslintrc.cjs"],
  parser: "@typescript-eslint/parser",
  plugins: ["react-refresh"],
  rules: {
    "react-refresh/only-export-components": [
      "warn",
      { allowConstantExport: true }
    ],
    // **** 新增 ****
    quotes: [2, "double"], // 必须使用双引号
    semi: [2, "always"], // 语句强制分号结尾
    "comma-dangle": [2, "never"], // 数组和对象键值对最后一个逗号, never参数:不能带末尾的逗号, always参数:必须带末尾的逗号
    eqeqeq: [2, "allow-null"] // 必须使用 ===
  }
};

h5 vscode setting.json

// vscode setting.json
{
  "editor.tabSize": 4,
  "editor.fontSize": 15,
  "launch": {
    "configurations": [],
    "compounds": []
  },
  "http.proxy": "http://127.0.0.1:7890", // 代理
  "json.schemas": [
    
  ],
  "workbench.colorTheme": "Monokai ST3", // vscode主题样式
  "editor.formatOnSave": true, // #每次保存的时候自动格式化
  // ****** 默认代码格式化样式 ******
  "prettier.trailingComma": "none", // {} 最后不要 ,
  "[html]": {
    "editor.defaultFormatter": "vscode.html-language-features"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.defaultFormatter": "yzhang.markdown-all-in-one"
  },
  "[go]": {
    "editor.insertSpaces": true,
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports": true
    }
  },
  "files.associations": {
    "*.jsx": "javascriptreact",
    "*.tsx": "typescriptreact"
  },
  // ****** 校验 ******
  "eslint.enable": true, // 是否启动 eslint
  "prettier.useEditorConfig": false, // 使用编辑器配置
}

axios简单封装

import axios from "axios";

// 创建 axios 实例
const service = axios.create({
  /* 基础地址 一般都是动态的 */
  baseURL: GLOBAL_API_URL,
  /* 请求类型定义 */
  // headers: {
  //   'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
  // },
  /* 如果用的JSONP,可以配置此参数带上cookie凭证,如果是代理和CORS不用设置 */
  withCredentials: false,
  /* 请求超时时间 */
  timeout: 6000
});

/**
 * http request 拦截器
 */
service.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem("szd_token"); /* 获取token */
    if (token) {
      /* 让每个请求携带自定义 token 请根据实际情况自行修改 */
      config.headers["token"] = `${token}`;
    }
    if (config.method === "get") {
      /* 让每个请求都携带一个不同的时间参数,防止浏览器缓存不发送请求 */
      config.params = {
        ...config.params
      };
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * http response 拦截器
 */
service.interceptors.response.use(
  (response) => {
    return response.data;
  },
  (error) => {
    console.log("请求出错:", error);
  }
);

export default service;