codegen

codegen

熱門

json-render 的程式碼生成工具。用於從 UI 規格生成程式碼、建立自訂程式碼匯出器、遍歷規格,或為 @json-render/codegen 序列化 props。

1.6萬星標
850分支
更新於 2026/7/8
SKILL.md
唯讀
名稱
codegen
描述

json-render 的程式碼生成工具。用於從 UI 規格生成程式碼、建立自訂程式碼匯出器、遍歷規格,或為 @json-render/codegen 序列化 props。

@json-render/codegen

與框架無關的工具,用於從 json-render UI 樹生成程式碼。可用來建立 Next.js、Remix 或其他框架的自訂程式碼匯出器。

安裝

npm install @json-render/codegen

樹狀遍歷

import {
  traverseSpec,
  collectUsedComponents,
  collectStatePaths,
  collectActions,
} from "@json-render/codegen";

// 深度優先走訪規格
traverseSpec(spec, (element, key, depth, parent) => {
  console.log(`${" ".repeat(depth * 2)}${key}: ${element.type}`);
});

// 取得所有使用的元件類型
const components = collectUsedComponents(spec);
// Set { "Card", "Metric", "Button" }

// 取得所有被引用的狀態路徑
const statePaths = collectStatePaths(spec);
// Set { "analytics/revenue", "user/name" }

// 取得所有動作名稱
const actions = collectActions(spec);
// Set { "submit_form", "refresh_data" }

序列化

import {
  serializePropValue,
  serializeProps,
  escapeString,
  type SerializeOptions,
} from "@json-render/codegen";

// 序列化單一值
serializePropValue("hello");
// { value: '"hello"', needsBraces: false }

serializePropValue({ $state: "/user/name" });
// { value: '{ $state: "/user/name" }', needsBraces: true }

// 序列化 JSX 的 props
serializeProps({ title: "Dashboard", columns: 3, disabled: true });
// 'title="Dashboard" columns={3} disabled'

// 跳脫字串中的特殊字元
escapeString('hello "world"');
// 'hello \"world\"'

SerializeOptions

interface SerializeOptions {
  quotes?: "single" | "double";
  indent?: number;
}

型別

import type { GeneratedFile, CodeGenerator } from "@json-render/codegen";

const myGenerator: CodeGenerator = {
  generate(spec) {
    return [
      { path: "package.json", content: "..." },
      { path: "app/page.tsx", content: "..." },
    ];
  },
};

建立自訂生成器

import {
  collectUsedComponents,
  collectStatePaths,
  traverseSpec,
  serializeProps,
  type GeneratedFile,
} from "@json-render/codegen";
import type { Spec } from "@json-render/core";

export function generateNextJSProject(spec: Spec): GeneratedFile[] {
  const files: GeneratedFile[] = [];
  const components = collectUsedComponents(spec);
  // 產生 package.json、元件檔案、主頁面...
  return files;
}