@ttsc/metro

@ttsc/metropackages/metro)是 React Native / Expo 的 Metro transformer,在每个 TypeScript 文件上跑 ttsc 插件(typia、nestia 等),再把结果交给现有的 Expo/React-Native Babel transformer。

为什么 RN/Expo 需要单独适配

React Native 与 Expo 用 Metro 打包,Metro 用 Babel(babel-preset-expo / @react-native/metro-babel-transformer)转每个文件。Babel 剥 TypeScript 类型、从不跑 TypeScript transformer,所以 ttsc CLI 与 @ttsc/unplugin 都够不着 RN/Expo 构建(README,packages/metro/README.md)。@ttsc/metro 接一个 Metro 自定义 transformer,在每个 TS 文件上跑 ttsc 插件 pass,再交给现有 Babel transformer。

用法:withTtsc 包裹

// metro.config.js (Expo, CommonJS — metro.config.js 的标准)
const { getDefaultConfig } = require("expo/metro-config");
const { withTtsc } = require("@ttsc/metro");
module.exports = withTtsc(getDefaultConfig(__dirname));

withTtsctransformer.babelTransformerPath,其余 config 不动。它自动探测要委托的上游 transformer:先 @expo/metro-config/babel-transformer(Expo),再 @react-native/metro-babel-transformer,再 legacy metro-react-native-babel-transformer。bare RN 换成从 @react-native/metro-configgetDefaultConfig

配置

默认 @ttsc/metro 从被转换文件向上找最近 tsconfig.json、跑那里配置的插件(标准 ttsc 模型)。选项是第二参数,镜像 @ttsc/unplugin,外加几个 Metro 特定旋钮。

与 serve 常驻宿主的关系

Metro 是 worker pool 模型——多个 worker 进程并行转文件。这正是 增量 Session 提到的 utility serve 常驻宿主的目标消费者:每个 worker 复用一个热宿主而非每文件重编译。不过跨独立 worker 进程共享一个宿主仍在 issue samchon/ttsc#255 跟踪中(utility/serve.go:54 注释)。

@ttsc/metro 当前用 TtscService(建在 serve 之上)做 per-file transform。README 提到 v1 caveats。

不变量

  • ttsc 插件 pass 在 Babel 之前跑(Babel 会剥类型,必须先转)。
  • withTtsc 只改 babelTransformerPath,其余 config 保持。
  • 自动探测上游 transformer,按 Expo → RN → legacy 顺序。

维护者提示

  • 改委托探测顺序时记住 Expo 优先(@expo/metro-config/babel-transformer)。
  • 跨 worker 共享宿主是已知限制(#255),别假设单宿主语义。

接下来