Skip to content

[功能建议] 自定义宏支持字符串、数字值及对应的 TypeScript 类型 #300

Description

@orchid-world

Use Case

我正在使用 Cocos Creator 3.8.8 开发需要发布到多个渠道的项目,希望通过编译期宏保存以下信息:

  • 构建环境,例如 "development""production"
  • 构建版本号,例如 1001
  • API 版本或数值类型的功能阈值

这些值在编译时已经确定。希望它们可以像现有布尔宏一样从 cc/userland/macro 导入,并参与编译器的常量折叠和无效分支裁剪。

相比运行时 JSON 配置,编译期宏可以提供静态类型检查,也能避免把其他渠道或环境的无效代码打入最终产物。

Problem Description

当前自定义宏的配置入口主要以布尔开关的形式工作,无法明确选择和维护 stringnumber 类型的值。

即使尝试直接修改 settings/v2/packages/engine.json,也缺少公开、稳定的类型约定,无法确认以下行为是否受到正式支持:

  1. 字符串和数字能否被正确生成到 cc/userland/macro
  2. 生成的 TypeScript 声明是否保留正确类型。
  3. 编辑器预览与正式构建的值是否一致。
  4. 字符串转义、负数和小数是否能够稳定处理。
  5. 编辑器重新保存设置后,手动填写的值是否会被覆盖或转换。

因此,目前只能额外维护运行时配置或自行编写扩展,既重复了宏系统的功能,也无法获得统一的编译期优化行为。

Proposed Solution

希望自定义宏正式支持以下基础类型:

  • boolean
  • string
  • 有限的 number

建议在项目设置的自定义宏列表中,为每一项增加类型选择器,并根据类型显示对应的输入控件。

同时希望:

  1. 字符串能够被安全转义和序列化。
  2. 数字支持整数、负数和小数,并拒绝 NaNInfinity
  3. 生成的 JavaScript 保留原始值类型。
  4. 生成的 TypeScript 声明至少包含对应的基础类型。
  5. 如果构建流程允许,TypeScript 声明可以进一步保留字面量类型。
  6. 编辑器预览与所有构建平台使用一致的宏值。
  7. 继续兼容现有布尔类型自定义宏。
  8. 重复名称或无效值能够显示明确的校验提示。

How it works

配置形式可以显式保存类型,也可以根据 JSON 值推断类型。以下结构仅用于说明期望行为:

{
  "macroCustom": [
    {
      "key": "GAME_CHANNEL",
      "type": "string",
      "value": "wechat"
    },
    {
      "key": "BUILD_NUMBER",
      "type": "number",
      "value": 1001
    },
    {
      "key": "ENABLE_DEBUG",
      "type": "boolean",
      "value": false
    }
  ]
}


### Alternatives Considered

```markdown
考虑过以下替代方案:

编写自定义编辑器扩展可以实现类似功能,但每个项目都需要自行维护扩展。该能力更适合作为 Creator 自定义宏系统的内置功能。

### Additional Information

- Cocos Creator 版本:3.8.8
- 操作系统:Windows
- 使用模块:`cc/userland/macro`
- 配置文件:`settings/v2/packages/engine.json`

当前项目中的布尔宏配置示例:

```json
{
  "macroCustom": [
    {
      "key": "test",
      "value": true
    }
  ]
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions