vue 中以 define 开头的 api(如 defineprops、defineemits、defineexpose)是编译器宏,仅在 顶层有效,由编译器在构建阶段转换为等效 js 代码,非运行时函数,无需导入。

什么是编译器 API
Vue 中以 define 开头的 API(如 defineProps、defineEmits、defineExpose 等)统称为“编译器宏”(Compiler Macros)。它们不是运行时函数,也不需要手动导入,而是由 Vue 编译器在构建阶段识别并转换为等效的 JavaScript 代码。只在 <script setup></script> 语法中有效,是专为简化组件声明而设计的语法糖。
核心编译器宏及用法
defineProps:声明组件接收的 props,支持运行时校验与 TypeScript 类型推导。
- JS 项目中可传入对象配置,设置
type、required、default和validator - TS 项目推荐配合
withDefaults使用接口定义,兼顾类型安全与默认值 - 注意:props 是只读响应式对象,直接赋值会触发警告;解构需用
toRefs保持响应性
defineEmits:显式声明组件对外抛出的事件,支持参数校验和类型约束。
- 运行时写法用对象形式定义事件名与校验函数
- TS 写法使用函数重载签名,如
defineEmits() - 调用
emit('xxx')前必须在此声明,否则开发环境下会发出警告
defineExpose:控制子组件向父组件暴露的属性和方法。
- 默认情况下,
<script setup></script>中的变量和函数不会被父组件通过ref访问 - 需显式调用
defineExpose({ methodA, dataB })才能暴露指定内容 - 常用于子组件提供操作入口,如表单的
validate()或弹窗的open()
使用限制与注意事项
这些 API 只能在 <script setup></script> 的顶层作用域中使用,不能出现在条件语句、循环或函数内部。
- 无法动态生成,例如不能写
if (cond) defineProps(...) - 不支持在普通
<script></script>或 Options API 中使用 - 服务端渲染(SSR)场景下,它们仍会被正确解析和处理,无需额外适配
- 构建工具(如 Vite、Vue CLI)已内置支持,无需额外插件
与其他 API 的关系
编译器宏与组合式 API 协作紧密,但职责分明:
-
ref、reactive、watch等属于运行时响应式 API,在 setup 函数内执行 -
defineProps等则在编译期介入,生成 props 解析逻辑和类型检查代码 - 它们共同构成
<script setup></script>的完整能力,缺一不可
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










