# apicloud-vue-app
**Repository Path**: ahongdream/apicloud-vue-app
## Basic Information
- **Project Name**: apicloud-vue-app
- **Description**: 基于 Vue 开发 APICloud App 的解决方案(Solution for developing APICloud App based on Vue)
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2023-03-14
- **Last Updated**: 2023-08-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# apicloud-vue-app
> For Vue3:主分支
>
> For Vue2:见 2.x-vue2 分支
> Vue Cli 版本:5.0.8
>
> Node 版本:18.13.0
>
> 技术栈文档
>
> [Vue3](https://cn.vuejs.org/) / [Vue Cli](https://cli.vuejs.org/)
>
> [APICloud 开发者文档](https://docs.apicloud.com/) / [config.xml 配置文档](https://docs.apicloud.com/Dev-Guide/app-config-manual) / [api 接口文档](https://docs.apicloud.com/Client-API/api)
## 介绍
apicloud-vue-app 是基于 Vue 开发 APICloud App 的解决方案,在使用 Vue MVVM 模型开发页面的同时,充分保留了访问 APICloud 底层接口的能力。
项目遵从 APICloud 多页面渲染方式,使用 Vue Cli 脚手架是为了弥补 APICloud 本身不具备的模块化能力,提高开发效率,跟随大前端的发展。
## 起步
1. 在 `public/config.xml` 中填写 AppId
```xml
```
### lib 库
在 `src/lib` 中提供了一些封装模块,可以在业务代码中引入使用,代码文件有详细的使用说明。
```
lib
├─apicloud 基于 APICloud 接口进行封装的模块
│ └─modules 基于 APICloud 的 modules 进行封装
├─components 内置的 vue 组件
├─composables 内置的 vue 组合式 API
└─utils 工具函数
```
#### apicloud
- 界面 / 交互反馈:`@/lib/apicloud/ui`
- 数据存储:`@/lib/apicloud/storage`
- 页面路由:`@/lib/apicloud/route`
- 设备权限:`@/lib/apicloud/permission`
- 网络请求:`@/lib/apicloud/network`
- 第三方模块
- dialogBox:`@/lib/apicloud/modules/dialogBox`
- WXPhotoPicker:`@/lib/apicloud/modules/WXPhotoPicker`
#### components
- AvaIcon:图标
- AvaImage:图片
- route/AvaNavigator:页面导航
- layout/AvaSafeArea:适配顶部状态栏、底部安全区
- layout/AvaSafeHeader:适配顶部状态栏的头部
- layout/AvaSafeFooter:适配底部安全区的底部
- layout/AvaSafeNavBar:适配顶部状态栏的导航栏
#### composables
- usePageParam:页面参数
```javascript
import { usePageParam } from "@/lib/composables/use-page-param";
export default {
setup() {
const pageParam = usePageParam({
message: '这里是默认参数'
});
return {
pageParam
};
}
}
```
#### utils
- validate.js:提供了一些验证函数
- web-api/event:事件相关
- web-api/scroll:各种尺寸与滚动条
- web-api/style:CSS 样式相关
### 兼容性处理
> 相关链接:[Browserlist](https://github.com/browserslist/browserslist)、[Can I use](https://caniuse.com/)
项目中有一个单独的 `.browserslistrc` 文件指定了目标浏览器的范围,这个值会被用来确定需要转译的 JavaScript 特性和需要添加的 CSS 浏览器前缀。
```
Android > 4.4
ios_saf > 12
```
说明:
- `Android > 4.4` 指定的是安卓 WebView 的 Chromium 内核
- `ios_saf > 12` 指定的是 iOS 系统版本大于 12
- 可以在项目目录中使用 `npx browserslist` 命令查看所写规则具体指定的目标浏览器及版本号
## APICloud 坑记录
1. [WKWebView使用介绍](https://community.yonyou.com/thread-151904-1-1.html)
1. 跨域问题:云编译启用全局加密后,默认会限制跨域访问
1. 解决方式一:【推荐】打卡页面时将 allowAccessFromFile 参数设为 true
2. 解决方式二:禁用全局加密
2. 调用 api.download 方法时,如果 Android 没有 storage 权限会提示 “没有插入 SD 卡”。
3. 关于权限,需要在 APICloud 云编译中选择平台对应的隐私权限,如果在没有选择的情况下调用 api.requestPermission:
1. iOS 会闪退
2. Android 在授权页没有对应的权限项让用户操作
4. config.xml 中 smartUpdate 设为 false 时,APICloud 平台的闪屏广告功能无法正常使用
## VueCli 多版本并存
### 使用 nvm
nvm 是 nodejs 版本管理工具,可在同个服务器上切换不同的 Node.js 版本,npm 版本也会对应切换,且每个 npm 版本下的全局包(node_modules)是独立的,利用这点可以实现在一台服务器上并存多个 VueCli 版本,只需使用 nvm 切换 Node.js 版本即可。
- 下载 nvm
macOS:brew install nvm
Windows:https://github.com/coreybutler/nvm-windows,下载后默认安装即可
- nvm 常用命令
```bash
nvm list # 查看当前所有的 Node.js 版本
nvm install 18.13.0 # 安装指定的 Node.js 版本
nvm use 18.13.0 # 切换指定的 Node.js 版本
```
- 备注:如果在安装 nvm 之前,已经使用 npm 全局下载了 VueCli,需要在安装 nvm 之前先执行 `npm uninstall @vue/cli -g` 进行卸载,或到全局 `node_modules` 文件夹下手动删除 VueCli 依赖。
### 使用 Docker
```bash
# 下载 node:18.13.0 镜像
docker pull node:18.13.0
# 运行 node:18.13.0 镜像,并将主机的项目目录挂载到容器中的 /app 目录下
docker run -it -v E:/apicloud-vue3-app:/app --name apicloud-vue-app node:18.13.0 /bin/bash
# 进入容器命令行后,安装 vue-cli
npm i @vue/cli -g
```
```javascript
// 在 vue.config.js 下添加配置
module.exports = {
configureWebpack: {
watchOptions: {
poll: true,
ignored: /node_modules/
}
}
}
```
## 框架持续优化中
> 设计参考:[uni-app](https://uniapp.dcloud.net.cn/)、[微信小程序](https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/api.html)
### Vue Cli 创建选项
1. Vue version:3.x
2. Babel
4. CSS Pre-processors
- Less
5. Linter / Formatter
- ESLint with error prevention only
- Lint on save
6. Where do you prefer placing config for Babel, ESLint, etx.?
- In dedicated config files
### 优化点
1. 考虑要不要直接使用 webpack 构建,不使用 vue-cli
2. 考虑能不能集成 apicloud-cli,实现 watch 监听编译并同步
3. 困惑:browserslist 中配置的浏览器是支持箭头函数的,为什么打包后要把箭头函数进行编译