@flun/node-mobile-app 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/Android /346/236/204/345/273/272/346/214/207/345/215/227.md" +315 -0
  2. package/LICENSE +29 -0
  3. package/README.md +448 -0
  4. package/bin/cli.js +49 -0
  5. package/cli-assets/server.js +37 -0
  6. package/mobileAppConfig.js +146 -0
  7. package/package.json +88 -0
  8. package/scripts/copy-files.js +37 -0
  9. package/src/commands/build.js +109 -0
  10. package/src/commands/clean.js +25 -0
  11. package/src/commands/test.js +108 -0
  12. package/src/config.js +112 -0
  13. package/src/copy.js +235 -0
  14. package/src/fingerprint.js +102 -0
  15. package/src/generate.js +102 -0
  16. package/src/install.js +144 -0
  17. package/src/patcher.js +374 -0
  18. package/src/platform-ios.js +142 -0
  19. package/src/utils.js +131 -0
  20. package/template/.prettierrc.js +5 -0
  21. package/template/.watchmanconfig +22 -0
  22. package/template/@types/nodejs-mobile-react-native/index.d.ts +9 -0
  23. package/template/App.tsx +108 -0
  24. package/template/Gemfile +17 -0
  25. package/template/android/app/build.gradle +127 -0
  26. package/template/android/app/debug.keystore +0 -0
  27. package/template/android/app/proguard-rules.pro +10 -0
  28. package/template/android/app/src/main/AndroidManifest.xml +27 -0
  29. package/template/android/app/src/main/java/com/myapp/MainActivity.kt +22 -0
  30. package/template/android/app/src/main/java/com/myapp/MainApplication.kt +27 -0
  31. package/template/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  32. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  33. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  34. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  35. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  36. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  37. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  38. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  39. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  40. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  41. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  42. package/template/android/app/src/main/res/raw/keep.xml +1 -0
  43. package/template/android/app/src/main/res/values/strings.xml +3 -0
  44. package/template/android/app/src/main/res/values/styles.xml +9 -0
  45. package/template/android/build.gradle +21 -0
  46. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  47. package/template/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  48. package/template/android/gradle.properties +49 -0
  49. package/template/android/gradlew +248 -0
  50. package/template/android/gradlew.bat +98 -0
  51. package/template/android/settings.gradle +6 -0
  52. package/template/app.json +4 -0
  53. package/template/babel.config.js +3 -0
  54. package/template/eslint.config.js +6 -0
  55. package/template/index.js +12 -0
  56. package/template/ios/.xcode.env +11 -0
  57. package/template/ios/MyApp/AppDelegate.swift +55 -0
  58. package/template/ios/MyApp/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  59. package/template/ios/MyApp/Images.xcassets/Contents.json +6 -0
  60. package/template/ios/MyApp/Info.plist +74 -0
  61. package/template/ios/MyApp/LaunchScreen.storyboard +47 -0
  62. package/template/ios/MyApp/PrivacyInfo.xcprivacy +37 -0
  63. package/template/ios/MyApp.xcodeproj/project.pbxproj +475 -0
  64. package/template/ios/MyApp.xcodeproj/xcshareddata/xcschemes/MyApp.xcscheme +88 -0
  65. package/template/ios/Podfile +34 -0
  66. package/template/metro.config.js +18 -0
  67. package/template/mobileApp.runtime.d.ts +16 -0
  68. package/template/package.json +18 -0
  69. package//350/207/252/345/256/232/344/271/211libnode/346/214/207/345/215/227.md +447 -0
