react19-build.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const path = require('path');
  4. const glob = require('glob');
  5. /**
  6. * React 19 构建脚本
  7. * 用于将 React 18 兼容的代码转换为 React 19 兼容的代码
  8. */
  9. const REACT_18_START = /\/\* REACT_18_START \*\/([\s\S]*?)\/\* REACT_18_END \*\//g;
  10. const REACT_19_START = /\/\* REACT_19_START \*\/([\s\S]*?)\/\* REACT_19_END \*\//g;
  11. function processReact19Code(content) {
  12. // 移除 React 18 的代码块
  13. content = content.replace(REACT_18_START, '');
  14. // 启用 React 19 的代码块(移除注释标记和注释符号)
  15. content = content.replace(REACT_19_START, (match, codeBlock) => {
  16. // 移除每行开头的 // (注意处理缩进)
  17. return codeBlock.replace(/^(\s*)\/\/ /gm, '$1').trim();
  18. });
  19. return content;
  20. }
  21. function processReact18Code(content) {
  22. // 移除 React 19 的代码块
  23. content = content.replace(REACT_19_START, '');
  24. // 启用 React 18 的代码块(仅移除标记)
  25. content = content.replace(REACT_18_START, (match, codeBlock) => {
  26. return codeBlock.trim();
  27. });
  28. return content;
  29. }
  30. function removePropTypes(content) {
  31. // 移除 PropTypes 导入
  32. content = content.replace(/import PropTypes from 'prop-types';\n?/g, '');
  33. content = content.replace(/import.*PropTypes.*from.*;\n?/g, '');
  34. // 移除 propTypes 静态属性
  35. content = content.replace(/static propTypes = \{[\s\S]*?\};\n?/g, '');
  36. // 移除 propTypes 赋值
  37. content = content.replace(/\.propTypes = \{[\s\S]*?\};\n?/g, '');
  38. return content;
  39. }
  40. function removeFindDOMNode(content) {
  41. // 移除 findDOMNode 导入
  42. content = content.replace(/import.*findDOMNode.*from 'react-dom';\n?/g, '');
  43. content = content.replace(/, findDOMNode/g, '');
  44. content = content.replace(/findDOMNode,?\s*/g, '');
  45. // 注意:不直接替换 findDOMNode 的使用,因为需要根据具体情况处理
  46. // 这部分需要通过条件编译标记来处理
  47. return content;
  48. }
  49. function buildForReact19() {
  50. const sourcePattern = 'packages/semi-ui/**/*.{ts,tsx}';
  51. const outputDir = 'packages/semi-ui-for-react19';
  52. // 确保输出目录存在
  53. if (!fs.existsSync(outputDir)) {
  54. fs.mkdirSync(outputDir, { recursive: true });
  55. }
  56. const files = glob.sync(sourcePattern);
  57. files.forEach(filePath => {
  58. const content = fs.readFileSync(filePath, 'utf8');
  59. // 处理 React 19 兼容性
  60. let processedContent = processReact19Code(content);
  61. // 移除 PropTypes
  62. processedContent = removePropTypes(processedContent);
  63. // 移除 findDOMNode
  64. processedContent = removeFindDOMNode(processedContent);
  65. // 计算输出路径
  66. const relativePath = path.relative('packages/semi-ui', filePath);
  67. const outputPath = path.join(outputDir, relativePath);
  68. // 确保输出目录存在
  69. const outputDirPath = path.dirname(outputPath);
  70. if (!fs.existsSync(outputDirPath)) {
  71. fs.mkdirSync(outputDirPath, { recursive: true });
  72. }
  73. // 写入处理后的文件
  74. fs.writeFileSync(outputPath, processedContent);
  75. });
  76. console.log(`✅ React 19 版本构建完成,输出目录: ${outputDir}`);
  77. }
  78. function buildForReact18() {
  79. const sourcePattern = 'packages/semi-ui/**/*.{ts,tsx}';
  80. const files = glob.sync(sourcePattern);
  81. files.forEach(filePath => {
  82. const content = fs.readFileSync(filePath, 'utf8');
  83. // 处理 React 18 兼容性(保持当前状态)
  84. const processedContent = processReact18Code(content);
  85. // 直接覆盖原文件(或者你可以选择输出到其他目录)
  86. fs.writeFileSync(filePath, processedContent);
  87. });
  88. console.log('✅ React 18 版本构建完成');
  89. }
  90. // 命令行参数处理
  91. const args = process.argv.slice(2);
  92. const version = args[0];
  93. if (version === '19') {
  94. buildForReact19();
  95. } else if (version === '18') {
  96. buildForReact18();
  97. } else {
  98. console.log('用法: node scripts/react19-build.js [18|19]');
  99. console.log(' 18: 构建 React 18 兼容版本');
  100. console.log(' 19: 构建 React 19 兼容版本到 packages/semi-ui-for-react19');
  101. }