# rn-code-shift-tool **Repository Path**: harmonytsc_rn/rn-code-shift-toolrn-code-shift-tool ## Basic Information - **Project Name**: rn-code-shift-tool - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-15 - **Last Updated**: 2026-01-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RnCodeShiftTool #### 介绍 RN组件扫描工具; 通过扫描js/ts等文件的抽象语法树,按照期望的方式对代码进行自动化重构 #### 软件架构 ```` |---- rn-code-shift-tool |---- scripts # 存放代码转化脚本的文件夹 |---- done # 脚本入口 |---- codeShift # 替换本地代码的脚本入口 |---- codeShiftRemote # 替换本地node_modules的脚本 |---- local # 替换本地代码的脚本 |---- remote # 替换本地node_modules |---- utils # 工具文件夹 |---- scriptsExample # 存放代码转化脚本的文件夹的示例说明 |---- animated_shift.js # 用于在Animated部分方法中增加默认属性的脚本 |---- import_shift.js # 用于变更导入路径的脚本 |---- rename_shift.js # 用于变更属性名字的脚本 |---- remove_shift.js # 用于对于removeListener进行替换 |---- rename_files.js # 用于对文件名称替换 |---- logger # 存放日志文件夹 |---- package.json # 工程配置文件 |---- README.md # 安装使用方法 |---- LICENSE # 许可证声明 ```` #### 安装教程 1. 需要电脑安装node环境 #### 使用说明 1. 执行**npm install**,用于安装本工具相关依赖 2. 修改工程文件scripts/done/codeShift.js文件中 **localProjectList(可多个文件夹同时执行)** 的 **source**(本地代码存放位置) 3. 修改工程文件scripts/done/codeShift.js文件中 **localProjectList(可多个文件夹同时执行)** 的 **target**(转化结束后本地代码保存位置) 4. 根据需求可修改工程文件scripts/done/codeShiftRemote.js文件中的 **remoteDir**(转换脚本的node_modules下的依赖项) 5. 在到工程根目录下,执行命令 **npm run codeShift**(执行所有依赖替换) 6. 在到工程根目录下,执行命令 **npm run codeShift:local**(执行scripts/local的脚本) 7. 在到工程根目录下,执行命令 **npm run codeShift:remote**(执行scripts/remote的脚本) #### scriptsExample(脚本示例类型说明) 注:可根据自己的需求将example复制到 **script/local** || **script/remote** 文件夹下进行修改 ##### remove_shift.js使用说明 将`Keyboard.addListener(’eventName‘,’callback‘)`和`Keyboard.removeListener(’eventName‘,’callback‘)` 转化为`xxx = Keyboard.addListener(’eventName‘,’callback‘)`和`xxx.remove()` 可以对下列常量量进行初始化 - `objectName` :改造对象名,这里是 Keyboard; - `addPropertyName`:改造对象的属性名, 需要添加`返回值 = `; - `removePropertyName`: 改造对象的属性名,需要改造为 `返回值.remove()`形式; - `importDefault`: `返回值`的变量类型,需要判断是否要需要导入; - `importSource`: `返回值`变量类型的导入路径; - `baseName`:`返回值`变量的基础名,未了确保唯一性,使用`baseName_eventName_hash`。 - **修改位置展示** ![文件展示](readme_png/addlistener.png) - **输入文件展示** ![文件展示](readme_png/addlistener_input.png) - **输出结果展示** ![文件展示](readme_png/addlistener_output.png) 备注: 可以复制该脚本到当前目录下,修改对应的常量的初始化值作为新的脚本 ##### animated_shift.js使用说明 在指定的`Animated`的API接口中添加默认属性`useNativeDriver = false`, 需要在白名单中,添加需要修改的API,如`timing`、 `spring`、 `decay`。 - **白名单添加位置展示** ![文件展示](readme_png/animated.png) - **输入文件展示** ![文件展示](readme_png/animated_input.png) - **输出结果展示** ![文件展示](readme_png/animated_output.png) ##### import_shift.js使用说明 在导入文件中,将`xxx`的导入路径从`A`变成`B`, 这里将`ViewPropTypes`从`react-native`导入变更到 从`deprecated-react-native-prop-types`中导入。 - **导入路径修改位置展示** ![文件展示](readme_png/import.png) - **输入文件展示** ![文件展示](readme_png/import_input.png) - **输出结果展示** ![文件展示](readme_png/import_output.png) ##### rename_shift.js使用说明 找到所有的标识符并匹配名称为 `A` 的标识符替换为`B`. 这里找到所有的标识符并匹配名称为 `currentFocusField` 的标识符替换为`currentlyFocusedInput`。 - **标志符替换修改位置展示** ![文件展示](readme_png/rename.png) - **输入文件展示** ![文件展示](readme_png/rename_input.png) - **输出结果展示** ![文件展示](readme_png/rename_output.png) ##### rename_files.js使用说明 找到所有的文件并匹配名称包含 `*.keyword.*` 的文件名替换为`*.*`. 这里找到所有的文件名并匹配名称为 `*.android.*` 的文件名替换为`*.*`。 - **标志符替换修改位置展示** ![文件展示](readme_png/rename_files.jpg) - **输入文件展示** ![文件展示](readme_png/rename_input_files.jpg) - **输出结果展示** ![文件展示](readme_png/rename_output_files.jpg) ##### 脚本命令 脚本使用需要在根目录的package.json中配置: ``` "scripts": { ... "codeShift":"npm run codeShift:local && npm run codeShift:remote", // 执行所有 "codeShift:local": "node ./scripts/done/codeShift", // 执行本地依赖替换 "codeShift:remote": "node ./scripts/done/codeShiftRemote" // 执行远程依赖替换 ... }, ``` ##### 日志输出 日志输出位置为: [根目录]/[日期]/脚本名-时间.log ##### 本地依赖说明 须在scripts/done/codeShift.js 对子工程做定制化处理 ``` const localProjectList = [ { source:"src", // 本地主工程源码目录 target:"target", // 本地主工程变更目录 }, { source: "projects/bell/src", // 本地子工程源码目录 target: "projects/bell/target", // 本地子工程变更目录 }, ]; ``` ## 贡献代码 使用过程中发现任何问题都可以提 [Issue](https://gitee.com/wu_xujie/rn-code-shift-tool/issues) 给我们,当然,我们也非常欢迎你给我们发 [PR](https://gitee.com/wu_xujie/rn-code-shift-tool/pulls) 。 ## 开源协议 本项目基于 [Apache-2.0](https://gitee.com/wu_xujie/rn-code-shift-tool/master/LICENSE) ,请自由地享受和参与开源。 ## 更新日志 ### 2025-08-08 - **feat**: `import_core` 模块新增功能,支持兼容 `require` 写法的替换。 - **影响范围**: 下列通过 `require` 导入的模块将被替换为对应的三方库的 `import` 写法: ```javascript const { ART, AsyncStorage, CheckBox, DatePickerAndroid, DatePickerIOS, MaskedViewIOS, ProgressBarAndroid, ProgressViewIOS, SegmentedControlIOS, Slider, TimePickerAndroid, WebView, NetInfo, ViewPagerAndroid } = require('react-native'); const { PropsType } = require('react-native/ReactCommon/hermes/inspector/tools/msggen/src/Type'); ``` 替换为: ```javascript import ART from '@react-native-community/art'; import AsyncStorage from '@react-native-async-storage/async-storage'; import CheckBox from '@react-native-community/checkbox'; import DatePickerAndroid from '@react-native-community/datetimepicker'; import DatePickerIOS from '@react-native-community/datetimepicker'; import MaskedViewIOS from '@react-native-masked-view/masked-view'; import ProgressBarAndroid from '@react-native-community/progress-bar-android'; import ProgressViewIOS from '@react-native-community/progress-view'; import SegmentedControlIOS from '@react-native-segmented-control/segmented-control'; import Slider from 'react-native-slider'; import TimePickerAndroid from '@react-native-community/datetimepicker'; import WebView from 'react-native-webview'; import NetInfo from '@react-native-community/netinfo'; import ViewPagerAndroid from 'react-native-pager-view'; import PropsType from 'prop-types'; ``` ### 2025-08-12 - **feat**: 添加 `replece_android_to_harmony` 脚本的黑名单配置。 - **屏蔽的包名**: ```javascript [ "1016199", "1014696", "1021708" ] ``` - **屏蔽的路径**: ```javascript "src/migration/components/body/sleepProfileBody.js" ``` - **影响范围**: 如果文件路径匹配上述路径(包名+路径),则不会执行 `replece_android_to_harmony.js` 脚本。 ### 2025-08-13 - **feat**: 添加 `require("NativeModules").ReactLocalization` 替换成 `import localization from 'react-native-localization'` 的脚本 - **影响范围**: 下列通过 `require` 导入的模块将被替换为对应的三方库的 `import` 写法: ```javascript var localization = require('NativeModules').ReactLocalization; var localization = require("react-native/Libraries/BatchedBridge/NativeModules").ReactLocalization; ``` 替换为: ```javascript import localization from 'react-native-localization'; ``` ### 2025-08-14 - **feat**: 添加 `replece_android_to_harmony_special` 脚本(该脚本只有配置白名单才会执行) - **白名单包名**: ```javascript [ "1002831", ] ``` - **白名单路径**: ```javascript "Main/utils/DeviceUtil.js" ``` - **影响范围**: 如果文件路径匹配上述路径(包名+路径),才会执行 `replece_android_to_harmony_special.js` 脚本。 ### 2025-08-22 - **feat**: 添加 `ios-to-harmony-converter` 脚本(该脚本只有配置白名单才会执行) - **白名单包名**: ```javascript [ "1004616", ] ``` - **白名单路径**: ```javascript "Main/kit/IphoneXHelper.js" ``` - **影响范围**: 如果文件路径匹配上述路径(包名+路径),才会执行 `ios-to-harmony-converter.js` 脚本。 - **替换内容**: (Platform.OS === 'ios' && !Platform.isPad && !Platform.isTVOS && Host.isIphoneXSeries) 替换成 Platform.OS === 'harmony' && !Platform.isPad && !Platform.isTVOS - **feat**: 添加 `replece_android_to_harmony` 脚本的黑名单配置。 - **屏蔽的包名**: ```javascript [ "1016199", "1014696", "1021708", "1022121", "1019849", "1014539", "1020025", "1014951", "1008594", "1008210", "1003214", "1011626", "1022969", "1019868", "1012146" ] ``` - **屏蔽的路径**: ```javascript [ path.join("src", "migration", "components", "body", "sleepProfileBody.js"), path.join("src", "components", "TimeTemperatureRange.js"), path.join("fix", "aircondition", "TimeTemperatureRange.js"), ] ``` - **影响范围**: 如果文件路径匹配上述路径(包名+路径),则不会执行 `replece_android_to_harmony.js` 脚本。