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的不少商业项目使用了此框架 ...
随机推荐
- CH02_数据类型
CH02_数据类型 数据类型 整型 描述:整型变量表示的是整型类型的数据,C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同. 数据类型 占用空间 取值范围 short(短整型) 2字 ...
- HEOI游记
\(NOI2024河北省选-HEOI游记\) ·评价 其实作为体验名额,最大的感觉就是自费旅游了一趟. 为什么说是自费呢?下面清点一下账单: 1.两晚酒店 1200 2.KFC 和 拉面 112 3. ...
- 拼多多API出租,拼多多API租用,拼多多订单信息获取API,拼多多开放平台权限出租,拼多多开放平台API出租
当前,拼多多开放平台的审核还是比较严格的,虽然可以申请,但是难度很大,对于一些用户来说困难还是蛮大的 拼多多的API主要拼多多订单信息获取.拼多多商品上传,拼多多库存更新等 需要这块API的一般是需要 ...
- 5.7前端跨域CSRF和SSRF
一.CSRF(跨站请求伪造) 1.get类型(pikaqu靶场环境) 前提:抓包获取请求地址,构造伪造请求站点,并保持用户登录状态点击伪造站点 此时在其他主机,构造网站信息index.html文件,并 ...
- 合合信息亮相新加坡科技周——Big Data & AI World Expo展示AI驱动文档数字化的前沿能力
合合信息亮相新加坡科技周--Big Data & AI World Expo展示AI驱动文档数字化的前沿能力 展会规模背景: 2023年10月11日-12日,合合信息在TECH WEEK ...
- Glob 语法
Glob 通常用来匹配 file, gitignore, Tailwind CSS purge 都有用到 参考: Online Test Tool 语法解释 常用到的 ./PdfTemplate/** ...
- 大模型应用开发初探 : 通用函数调用Planner
大家好,我是Edison. 上一篇,我们了解了什么是AI Agent以及如何用Semantic Kernel手搓一个AI Agent.有朋友留言说,自动函数调用对大模型有较高的要求,比如Azure O ...
- SpringMVC——SSM整合——项目异常处理
项目异常处理 项目异常分类 业务异常 不规范的用户行为产生的异常 规范的用户行为产生的异常 系统异常 项目运行过程中可预计且无法避免的异常 其他异常 编程人员未预期到的异常 项 ...
- @RequestBody注意事项
使用@RequestBody注解时,是用于接收Content-Type为application/json类型的请求,数据类型是JSON:{"aaa":"111" ...
- 加入 Flutter Engage,Pick 您的专属 Dash 形象!
Flutter Engage 活动精彩来袭 对 Flutter 团队的开发者们来说,交流的重要性不言而喻,和您一样,我们也希望开发者们能够在不同的情境下进行互动分享.于是我们为您准备了一场特别的线上活 ...