@hzab/vite-config 0.0.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +83 -0
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/create-app-vite-config.cjs +426 -0
- package/dist/create-app-vite-config.cjs.map +1 -0
- package/dist/create-app-vite-config.d.cts +19 -0
- package/dist/create-app-vite-config.d.ts +19 -0
- package/dist/create-app-vite-config.js +415 -0
- package/dist/create-app-vite-config.js.map +1 -0
- package/dist/create-library-vite-config.cjs +281 -0
- package/dist/create-library-vite-config.cjs.map +1 -0
- package/dist/create-library-vite-config.d.cts +31 -0
- package/dist/create-library-vite-config.d.ts +31 -0
- package/dist/create-library-vite-config.js +268 -0
- package/dist/create-library-vite-config.js.map +1 -0
- package/dist/create-package-vitest-config.cjs +73 -0
- package/dist/create-package-vitest-config.cjs.map +1 -0
- package/dist/create-package-vitest-config.d.cts +12 -0
- package/dist/create-package-vitest-config.d.ts +12 -0
- package/dist/create-package-vitest-config.js +67 -0
- package/dist/create-package-vitest-config.js.map +1 -0
- package/dist/create-vite-config.cjs +438 -0
- package/dist/create-vite-config.cjs.map +1 -0
- package/dist/create-vite-config.d.cts +17 -0
- package/dist/create-vite-config.d.ts +17 -0
- package/dist/create-vite-config.js +427 -0
- package/dist/create-vite-config.js.map +1 -0
- package/dist/index.cjs +631 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +603 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/copy.cjs +16 -0
- package/dist/plugins/copy.cjs.map +1 -0
- package/dist/plugins/copy.d.cts +18 -0
- package/dist/plugins/copy.d.ts +18 -0
- package/dist/plugins/copy.js +13 -0
- package/dist/plugins/copy.js.map +1 -0
- package/dist/plugins/hash-deploy.cjs +128 -0
- package/dist/plugins/hash-deploy.cjs.map +1 -0
- package/dist/plugins/hash-deploy.d.cts +56 -0
- package/dist/plugins/hash-deploy.d.ts +56 -0
- package/dist/plugins/hash-deploy.js +119 -0
- package/dist/plugins/hash-deploy.js.map +1 -0
- package/dist/plugins/less-tilde.cjs +32 -0
- package/dist/plugins/less-tilde.cjs.map +1 -0
- package/dist/plugins/less-tilde.d.cts +36 -0
- package/dist/plugins/less-tilde.d.ts +36 -0
- package/dist/plugins/less-tilde.js +29 -0
- package/dist/plugins/less-tilde.js.map +1 -0
- package/dist/plugins/lifecycle.cjs +28 -0
- package/dist/plugins/lifecycle.cjs.map +1 -0
- package/dist/plugins/lifecycle.d.cts +20 -0
- package/dist/plugins/lifecycle.d.ts +20 -0
- package/dist/plugins/lifecycle.js +26 -0
- package/dist/plugins/lifecycle.js.map +1 -0
- package/dist/plugins/public-assets.cjs +28 -0
- package/dist/plugins/public-assets.cjs.map +1 -0
- package/dist/plugins/public-assets.d.cts +17 -0
- package/dist/plugins/public-assets.d.ts +17 -0
- package/dist/plugins/public-assets.js +26 -0
- package/dist/plugins/public-assets.js.map +1 -0
- package/dist/plugins/public-config.cjs +31 -0
- package/dist/plugins/public-config.cjs.map +1 -0
- package/dist/plugins/public-config.d.cts +20 -0
- package/dist/plugins/public-config.d.ts +20 -0
- package/dist/plugins/public-config.js +29 -0
- package/dist/plugins/public-config.js.map +1 -0
- package/dist/plugins/react-compiler.cjs +22 -0
- package/dist/plugins/react-compiler.cjs.map +1 -0
- package/dist/plugins/react-compiler.d.cts +24 -0
- package/dist/plugins/react-compiler.d.ts +24 -0
- package/dist/plugins/react-compiler.js +16 -0
- package/dist/plugins/react-compiler.js.map +1 -0
- package/dist/plugins/relative-base.cjs +19 -0
- package/dist/plugins/relative-base.cjs.map +1 -0
- package/dist/plugins/relative-base.d.cts +9 -0
- package/dist/plugins/relative-base.d.ts +9 -0
- package/dist/plugins/relative-base.js +17 -0
- package/dist/plugins/relative-base.js.map +1 -0
- package/dist/plugins/stub-less.cjs +26 -0
- package/dist/plugins/stub-less.cjs.map +1 -0
- package/dist/plugins/stub-less.d.cts +9 -0
- package/dist/plugins/stub-less.d.ts +9 -0
- package/dist/plugins/stub-less.js +24 -0
- package/dist/plugins/stub-less.js.map +1 -0
- package/dist/plugins/svg-react.cjs +70 -0
- package/dist/plugins/svg-react.cjs.map +1 -0
- package/dist/plugins/svg-react.d.cts +28 -0
- package/dist/plugins/svg-react.d.ts +28 -0
- package/dist/plugins/svg-react.js +63 -0
- package/dist/plugins/svg-react.js.map +1 -0
- package/dist/svg-react-runtime.cjs +4 -0
- package/dist/svg-react-runtime.cjs.map +1 -0
- package/dist/svg-react-runtime.d.cts +2 -0
- package/dist/svg-react-runtime.d.ts +2 -0
- package/dist/svg-react-runtime.js +3 -0
- package/dist/svg-react-runtime.js.map +1 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +291 -0
- package/dist/types.d.ts +291 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/vitest-types.cjs +4 -0
- package/dist/vitest-types.cjs.map +1 -0
- package/dist/vitest-types.d.cts +22 -0
- package/dist/vitest-types.d.ts +22 -0
- package/dist/vitest-types.js +3 -0
- package/dist/vitest-types.js.map +1 -0
- package/dist/vitest.cjs +73 -0
- package/dist/vitest.cjs.map +1 -0
- package/dist/vitest.d.cts +4 -0
- package/dist/vitest.d.ts +4 -0
- package/dist/vitest.js +67 -0
- package/dist/vitest.js.map +1 -0
- package/docs/README.md +15 -0
- package/docs/abt-management-ui/vite.config.mts +226 -0
- package/docs/api.md +366 -0
- package/docs/migration-from-webpack.md +722 -0
- package/docs/sync-public-path.md +52 -0
- package/docs/vite-config-integration.md +476 -0
- package/docs/vite-pnpm-integration.md +279 -0
- package/docs/vs-ccc-vite-config.md +26 -0
- package/docs/webpack-gap.md +107 -0
- package/package.json +113 -0
- package/src/client.d.ts +9 -0
- package/src/create-app-vite-config.ts +218 -0
- package/src/create-library-vite-config.ts +199 -0
- package/src/create-package-vitest-config.ts +54 -0
- package/src/create-vite-config.ts +22 -0
- package/src/index.ts +42 -0
- package/src/plugins/copy.ts +25 -0
- package/src/plugins/hash-deploy.ts +199 -0
- package/src/plugins/less-tilde.ts +44 -0
- package/src/plugins/lifecycle.ts +40 -0
- package/src/plugins/public-assets.ts +28 -0
- package/src/plugins/public-config.ts +34 -0
- package/src/plugins/react-compiler.ts +32 -0
- package/src/plugins/relative-base.ts +20 -0
- package/src/plugins/stub-less.ts +26 -0
- package/src/plugins/svg-react.ts +90 -0
- package/src/svg-react-runtime.ts +4 -0
- package/src/svg-react.d.ts +6 -0
- package/src/types.ts +314 -0
- package/src/vitest-types.ts +20 -0
- package/src/vitest.ts +2 -0
- package/templates/src/vite-env.d.ts +2 -0
- package/templates/tsconfig.json +12 -0
- package/templates/vite.config.ts +26 -0
package/docs/api.md
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
# API
|
|
2
|
+
|
|
3
|
+
## `createViteConfig(options?)`
|
|
4
|
+
|
|
5
|
+
默认工厂,面向新项目;等价于 `createAppViteConfig` 的快捷入口,但部分默认值不同。显式传入
|
|
6
|
+
的选项始终优先(内部最后展开 `options`):
|
|
7
|
+
|
|
8
|
+
| 选项 | `createViteConfig` 默认 | `createAppViteConfig` 默认 |
|
|
9
|
+
| --------------- | --------------------------- | ------------------------------- |
|
|
10
|
+
| `rootDir` | `process.cwd()` | 必填 |
|
|
11
|
+
| `command` | `"serve"` | 必填 |
|
|
12
|
+
| `mode` | `"development"` | 必填 |
|
|
13
|
+
| `openBrowser` | `false`(不自动打开浏览器) | `true`(开发启动自动打开) |
|
|
14
|
+
| `reactCompiler` | `false`(关闭) | `"build-only"`(仅 build 启用) |
|
|
15
|
+
|
|
16
|
+
其余选项默认值与 [`createAppViteConfig`](#createappviteconfigoptions) 一致。
|
|
17
|
+
|
|
18
|
+
## `createAppViteConfig(options)`
|
|
19
|
+
|
|
20
|
+
组装应用 Vite 配置。返回值可直接交给 `defineConfig` / `vite.build`;并附带只读
|
|
21
|
+
`buildDirHash`(本次 hash 子目录名;未启用时为 `""`)。该字段为非可枚举,展开配置时不会
|
|
22
|
+
写入 Vite 选项。
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
const config = createAppViteConfig({ /* ... */ hashDeploy: true });
|
|
26
|
+
config.buildDirHash; // e.g. "a1b2c3d4e5f6-1710000000000"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 策略选项
|
|
30
|
+
|
|
31
|
+
| 字段 | 说明 |
|
|
32
|
+
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
33
|
+
| `rootDir` / `command` / `mode` | 必填上下文;`rootDir` 同时作为 Vite `root` 和默认 Git 仓库目录 |
|
|
34
|
+
| `repositoryRoot` | 可选 Git 仓库目录;生成 Hash 时覆盖默认的 `rootDir`,适用于应用位于仓库子目录的场景 |
|
|
35
|
+
| `alias` | 与 Vite `resolve.alias` 相同(`Record<string, string>` 或 `{ find, replacement }[]`) |
|
|
36
|
+
| `useHttps` | 开发 HTTPS + basic-ssl |
|
|
37
|
+
| `openBrowser` | 开发启动自动打开浏览器(映射 `server.open`);默认 `true`;`false` 关闭;`string` 为 pathname;也可经 `vite.server.open` 覆盖 |
|
|
38
|
+
| `hashDeploy` | build 时启用 hash 子目录部署(且 `mode !== "development"`) |
|
|
39
|
+
| `hashTimestamp` | Hash 目录时间戳格式。默认 `"epoch"`(`{commit}-{Date.now()}`);`"datetime"` 为本地时区 `{commit}-YYYY-MM-DD-HH-mm-ss` |
|
|
40
|
+
| `base` | 构建资源公共路径(Vite `base`);未传则默认 `"./"`;可传 `https://cdn.example.com/app/`;hash 模式下实际为 `{base}{hash}/` |
|
|
41
|
+
| `deployRoot` | 产物根目录,默认 `"dist"`;hash 模式下为 `<deployRoot>/<hash>/` 的父目录 |
|
|
42
|
+
| `hashCleanup` | `{ keep }`;成功构建后保留的 Hash 版本总数(含本次),`keep` 须为正整数;未传则永久保留 |
|
|
43
|
+
| `publicAssets` | `{ dir? }`;默认启用,复制到产物 `public/` 子目录;传 `false` 恢复 Vite 默认 publicDir |
|
|
44
|
+
| `publicConfig` | `{ mode, sourceGlob?, dest? }`;默认复制到站点根 `config/`;`dest` 可覆盖(如 `"public/config"`);传 `false` 关闭 |
|
|
45
|
+
| `copy` | 额外静态复制。传 `{ targets, silent?, watch?, hook? }` 或直接传 `targets` 数组;独立插件 `copyPlugin()` |
|
|
46
|
+
| `htmlData` | 注入 HTML 模板的 EJS 数据,与内置 `PUBLIC_PATH` 合并;HTML `PUBLIC_PATH` 始终由工厂计算,消费方同名键会被覆盖 |
|
|
47
|
+
| `devProxy` | `server.proxy` |
|
|
48
|
+
| `reactCompiler` | `true` \| `"build-only"`(默认)\| `false` |
|
|
49
|
+
| `react` | 是否启用 `@vitejs/plugin-react`,默认 `true` |
|
|
50
|
+
| `svgr` | SVG 组件通道;默认关。`true` 或 SVGR 选项对象启用 `import Icon from "./icon.svg?react"`;普通 `*.svg` 仍为 URL。需可选 peer `@svgr/*` |
|
|
51
|
+
| `less` | Less 预处理器:`additionalData` / `modifyVars` / `javascriptEnabled` → `css.preprocessorOptions.less` |
|
|
52
|
+
| `onRun` / `onDone` | 构建生命周期。仅 `command === "build"` 时挂载:`onRun` → `buildStart`;`onDone` 在 Hash 根入口写入之后(sequential post `writeBundle`)。Hash 写入失败不调用 `onDone` |
|
|
53
|
+
|
|
54
|
+
所有 build 默认设置 `base: "./"`,生成的 JS、CSS、图片和 module preload 均使用相对路径;
|
|
55
|
+
开发服务器仍使用 Vite 默认 base。需要把产物挂到固定 HTTPS/CDN 目录时,直接传工厂选项
|
|
56
|
+
`base`(会自动补尾 `/`):
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
createAppViteConfig({
|
|
60
|
+
// ...
|
|
61
|
+
base: "https://cdn.example.com/app/", // → 资源 URL 前缀
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
未使用 `hashDeploy` 时,仍可通过 `vite` / `configure` 覆盖 `base`;启用 hash 后不得改掉
|
|
66
|
+
工厂生成的最终 `base`(见下方契约)。
|
|
67
|
+
|
|
68
|
+
### copy 示例
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
createAppViteConfig({
|
|
72
|
+
// ...
|
|
73
|
+
copy: [
|
|
74
|
+
{
|
|
75
|
+
src: "node_modules/some-sdk/assets/**/*",
|
|
76
|
+
dest: "sdk",
|
|
77
|
+
rename: { stripBase: 3 },
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
// 或完整选项:copy: { targets: [...], silent: true }
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
也可脱离工厂使用 `copyPlugin()`(同族于 `publicAssetsPlugin` / `publicConfigPlugin`)。
|
|
85
|
+
|
|
86
|
+
### htmlData 示例
|
|
87
|
+
|
|
88
|
+
模板使用 EJS 插值(与现有 `<%= PUBLIC_PATH %>` 相同):
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<title><%= APP_TITLE %></title> <link rel="icon" href="<%= PUBLIC_PATH %>public/icons.svg" />
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
createAppViteConfig({
|
|
96
|
+
// ...
|
|
97
|
+
htmlData: { APP_TITLE: "My App" },
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`PUBLIC_PATH` 仍由工厂按 `base` / Hash 写入;`htmlData.PUBLIC_PATH` 不会覆盖它。
|
|
102
|
+
|
|
103
|
+
相对 Hash 时,**子目录 HTML** 的 `PUBLIC_PATH` 是 `./`(资源相对该子目录);**JS** 里的
|
|
104
|
+
`import.meta.env.PUBLIC_PATH` 是 `./{hash}/`,给打开根 `index.html` 后的 `fetch` / 动态 URL
|
|
105
|
+
用。两者不是同一个值。Vite `base` / `import.meta.env.BASE_URL` 仍为 `./`,不要改它。
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
fetch(`${import.meta.env.PUBLIC_PATH}public/data.json`);
|
|
109
|
+
// 相对 hash:./{hash}/public/data.json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
类型:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
/// <reference types="@hzab/vite-config/client" />
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`vite.define` / `configure` 里的同名键会被工厂覆盖。必须写成静态成员
|
|
119
|
+
`import.meta.env.PUBLIC_PATH`,不要解构。
|
|
120
|
+
|
|
121
|
+
### publicConfig `dest` 示例
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
// 默认:产物 /config/config.js
|
|
125
|
+
publicConfig: { mode }
|
|
126
|
+
|
|
127
|
+
// 对齐 webpack 等:产物 /public/config/config.js(需同步改 index.html 引用)
|
|
128
|
+
publicConfig: { mode, dest: "public/config" }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 外部自定义
|
|
132
|
+
|
|
133
|
+
| 字段 | 说明 |
|
|
134
|
+
| ----------- | --------------------------------------------- |
|
|
135
|
+
| `plugins` | 追加插件(内置之后、`onRun` / `onDone` 之前) |
|
|
136
|
+
| `vite` | 任意 `UserConfig`,经 `mergeConfig` 合并 |
|
|
137
|
+
| `configure` | `(config) => config` 最终回调 |
|
|
138
|
+
|
|
139
|
+
**合并顺序:** `base(options) → mergeConfig(base, vite) → configure(final)`,之后工厂写入
|
|
140
|
+
`import.meta.env.PUBLIC_PATH`(覆盖 `vite.define` / `configure` 里的同名键)。
|
|
141
|
+
|
|
142
|
+
`plugins` 排在 Hash 部署等内置插件之后。`onRun` / `onDone` 再挂在其后,因此 `onDone` 能读到
|
|
143
|
+
`hash.txt` 与根 `index.html`。消费方 `writeBundle`(sequential post)若抛错,不会调用 `onDone`。
|
|
144
|
+
|
|
145
|
+
### Hash 部署契约
|
|
146
|
+
|
|
147
|
+
启用 `hashDeploy` 后:默认 Vite `base` 仍为相对 `./`,构建结束时为根入口的相对
|
|
148
|
+
`src` / `href` 增加 Hash 前缀;Hash 子目录入口中的 HTML `PUBLIC_PATH` 保持
|
|
149
|
+
`./`,因此 `assets/`、`public/`、`config/` 均相对于该子目录。JS
|
|
150
|
+
`import.meta.env.PUBLIC_PATH` 则为 `./{hash}/`(打开根入口时拼静态文件)。传入绝对 `base`
|
|
151
|
+
(`https://…` / `http://…` / `/…`)时,最终 Vite `base` 与两个入口的资源前缀均为
|
|
152
|
+
`{base}{hash}/`。
|
|
153
|
+
|
|
154
|
+
默认产物为(`deployRoot` 默认 `"dist"`):
|
|
155
|
+
|
|
156
|
+
- `<deployRoot>/<hash>/`:本次完整构建;
|
|
157
|
+
- `<deployRoot>/index.html`:从 hash 目录复制的部署入口;
|
|
158
|
+
- `<deployRoot>/hash.txt`:当前 hash 目录名。
|
|
159
|
+
|
|
160
|
+
工厂返回值上的 `buildDirHash` 与上述 `<hash>` / `hash.txt` 内容一致。
|
|
161
|
+
其中 commit hash 默认从 `rootDir` 读取;应用位于 monorepo 子目录时可传 `repositoryRoot`
|
|
162
|
+
显式指定仓库目录,不依赖启动 Vite 时的进程工作目录。默认目录名为 `{commit}-{Date.now()}`;
|
|
163
|
+
`hashTimestamp: "datetime"` 时改为本地时区 `{commit}-YYYY-MM-DD-HH-mm-ss`。
|
|
164
|
+
|
|
165
|
+
默认不清理旧 Hash 目录,回滚版本的保留期限与清理由部署系统负责。消费方也可配置
|
|
166
|
+
`hashCleanup: { keep }`:插件在本次构建及根入口成功写入后,按目录名中的时间戳清理旧版本,
|
|
167
|
+
最终保留包含本次构建在内的最新 `keep` 个版本。清理只匹配工厂生成的
|
|
168
|
+
`<12 位 git hash>-<timestamp>` / `local-<timestamp>` 目录(`timestamp` 为毫秒 epoch 或
|
|
169
|
+
`YYYY-MM-DD-HH-mm-ss`),不会删除部署根目录中的其他文件或目录。混用两种格式时按解析后的真实时间排序。
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
createAppViteConfig({
|
|
173
|
+
// ...
|
|
174
|
+
hashDeploy: true,
|
|
175
|
+
deployRoot: "artifacts", // → artifacts/<hash>/ + artifacts/index.html + artifacts/hash.txt
|
|
176
|
+
hashCleanup: { keep: 3 }, // 本次成功构建后仅保留最新 3 个 Hash 版本
|
|
177
|
+
hashTimestamp: "datetime", // → artifacts/a1b2c3d4e5f6-2026-08-21-18-54-00/
|
|
178
|
+
base: "https://cdn.example.com/releases/", // → base 实际为该 URL + <hash>/
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
最终 `build.outDir` 必须以生成的 `<hash>` 目录结尾。除 `deployRoot` 外,仍可通过
|
|
183
|
+
`configure` 修改父目录(例如把 `dist/<hash>` 改为 `artifacts/<hash>`);插件会从 Vite 的最终
|
|
184
|
+
resolved config 推导部署根目录。修改时不得覆盖 Hash 部署生成的最终 `base`(相对
|
|
185
|
+
`./{hash}/` 或 `{customBase}{hash}/`),否则构建会直接报错,避免产出路径错误但表面成功。
|
|
186
|
+
|
|
187
|
+
### alias 示例(与 Vite 原配置一致)
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
alias: {
|
|
191
|
+
"@": path.resolve(rootDir, "./src"),
|
|
192
|
+
"@hzab/utils": path.resolve(rootDir, "./packages/utils/src/index.ts"),
|
|
193
|
+
"@hzab/utils/src": path.resolve(rootDir, "./packages/utils/src"),
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// 或数组形式
|
|
197
|
+
alias: [
|
|
198
|
+
{ find: "@", replacement: path.resolve(rootDir, "./src") },
|
|
199
|
+
]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### less 示例(等价 webpack `less-loader`)
|
|
203
|
+
|
|
204
|
+
| webpack `lessLoaderOptions` | 工厂 `less` |
|
|
205
|
+
| ---------------------------- | --------------------------------------------- |
|
|
206
|
+
| `additionalData` | `additionalData` |
|
|
207
|
+
| `modifyVars` | `modifyVars` |
|
|
208
|
+
| `javascriptEnabled` | `javascriptEnabled` |
|
|
209
|
+
| (无,webpack `~` 前缀约定) | `resolveTilde`(默认 `false`,需手动 `true`) |
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
createAppViteConfig({
|
|
213
|
+
// ...
|
|
214
|
+
less: {
|
|
215
|
+
additionalData: `@import "${path.resolve(rootDir, "src/assets/styles/variables.less")}";`,
|
|
216
|
+
// modifyVars: { '@primary-color': '#1890ff' },
|
|
217
|
+
// javascriptEnabled: true,
|
|
218
|
+
// resolveTilde: true, // 开启 `~` 解析(默认关闭)
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
`~antd/...` 这类 webpack 「~」前缀写法(含第三方包自带的 `~antd` 导入)**默认不解析**;
|
|
224
|
+
项目含 `~antd` 时设 `less.resolveTilde: true` 开启,自动从 node_modules 解析,无需改写为裸包名。
|
|
225
|
+
|
|
226
|
+
### SVG 双通道(`svgr`)
|
|
227
|
+
|
|
228
|
+
资源通道不封装:`import url from "./icon.svg"` 走 Vite 默认 URL。组件通道默认关闭;启用后使用社区 query `?react`(不兼容 webpack 的 `?svgEle`):
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
createAppViteConfig({
|
|
232
|
+
// ...
|
|
233
|
+
svgr: true,
|
|
234
|
+
// svgr: { icon: true },
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
import logoUrl from "./logo.svg";
|
|
240
|
+
import Logo from "./logo.svg?react";
|
|
241
|
+
|
|
242
|
+
<img src={logoUrl} alt="" />
|
|
243
|
+
<Logo className="icon" />
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
类型:
|
|
247
|
+
|
|
248
|
+
```ts
|
|
249
|
+
/// <reference types="@hzab/vite-config/svg-react" />
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
或在 tsconfig `compilerOptions.types` 数组中加入 `"@hzab/vite-config/svg-react"`(也可用
|
|
253
|
+
副作用导入 `import '@hzab/vite-config/svg-react'` 等价加载)。该入口为纯类型入口(运行时为
|
|
254
|
+
空模块),声明 `*.svg?react` 默认导出 `FunctionComponent<SVGProps<SVGSVGElement>>`,仅供
|
|
255
|
+
类型引用,不产生运行时行为。
|
|
256
|
+
|
|
257
|
+
运行时需安装可选 peer `@svgr/core`、`@svgr/plugin-jsx`;未关 `svgo` 时还需 `@svgr/plugin-svgo`。也可直接使用独立插件 `svgReactPlugin()`。
|
|
258
|
+
|
|
259
|
+
## `createLibraryViteConfig(options)`
|
|
260
|
+
|
|
261
|
+
组装组件库 Vite 配置。`command === "build"` 走 `build.lib`(默认 UMD → `lib/index.js`);
|
|
262
|
+
`command === "serve"` 是本地预览应用,不启用 lib / externals。不挂 Hash 部署、public 复制或
|
|
263
|
+
public-config。
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
import path from "node:path";
|
|
267
|
+
import { defineConfig } from "vite";
|
|
268
|
+
import { createLibraryViteConfig, DEFAULT_LIBRARY_EXTERNALS } from "@hzab/vite-config";
|
|
269
|
+
|
|
270
|
+
export default defineConfig(({ command, mode }) =>
|
|
271
|
+
createLibraryViteConfig({
|
|
272
|
+
rootDir: __dirname,
|
|
273
|
+
command,
|
|
274
|
+
mode,
|
|
275
|
+
name: "MyLib", // formats 含 umd / iife 的 build 必填
|
|
276
|
+
alias: {
|
|
277
|
+
"@": path.resolve(__dirname, "./src"),
|
|
278
|
+
},
|
|
279
|
+
// externals: [...DEFAULT_LIBRARY_EXTERNALS, "antd"],
|
|
280
|
+
// previewHtml: "preview/index.html",
|
|
281
|
+
}),
|
|
282
|
+
);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### 策略选项
|
|
286
|
+
|
|
287
|
+
| 字段 | 说明 |
|
|
288
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
289
|
+
| `rootDir` / `command` / `mode` | 必填上下文;`mode` 与应用工厂对齐,本工厂不据此切换 Hash |
|
|
290
|
+
| `alias` | 与 Vite `resolve.alias` 相同;**不**默认 `@` / `@assets` / `@service` |
|
|
291
|
+
| `entry` | 库入口,相对 `rootDir`。默认 `"src/index.ts"` |
|
|
292
|
+
| `name` | UMD / IIFE 全局名。`formats` 含 `umd` 或 `iife` 的 build 必填 |
|
|
293
|
+
| `outDir` | 产物目录。默认 `"lib"` |
|
|
294
|
+
| `fileName` | 产物文件名。未传时:单一 format 为 `index.js`;多 format 时 ESM 为 `index.js`,其余 `index.<format>.js` |
|
|
295
|
+
| `cssFileName` | CSS 产物名(不含扩展名)。默认 `"index"` |
|
|
296
|
+
| `formats` | 默认 `["umd"]`(对齐 webpack `libraryTarget: "umd"`) |
|
|
297
|
+
| `externals` | 仅 build 生效。未传:`react` / `react-dom`(含子路径如 `react/jsx-runtime`);`false` 不外置;数组**整表替换**(追加请展开 `DEFAULT_LIBRARY_EXTERNALS`) |
|
|
298
|
+
| `globals` | UMD / IIFE 全局名。与 React 默认及字符串 external 的包名合并 |
|
|
299
|
+
| `previewHtml` | 仅 serve:交给 `vite-plugin-html` 的模板,相对 `rootDir`。未传则用根目录 `index.html`。**不**默认 `example/` |
|
|
300
|
+
| `useHttps` / `openBrowser` / `devProxy` | 同应用工厂;仅 serve |
|
|
301
|
+
| `react` / `reactCompiler` / `svgr` / `less` | 同应用工厂 |
|
|
302
|
+
| `onRun` / `onDone` | 仅 `command === "build"` 时挂载 |
|
|
303
|
+
| `plugins` / `vite` / `configure` | 同应用工厂。合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)` |
|
|
304
|
+
|
|
305
|
+
默认导出常量:`DEFAULT_LIBRARY_EXTERNALS`(`react` / `react-dom`)、`DEFAULT_LIBRARY_GLOBALS`
|
|
306
|
+
(`react → React`、`react-dom → ReactDOM`)。
|
|
307
|
+
|
|
308
|
+
serve 预览会把依赖打进包,便于本地联调;不要用应用工厂的 `hashDeploy` 去包一层。预览页把
|
|
309
|
+
`index.html` 放在包根,或传 `previewHtml`。`publicDir` 固定为 `false`(对齐 webpack 组件模式
|
|
310
|
+
不复制 public);需要静态目录时经 `vite.publicDir` 打开。
|
|
311
|
+
|
|
312
|
+
## `createPackageVitestConfig(options)`
|
|
313
|
+
|
|
314
|
+
从独立入口导入:
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { createPackageVitestConfig } from "@hzab/vite-config/vitest";
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
| 字段 | 说明 |
|
|
321
|
+
| -------------------------------- | ---------------------------------------------------------------------- |
|
|
322
|
+
| `packageRoot` | 包根目录(`root`) |
|
|
323
|
+
| `alias` | 与 Vite `resolve.alias` 相同 |
|
|
324
|
+
| `react` / `stubLess` | 可选插件 |
|
|
325
|
+
| `environment` | 默认 `happy-dom`(需安装可选 peer `happy-dom`;纯逻辑包可传 `"node"`) |
|
|
326
|
+
| `include` / `setupFiles` | 测试发现 |
|
|
327
|
+
| `plugins` / `vite` / `configure` | 同应用工厂 |
|
|
328
|
+
|
|
329
|
+
`vite`、`configure` 的参数与返回值,以及工厂返回值均使用 Vitest 的 `ViteUserConfig`
|
|
330
|
+
类型,包含 `test` 字段校验;传入无效的 Vitest 配置项会在 TypeScript 编译期报错。
|
|
331
|
+
|
|
332
|
+
## 独立插件
|
|
333
|
+
|
|
334
|
+
可脱离工厂自行组装:
|
|
335
|
+
|
|
336
|
+
- `relativeBasePlugin(deployPath)`
|
|
337
|
+
- `hashDeployPlugin({ rootDir, buildDirStr, publicPath, cleanup? })`
|
|
338
|
+
- `lifecyclePlugin({ onRun?, onDone? })`
|
|
339
|
+
- `copyPlugin({ targets, silent?, watch?, hook? })`(也可直接传 `targets` 数组)
|
|
340
|
+
- `publicAssetsPlugin({ dir? })`
|
|
341
|
+
- `publicConfigPlugin({ sourceGlob, dest? })`
|
|
342
|
+
- `reactCompilerPlugin({ command, mode? })`
|
|
343
|
+
- `svgReactPlugin({ svgo?, icon?, ... })`
|
|
344
|
+
- `stubLessPlugin()`
|
|
345
|
+
- `getCommitHash(repositoryRoot?)`
|
|
346
|
+
- `createHashBuildDirName(repositoryRoot?, now?)`(仍兼容旧的 `createHashBuildDirName(now)`)
|
|
347
|
+
- `createHashBuildDirName({ repositoryRoot?, now?, timestampFormat? })`
|
|
348
|
+
|
|
349
|
+
`stubLessPlugin()` 会将普通 `.less` 作为空模块处理;`.module.less` 的默认导出是 identity
|
|
350
|
+
stub,访问 `styles.foo` 会得到 `"foo"`,无需在单测中加载 Less 编译链。
|
|
351
|
+
|
|
352
|
+
## peerDependencies
|
|
353
|
+
|
|
354
|
+
入口模块会静态装载配置工厂和独立插件,因此以下 peer 均为必选:
|
|
355
|
+
|
|
356
|
+
`vite`、`@vitejs/plugin-react`、`@vitejs/plugin-basic-ssl`、`@rolldown/plugin-babel`、
|
|
357
|
+
`vite-plugin-html`、`vite-plugin-static-copy`。
|
|
358
|
+
|
|
359
|
+
`vitest` 仅在导入 `@hzab/vite-config/vitest`、使用 `createPackageVitestConfig` 时需要安装;
|
|
360
|
+
包根入口不引用 Vitest 运行时或类型。
|
|
361
|
+
|
|
362
|
+
`@svgr/core`、`@svgr/plugin-jsx`、`@svgr/plugin-svgo` 为可选 peer:仅在启用 `svgr` /
|
|
363
|
+
`svgReactPlugin` 且实际导入 `*.svg?react` 时加载;未启用时不必安装。
|
|
364
|
+
|
|
365
|
+
`happy-dom` 为可选 peer:仅在使用 `createPackageVitestConfig` 且保留默认
|
|
366
|
+
`environment: "happy-dom"` 时需要安装;纯逻辑测试可传 `environment: "node"` 免装。
|