@@ -0,0 +1,315 @@
1
+ # Android 构建指南
2
+
3
+ 本文档是 [README.md](./README.md) 的**深度附件**。日常使用(`test` / `build`)不需要看——CLI 自动处理。
4
+
5
+ 本文档只讲四件事,都是 README 没细说的:
6
+ 1. **环境准备**(JDK / SDK / NDK / adb / 原生模块编译)
7
+ 2. **libnode.so**(v18 vs v22、预编译仓库、替换、full-icu 验证)
8
+ 3. **Express 版本选择**(踩坑清单)
9
+ 4. **调试与缓存排查**(logcat 命令、手动清缓存兜底)
10
+
11
+ ---
12
+
13
+ ## 一、环境准备
14
+
15
+ ### 1.1 JDK 17(必须)
16
+
17
+ Android Gradle Plugin 不支持 JDK 18+。
18
+
19
+ 下载:[Adoptium JDK 17](https://adoptium.net/temurin/releases/?version=17)
20
+
21
+ **CLI 不读 `JAVA_HOME`**,直接用系统 PATH 里的 `java`。确保 `java -version` 输出是 17。
22
+
23
+ ### 1.2 Android SDK
24
+
25
+ CLI 自动查找,顺序:
26
+
27
+ 1. `mobileAppConfig.js` 的 `android.sdkPath`
28
+ 2. 环境变量 `ANDROID_HOME` / `ANDROID_SDK_ROOT`
29
+ 3. 常见默认路径(Windows:`%LOCALAPPDATA%\Android\Sdk`)
30
+
31
+ **必需组件**:
32
+
33
+ | 组件 | 版本 |
34
+ | -------------- | ------------------------------------ |
35
+ | SDK Platform | 36 |
36
+ | Build-Tools | 37.0.0 |
37
+ | Platform-Tools | 最新(含 adb) |
38
+ | NDK | 27.1.12297006(libnode.so 编译依赖) |
39
+
40
+ ### 1.3 adb
41
+
42
+ 查找顺序同 SDK。常用命令:
43
+
44
+ ```powershell
45
+ $adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
46
+ & $adb devices
47
+ ```
48
+
49
+ ### 1.4 原生模块编译开关(Windows)
50
+
51
+ `nodejs-mobile-react-native` 在 Windows 上无法编译原生模块。CLI 首次运行时自动写:
52
+
53
+ ```
54
+ <buildDir>/nodejs-assets/BUILD_NATIVE_MODULES.txt # 内容: 0
55
+ ```
56
+
57
+ **例外场景**:用了 v22 的 `libnode.so`,且需要重编原生模块(如 `bcrypt`)。
58
+
59
+ 1. `mobileAppConfig.js` 里设 `android.buildNativeModules: true`
60
+ 2. 跑 `npx node-mobile-app test`(CLI 写 `1` 并设环境变量 `NODEJS_MOBILE_BUILD_NATIVE_MODULES=1`)
61
+ 3. 编完后改回 `false`
62
+
63
+ ---
64
+
65
+ ## 二、libnode.so
66
+
67
+ `nodejs-mobile-react-native` 用它提供 Node.js 运行时。**是否带 full-icu** 决定能跑哪个 Express 版本。
68
+
69
+ ### 2.1 官方 v18(默认随包带)
70
+
71
+ 路径:
72
+
73
+ ```
74
+ <你的项目>/node_modules/nodejs-mobile-react-native/android/libnode/bin/<架构>/libnode.so
75
+ ```
76
+
77
+ | 架构 | 大小 |
78
+ | ----------- | ------- |
79
+ | arm64-v8a | 59.6 MB |
80
+ | armeabi-v7a | 56 MB |
81
+ | x86_64 | 62.3 MB |
82
+
83
+ **特点**:`--with-intl=none`,**不含 ICU**。
84
+
85
+ - 不能用 `\p{...}` / `\P{...}` Unicode 正则
86
+ - **必须 Express 4**
87
+
88
+ ### 2.2 自编译 v22+(推荐)
89
+
90
+ **官方 v18 已停更**。要跑 Express 5 或新语法,需替换。
91
+
92
+ **预编译产物仓库**:
93
+
94
+ - GitHub:https://github.com/OpenFlun/nodejs-mobile
95
+ - Gitee(国内):https://gitee.com/OpenFlun/nodejs-mobile
96
+
97
+ **当前 Android 支持情况**:
98
+
99
+ | 架构 | v18 | v22 |
100
+ | ----------- | --- | --- |
101
+ | arm64-v8a | ✓ | ✓ |
102
+ | x86_64 | ✓ | ✓ |
103
+ | armeabi-v7a | ✓ | ✗ |
104
+
105
+ **未来计划**:v24、v26 逐步适配。
106
+
107
+ **替换步骤**:
108
+
109
+ 1. 下载 `libnode.zip`(含 `bin/` + `include/`)
110
+ 2. **整体替换** `你的项目/node_modules/nodejs-mobile-react-native/android/libnode/`
111
+ 3. `mobileAppConfig.js` 的 `android.abiFilters` 只写实际存在的架构(v22 是 `['arm64-v8a', 'x86_64']`)
112
+ 4. 跑 `npx node-mobile-app test` 或 `build`
113
+
114
+ CLI 指纹机制会自动清 `.cxx` / `android/build` / `app/build` 并全量重编——**无需手动清缓存**。
115
+
116
+ **完整自编译流程**见 `自定义libnode指南.md`。
117
+
118
+ ### 2.3 验证是否带 full-icu
119
+
120
+ ```bash
121
+ # Linux / macOS / WSL / Git Bash
122
+ strings libnode.so | grep -c icudt78l
123
+ ```
124
+
125
+ - 输出几千(约 4300)→ 带 full-icu
126
+ - 输出 0 → 不带
127
+
128
+ **体积对照**(实测,strip 后):
129
+
130
+ | 版本 | arm64-v8a | x86_64 |
131
+ | ----------------------- | --------- | -------- |
132
+ | v18(官方,无 ICU) | 59.6 MB | 62.3 MB |
133
+ | v22(自编译,full-icu) | 112.4 MB | 117.2 MB |
134
+
135
+ 体积差异约 50 MB,来自三部分:Node v22 核心引擎 + full-icu 数据(约 25–30 MB)+ V8 版本升级。**不是编译出错**。
136
+
137
+ ---
138
+
139
+ ## 三、Express 版本选择(踩坑清单)
140
+
141
+ **选错版本会在 Node 进程启动时崩溃**,且错误信息极具误导性(如 `number 116 is not a function`)。
142
+
143
+ ### 3.1 版本对照
144
+
145
+ | libnode.so | Node.js | ICU | Express |
146
+ | --------------------- | ------- | --- | ---------------------- |
147
+ | 官方 v18 | v18 | 无 | **4.x**(如 `4.22.2`) |
148
+ | 自编译 v22 + full-icu | v22 | 有 | **5.x**(如 `5.2.1`) |
149
+
150
+ ### 3.2 场景 A(v18 + Express 4)
151
+
152
+ `nodejs-project/package.json`:
153
+
154
+ ```json
155
+ {
156
+ "dependencies": {
157
+ "express": "4.22.2"
158
+ }
159
+ }
160
+ ```
161
+
162
+ 依赖里如有 `\P{ASCII}` 等 Unicode 正则,改写成 ASCII 等价:
163
+
164
+ | 原写法 | ASCII 写法 |
165
+ | ----------- | -------------- |
166
+ | `\P{ASCII}` | `[^\x00-\x7F]` |
167
+
168
+ ### 3.3 场景 B(v22 + full-icu + Express 5)
169
+
170
+ ```json
171
+ {
172
+ "dependencies": {
173
+ "express": "5.2.1"
174
+ }
175
+ }
176
+ ```
177
+
178
+ **三个前提**:
179
+
180
+ 1. `libnode.so` 确实带 full-icu(用 `strings` 验证过)
181
+ 2. **不要**用 `@alloc/path-to-regexp` 替换原版——它的 `exports` 只有 `import` 条件,CJS 下 `require()` 报 `No "exports" main defined`
182
+ 3. **不要**加任何 `overrides` 强制替换 `path-to-regexp`
183
+
184
+ ### 3.4 Express 5 路由语法迁移
185
+
186
+ `app.get('*')` 会抛 `TypeError: Missing parameter name`:
187
+
188
+ | Express 4 | Express 5 |
189
+ | ---------------------------- | --------------------------------- |
190
+ | `app.get('*', handler)` | `app.get('/{*splat}', handler)` |
191
+ | `app.get('/:id?', handler)` | `app.get('/user{/:id}', handler)` |
192
+ | `app.get('/:id(\\d+)', ...)` | 中间件校验 `req.params.id` |
193
+ | `app.del('/x', handler)` | `app.delete('/x', handler)` |
194
+ | `res.json(obj, 200)` | `res.status(200).json(obj)` |
195
+ | `res.send(200, body)` | `res.status(200).send(body)` |
196
+
197
+ ### 3.5 验证依赖树
198
+
199
+ ```powershell
200
+ cd node-mobile-app-build\nodejs-assets\nodejs-project
201
+ npm ls express --all
202
+ npm ls path-to-regexp --all
203
+ ```
204
+
205
+ **期望(场景 B)**:
206
+
207
+ ```
208
+ express@5.2.1
209
+ └─┬ router@2.2.0
210
+ └── path-to-regexp@8.4.2
211
+ ```
212
+
213
+ 如出现 `@alloc/path-to-regexp`,说明 `package-lock.json` 里有残留 `overrides`。**彻底清理**:
214
+
215
+ ```powershell
216
+ Remove-Item -Recurse -Force node_modules, package-lock.json
217
+ npm install
218
+ ```
219
+
220
+ ### 3.6 三个常见误区
221
+
222
+ - **误区 1**:以为 `@alloc/path-to-regexp` 能解决 ESM 问题 → 它的 `exports` 也是纯 `import`,`require()` 依然失败
223
+ - **误区 2**:只改路由语法就想让 Express 5 跑 → 若 `libnode.so` 无 full-icu,加载 `path-to-regexp@8` 时仍崩
224
+ - **误区 3**:用 `overrides` 强制替换 `path-to-regexp` → 破坏依赖链,且 `package-lock.json` 会残留解析结果,删掉 `overrides` 也不生效
225
+
226
+ ---
227
+
228
+ ## 四、调试与缓存排查
229
+
230
+ ### 4.1 抓 Node.js 日志
231
+
232
+ ```powershell
233
+ $adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
234
+
235
+ # 清空
236
+ & $adb logcat -c
237
+
238
+ # 重启 App
239
+ & $adb shell am force-stop com.me.myapp
240
+ & $adb shell am start -n com.me.myapp/.MainActivity
241
+
242
+ # 抓关键日志
243
+ & $adb logcat -d | Select-String 'NODEJS-MOBILE|ReactNativeJS'
244
+ ```
245
+
246
+ **正常日志**:
247
+ ```
248
+ NODEJS-MOBILE: [node-mobile-app] server URL: http://127.0.0.1:3000
249
+ NODEJS-MOBILE: Express started on port 3000
250
+ ReactNativeJS: Node started on http://127.0.0.1:3000
251
+ ```
252
+
253
+ **失败日志**:
254
+ ```
255
+ NODEJS-MOBILE: [node-mobile-app] failed: Node 服务 5 秒内未启动 -- 请检查 ./server.js 是否调用了 listen()
256
+ ```
257
+
258
+ **崩溃日志**:
259
+
260
+ ```powershell
261
+ & $adb logcat -c
262
+ & $adb logcat | Select-String 'FATAL|AndroidRuntime|NODEJS-MOBILE'
263
+ ```
264
+
265
+ ### 4.2 手动清缓存(兜底)
266
+
267
+ **正常情况不需要**——CLI 指纹机制自动清。以下仅当指纹判断失效(如手动改过 `node-mobile-app-build/` 内文件)时用:
268
+
269
+ ```powershell
270
+ # 最彻底:删整个 RN 工程
271
+ Remove-Item -Recurse -Force D:\你的项目\node-mobile-app-build
272
+
273
+ # 或删插件 CMake 缓存
274
+ Remove-Item -Recurse -Force D:\你的项目\node_modules\nodejs-mobile-react-native\android\.cxx
275
+ Remove-Item -Recurse -Force D:\你的项目\node_modules\nodejs-mobile-react-native\android\build
276
+
277
+ # 或删指纹文件(下次跑 = 首次构建)
278
+ Remove-Item -Force D:\你的项目\node-mobile-app-build\.build-fingerprint.json
279
+ ```
280
+
281
+ 或直接:
282
+
283
+ ```powershell
284
+ npx node-mobile-app clean
285
+ ```
286
+
287
+ ### 4.3 手动端口转发(`test` 会自动做)
288
+
289
+ ```powershell
290
+ & "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" reverse tcp:8081 tcp:8081
291
+ & "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" reverse --list
292
+ ```
293
+
294
+ ### 4.4 模拟器(x86_64)
295
+
296
+ ```powershell
297
+ # 列出 AVD
298
+ & "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -list-avds
299
+
300
+ # 启动
301
+ & "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -avd Pixel_7_API_34
302
+ ```
303
+
304
+ **三个必须**:
305
+ - `mobileAppConfig.js` 的 `abiFilters` 含 `x86_64`
306
+ - `libnode/bin/x86_64/libnode.so` 存在
307
+ - 模拟器镜像是 **x86_64 架构**
308
+
309
+ ---
310
+
311
+ ## 相关文档
312
+
313
+ - [README.md](./README.md) —— 快速开始、配置字段、命令
314
+ - [自定义libnode指南.md](./自定义libnode指南.md) —— 自编译 v22 + full-icu 完整流程
315
+ - [libnode.so 预编译仓库](https://github.com/OpenFlun/nodejs-mobile)([Gitee](https://gitee.com/OpenFlun/nodejs-mobile))
package/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ ISC 许可证 (ISC License)
2
+
3
+ 版权所有 (c) 2026, flun <open@flun.top>
4
+
5
+ 特此免费授予任何获得本软件及相关文档文件(“软件”)副本的人,不受限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人这样做,但须满足以下条件:
6
+
7
+ 上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中;
8
+
9
+ 本软件按“原样”提供,不作任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证;在任何情况下,作者或版权持有人均不对因本软件或本软件的使用或其他交易而产生的任何索赔、损害或其他责任负责,无论是合同之诉、侵权之诉还是其他行为之诉;
10
+
11
+ ---
12
+
13
+ 英文原文 (English Version)
14
+
15
+ ISC License
16
+
17
+ Copyright (c) 2026, flun <open@flun.top>
18
+
19
+ Permission to use, copy, modify, and/or distribute this software for any
20
+ purpose with or without fee is hereby granted, provided that the above
21
+ copyright notice and this permission notice appear in all copies.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
26
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
27
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
28
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.