用途:该技能用于在 Expo/React Native 应用的本地模块中安全地编写 New Architecture 原生代码,覆盖 iOS 的 Swift 与 Android 的 Kotlin。它强调原生代码只放在 modules/<name>/ 下,不写入内联模块,也不修改生成的 ios/ 与 android/ 目录,不使用 RCT_EXPORT_MODULE、ReactContextBaseJavaModule、@ReactMethod 等旧桥接代码。
主要能力:按顺序选择方案——先用 Expo SDK 包,其次用兼容 New Architecture 的原生库,再次用配置插件,最后才用 npx create-expo-module@latest --local 创建本地模块。模块需在 expo-module.config.json 中声明各平台与所有 Module 类,podspec 依赖 ExpoModulesCore,Gradle 应用 expo-module-gradle-plugin;模块名需在 Swift 与 Kotlin 中显式且一致。绑定只允许出现在适配器 src/services/<concern>/native-<concern>-adapter.ts 中,使用 requireOptionalNativeModule 在工厂默认参数里懒加载,缺失时返回带类型的不可用失败;绑定类型逐项列出原生函数、属性和事件,平台缺失成员标为可选并映射为 unsupported。定义保持轻薄,调用不导入 Expo 类型的普通辅助函数;UI 工作通过 AsyncFunction(...).runOnQueue(.main) 执行;事件在 OnStartObserving 开启、OnStopObserving 与 OnDestroy 停止。仅在共享 C++ 或发布需求下使用 Turbo Module,作为本地包配置 codegenConfig 与 Native<Name>.ts 规范。第三方原生库若无 expo-module.config.json、codegenConfig 或 Nitro 标记,需在 contracts/native-libraries.json 记录架构、保留或替换、原因、证据与复查日期。expo-doctor 的 React Native Directory 检查必须保持开启。
使用方式:从应用根目录运行 EXPO_NONINTERACTIVE=1 npx create-expo-module@latest --local <name> --name <Pascal> --platform apple android --features Function AsyncFunction Event 创建模块,删除其 src/ 文件夹,参照 templates/modules/time-change/ 组织配置、podspec、Gradle 文件与各平台轻薄 Module 类。按模板编写 port、fake(先写测试)、适配器及其测试,并按 examples/wiring-the-port.md 完成接线。随后运行 node ${CLAUDE_SKILL_DIR}/scripts/check-native-modules.mjs . 与 node ${CLAUDE_SKILL_DIR}/scripts/check-native-libraries.mjs .,修复所有 FAIL 行并重跑直到输出 RESULT: PASS;同时运行 npm test、npx expo-modules-autolinking resolve --platform apple --json 与 --platform android、Swift 类型检查、Kotlin 辅助编译,并在指定 iOS 模拟器与 Android 模拟器上用 dev client 验证每个成员。
适用场景:需要在 Expo 应用中添加 Swift 或 Kotlin、创建本地模块或 Turbo 模块、使用 codegen、检查原生库的 New Architecture 兼容性时使用。
限制:新增原生模块、以 Turbo Module 替代 Expo 模块、保留 interop 库、添加 expo-doctor 排除项或 nativeSourceDirs 条目之前必须先询问开发者。Fast Refresh 与 OTA 更新不携带原生代码,原生改动需要新二进制。Jest 只能证明映射,必须在设备上验证系统事件。该技能未提供收费标准、平台版本范围或性能数据等事实。