当前Pull Request已关闭, 关闭人@fanwangah
感谢提交 Pull Requests!
Thanks for submitting a pull request.


【AI-Review】【致命】【基础代码问题】【代码逻辑错误】global.css 导入路径错误导致 Metro 打包失败
● 问题:第1行 import "../../../global.css" 的相对路径多退了两级目录。index.tsx 位于 example/src/ 目录下,../../../ 从 example/src/ 出发依次退到 example/ → 仓库根 → 仓库根的父目录,最终解析为 <仓库根父目录>/global.css,该文件不存在。实际 global.css 位于 example/global.css(已通过仓库文件系统确认),从 example/src/index.tsx 引用的正确路径应为 ../global.css。metro.config.js 中 withNativeWind(config2, { input: './global.css' }) 的 input 基于 example/ 解析为 example/global.css,withCssInterop 的 resolveRequest 先调用原始 resolver 解析模块路径,再与 options.input 比对——原始 resolver 解析 ../../../global.css 时找不到文件即抛出 "Unable to resolve module" 错误,不会进入虚拟模块替换分支。
● 影响:致命。Metro bundler 无法解析该导入,打包直接失败,应用无法启动。开发执行 npm run dev(react-native bundle-harmony)或 npm start(Metro dev server)均会报模块解析错误。
● 建议:将第1行改为 import "../global.css",与 base 版本一致。base 版本(commit 3a4acd5)使用的是 import "../global.css",本次 PR 改为 ../../../global.css 属于回归。


【AI-Review】【一般】【软件设计】【其他软件设计问题】组件定义与 cssInterop/remapProps 调用放在 render 函数内部导致每次渲染重建组件
● 问题:ThirdPartyButton(第18行)、CustomizedButton(第23行 remapProps)、MyInput(第27行)、OverridenTextInput(第28行 remapProps)以及两个 cssInterop 调用(第30行 cssInterop(TextInput, ...)、第45行 cssInterop(Tester, ...))全部定义在 App() 函数体内。每次 App 渲染时,这些组件都会被重新创建为新的函数对象,React 会将其视为全新的组件类型,触发子树卸载并重新挂载。触发路径:用户点击第88-91行 "点击切换主题" Button → setColorScheme(...) → App 重新渲染 → ThirdPartyButton/CustomizedButton/MyInput/OverridenTextInput 重新创建 → React 卸载旧子树并挂载新子树 → 所有子组件内部状态丢失。
● 影响:一般。每次切换主题时,TextInput 中已输入的内容、Tester/TestCase 的内部状态全部丢失,组件被销毁重建。同时 cssInterop(TextInput, ...) 和 cssInterop(Tester, ...) 在每次渲染时重复调用,对全局组件反复注册 interop 映射,产生不必要的开销。
● 建议:将 ThirdPartyButton、CustomizedButton、MyInput、OverridenTextInput 的定义以及 cssInterop、remapProps 调用移到 App() 函数外部(模块级别),useColorScheme 和 vars 可保留在组件内或按需提取。参考 nativewind 官方文档,cssInterop 和 remapProps 应在模块级别调用一次。


【AI-Review】【一般】【软件设计】【冗余重复代码】.babelrc 与 babel.config.js 配置重复导致 nativewind babel 预设被重复应用
● 问题:新增的 example/src/.babelrc 声明 "presets": ["@react-native-ohos/nativewind/babel"],但已存在的 example/babel.config.js 已经在 presets 中包含了 '@react-native-ohos/nativewind/babel'。Babel 7 中 babel.config.js 是项目级配置(应用于所有文件),.babelrc 是目录级相对配置(应用于该目录及子目录的文件),两者对 example/src/ 下的文件会合并生效——presets 数组会被拼接,最终对 example/src/index.tsx 的 @react-native-ohos/nativewind/babel 预设被应用两次。
● 影响:一般。nativewind babel 预设(实际指向 react-native-css-interop/babel,即 babel-plugin.ts)的 Program visitor 会在每次应用时遍历 AST 并尝试插入 createInteropElement 导入,重复应用可能导致多余的 AST 遍历开销,并增加构建行为的不确定性。同时两处配置维护负担增加,后续修改易遗漏其中一处。
● 建议:删除 example/src/.babelrc 文件。example/babel.config.js 已完整配置了 module:@react-native/babel-preset、@react-native-ohos/nativewind/babel 预设和 react-native-reanimated/plugin 插件,无需额外的 .babelrc。


