你的 Vue 3 <script setup>,VuReact 会编译成完整的 React 组件

VuReact 是一个能将 Vue 3 代码编译为标准、可维护 React 代码的工具。今天我们不讲某个 API 的映射,而是从宏观层面看:Vue 的 <script setup> 如何被编译成一个完整的 React 组件。

前置约定

为避免示例冗长,本文聚焦于 <script setup> 的整体编译结果和结构变化:

  1. <script setup> 本身是一个编译宏,不会在运行时保留;
  2. 其内部顶层代码会被提炼为 React 组件函数体;
  3. Vue 模板最终会被转成 JSX 的 return 语句。

编译对照

JavaScript:<script setup> 到 React 组件函数

  • Vue 代码:
html 复制代码
<script setup>
const props = defineProps({
  title: String,
  count: Number,
});

const emit = defineEmits(['update']);

const handleClick = () => {
  emit('update', props.count + 1);
};
</script>

<template>
  <button @click="handleClick">
    {{ props.title }} - {{ props.count }}
  </button>
</template>
  • VuReact 编译后 React 代码:
jsx 复制代码
const Comp = memo((props) => {
  const handleClick = useCallback(() => {
    props.onUpdate?.(props.count + 1);
  }, [props.onUpdate, props.count]);

  return (
    <button onClick={handleClick}>
      {props.title} - {props.count}
    </button>
  );
});

export default Comp;

这段转换显示了 <script setup> 的核心编译思路:

  • 非纯 UI 组件会被 memo 包裹以进行性能优化。
  • defineProps 不是运行时调用,而是被编译为组件的 props 参数;
  • defineEmits 被编译为 props.onXxx 的事件回调;
  • 你在 script setup 中编写的大多数代码,直接成为组件内部的函数;
  • 对 script 代码进行编译时静态优化;
  • Vue 模板被编译为 return (...) 中的 JSX。

TypeScript:带类型的 <script setup> 整体编译

  • Vue 代码:
html 复制代码
<script setup lang="ts">
const props = defineProps<{
  title: string;
  count: number;
}>();

const emit = defineEmits<{
  (e: 'update', value: number): void;
}>();

const handleClick = () => {
  emit('update', props.count + 1);
};
</script>

<template>
  <button @click="handleClick">
    {{ props.title }} - {{ props.count }}
  </button>
</template>
  • VuReact 编译后 React 代码:
tsx 复制代码
type ICompProps = {
  title: string;
  count: number;
  onUpdate?: (value: number) => void;
};

const Comp = memo((props: ICompProps) => {
  const handleClick = useCallback(() => {
    props.onUpdate?.(props.count + 1);
  }, [props.onUpdate, props.count]);

  return (
    <button onClick={handleClick}>
      {props.title} - {props.count}
    </button>
  );
});

这说明:

  • <script setup lang="ts"> 中的类型信息会被保留并转换为组件 props 类型;
  • defineProps 的类型参数最终用在 React props 类型定义上;
  • defineEmits 的事件类型会映射成 onUpdate 的回调类型。

在 TypeScript 环境下,VuReact 也支持将 definePropsdefineEmits 的 JavaScript 运行时参数写法,编译为对应的 TS 类型信息。

  • Vue 代码:
ts 复制代码
const props = defineProps({
  title: String,
  count: Number,
});

const emit = defineEmits(['update']);
  • VuReact 编译后 React 代码:
tsx 复制代码
type ICompProps = {
  title: string;
  count: number;
  onUpdate?: () => any;
};

相关资源


如果你觉得本文对你理解 VuReact 有帮助,欢迎点赞、收藏、关注!

相关推荐
Loveyourself14 小时前
cc压缩机制之-toolResultBudget源码解读
面试
飘尘14 小时前
一文讲清楚前端面试会问到的所有缓存
前端·javascript·面试
windliang16 小时前
Claude Code 源码分析(五):一次 Tool 调用怎样通过权限检查
前端·人工智能·面试
张元清16 小时前
React useDisclosure Hook:管理模态框和抽屉的打开关闭状态 (2026)
javascript·react.js
学高数就犯困17 小时前
React:常见的性能优化手段
前端·react.js
天天码行空17 小时前
vkeyboardhand:零依赖虚拟键盘指法组件
前端·javascript·vue.js
濮水大叔17 小时前
为什么 AI 最擅长 React/Next.js,却很少看到真正好用的 Next.js 开源项目?
react.js·node.js·next.js
我要两颗404西柚17 小时前
Stage four:VUE项目上线
前端·javascript·vue.js
Cloud_bread19 小时前
从ReAct到自主闭环:Agentic Coding核心执行引擎的技术演进
前端·react.js·前端框架
鹿角片ljp20 小时前
Redis 深度复习:从入门到面试通关
数据库·redis·面试