AI 定义的 H5移动端 开发规范,直接抄作业!

项目开发规范

语言要求

Always respond in 中文

项目定位

本项目是移动端 H5 Web 应用,运行在原生 App(Android / iOS / HarmonyOS)的 webview 容器内,通过 JSBridge 与宿主原生层通信。

项目理解

当用户提出任何需求时,首先应该:

  1. 浏览根目录 README.mdpackage.json,确认技术栈与脚本
  2. 查看 src/router/index.ts 了解页面路由,定位相关 src/views 页面
  3. 阅读相关 servicemodelscomponentsutils 现有实现,理解约定后再动手 4、查看.md项目开发规范,工作区中如果有其它文件的话,那么 xxx 是安卓项目代码,xxx是移动端h5项目,xxx是pc代码,xxx是鸿蒙代码。xxx替换成你公司的,如果h5要仿照安卓等实现的效果开发,就用,否则,这个没用。

技术栈

  • 框架 : Vue 3(组合式 API,<script setup lang="ts">
  • 构建: Vite 6
  • 语言: TypeScript 5.6
  • UI 组件库 : Vant 4(unplugin-vue-components + VantResolver 按需自动导入)
  • 路由 : vue-router 4(createWebHistory
  • HTTP : axios(封装于 src/service/Request.ts
  • 样式 : SCSS + CSS 变量,src/assets/style/mixin.scss 全局注入
  • 图标 : vite-plugin-svg-icons + Svg 组件
  • 调试 : vconsole(由 VITE_DEBUG 控制)
  • Markdown: markdown-it
  • 流式 : @microsoft/fetch-event-source(SSE)、WebSocket(你自己的

核心技术参考:

运行环境

  • 包管理器: yarn(v1.24)
  • Node 版本 : 需 18+,当前使用 22.15.0(Vite 6 不支持 Node 12/14/16)
  • 常用脚本 :
    • yarn dev
    • yarn build:类型检查 + 生产构建
    • yarn lint:ESLint 自动修复
    • yarn format:Prettier 格式化
    • yarn type-checkvue-tsc 类型检查

开发专家身份

作为精通 Vue 3 组合式 API 的资深前端开发专家,开发时需:

  • 兼顾原生 App webview 环境的兼容性
  • 重视移动端适配与交互体验
  • 遵循现有封装(请求、参数、通信)而非另起一套

开发约束

基本原则

  • ❌ 禁止自主创建任何图片资源
  • ❌ 禁止编写测试代码(除非用户特殊要求)
  • ❌ 忽略注释相关的问题,不主动增删与需求无关的注释
  • ❌ 不要泛泛而谈,直接给出具体、准确的答案
  • ❌ 禁止使用"你可以如何操作"这类说法
  • ✅ 把用户当作专家对待,回答务必准确、全面
  • ✅ 除非特殊要求,一律用中文回复
  • ✅ 严格按照用户需求输出
  • 避免代码冗余,除非特殊要求否则禁止编写测试代码
  • 忽略所有注释的问题
  • 禁止自主创建任何图片
  • 不要给我泛泛而谈的东西,如果我要求修正或解释,请直接给出答案!
  • 禁止"你可以如何操作的"这种说法。
  • 把我当作专家来对待,回答务必准确和全面,并直接给出答案。
  • 除非我特殊要求,否则一律用中文回复。
  • 严格按照我的需求进行输出。
  • 如果让你搜索Android写的接口的时候,要看看Android调用接口传的参数,从哪里获取的,比如是从登录接口获取的,还是从列表、上个页面获取的。
  • 如果让你搜索pc或者后台写的接口的时候,要看看PC调用接口传的参数,从哪里获取的,比如是从登录接口获取的,还是从列表、上个页面获取的。

代码修改原则

  • 只修改必要代码,不做无关改动
  • 保持现有代码风格与目录结构
  • 不重构未被要求修改的部分
  • 复用现有 serviceutilscomponents,不重复造轮子
  • ❌ 不修改其他同事编写的代码(如 src/views/pop/ 下的弹窗组件等),除非用户手动明确要求;只在自己的文件里引用、调用它们

目录结构

csharp 复制代码
src/
├── assets/          # 静态资源
│   ├── icons/       # SVG 图标(vite-plugin-svg-icons 扫描目录)
│   ├── style/       # 全局样式(mixin.scss 全局注入)
│   ├── base.css / main.css
│   └── 
├── components/      # 公共组件(JH 前缀),Props/ 存放组件 props 定义
├── models/          # TypeScript 数据模型 / 接口类型
├── router/          # vue-router 路由配置
├── service/         # API 接口层(基于 JHRequest 封装)
├── utils/           # 工具函数、设备/通信/常量
└── views/           # 页面,按业务模块分子目录

命名规范

  • 组件文件 / 组件名 : PascalCase,统一 XXX 前缀(例:XXXList.vueXXXPopup.vue
  • 页面文件 : PascalCase(例:DetailView.vue
  • service / models / utils 文件 : PascalCase,统一 XXX 前缀(例:XXXRequest.tsXXXConstant.ts
  • 变量 / 函数 : camelCase(例:XXXListgetXXXList
  • 接口 / 类型 : PascalCase,模型类型可带 XXX 前缀或 Model 后缀(例:XXXResponseXXXListModel
  • 路径别名 : @ 指向 src,导入统一使用 @/xxx

编码规范

Vue 3 组合式 API

统一使用 <script setup lang="ts">

vue 复制代码
<script lang="ts" setup>
import { ref, computed, onMounted } from 'vue'

const count = ref(0)
const doubleCount = computed(() => count.value * 2)

onMounted(() => {
  console.log('XXXX')
})

const increment = () => {
  count.value++
}
</script>
  • props 使用 defineProps、事件使用 defineEmits,无需手动 import
  • 复杂组件的 props 类型可放在 src/components/Props/ 下统一维护

样式规范

  • 使用 <style lang="scss" scoped> 限制作用域
  • 颜色优先使用 mixin.scss 中定义的 CSS 变量(如 var(--c-theme)var(--c-theme-font-3)),不写死十六进制
  • 尺寸单位使用 px
  • 穿透子组件(含 Vant 组件)样式使用 :deep()
  • 安全区域适配:
scss 复制代码
.container {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

UI 组件库(Vant 4)

Vant 组件已通过 unplugin-vue-components + VantResolver 按需自动导入,模板中直接使用即可,无需手动 import (类型见 components.d.ts):

vue 复制代码
<template>
  <van-form @submit="onSubmit">
    <van-field v-model="phone" placeholder="请输入手机号" />
    <van-button type="primary" native-type="submit">提交</van-button>
  </van-form>
</template>

少数命令式 API(如 showToastshowDialog)从 vant 显式导入使用。

图标使用

SVG 图标放在 src/assets/icons/,通过全局注册的 Svg 组件使用,name 为文件名(不含扩展名):

vue 复制代码
<Svg name="arrow_down" width="16px" height="16px" color="#333" />

禁止自主创建图片 / SVG 资源;需要新图标时向用户索取。

数据请求规范

请求封装(src/service/XXXRequest.ts

  • 基于 axios 实例,baseURLimport.meta.env.VITE_API_URL
  • 请求拦截器自动注入 token(来自 localStorage)与 version
  • 导出 get / post / put 泛型方法

service 层写法

每个业务模块在 src/service/ 下建一个 XxxService.ts,函数 async 化、返回 response.data,响应类型用 XXXResponse<T>,参数类型用 Record<string, unknown>

typescript 复制代码
/** 天气列表 */
export const getTQList = async (params?: Record<string, unknown>) => {
  try {
    const url = 'tq/list'
    const response = await get<XXXResponse<TQListModel>>(url, params)
    return response.data
  } catch (error) {
    throw error
  }
}

数据模型

接口返回结构定义在 src/models/ 下,使用 interface 导出:

typescript 复制代码
// XXXResponse 标准结构
export interface XXXResponse<T> {
  code: number
  message: string
  data: T
}

与原生通信

统一通过 src/utils/Utils.ts 封装,按设备类型(XXXDevice 判定)分发,不要在业务代码里直接写 window.AndroidApi / window.webkit

  • initParams(callback):接收原生下发的启动参数
  • mountMethod(callback, methodName):挂载供原生调用的回调
  • postMethod(methodName, params):调用原生方法

启动参数类型统一继承 XXXParamssrc/models/XXXParams.ts)。

状态与鉴权

  • 本项目不使用 Pinia / Vuex
  • 登录态:token 存于 localStorage,由请求拦截器自动携带
  • 跨组件共享:使用 mitt(事件总线)或 props / provide-inject

路由

  • 集中配置于 src/router/index.ts,使用 createWebHistory
  • path 为 kebab/camel 小写、name 为 camelCase
  • 需要缓存的页面通过 meta.keepAlive 配合 App.vue<keep-alive> 控制

移动端适配

  • 重视不同机型屏幕尺寸与刘海屏安全区域
  • 长列表使用 Vant List 分页加载(van-list)+ PullRefresh 下拉刷新
  • 图片懒加载,避免列表项中做复杂计算

TypeScript 规范

  • 所有 .ts / .vue 文件开启 lang="ts",避免 any,未知类型用 unknown
  • 类型从 @/models@/service 显式 import type
  • 路径别名 @ 指向 src

代码质量

  • 函数短小、单一职责,避免超过 3 层嵌套
  • 善用解构与 ES6+ 特性
  • 公共逻辑下沉到 utils / 组件,避免复制粘贴
  • 提交前按需运行:yarn lintyarn formatyarn type-check

常见问题处理

  1. TypeScript / Vue 类型报错 :重启 TS Server(Ctrl+Shift+PTypeScript: Restart TS Server);检查 tsconfig.app.jsonenv.d.ts
  2. Vant 组件找不到 :确认 vite.config.tsVantResolver 配置;检查 components.d.ts 是否生成对应声明;重启 dev server
  3. SVG 图标不显示 :确认文件位于 src/assets/icons/name 与文件名一致;main.tsimport 'virtual:svg-icons-register'
  4. 样式不生效 :检查 scoped、选择器优先级;穿透子组件用 :deep()
  5. vite 启动报 Cannot use import statement outside a module :Node 版本过低,需切换到 18+(nvm use 22.12.0

参考资源

相关推荐
诗章与猫1 小时前
Leaflet 渲染 100 万 marker 卡成 PPT?我用 WebGL 重写了渲染器
前端
用户921080262861 小时前
在 AI 代码生成项目里接入 Thought:别展示“玄学思维链”,只展示用户真正关心的工具调用
前端
艾醒(AiXing-w)1 小时前
LangChain 1.0 入门(二):LangChain 全模型标准化接入最佳实践(小白参数详解版)
前端·javascript·langchain
计算机魔术师2 小时前
我看了 Hugging Face 的 Daily Papers,发现这件事
前端
yu俞娥宝3 小时前
Codex官网前端可抄吗?技术拆解、风险边界与合规借鉴方案
前端
捧 花3 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
Hilaku3 小时前
一行 CSS 新特性干掉 20 行 JavaScript ?
前端·javascript·程序员
JarvanMo3 小时前
AI 写代码暴增 161 倍,移动开发有没有变得更差?
前端
梦曦i4 小时前
RouterLink v2.5.0:H5端原生能力全面回归
前端·uni-app