React h5架构
目录
初始化项目架构
一步一步搭建自己的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;
React h5架构的更多相关文章
- React Native 架构演进
写在前面 上一篇(React Native 架构一览)从设计.线程模型等方面介绍了 React Native 的现有架构,本篇将分析这种架构的局限性,以及 React Native 正在进行的架构升级 ...
- H5架构和原生架构的区别
1.App的3种开发方式 表面上看,手机App都是同样的东西,就是手机上的应用程序,点击图标就能运行,但是它们的底层技术不一样.按照开发技术,App可以分成三大类.原生应用(简称nativeApp), ...
- 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上
写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...
- React Native 架构一览
一.架构设计 整体上分为三大块,Native.JavaScript 与 Bridge: Native 管理 UI 更新及交互,JavaScript 调用 Native 能力实现业务功能,Bridge ...
- yeoman生成react基本架构
工欲善其事必先利其器.在开始react开始之前,我们先使用一系列的前段工具构建自己的前端集成解决方案. 环境配置: Bower,node js,npm,Grunt,Gulp,Yeoman 作者一直使用 ...
- react 组件架构
容器型组件(container component) 含有抽象数据而没有业务逻辑的组件 负责管理数据和业务逻辑,不负责 UI 的呈现 带有内部状态 展示型组件(presentational compo ...
- React Native For Android 架构初探
版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...
- 手写React的Fiber架构,深入理解其原理
熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...
- Immutable.js 以及在 react+redux 项目中的实践
来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...
- Thinking in React
本文翻译自React的官方博客,详情请阅读原文. React非常适合构建组件化的应用,它注重高性能,因此组建的重用,项目的扩展都十分灵活,Facebook和instagram的不少商业项目使用了此框架 ...
随机推荐
- Apache DolphinScheduler 3.2.1 版本发布:增强功能与安全性的全面升级
近期,Apache DolphinScheduler 社区激动地宣布 3.2.1 版本的发布.此次更新不仅着力解决了前一版本(3.2.0)中遗留的问题,而且引入了一系列的功能增强和优化措施. 原先的问 ...
- Linux统计文件目录下文件的数目命令
Linux下有三个命令:ls.grep.wc.通过这三个命令的组合可以统计目录下文件及文件夹的个数. 1.ls -l | grep "^-" | wc -l:统计当前目录下文件的个 ...
- [学习笔记] 单调队列优化DP - DP
单调队列优化DP 简单好想的DP优化 真正的教育是把学过的知识忘掉后剩下的东西 -- *** 对于一个转移方程类似于 \(dp[i]=max(min)\{dp[j]+b[j]+a[i]\}\ \ x_ ...
- 一个好用的消息推送服务【Server 酱】
今天给大家介绍一个好用的消息推送服务Server 酱 Server 酱简介 Server 酱是什么 「Server 酱」,英文名「ServerChan」,是一款「手机」和「服务器」.「智能设备」之间的 ...
- springboot认证方案一
这里给出集成oauth2后的简单认证方案架构图
- docker安装cdh6.3.2集群(联网版)
一.前言 本次采用的在线安装方式,cdh为6.3.2版本,系统为centos7.4, docker节点可以为任意多个,下文将以3个docker容器为示例进行展示.此方法也可用在docker swarm ...
- 6.2K star!推荐一款开源混沌工程测试平台:Chaos Mesh
1.Chaos Mesh 介绍 Chaos Mesh是一个开源的混沌工程平台,旨在帮助用户在生产环境中测试.验证和优化其应用程序的可靠性和稳定性.通过引入故障注入和混沌工程原则,Chaos Mesh可 ...
- LaTeX 生成黑底白字的 PDF
最近需要深夜看论文,然而白底的 PDF 看久了眼睛很难受,想转换成黑底的.正好我有论文的 LaTeX 源码,因此可以直接编译黑底的 PDF 出来. 使用 darkmode 宏包 CTAN 上有一个 L ...
- MyBatis 从入门到放弃 ( MyBatis基础总结 )
目录 MyBatis历史 Mybatis特性 MyBatis下载 和其它持久化层技术对比 开发环境 创建maven工程 创建MyBatis的核心配置文件 创建mapper接口 创建MyBatis的映射 ...
- 神经网络之卷积篇:详解卷积神经网络示例(Convolutional neural network example)
详解卷积神经网络示例 假设,有一张大小为32×32×3的输入图片,这是一张RGB模式的图片,想做手写体数字识别.32×32×3的RGB图片中含有某个数字,比如7,想识别它是从0-9这10个数字中的哪一 ...