ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ReScript 构建配置全解析:基于 rewatch 的 `rescript.json` 配置参数规范与实现状态

ReScript 构建配置全解析:基于 rewatch 的 `rescript.json` 配置参数规范与实现状态 编译器编程语言开发工具【免费下载链接】rescript-compilerReScript is a robustly typed language that compiles to efficient and human-readable JavaScript.项目地址https://gitcode.com/gh_mirrors/re/rescript-compiler点击查看免费下载导读本指南以 rewatch 仓库中的 CompilerConfigurationSpec.md 为核心系统梳理 ReScript 编译器rescript.json及遗留bsconfig.json的全部构建配置参数——包括 JSON 类型、取值枚举、rewatch 实现状态以及 rewatch 相对官方 schema 额外扩展的features、experimental-features等能力。阅读本文后你将能够准确配置源码目录、模块格式、JSX、警告、ppx、后构建命令等关键选项并理解每个参数在 rewatch 源码rewatch/src/config.rs、rewatch/src/cli.rs中的解析与落地点从而在迁移旧项目、排查配置错误时做到心中有数。一、文档背景与阅读方法CompilerConfigurationSpec.md本质上是一张配置参数清单 实现状态对照表它以 ReScript 官方 build-configuration-schema 为基础逐一列出每个顶层参数、其合法 JSON 类型、附加说明Remark并用[x]/[_]标记 rewatch 是否已经实现。因此这张表同时回答三个问题某个配置项长什么样JSON 类型与枚举值rewatch认不认它[x]已实现[_]未实现/忽略哪些是rewatch 独有扩展dependencies/dev-dependencies的对象形式、顶层features、experimental-features等详见 Features.md。从源码看这些配置在 rewatch 中由 rewatch/src/config.rs 中的Config结构体统一反序列化入口为Config::new/Config::new_from_json_string见 config.rs。它使用 serde 解析并借助serde_ignored收集未知字段未知字段会被记录并提示而不支持recognized-but-unsupported的字段则通过is_unsupported_field单独归类见 config.rs。二、顶层配置参数总览下表完整复刻原文档的顶层参数清单并补充源码级说明。其中实现状态列沿用原文档标记[x]表示 rewatch 已实现[_]表示尚未实现配置会被接受但语义不生效或仅作占位。参数JSON 类型说明 / 备注实现状态namestring包名也是命名空间推导的基础见下文 namespace[x]namespacebooleantrue时按包名自动生成命名空间false关闭[x]namespacestring显式指定命名空间字符串[x]sourcesstring单个源码目录简写如src[x]sourcesarray of string多个源码目录简写[x]sourcesSource单个 Source 对象含 dir/subdirs/type/feature[x]sourcesarray of Source多个 Source 对象[x]ignored-dirsarray of string忽略目录列表rewatch 未实现[_]dependenciesarray of string字符串简写形式等同官方行为[x]dependenciesarray of Dependency对象形式可限制依赖的特性集合rewatch 扩展见 Features.md[x]dev-dependenciesarray of string开发期依赖简写形式[x]dev-dependenciesarray of Dependency对象形式rewatch 扩展[x]featuresmap of string to array顶层特性声明名称 → 其蕴含的特性列表rewatch 扩展见 Features.md[x]generatorsarray of Rule-Generator规则生成器rewatch 未实现[_]cut-generatorsboolean是否裁剪生成器产物rewatch 未实现[_]jsxJSXJSX 配置对象见下文JSX节[x]gentypeconfigGentypeGenType类型生成配置rewatch 将path之外的能力通过-bs-gentype-*参数下发给 bsc[x]compiler-flagsarray of string追加到 bsc 的编译器参数兼容遗留别名bsc-flags[x]warningsWarnings警告编号与告警升级配置[x]ppx-flagsarray of stringPPX 重写器参数rewatch 会解析为-ppx 路径[x]pp-flagsarray of stringPretty-print 参数rewatch 未实现[_]js-post-buildJs-Post-Build每个 JS 文件编译后执行的命令路径遵循in-source设置stdout/stderr 会被记录[x]package-specsarray of Module-Format遗留的模块格式简写数组rewatch 未实现对象形式已实现[_]package-specsarray of Package-Spec对象形式见下文Package-Spec节[x]entriesarray of Target-Item入口目标原文档标注ReScript 基本不可用可能被移除[_]bs-external-includesarray of string外部 include 路径rewatch 未实现[_]suffixSuffix输出文件后缀如.mjs见下文 Suffix 枚举[x]reanalyzeReanalyzereanalyze 工具配置rewatch 直接忽略不报错见下文Reanalyze节[x]experimental-featuresExperimentalFeatures实验性编译器特性开关仅 rewatch 支持见下文专节[x]editorobject仅供 VS Code 工具链使用rewatch 忽略但不告警[x]实现状态细节印证UNSUPPORTED_TOP_LEVEL_FIELDS常量中明确列出了ignored-dirs、generators、cut-generators、pp-flags、entries、bs-external-includes六项见 config.rs与上表[_]项一一对应而editor与reanalyze在Config中声明为Optionserde_json::Value原样接收、不做校验见 config.rs对应忽略但不告警的行为。2.1 name 与 namespace 的关联namespace有两种形态boolean 或 string由NamespaceConfig枚举处理config.rs。其语义集中在Config::get_namespace()config.rs不配置或namespace: false→ 不启用命名空间namespace: true→ 由包名自动推导namespace_from_package_name会把scope/pkg这类名字中的/、-转为大写首字母并拼接namespace: 字符串→ 显式使用该字符串若字符串形如 PascalCase 则直接使用否则先做格式转换。另外namespace-entryrewatch 独有、不属于官方 spec可与命名空间结合生成带入口的命名空间NamespaceWithEntry。2.2 遗留配置与别名兼容rewatch 兼容旧版 bsb 时代的命名习惯并在解析时记录DeprecationWarning枚举见 config.rs配置文件叫bsconfig.json→ 提示BsconfigJsonbs-dependencies/bs-dev-dependencies→ 映射到dependencies/dev-dependenciesbsc-flags→ 映射到compiler-flagspackage-specs.module用cjs/es6→ 分别映射为commonjs/esmodule并提示已废弃。这些别名在 serde 属性中直接声明如#[serde(alias bs-dependencies)]、#[serde(alias bsc-flags)]见 config.rs并有对应单元测试覆盖如test_bs_dependencies_alias、test_es6_module_alias见 config.rs。三、sources源码目录配置Sourcesources是整个构建的入口rewatch 支持简写与对象两种形式。原文档的 Source 子参数表如下参数JSON 类型说明实现状态dirstring源码目录路径相对包根[x]typedev标记为开发期源码--prod构建时跳过[x]featurestring特性标签rewatch 扩展见 Features.md[x]filesarray of string文件过滤列表[_]filesFile-Object文件过滤对象slow-re/excludes[_]generatorsarray of Build-Generator构建期生成器[_]publicall全部公开[_]publicarray of string指定公开模块列表[_]resourcesarray of string资源文件复制列表[_]subdirsbooleantrue递归包含子目录false不包含[x]subdirsstring单个子目录[_]subdirsarray of string子目录名列表[x]subdirsSource嵌套 Source 对象[_]subdirsarray of Source嵌套 Source 对象数组[x]groupstring / Group分组配置官方 spec 本身都未实现可能移除[_]internal-dependsarray of string内部依赖声明[_]源码中的数据结构与这张表完全对应Source枚举区分Shorthand(String)与Qualified(PackageSource)两种形态config.rsPackageSource含dir、subdirs、type_、feature四个字段config.rsSubdirs枚举区分Recurse(bool)对应subdirs: true/false与Qualified(VecSource)对应嵌套对象数组见 config.rs。一个同时使用对象、type: dev与subdirs的完整示例改写自测试用例test_sources见 config.rs{ name: rescript/core, sources: { dir: test, subdirs: [intl], type: dev }, suffix: .mjs, package-specs: { module: esmodule, in-source: true }, dev-dependencies: [rescript/tools], warnings: { error: 101 } }关于type: dev的级联语义源码注释明确指出父目录标记为dev时其下所有子目录都视为 dev 源码find_is_type_dev_for_sub_folder不再单独检查子目录见 config.rsis_type_dev的判定在find_is_type_dev_for_path中实现config.rs。四、特性系统featuresrewatch 的独有扩展顶层features与Source.feature、依赖对象形式共同构成 rewatch 的特性构建体系。原文档标注其为 rewatch 扩展完整机制在 Features.md 中说明这里归纳其核心4.1 给源码目录打标签在sources条目上添加feature属性只有该特性激活时目录才参与构建{ name: example/lib, sources: [ { dir: src }, { dir: src-native, feature: native }, { dir: src-experimental, feature: experimental } ] }未打标签的目录永远参与编译标签会沿subdirs向下级联——子目录若未显式声明自己的feature则继承父级的。源码中is_feature_enabledconfig.rs检查目录标签是否存在于激活特性集合中set_feature实现级联且不会覆盖子目录的显式标签config.rs对应测试test_feature_cascade_does_not_overwrite_explicit_child。4.2 声明特性蕴含关系顶层features映射声明一个特性蕴含哪些其他特性仅当需要这种蕴含关系时才必须声明叶级特性无蕴含可直接作为目录标签使用{ features: { full: [native, experimental] } }请求full会传递性启用native与experimentala - b - a这类环会在构建期被拒绝并报错resolve_active_features/expand_feature检测环并输出参与者链见 config.rs。4.3 命令行选择特性rewatch build/rewatch watch通过--features限制当前包编译范围参数校验见 cli.rsrewatch build # 全部特性激活默认 rewatch build --features native # 仅未打标签 native rewatch build --features native,full # 多特性同时展开 full该 CLI 标志只作用于当前包不会传递给依赖依赖的激活特性集合由使用方声明决定空值--features 或--features ,会被拒绝不传标志即全部特性默认全部特性集合由collect_declared_features计算它合并顶层features映射中的键、蕴含列表中的名字以及所有源码目录上出现的标签config.rs。4.4 限制依赖的特性将dependencies/dev-dependencies中的条目从字符串简写换成对象形式即可限定依赖构建哪些特性{ dependencies: [ plain/dep, { name: example/lib, features: [native] } ] }规则简写plain/dep→ 使用该依赖的全部特性未接入特性系统的配置行为不变对象含features→ 仅启用列出的特性及其在依赖自身features映射中传递蕴含的特性features: []表示仅无标签目录不编译任何特性门控代码对象不含features→ 等价于简写全部特性激活。同一依赖被多个使用方以不同特性集引用时取并集特性是加法式的启用更多特性不会删除模块因此并集总是安全。数据结构上Dependency枚举对应简写与QualifiedDependency { name, features }两种形态config.rs。4.5 特性与增量构建的交互type: dev与--prod独立于特性目录可同时声明type: dev与feature只有两个过滤器都通过才构建rewatch clean忽略--features总是清理全部特性门控目录下的构建产物保证 clean 行为可预期关闭某特性后下一次rewatch build会通过删除文件那套 diff 机制清理对应产物.mjs、.cmj等rewatch watch下修改rescript.json的features会触发全量重建并重新注册 watchCLI 的--features只在启动 watch 时求值一次变更需重启。仓库中的真实配置样例可参考 rewatch/testrepo/packages/with-features/rescript.json含src-native、src-experimental标签与features: { full: [...] }映射其解析与展开行为由test_source_with_feature_tag_parses、test_features_map_parses、test_resolve_active_features_expands_transitive等测试锁定见 config.rs。五、JSX 配置jsx子对象参数原文档JSX节参数JSON 类型说明实现状态versionJSX-Version枚举3|4[x]modulereactJSX 目标模块[x]modeJSX-Mode枚举classic|automatic[x]v3-dependenciesarray of stringJSX v3 相关依赖列表[x]对应数据结构JsxSpecsconfig.rs其中还额外支持preserve布尔字段-bs-jsx-preserve。rewatch 将这些配置翻译成 bsc 参数version 4→-bs-jsx 4get_jsx_argsconfig.rs原文档只列了 3/4 两个取值源码实现仅接受 4其他版本会 panicJSX version {version} is unsupportedmode: classic→-bs-jsx-mode classicautomatic→-bs-jsx-mode automaticget_jsx_mode_argsmodule: react→-bs-jsx-module react源码还允许任意字符串模块JsxModule::Other测试test_other_jsx_module使用了Voby.JSX见 config.rs。典型配置{ jsx: { version: 4, module: react, mode: automatic } }六、warnings警告控制warnings子对象原文档Warnings节参数JSON 类型说明实现状态numberstring警告编号开关串如832、-a[x]errorbooleantrue表示所有警告视为错误对应-warn-error A[x]errorstring指定将哪些警告编号视为错误如101[x]源码中Warnings { number: OptionString, error: OptionError }Error枚举区分布尔全量与字符串限定两种形态config.rs。落地点为get_warning_argsconfig.rsnumber→-w 串error: true→-warn-error Aerror: 串→-warn-error 串命令行--warn-error优先级高于配置文件与遗留 bsb 行为一致非本地依赖node_modules 中的包不接收任何警告参数。{ warnings: { number: 832, error: 101 } }七、ppx-flags 与 compiler-flagscompiler-flags追加给 bsc 的编译器标志类型为array of string。rewatch 支持嵌套形态OneOrMore单字符串或字符串数组并会按空格拆分扁平化flatten_flagsconfig.rs。ppx-flagsPPX 重写器列表。flatten_ppx_flagsconfig.rs会把每个条目解析成-ppx 路径参数以.开头的条目视为相对当前包名的路径并做解析其他按名称在包路径中解析。真实示例见 rewatch/testrepo/packages/with-ppx/rescript.json。八、js-post-build编译后钩子js-post-build在每个JS 文件编译完成后执行指定命令原文档Js-Post-Build节参数JSON 类型说明实现状态cmdstring接收 JS 文件的绝对路径[x]关键语义原文档明确且源码注释强调Unlike bsb, rewatch passes absolute paths见 config.rs传入路径遵循in-source设置in-source: true→ 路径位于源文件旁如src/Foo.jsin-source: false→ 路径位于lib/module/目录如lib/es6/src/Foo.mjs命令与 rewatch 进程使用相同工作目录运行通常为项目根命令的 stdout 与 stderr 都会被记录。{ js-post-build: { cmd: node scripts/post.mjs } }九、package-specs、suffix 与模块格式9.1 Package-Spec对象形式已实现参数JSON 类型说明实现状态moduleModule-Format模块格式枚举esmodule|commonjs默认esmodule[_]简写数组形式未实现in-sourcebooleantrue输出到源文件旁false输出到lib/module/[x]suffixSuffix输出后缀[_]per-spec 后缀在对象形式中已实现说明原文档中module与suffix标记为[_]指的是遗留的 Module-Format 简写数组形式如package-specs: [es6, cjs]未实现对象形式整体含module、suffix字段是已实现的。源码PackageSpec结构体config.rs完整支持module/in-source/suffix三字段默认输出目录由模块格式决定commonjs →jsesmodule →es6get_out_of_source_dir。校验逻辑validate_package_specs_valueconfig.rs还强制一条规则相同后缀 相同 in-source 组合不允许重复报错信息为Duplicate package-spec suffix ... is not allowed对应测试test_package_specs_duplicate_suffix_default等。9.2 Suffix 枚举.js | .mjs | .cjs | .bs.js | .bs.mjs | .bs.cjs顶层suffix作为默认后缀单个 package-spec 的suffix优先get_suffixconfig.rs。完全省略配置时默认值等价于{ module: esmodule, in-source: true, suffix: .js }见get_package_specsconfig.rs。9.3 完整示例{ name: my-app, sources: { dir: src, subdirs: true }, package-specs: [{ module: esmodule, in-source: true }], suffix: .mjs, dependencies: [teamwalnut/app] }该写法与仓库测试test_getters完全一致config.rsdependencies解析测试可见 rewatch/testrepo/rescript.jsonmonorepo 根配置混合使用对象与字符串形式依赖。十、experimental-features仅 rewatch 支持的特性开关experimental-features是 rewatch 独有的顶层字段原文档明确标注 Only supported by Rewatch用于开启实验性编译器行为键特性标识符PascalCase值布尔值true开启。目前支持的特性LetUnwrap启用let?语法。{ experimental-features: { LetUnwrap: true } }源码ExperimentalFeature枚举当前只有LetUnwrap一个变体反序列化时对未知特性报错Unknown experimental feature name. Available features: LetUnwrapconfig.rs启用后翻译为 bsc 参数-enable-experimental LetUnwrapget_experimental_features_argsconfig.rs。十一、与外部工具共享的配置段原文档中还有两个被 rewatch 接收但忽略的配置段本文一并给出说明避免读者误以为漏配11.1 Reanalyzereanalyze 工具参数JSON 类型说明实现状态analysisarray of Reanalyze-Analysis分析类型列表[_]suppressarray of string抑制的分析[_]unsuppressarray of string取消抑制的分析[_]transitiveboolean是否跨依赖分析[_]Reanalyze-Analysis枚举dce|exception|termination。该段由 reanalyze 工具消费rewatch 忽略Config中声明为Optionserde_json::Value见 config.rs因此不参与 rewatch 构建流程。11.2 editorVS Code 工具链editor为对象仅 VS Code 扩展使用rewatch 接受但不校验测试test_editor_field_supported验证其不会触发未知字段告警见 config.rs。十二、可能被移除的配置Target-Item 与 Groupentries / Target-Itemkind枚举native|bytecode|js与mainstring。原文档标注 Not really usable by ReScript, likely to be removed——即 ReScript 本身基本不使用此配置预计移除。Groupnamestring与hierarchyboolean。原文档措辞为 What is this even for?官方 spec 声称尚未在 ReScript 中实现同样预计移除。这两段在 rewatch 中均未实现[_]配置它们不会产生构建行为。十三、配置排查速查结合源码将常见配置问题的定位路径整理如下现象排查点依据配置了ignored-dirs/generators等却不生效这些字段属于 unsupported[_]rewatch 接受但忽略is_unsupported_fieldconfig.rs提示Duplicate package-spec suffix两个 package-spec 的后缀 in-source 组合重复validate_package_specs_valueconfig.rs出现Unknown experimental feature实验特性名拼写错误或未被当前版本支持ExperimentalFeature反序列化config.rs出现bs-dependencies等旧键的弃用提示正在使用遗留别名建议迁移到新键名DeprecationWarningconfig.rssourceMap: true报错rewatch 不支持布尔true需用对象{ enabled: ..., mode: ... }或falseSourceMapConfig反序列化config.rs结语CompilerConfigurationSpec.md是理解 ReScript 构建配置与 rewatch 实现边界的核心索引一张表同时给出了每个参数的 JSON 形态、枚举取值、rewatch 支持状态并标注出features、experimental-features、依赖对象形式等 rewatch 独有扩展。结合 rewatch/src/config.rs 中的 serde 结构与-bs-*参数翻译逻辑以及 rewatch/testrepo 下的真实配置样例开发者在迁移旧bsconfig.json、编写新rescript.json、或排查某配置为何不生效时都可以对照本文表结构快速定位准确区分官方 schema 语义与rewatch 实现边界。赞分享编译器编程语言开发工具【免费下载链接】rescript-compilerReScript is a robustly typed language that compiles to efficient and human-readable JavaScript.项目地址https://gitcode.com/gh_mirrors/re/rescript-compiler点击查看免费下载相关推荐ReScript Compiler配置选项全解析rescript.json最佳实践ReScript Compiler配置选项全解析rescript.json最佳实践 配置文件基础结构 rescript.json是ReScript项目的核心配编译器编程语言开发工具VoltAgent 代码规范实战基于 Biome 的 Linting 与格式化配置全解析VoltAgent 代码规范实战基于 Biome 的 Linting 与格式化配置全解析 导读 本文围绕 VoltAgent基于 TypeScript 的开人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆Agent 工作流AI 评测MCP 服务MCP Clients语音Dopamine JaxDQNAgent 深度解析基于 JAX 的 DQN Agent 实现、参数全解与 gin 实战配置Dopamine JaxDQNAgent 深度解析基于 JAX 的 DQN Agent 实现、参数全解与 gin 实战配置 Dopamine 官方 API 文机器学习深度学习上一篇Snips NLU 开源项目教程下一篇如何用 Papermill 轻松实现 Jupyter 笔记本参数化与自动化执行创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进