【AI-Review】【一般】【基础代码问题】【代码逻辑错误】使用 React.ReactNode 类型未导入 React 命名空间
● 问题:第15行 children?: React.ReactNode; 引用了 React 命名空间,但本文件 import 部分(第1-4行)未导入 React。example/tsconfig.json extends @react-native/typescript-config(基于 @tsconfig/react-native,strict: true,未设置 allowUmdGlobalAccess)。@types/react 通过 export as namespace React 声明 UMD 全局,在模块文件(含 import/export 的文件)中 UMD 全局不会自动可用,TypeScript 报 TS2686:"'React' refers to a UMD global, but the current file is a module."。jsx: "react-native" 仅免除 JSX 对 React 的作用域要求,不影响类型注解中的命名空间引用。本仓库 example/src/ 目录下也无其他文件采用 "使用 React. 但不导入" 的写法。
● 影响:一般。TypeScript 类型检查报错,IDE 标红,tsc --noEmit 失败。Metro 打包使用 Babel 转译会忽略类型错误不影响运行,但类型检查流程被破坏。
● 建议:在第1-4行的 import 区域添加 import React from 'react';,或将类型改为 import('react').ReactNode,或直接 import { ReactNode } from 'react' 后使用 ReactNode。


【AI-Review】【一般】【基础代码问题】【代码逻辑错误】MyInput 的 props 参数缺少类型标注触发隐式 any
● 问题:第27行 const MyInput = (props) => <TextInput {...props} />; 中 props 参数未声明类型。example/tsconfig.json extends @react-native/typescript-config,其 strict: true 启用 noImplicitAny,未标注类型的参数会被推断为 any 并报 TS7066:"'props' implicitly has an 'any' type."。同一文件中 ThirdPartyButton(第18行)已为 props 定义了 ThirdPartyButtonProps 类型,MyInput 未保持一致。
● 影响:一般。TypeScript 类型检查报错 TS7066,tsc --noEmit 失败。
● 建议:为 MyInput 的 props 添加类型标注,例如 const MyInput = (props: TextInputProps) => <TextInput {...props} />;(需从 'react-native' 导入 TextInputProps),或至少标注为 React.ComponentProps<typeof TextInput>。


【AI-Review】【严重】【业务功能】【功能实现错误】删除 INTERNET 权限导致 Metro 开发服务器连接失败
● 问题:本 PR 删除了 requestPermissions 中的 ohos.permission.INTERNET 权限(原第18-22行)。但 example/harmony/entry/src/main/ets/pages/Index.ets 的 RNApp 配置中,jsBundleProvider 使用 AnyJSBundleProvider 按顺序尝试多个 provider,第一个就是 new MetroJSBundleProvider()。MetroJSBundleProvider 通过 HTTP 连接本地 Metro dev server(localhost:8081)拉取 JS bundle。HarmonyOS 中任何 TCP/HTTP 网络访问(包括 localhost 回环连接)均要求声明 ohos.permission.INTERNET,否则 socket 创建失败。
● 影响:严重。开发执行 npm start(scripts 中定义为 hdc rport tcp:8081 tcp:8081 && react-native start)启动 Metro dev server 后,应用启动时 MetroJSBundleProvider 因缺少 INTERNET 权限无法连接 localhost:8081,JS bundle 加载失败。虽然 AnyJSBundleProvider 会回退到 FileJSBundleProvider 和 ResourceJSBundleProvider,但这要求设备上已存在预打包的 bundle.harmony.js,Metro 的热重载开发流程被破坏。
● 建议:恢复 requestPermissions 中的 ohos.permission.INTERNET 权限声明。如确实需要在某些场景移除,应同步移除 Index.ets 中的 MetroJSBundleProvider 并确保打包流程始终生成 bundle.harmony.js。


已审视,无问题


fix: 修改nativewind三方库77分支AI文档质量扫描整改