用途:@sanity/tsdown-config 是 Sanity 对 tsdown 的封装,用于构建可发布的 Sanity 库。通用 tsdown 概念请使用单独的 tsdown 技能(npx skills add rolldown/tsdown --skill tsdown)。除非包明确不需要 Sanity 的库约定,否则不要用原生 tsdown 配置替换该封装。
安装与配置:0.28.x 要求 Node.js ^22.18.0 || ^24.11.0 || >=26.0.0。安装命令:pnpm add -D @sanity/tsdown-config tsdown。创建 tsdown.config.ts:import {defineConfig} from '@sanity/tsdown-config';export default defineConfig({tsconfig: 'tsconfig.dist.json'})。建议使用只包含可发布源码的发行版 tsconfig。声明生成由包元数据驱动:当 package.json 含 types 字段或 exports 中的 types 条件时启用 dts。构建与监听:pnpm tsdown、pnpm tsdown --watch。
默认行为:平台为 'neutral',同时外置 node: 内置模块;格式 'esm';source maps 为 true;始终生成 package exports(pnpm 项目中 devExports: true 将本地 exports 指向源码,构建产物放入 publishConfig);publint: true;deps.resolveDepSubpath: true;checks.circularDependency: true(仅声明循环被抑制,运行时循环仍警告);压缩仅做压缩/死代码消除,不做混淆或空白代码生成,保留函数与类名;报告 {gzip: false};清理与输出目录沿用 tsdown 默认(dist);chunk 名保留哈希默认。neutral 平台是为同构包刻意选择,不要因部分源码导入 Node API 就改为 'node'。exports 功能每次构建都会重写 package.json,包括 CI=true 时,需检查本地 exports 与 publishConfig.exports。
PackageOptions:封装直接暴露 tsconfig、entry、format、dts、define、target、outDir、clean、platform、cwd、exports、sourcemap、deps、css、vanillaExtract、reactCompiler、styledComponents、bundleAnalyzer、tsdoc、suppressWarnings。neutral 平台下用户 deps.neverBundle 会追加到内置 /^node:/ 外置规则而非替换。
可选功能:React Compiler 默认实现为 Oxc,需 pnpm add -D oxc-transform-react,可用 reactCompiler: {target: '18'};仅当 Oxc 不支持(自定义 jsxImportSource、logger、函数式 sources)时改用 Babel 参考实现,需 pnpm add -D @rolldown/plugin-babel @babel/core babel-plugin-react-compiler,并设 reactCompiler: {target: '19', transform: 'babel'}。同构组件库可用 reactCompiler: {target: '19', reactServer: true} 生成额外未编译 react-server 变体并添加该导出条件,此为实验性。styledComponents: true 添加 display name 与稳定组件 ID 并压缩 tagged CSS,使用 Oxc 原生转换,不要安装 babel-plugin-styled-components。vanillaExtract: true 将 .css.ts 提取到 dist/bundle.css;css: {...} 启用普通 CSS、CSS Modules、预处理器与 PostCSS,需可选 peer @tsdown/css(pnpm add -D @tsdown/css)。两者默认 CSS 压缩为 true,可同时启用(vanilla-extract 用 bundle.css,css 用 style.css)。需将发布的 CSS 加入 package.json#sideEffects,如 "sideEffects": ["*.css"]。bundleAnalyzer 保持可选,true 生成 dist/analyze-data.md,需从 package.json#files 排除。tsdoc: true 在构建后运行 API Extractor 做 TSDoc 语法与发布标签检查,默认关闭,不替代 TypeScript 类型检查。
高级用法:PackageOptions 小于 UserConfig,未暴露的原生 tsdown 选项可用 mergeConfig 合并:import {mergeConfig} from 'tsdown';export default mergeConfig(await defineConfig({tsconfig: 'tsconfig.dist.json'}), {hash: false})。配合 @sanity/tsconfig/isolated-declarations 预设时,用 export default defineConfig() satisfies Promise<UserConfig>;启用 reactCompiler.reactServer 时用 Promise<UserConfig[]>。
默认不要做:不要启用 exe(面向可发布库而非独立可执行文件);不要启用 devtools;不要用完整混淆替换仅压缩输出;不要围绕 Storybook 设计;无具体需求不要禁用 exports、publint、循环依赖检查或 source maps。
工具选择:当常规 Sanity 包已在 package.json#exports 描述入口与运行时条件时,使用 @sanity/pkg-utils 与 pkg build;当构建需要任意 tsdown 选项、多配置、reactCompiler.reactServer 或超出 pkg-utils 的 package.config.ts 范围时,直接使用本封装。