|
1 | | -# Plugin 开发说明 |
| 1 | +# Plugin 目录结构 |
2 | 2 |
|
3 | | -`plugin/` 目录承载了 `mx-jpush-expo` 的 TypeScript 实现、原生 fixture 测试和编译产物,是贡献者理解插件行为的第一入口。 |
| 3 | +本目录包含 JPush Expo Config Plugin 的 TypeScript 实现与测试。 |
4 | 4 |
|
5 | | -相关文档: |
6 | | - |
7 | | -- 接入与使用说明:[`README.md`](../README.md) |
8 | | -- 开发流程与发布说明:[`DEVELOPMENT.md`](../DEVELOPMENT.md) |
9 | | -- 历史版本更新:[`CHANGELOG.md`](../CHANGELOG.md) |
10 | | - |
11 | | -## 目录概览 |
| 5 | +## 目录结构 |
12 | 6 |
|
13 | 7 | ```text |
14 | 8 | plugin/ |
15 | | -├── src/ # TypeScript 源码 |
16 | | -│ ├── index.ts # 主入口文件 |
17 | | -│ ├── types.ts # 类型定义和参数验证 |
18 | | -│ ├── utils/ |
19 | | -│ │ ├── config.ts # 全局配置管理 |
20 | | -│ │ ├── codeValidator.ts # 注入结果校验 |
21 | | -│ │ └── generateCode.ts # 原生代码注入工具 |
22 | | -│ ├── ios/ # iOS 平台配置 |
23 | | -│ │ ├── index.ts # iOS 配置集成入口 |
24 | | -│ │ ├── infoPlist.ts # Info.plist 配置 |
25 | | -│ │ ├── appDelegate.ts # AppDelegate 实现配置 |
26 | | -│ │ └── bridgingHeader.ts # Swift/OC 桥接头文件配置 |
27 | | -│ └── android/ # Android 平台配置 |
28 | | -│ ├── index.ts # Android 配置集成入口 |
29 | | -│ ├── androidManifest.ts # AndroidManifest.xml 配置 |
30 | | -│ ├── appBuildGradle.ts # app/build.gradle 配置 |
31 | | -│ ├── projectBuildGradle.ts # project/build.gradle 配置 |
32 | | -│ ├── settingsGradle.ts # settings.gradle 配置 |
33 | | -│ └── gradleProperties.ts # gradle.properties 配置 |
34 | | -├── __tests__/ # 测试目录 |
35 | | -│ ├── fixtures/ |
36 | | -│ │ └── ios-project/ # iOS 原生 fixture |
37 | | -│ ├── iosFixture.ts # iOS fixture helper |
38 | | -│ └── *.test.ts # Jest 用例 |
39 | | -├── build/ # 编译后的 JavaScript 文件(npm 发布) |
40 | | -├── tsconfig.json # TypeScript 配置 |
41 | | -└── jest.config.js # Jest 测试配置 |
| 9 | +├── src/ # TypeScript 源码 |
| 10 | +│ ├── index.ts # 主入口文件 |
| 11 | +│ ├── types.ts # 类型定义和参数验证 |
| 12 | +│ ├── android/ # Android 平台配置 |
| 13 | +│ │ ├── androidManifest.ts |
| 14 | +│ │ ├── appBuildGradle.ts |
| 15 | +│ │ ├── gradleProperties.ts |
| 16 | +│ │ ├── index.ts |
| 17 | +│ │ ├── projectBuildGradle.ts |
| 18 | +│ │ └── settingsGradle.ts |
| 19 | +│ ├── ios/ # iOS 平台配置 |
| 20 | +│ │ ├── appDelegate.ts |
| 21 | +│ │ ├── bridgingHeader.ts |
| 22 | +│ │ ├── index.ts |
| 23 | +│ │ └── infoPlist.ts |
| 24 | +│ └── utils/ # 通用注入与源码定位工具 |
| 25 | +├── __tests__/ # 单元测试与 fixture 测试 |
| 26 | +├── build/ # 编译产物(npm 发布内容) |
| 27 | +├── jest.config.js # Jest 测试配置 |
| 28 | +└── tsconfig.json # TypeScript 配置 |
42 | 29 | ``` |
43 | 30 |
|
44 | | -## 模块职责 |
45 | | - |
46 | | -| 模块 | 职责 | |
47 | | -| --- | --- | |
48 | | -| `src/index.ts` | 插件入口,负责参数校验、配置初始化和平台分发 | |
49 | | -| `src/types.ts` | 类型定义与参数校验 | |
50 | | -| `src/ios/*` | iOS 原生输出注入 | |
51 | | -| `src/android/*` | Android 原生输出注入 | |
52 | | -| `src/utils/config.ts` | 当前主线的共享配置流转 | |
53 | | -| `src/utils/*` | 代码注入与校验工具 | |
54 | | -| `__tests__/fixtures/*` | 最小原生模板,用于回归测试 | |
55 | | -| `iosFixture.ts` | iOS fixture 生命周期、复制、编译与读取 helper | |
56 | | - |
57 | | -## 当前实现约束 |
58 | | - |
59 | | -### 配置流转 |
60 | | - |
61 | | -- 对外入口仍然使用 `JPushPluginProps` |
62 | | -- 插件入口会先做参数校验,再通过 `setConfig/get*` 在模块间共享配置 |
63 | | -- 当前主线仍依赖模块级配置流转;如果后续继续重构,可再收敛到显式传参 |
64 | | - |
65 | | -### iOS |
66 | | - |
67 | | -- `infoPlist.ts` 负责 `JPUSH_*` 键和 `UIBackgroundModes` |
68 | | -- `appDelegate.ts` 负责 Swift 注入 |
69 | | -- `bridgingHeader.ts` 负责复用或创建桥接头文件,并设置 `SWIFT_OBJC_BRIDGING_HEADER` |
70 | | - |
71 | | -### Android |
72 | | - |
73 | | -- `androidManifest.ts` 负责 `JPUSH_APPKEY` / `JPUSH_CHANNEL` meta-data |
74 | | -- `appBuildGradle.ts` 负责依赖、`manifestPlaceholders`、`abiFilters` 与 `apply plugin` |
75 | | -- `projectBuildGradle.ts` 负责 Maven 仓库与 classpath |
76 | | -- `settingsGradle.ts` 负责 `jpush-react-native` / `jcore-react-native` 模块注入 |
77 | | -- `gradleProperties.ts` 负责华为 AGC 兼容性属性 |
78 | | - |
79 | | -## 测试策略 |
80 | | - |
81 | | -当前主线使用 fixture-based 回归测试,而不只做参数校验。 |
| 31 | +## 模块说明 |
82 | 32 |
|
83 | | -| 测试文件 | 覆盖内容 | |
84 | | -| --- | --- | |
85 | | -| `withJPush.test.ts` | 参数校验与插件入口基础行为 | |
86 | | -| `nativeIosSmoke.test.ts` | iOS 主流程 smoke | |
87 | | -| `nativeIosMods.test.ts` | `Info.plist`、Bridging Header | |
| 33 | +### 主入口 |
| 34 | +- `src/index.ts` 负责参数验证、全局配置初始化,以及串联 iOS/Android 配置。 |
88 | 35 |
|
89 | | -### 为什么使用 fixture |
| 36 | +### Android 模块 |
| 37 | +- `androidManifest.ts` 处理 `JPUSH_APPKEY` / `JPUSH_CHANNEL` meta-data。 |
| 38 | +- `appBuildGradle.ts` 处理 `defaultConfig`、依赖和可回收的 `apply plugin` 注入。 |
| 39 | +- `projectBuildGradle.ts` 处理 `buildscript` / `allprojects` 仓库与 classpath。 |
| 40 | +- `gradleProperties.ts` 处理华为 AGC 的兼容性属性。 |
| 41 | +- `settingsGradle.ts` 注入 `jpush-react-native` / `jcore-react-native` 模块。 |
90 | 42 |
|
91 | | -- 直接验证 `compileModsAsync` 的真实输出 |
92 | | -- 能覆盖正则锚点、幂等性和模板兼容性 |
93 | | -- 比只断言 helper 返回值更接近业务项目里的 `expo prebuild` |
94 | | -- Android 与 `AppDelegate` 的细粒度 fixture 覆盖可以继续在后续 PR 中补齐 |
| 43 | +### iOS 模块 |
| 44 | +- `infoPlist.ts` 合并 `UIBackgroundModes` 并写入 JPush 配置。 |
| 45 | +- `appDelegate.ts` 向 Swift `AppDelegate` 注入初始化、通知方法与 delegate extension。 |
| 46 | +- `bridgingHeader.ts` 仅对 application target 配置 Bridging Header,并自动创建/补全头文件。 |
95 | 47 |
|
96 | | -## 本地开发 |
| 48 | +### 通用工具 |
| 49 | +- `utils/generateCode.ts` 负责带 tag 的生成区段插入、更新和删除。 |
| 50 | +- `utils/sourceCode.ts` 提供 import、代码块与行号定位 helper。 |
| 51 | +- `utils/config.ts` 维护运行期共享的插件配置。 |
97 | 52 |
|
98 | | -在仓库根目录执行: |
| 53 | +## 开发流程 |
99 | 54 |
|
100 | 55 | ```bash |
| 56 | +pnpm install |
101 | 57 | npm run build |
102 | | -npm run test -- --runInBand |
| 58 | +npm test -- --coverage |
103 | 59 | npm run lint |
104 | 60 | ``` |
105 | 61 |
|
106 | | -## 贡献建议 |
| 62 | +## 设计原则 |
107 | 63 |
|
108 | | -- 改动原生输出逻辑时,优先补 fixture 回归测试 |
109 | | -- 尽量保持每个模块只处理一个原生文件或一个原生职责 |
110 | | -- 如果新增平台配置,先决定它属于 `Info.plist`、Gradle、Manifest 还是 `AppDelegate` 哪一层,再落实现 |
111 | | -- 如果 README 需要新增接入说明,优先更新根目录 `README.md`;这里更适合写贡献者视角的信息 |
| 64 | +1. 幂等:重复执行 `expo prebuild` 不重复注入。 |
| 65 | +2. 可回收:配置关闭后移除旧的生成内容,不保留历史残留。 |
| 66 | +3. 类型安全:使用 TypeScript 与显式 helper 提升可维护性。 |
| 67 | +4. 可测试:平台注入逻辑优先拆成可直接单测的纯转换函数。 |
0 commit comments