Skip to content

generateCode ​

generateCode 将 SchemaJSON 转成可落地的 Vue SFC(<template> + <script setup> + <style>),用于导出页面源码、离线预览或二次开发。

仅使用代码生成时可从 @opentiny/genui-sdk-vue/code-generator 按需引入,见 快速开始 - 按需引入。主入口 @opentiny/genui-sdk-vue 同样会再导出该能力。

基本用法 ​

ts
import { generateCode } from '@opentiny/genui-sdk-vue/code-generator';

const { panelName, panelValue, errors } = await generateCode({
  pageInfo: {
    name: 'OrderForm',
    schema: {
      componentName: 'Page',
      children: [
        {
          componentName: 'TinyButton',
          props: { text: '提交', type: 'primary' },
        },
      ],
    },
  },
  componentsMap: [
    {
      componentName: 'TinyButton',
      package: '@opentiny/vue',
      exportName: 'TinyButton',
    },
  ],
  formatWithPrettier: true,
});

if (errors.length) {
  console.error(errors);
}

console.log(panelName); // OrderForm.vue
console.log(panelValue); // Vue SFC 源码

schema 可以是对象,也可以是 JSON 字符串。解析失败或为空时,会回退为空的 Page。

generateCode() ​

  • 类型
ts
function generateCode(params: ICodeGeneratorParams): Promise<ICodeGeneratorResult>

内部等价于 new VueCodeGenerator().generate(params),默认开启编译校验。

  • 参数
参数类型必填默认值说明
pageInfo.schemaCardSchema | string是—页面 Schema
pageInfo.namestring否'SchemaCard'输出文件名(不含扩展名),结果为 {name}.vue
componentsMapIComponentMapItem[]否[]Schema 中组件名到 npm 包的映射,用于生成 import
formatWithPrettierboolean否false是否用 Prettier 格式化;失败时返回未格式化源码
  • 返回值: Promise<ICodeGeneratorResult>

ICodeGeneratorResult ​

字段类型说明
panelNamestring文件名,如 SchemaCard.vue
panelValuestringVue SFC 源码
panelType'vue'固定为 Vue
type'page'固定为页面
prettierOptsRecord<string, unknown>本次使用的 Prettier 配置
errors{ message: string }[]编译校验错误;无错误时为空数组

IComponentMapItem ​

字段类型必填说明
componentNamestring是Schema 里的组件名,需与 componentName 一致
packagestring是npm 包名,用于 from '...'
exportNamestring否包内导出名;与 componentName 不同时生成 exportName as componentName

缺少 componentName 或 package 的项会被忽略。Schema 中出现、但未出现在 componentsMap 中的组件不会生成对应 import。

可从物料协议的 npm 字段组装,例如:

ts
import { materialsMeta } from '@opentiny/genui-sdk-materials-vue-opentiny-vue/meta';

const componentsMap = materialsMeta.materials.flatMap((material) =>
  (material.data?.materials?.components ?? []).map((item) => ({
    componentName: item.component,
    package: item.npm.package,
    exportName: item.npm.exportName,
  })),
);

VueCodeGenerator ​

需要自定义 Prettier 配置,或关闭编译校验时,直接实例化生成器:

ts
import { VueCodeGenerator } from '@opentiny/genui-sdk-vue/code-generator';

const generator = new VueCodeGenerator({
  prettierOpts: { printWidth: 100, singleQuote: true },
  enableCompileValidation: false,
});

const result = await generator.generate({
  pageInfo: { schema },
  formatWithPrettier: true,
});

构造选项 IVueCodeGeneratorOptions ​

字段类型默认值说明
prettierOptsRecord<string, unknown>内置 Vue 默认项与内置配置合并后用于格式化
enableCompileValidationbooleantrue是否用 @vue/compiler-sfc 校验生成结果

生成内容 ​

生成的 SFC 会尽量还原 Schema 语义,包括:

  • 组件树对应的 <template>
  • state、methods、lifeCycles、refs 对应的 <script setup>
  • Schema css 对应的 <style>
  • 按 componentsMap 写入的组件 import

Playground 的「导出 Vue 源码」即调用该 API。