vite-plugin-build-version-file 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -6,8 +6,18 @@
6
6
 
7
7
  - 构建产物中生成 `version.json`
8
8
  - 可选地向 HTML 注入 `window["__VERSION__"]`
9
+ - 通过 `import.meta.env.__VERSION__` 在代码中直接读取版本号
9
10
  - 支持自定义版本号、文件名和全局变量名
10
11
 
12
+ 这个插件只负责产出和暴露版本信息。
13
+
14
+ 它不负责这些运行时行为:
15
+
16
+ - 轮询检查版本
17
+ - 弹窗提示用户更新
18
+ - 用户取消后的重试策略
19
+ - 页面刷新时机
20
+
11
21
  适合用在这些场景:
12
22
 
13
23
  - 页面显示当前前端版本
@@ -60,7 +70,7 @@ export default defineConfig({
60
70
  ```json
61
71
  {
62
72
  "version": "20260401153045",
63
- "production": true
73
+ "env": "production"
64
74
  }
65
75
  ```
66
76
 
@@ -69,10 +79,33 @@ export default defineConfig({
69
79
  ```json
70
80
  {
71
81
  "version": 0,
72
- "production": false
82
+ "env": "development"
73
83
  }
74
84
  ```
75
85
 
86
+ ## 职责边界
87
+
88
+ 这个库的职责是:
89
+
90
+ - 生成版本号
91
+ - 输出 `version.json`
92
+ - 向页面注入版本信息
93
+ - 让业务代码能读取当前版本
94
+
95
+ 这些逻辑建议写在业务项目里,而不是放进这个库里:
96
+
97
+ - 多久检查一次新版本
98
+ - 请求失败后是否重试
99
+ - 用什么 UI 提示用户
100
+ - 用户点击取消后怎么处理
101
+ - 是否立即刷新页面
102
+
103
+ 如果你的项目要做“检测到新版本后提示刷新”,推荐做法是:
104
+
105
+ - 用 `import.meta.env.__VERSION__` 读取当前页面版本
106
+ - 请求 `version.json` 读取服务端版本
107
+ - 在业务项目里自行决定提示方式和刷新时机
108
+
76
109
  ## 配置项
77
110
 
78
111
  ```ts
@@ -111,10 +144,12 @@ type BuildVersionPluginOptions = {
111
144
 
112
145
  ```html
113
146
  <script>
114
- window["__VERSION__"] = "20260401153045";
147
+ window["__VERSION__"] = { "version": "20260401153045", "env": "production" };
115
148
  </script>
116
149
  ```
117
150
 
151
+ 这里注入的是完整对象,不是单独的版本字符串。
152
+
118
153
  ### `injectToHtml`
119
154
 
120
155
  - 类型:`boolean`
@@ -175,7 +210,8 @@ export default defineConfig({
175
210
  注入后可以这样读取:
176
211
 
177
212
  ```ts
178
- const version = window['__APP_VERSION__']
213
+ const payload = window['__APP_VERSION__']
214
+ const version = payload.version
179
215
  ```
180
216
 
181
217
  ### 3. 只保留 `version.json`,不注入 `window`
@@ -243,24 +279,95 @@ export default defineConfig({
243
279
 
244
280
  ## 在项目中读取版本
245
281
 
246
- ### 读取注入的全局变量
282
+ 插件提供三种方式读取版本号,可根据场景选择:
283
+
284
+ ### 方式一:通过 `import.meta.env` 读取(推荐)
285
+
286
+ 版本号会被注入到 `import.meta.env` 中,可以直接在代码中使用:
287
+
288
+ ```ts
289
+ const version = import.meta.env.__VERSION__
290
+ console.log(version) // '20260401153045' 或 '1.2.3'
291
+ ```
292
+
293
+ **优势:**
294
+ - 无需等待页面加载或发起请求
295
+ - 类型安全,可在 `vite-env.d.ts` 中声明类型
296
+ - 适合在应用初始化时读取版本
297
+
298
+ **TypeScript 类型声明:**
299
+
300
+ ```ts
301
+ // vite-env.d.ts
302
+ interface ImportMetaEnv {
303
+ readonly __VERSION__: string
304
+ }
305
+
306
+ interface ImportMeta {
307
+ readonly env: ImportMetaEnv
308
+ }
309
+ ```
310
+
311
+ ### 方式二:读取注入的全局变量
247
312
 
248
313
  ```ts
249
- const version = window['__VERSION__']
314
+ const payload = window['__VERSION__']
315
+
316
+ console.log(payload.version)
317
+ console.log(payload.env)
250
318
  ```
251
319
 
252
- ### 读取 `version.json`
320
+ **说明:**
321
+
322
+ - 需要确保 `injectToHtml` 为 `true`(默认值)
323
+ - 这里读到的是完整对象,不是单独字符串
324
+
325
+ ### 方式三:读取 `version.json`
253
326
 
254
327
  ```ts
255
328
  const response = await fetch('/version.json')
256
329
  const payload = await response.json()
257
330
 
258
331
  console.log(payload.version)
259
- console.log(payload.production)
332
+ console.log(payload.env)
260
333
  ```
261
334
 
262
335
  如果你配置了自定义 `filename`,这里的请求路径也需要改成对应地址。
263
336
 
337
+ ## 在项目中做版本检查
338
+
339
+ 推荐把“检查新版本并提示刷新”的逻辑写在业务项目里。
340
+
341
+ 示例:
342
+
343
+ ```ts
344
+ async function checkVersion() {
345
+ const response = await fetch(import.meta.env.VITE_BASE_PATH + '/version.json')
346
+ const payload = await response.json()
347
+
348
+ if (payload.version !== import.meta.env.__VERSION__) {
349
+ const shouldReload = window.confirm('检测到新版本,是否刷新页面?')
350
+
351
+ if (shouldReload) {
352
+ window.location.reload()
353
+ return
354
+ }
355
+ }
356
+
357
+ setTimeout(checkVersion, 1000)
358
+ }
359
+
360
+ checkVersion()
361
+ ```
362
+
363
+ 上面这段逻辑故意没有放进插件里,因为不同项目通常会有不同要求:
364
+
365
+ - 轮询频率不同
366
+ - 请求路径可能不同
367
+ - 弹窗组件不同
368
+ - 刷新策略不同
369
+ - 失败重试策略不同
370
+
264
371
  ## 开发态行为说明
265
372
 
266
373
  开发态下,插件不会往项目的 `public/` 目录写文件。
package/dist/index.cjs CHANGED
@@ -114,7 +114,7 @@ function buildVersionPlugin(options = {}) {
114
114
  }
115
115
  payload = {
116
116
  version,
117
- production: config.command === "build"
117
+ env: config.mode
118
118
  };
119
119
  if (options.payload) {
120
120
  payload = options.payload(payload);
package/dist/index.d.cts CHANGED
@@ -6,7 +6,7 @@ interface BuildVersionContext {
6
6
  }
7
7
  interface BuildVersionPayload {
8
8
  version: string | number;
9
- production: boolean;
9
+ env: string;
10
10
  }
11
11
  interface BuildVersionPluginOptions {
12
12
  filename?: string;
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ interface BuildVersionContext {
6
6
  }
7
7
  interface BuildVersionPayload {
8
8
  version: string | number;
9
- production: boolean;
9
+ env: string;
10
10
  }
11
11
  interface BuildVersionPluginOptions {
12
12
  filename?: string;
package/dist/index.mjs CHANGED
@@ -89,7 +89,7 @@ function buildVersionPlugin(options = {}) {
89
89
  }
90
90
  payload = {
91
91
  version,
92
- production: config.command === "build"
92
+ env: config.mode
93
93
  };
94
94
  if (options.payload) {
95
95
  payload = options.payload(payload);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-build-version-file",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "A Vite plugin that emits version.json and injects version metadata into HTML.",
5
5
  "license": "MIT",
6
6
  "type": "module",