{"id":22903378,"url":"https://github.com/walrusjs/redbud","last_synced_at":"2025-10-31T09:32:27.596Z","repository":{"id":38263909,"uuid":"501938670","full_name":"walrusjs/redbud","owner":"walrusjs","description":"🎉 基于 Umi4 架构，提供基础库开发工作流的解决方案。","archived":false,"fork":false,"pushed_at":"2023-02-11T10:48:28.000Z","size":611,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-23T01:53:14.991Z","etag":null,"topics":["babel","build-tool","esbuild","node","plugins","redbud","umi","webpack"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/walrusjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-10T07:11:59.000Z","updated_at":"2023-04-21T01:40:58.000Z","dependencies_parsed_at":"2024-06-19T17:10:45.012Z","dependency_job_id":"736f7b7f-f716-4b38-a62a-3d872753a8db","html_url":"https://github.com/walrusjs/redbud","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/walrusjs/redbud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walrusjs%2Fredbud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walrusjs%2Fredbud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walrusjs%2Fredbud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walrusjs%2Fredbud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/walrusjs","download_url":"https://codeload.github.com/walrusjs/redbud/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walrusjs%2Fredbud/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281441023,"owners_count":26501758,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["babel","build-tool","esbuild","node","plugins","redbud","umi","webpack"],"created_at":"2024-12-14T02:36:11.708Z","updated_at":"2025-10-31T09:32:27.566Z","avatar_url":"https://github.com/walrusjs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://redbud.xingkang.wang\"\u003e\n    \u003cimg width=\"200\" src=\"https://cdn.jsdelivr.net/gh/walrusjs/redbud@latest/public/logo.svg\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eRedbud\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n基于 Umi4 架构，提供基础库开发工作流的解决方案。\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n**注意:** 本项目主要参考 [`father@4`](https://github.com/umijs/father-next) 的代码实现，并在其中加入自己对基础库开发工作流的一些理解。\n\n与 father@4 主要区别如下:\n\n- 暂无\n\n经过对目前主流的一些基础库(组件库/工具库等)和打包工具(webpack/rollup/esbuild 等)的的研究，得出如何结论:\n\n1. 编译模式主要分为以下两种\n\n- Bundle: 将所有文件打包进一个文件;\n- Bundless: 目录对目录;\n\n2. 编译格式主要分为以下三种\n\n- `esm`\n- `cjs`\n- `umd`\n\n以 React 技术栈有名的 [antd](https://ant.design/) 组件库为例，打包输出目录为 `es`、`lib`、`dist` 就分别用到了上述两种编译模式\n\n- `es` 和 `lib` 采用的就是 Bundless 模式；\n- `dist` 采用的就是 Bundle 模式；\n\n以 [father@3](https://github.com/umijs/father) 为例，就提供了 `babel` 和 `rollup` 两种模式供用户选择。(babel 就相当于 Bundless 模式；rolup 就相当于 Bundle 模式)\n\n基于多年开源开发经验，一个好的打包工具应具备如下特性：\n\n- 能够同时支持 `esm`、`cjs`、`umd` 三种编译格式\n- `esm`、`cjs` 使用 `Bundless` 编译模式\n- `umd` 使用 `Bundle` 编译模式\n- 能够处理组件库和工具库的所有打包场景\n\n## ✨ 特性\n\n- 📦 依赖预打包 基于 ncc（打包文件）+ @microsoft/api-extractor（生成类型）\n- ⚔️ 双模式构建\n  - Bundle 模式：仅 UMD 产物走 bundle 模式，核心为 webpack\n  - Bundless 模式：仅 ESM、CJS 产物走 bundless 模式，默认提供 babel（browser）+ esbuild（node）双编译核心，可基于插件系统注册 swc/tsc 模式\n\n## 🏗 安装\n\n```bash\n# npm\n$ npm install redbud --save -D\n\n# yarn\n$ yarn add redbud -D\n\n# pnpm\n$ pnpm i redbud -D\n```\n\n## Cli\n\n### version\n\n查看 `redbud` 的版本\n\n```bash\n$ redbud version\n```\n\n### dev\n\n执行全量构建并 watch 变更做增量构建，仅支持 esm/cjs 产物\n\n```bash\n$ redbud dev\n```\n\n### build\n\n执行全量构建\n\n```bash\n$ redbud build\n```\n\n### prebundle\n\n执行依赖预打包\n\n```bash\n$ redbud prebundle\n```\n\n## 配置\n\n### 公共配置\n\n#### alias\n\n- 类型：`Record\u003cstring, string\u003e`\n- 默认值：`undefined`\n\n指定源码编译/转换过程中需要处理的别名，其中 Bundles 模式会自动将 `.js`、`.d.ts` 产物中本地路径的别名转换为相对路径。\n\n#### define\n\n- 类型：`Record\u003cstring, string\u003e`\n- 默认值：`undefined`\n\n指定源码编译/转换过程中需要替换的变量，用法与 Webpack [DefinePlugin](https://webpack.js.org/plugins/define-plugin/#usage) 一致。\n\n#### extends\n\n- 类型：`string`\n- 默认值：`undefined`\n\n指定继承的父配置文件路径。\n\n#### extraBabelPlugins\n\n- 类型：`string[]`\n- 默认值：`undefined`\n\n指定要额外挂载的 babel 插件。\n\n\u003e 注：在 Bundless 模式下、且 `transformer` 为 `esbuild` 时，该配置不生效。\n\n#### extraBabelPresets\n\n- 类型：`string[]`\n- 默认值：`undefined`\n\n指定要额外挂载的 babel 插件集。\n\n\u003e 注：在 Bundless 模式下、且 `transformer` 为 `esbuild` 时，该配置不生效。\n\n#### platform\n\n- 类型：`browser` | `node`\n- 默认值：`\u003cauto\u003e`\n\n指定构建产物的目标平台，其中 `esm` 与 `umd` 产物的默认 `platform` 为 `browser`，`cjs` 产物的默认 `platform` 为 `node`；指定为 `browser` 时产物默认兼容至 IE11，指定为 `node` 时产物默认兼容至 Node.js v14，兼容性不支持配置。\n\n\u003e 注：Bundless 模式下，如果手动将 `transformer` 指定为 `esbuild`，那么 `browser` 产物兼容性为 ES6 而不是 IE11。\n\n### 构建配置\n\n以构建产物类型划分构建配置，其中 `esm`、`cjs` 产物为 Bundless 构建模式，`umd` 产物为 Bundle 构建模式，另外依赖预打包 `prebundle` 产物也为 Bundle 构建模式。\n\n### esm/cjs\n\n- 类型：`object`\n- 默认值：`undefined`\n\n配置将源码转换为 ESModule/CommonJS 产物，支持以下子配置项，也支持覆盖外部的公共配置项。\n\n#### input\n\n- 类型：`string`\n- 默认值：`src`\n\n指定要转换的源码目录。\n\n#### output\n\n- 类型：`string`\n- 默认值：`\u003cauto\u003e`\n\n指定产物的输出目录，`esm` 产物的默认输出目录为 `dist/esm`，`cjs` 产物的默认输出目录为 `dist/cjs`。\n\n#### transformer\n\n- 类型：`babel` | `esbuild`\n- 默认值：`\u003cauto\u003e`\n\n指定源码的编译工具，当 `platform` 为 `node` 时，默认值为 `esbuild`，当 `platform` 为 `browser` 时，默认值为 `babel`。\n\n#### overrides\n\n- 类型：`object`\n- 默认值：`undefined`\n\n为指定源码子目录覆盖构建配置，例如：\n\n```ts\nexport default {\n  esm: {\n    overrides: {\n      // 将 server 文件夹下的源码以 node 为目标平台进行编译\n      'src/server': {\n        platform: 'node',\n      },\n    },\n  },\n};\n```\n\n#### ignores\n\n- 类型：`string[]`\n- 默认值：`undefined`\n\n配置转换过程中需要忽略的文件，支持 glob 表达式，被匹配的文件将不会输出到产物目录。另外，father 会默认忽略源码目录中所有的 Markdown 文件和测试文件。\n\n### umd\n\n- 类型：`object`\n- 默认值：`undefined`\n\n配置将源码打包为 UMD 产物，支持以下子配置项，也支持覆盖外部的公共配置项。\n\n#### name\n\n- 类型：`string`\n- 默认值：无\n\n指定 umd 包的导出 library 名称，例如：\n\n```ts\nexport default {\n  umd: {\n    name: 'redbudDemo',\n  },\n};\n```\n\n默认是全量导出 member exports，需要拆解 `default` 的话，可以通过 `chainWebpack` 配置修改 `libraryExport`，例如：\n\n```ts\nexport default {\n  umd: {\n    name: 'redbudDemo',\n    chainWebpack: (memo: any) =\u003e {\n      memo.output.libraryExport('default');\n      return memo;\n    },\n  },\n};\n```\n\n#### entry\n\n- 类型：`string` | `Record\u003cstring, Config\u003e`\n- 默认值：`src/index`\n\n指定要打包的源码入口文件，支持配置多入口、并为每个入口文件单独覆盖构建配置，例如：\n\n```ts\nexport default {\n  umd: {\n    entry: {\n      'src/browser': {},\n      'src/server': {\n        platform: 'node',\n      },\n    },\n  },\n};\n```\n\n#### output\n\n- 类型：`string`\n- 默认值：`dist/umd`\n\n指定产物的输出目录，输出文件名暂不支持配置，单 `entry` 时默认以 NPM 包名命名、多 `entry` 时默认与源码文件同名。\n\n#### externals\n\n- 类型：`Record\u003cstring, string\u003e`\n- 默认值：`undefined`\n\n配置源码打包过程中需要处理的外部依赖。\n\n#### chainWebpack\n\n- 类型：`function`\n- 默认值：`undefined`\n\n使用 `webpack-chain` 自定义源码打包的 Webpack 配置。\n\n#### postcssOptions\n\n- 类型：`object`\n- 默认值：`undefined`\n\n配置源码打包过程中额外的 [PostCSS 配置项](https://webpack.js.org/loaders/postcss-loader/#postcssoptions)。\n\n#### autoprefixer\n\n配置源码打包过程中额外的 [Autoprefixer 配置项](https://github.com/postcss/autoprefixer#options)。\n\n### prebundle\n\n配置项目需要预打包的三方依赖，仅用于 Node.js 工具或框架项目降低安装体积、提升项目稳定性，例如 Umi 这类前端开发框架。\n\n预打包支持以下配置项。\n\n#### output\n\n- 类型：`string`\n- 默认值：`compiled`\n\n指定预打包产物的输出目录，默认输出到`compiled`目录。\n\n#### deps\n\n- 类型：`string[]` | `Record\u003cstring, { minify?: boolean; dts?: boolean }\u003e`\n- 默认值：`undefined`\n\n配置需要预打包的三方依赖，默认开启代码压缩、打包类型声明文件（如果是 TypeScript 项目且包含类型声明），且将每个依赖的打包产物输出到 `[output]/[package_name]` 目录下。\n\n也可以单独对每个依赖进行配置，例如：\n\n```ts\nexport default {\n  prebundle: {\n    // 只配置要预打包的依赖\n    deps: ['rimraf'],\n\n    // 配置预打包的依赖并指定详细配置\n    deps: {\n      rimraf: { minify: false },\n    },\n  },\n};\n```\n\n#### extraDtsDeps\n\n- 类型：`string[]`\n- 默认值：`undefined`\n\n配置仅需要打包 `d.ts` 类型声明文件的依赖。\n\n#### extraExternals\n\n- 类型：`Record\u003cstring, string\u003e`\n- 默认值：`undefined`\n\n配置预打包过程中要额外处理的外部依赖。father 会默认对以下两类依赖做 external：\n\n1. 预打包的所有目标依赖，并自动 external 到输出目录\n2. 当前项目 `package.json` 中声明的 `dependencies`\n\n## 目录结构\n\n```\n┣ ━ .github github 相关配置\n┣ ━ .husky husky 相关配置 (git 钩子)\n┣ ━ .vscode vscode 相关配置\n┣ ━ docs 文档相关\n┣ ━ bin 示例\n┣ ━ compiled\n┣ ━ examples 示例\n┣ ━ src\n┃　　┣ ━ builder\n┃　　┣ ━ cli\n┃　　┣ ━ commands\n┃　　┣ ━ features\n┃　　┣ ━ generators\n┃　　┣ ━ prebundler\n┃　　┣ ━ service\n┃　　┣ ━ builder\n┃　　┣ ━ constants.ts\n┃　　┣ ━ defineConfig.ts\n┃　　┣ ━ index.ts\n┃　　┣ ━ preset.ts\n┃　　┣ ━ registerMethods.ts\n┃　　┗ ━ types.ts\n┣ ━ test 测试相关\n┣ ━ .editorconfig\n┣ ━ .gitignore\n┣ ━ .prettierignore\n┣ ━ jest.config.ts\n┣ ━ LICENSE\n┣ ━ package.json\n┣ ━ pnpm-lock.yaml\n┣ ━ tsconfig.build.json\n┗ ━ tsconfig.json\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalrusjs%2Fredbud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwalrusjs%2Fredbud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalrusjs%2Fredbud/lists"}