@gylautorun/dev-proxy-cookie 1.0.0-beta.1

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 ADDED
@@ -0,0 +1,743 @@
1
+ # dev-proxy-cookie
2
+
3
+ 开发环境代理 Cookie 注入工具,支持文件监听自动重载和自动代理。
4
+
5
+ ## 功能特性
6
+
7
+ - 🚀 **Vue CLI 兼容**:提供 `createVueProxyConfig`,完美兼容 vue.config.js 的代理配置方式
8
+ - ⚡ **Vite 插件支持**:开箱即用的 Vite 插件,支持自动代理所有请求
9
+ - 📁 **Cookie 文件监听**:监听 Cookie 文件变化,实时更新请求,无需重启服务器
10
+ - 🎯 **自动代理**:可选的自动代理所有请求功能,无需手动配置每个路径
11
+ - 🔄 **双向模式**:支持白名单模式(`includePaths`)和黑名单模式(`ignorePaths`)
12
+ - 🔌 **钩子函数**:支持 `onProxyReq`、`onProxyRes`、`onError`、`onWsError` 等钩子
13
+ - ⚙️ **代理配置**:支持 `ws`、`changeOrigin`、`secure`、`followRedirects` 等完整代理选项
14
+ - 🛠️ **工具类**:提供 `CookieReader` 和 `CookieWatcher` 基础工具类
15
+
16
+ ## 安装
17
+
18
+ ```bash
19
+ npm install dev-proxy-cookie
20
+ # 或
21
+ pnpm add dev-proxy-cookie
22
+ # 或
23
+ yarn add dev-proxy-cookie
24
+ ```
25
+
26
+ ## 使用方法
27
+
28
+ ### Vue CLI 项目 (vue.config.js) - 标准方式
29
+
30
+ ```javascript
31
+ const path = require('path');
32
+ const { createVueProxyConfig, createFileCookieGetter } = require('dev-proxy-cookie');
33
+
34
+ const _target = 'http://10.17.33.33/';
35
+ const cookieFile = path.resolve(__dirname, './cookie.txt');
36
+ const getCookie = createFileCookieGetter(cookieFile);
37
+
38
+ module.exports = {
39
+ devServer: {
40
+ proxy: {
41
+ '/examine/': createVueProxyConfig(_target, { getCookie }),
42
+ '/cas/': createVueProxyConfig(_target, { getCookie }),
43
+ '/mock/': createVueProxyConfig('http://localhost:3000'),
44
+ },
45
+ },
46
+ };
47
+ ```
48
+
49
+ ### Vue CLI 项目 (vue.config.js) - 自动代理所有接口
50
+
51
+ 使用 `createAutoProxyConfig` 自动代理所有请求:
52
+
53
+ ```javascript
54
+ const path = require('path');
55
+ const { createAutoProxyConfig, createFileCookieGetter } = require('dev-proxy-cookie');
56
+
57
+ const getCookie = createFileCookieGetter('./cookie.txt', {
58
+ watch: true, // 监听文件变化
59
+ debug: true, // 输出调试日志
60
+ });
61
+
62
+ module.exports = {
63
+ devServer: {
64
+ proxy: createAutoProxyConfig({
65
+ target: 'http://10.17.33.33:10000',
66
+ getCookie,
67
+ debug: true,
68
+ // WebSocket 支持
69
+ ws: true,
70
+ changeOrigin: true,
71
+ secure: false,
72
+
73
+ // 白名单模式 - 只代理这些路径
74
+ // includePaths: ['/api/', '/cas/', '/examine/'],
75
+
76
+ // 黑名单模式 - 忽略这些路径
77
+ ignorePaths: ['/assets/', '/img/', '/public/', '/favicon.ico'],
78
+
79
+ // 额外的代理配置(优先级最高)
80
+ additionalProxies: {
81
+ '/mock/': {
82
+ target: 'http://localhost:3000',
83
+ changeOrigin: true,
84
+ },
85
+ },
86
+
87
+ // 自定义请求头
88
+ headers: {
89
+ host: '10.17.33.33',
90
+ origin: 'http://10.17.33.33',
91
+ },
92
+
93
+ // 钩子函数
94
+ hooks: {
95
+ onProxyReq: (proxyReq, req, res) => {
96
+ console.log('[Proxy] Request:', req.method, req.url);
97
+ },
98
+ onProxyRes: (proxyRes, req, res) => {
99
+ console.log('[Proxy] Response:', req.url, proxyRes.statusCode);
100
+ },
101
+ onError: (err, req, res) => {
102
+ console.error('[Proxy] Error:', err.message);
103
+ },
104
+ },
105
+ }),
106
+ },
107
+ };
108
+ ```
109
+
110
+ ### Vite 项目 (vite.config.js) - 自动代理
111
+
112
+ ```javascript
113
+ import { defineConfig } from 'vite';
114
+ import { viteAutoProxyCookie } from 'dev-proxy-cookie';
115
+
116
+ export default defineConfig({
117
+ plugins: [
118
+ viteAutoProxyCookie({
119
+ // 必需配置
120
+ cookieFile: './cookie.txt',
121
+ target: 'http://10.17.33.33',
122
+
123
+ // 调试模式
124
+ debug: true,
125
+
126
+ // Cookie变化时自动重启开发服务器(需要外部脚本配合)
127
+ autoRestart: true,
128
+
129
+ // WebSocket 支持
130
+ ws: true,
131
+ changeOrigin: true,
132
+ secure: false,
133
+ followRedirects: true,
134
+
135
+ // 自定义代理映射
136
+ proxyMap: {
137
+ '/mock/': 'http://localhost:3000',
138
+ },
139
+
140
+ // 忽略的路径
141
+ ignorePaths: ['/assets/', '/img/', '/public/'],
142
+
143
+ // 钩子函数
144
+ hooks: {
145
+ onProxyReq: (proxyReq, req, res) => {
146
+ console.log('[Proxy] Request:', req.method, req.url);
147
+ },
148
+ onProxyRes: (proxyRes, req, res) => {
149
+ console.log('[Proxy] Response:', req.url, proxyRes.statusCode);
150
+ },
151
+ onError: (err, req, res) => {
152
+ console.error('[Proxy] Error:', err.message);
153
+ },
154
+ onWsError: (err, req, socket) => {
155
+ console.error('[Proxy] WebSocket Error:', err.message);
156
+ },
157
+ },
158
+ }),
159
+ ],
160
+ });
161
+ ```
162
+
163
+ ### Vite 项目 (vite.config.js) - 基础 Cookie 注入
164
+
165
+ ```javascript
166
+ import { defineConfig } from 'vite';
167
+ import { viteDevProxyCookie } from 'dev-proxy-cookie';
168
+
169
+ export default defineConfig({
170
+ plugins: [
171
+ viteDevProxyCookie({
172
+ cookieFile: './cookie.txt',
173
+ debug: true,
174
+ onCookieChange: (cookie) => {
175
+ console.log('Cookie updated:', cookie);
176
+ },
177
+ }),
178
+ ],
179
+ });
180
+ ```
181
+
182
+ ## API 文档
183
+
184
+ ### Vue CLI 相关
185
+
186
+ #### createVueProxyConfig(target, options)
187
+
188
+ 创建兼容 Vue CLI 的代理配置。
189
+
190
+ **参数:**
191
+
192
+ - `target` (string): 目标服务器地址(必需)
193
+ - `options` (object):
194
+ - `getCookie` (() => string): 获取当前 Cookie 的函数
195
+ - `debug` (boolean): 是否开启调试日志,默认 `false`
196
+ - `headers` (object): 自定义请求头
197
+ - `ws` (boolean): WebSocket 支持,默认 `false`
198
+ - `changeOrigin` (boolean): 是否改变请求来源,默认 `true`
199
+ - `secure` (boolean): 是否验证 SSL 证书,默认 `false`
200
+ - `followRedirects` (boolean): 是否跟随重定向,默认 `true`
201
+ - `hooks` (object): 钩子函数配置
202
+
203
+ **返回值:**
204
+ 标准的代理配置对象,可直接用于 vue.config.js。
205
+
206
+ #### createAutoProxyConfig(options)
207
+
208
+ 创建自动代理配置,代理所有请求到目标服务器。
209
+
210
+ **参数:**
211
+
212
+ - `target` (string): 默认代理目标地址(必需)
213
+ - `getCookie` (() => string): Cookie 获取函数
214
+ - `debug` (boolean): 是否开启调试日志,默认 `false`
215
+ - `ws` (boolean): WebSocket 支持,默认 `false`
216
+ - `changeOrigin` (boolean): 是否改变请求来源,默认 `true`
217
+ - `secure` (boolean): 是否验证 SSL 证书,默认 `false`
218
+ - `followRedirects` (boolean): 是否跟随重定向,默认 `true`
219
+ - `autoRewrite` (boolean): 自动重写路径,默认 `false`
220
+ - `protocolRewrite` (string): 协议重写(http/https)
221
+ - `cookieDomainRewrite` (boolean | string | object): Cookie 域名重写
222
+ - `cookiePathRewrite` (boolean | string | object): Cookie 路径重写
223
+ - `headers` (object): 自定义请求头
224
+ - `logLevel` (string): 日志级别(debug/info/warn/error),默认 `info`
225
+ - `includePaths` (string[]): 只代理这些路径(白名单模式)
226
+ - `ignorePaths` (string[]): 忽略这些路径(黑名单模式)
227
+ - `additionalProxies` (object): 额外的代理配置
228
+ - `hooks` (object): 钩子函数配置
229
+
230
+ **工作原理:**
231
+
232
+ - **白名单模式**:设置 `includePaths` 后,只有匹配的路径才会被代理
233
+ - **黑名单模式**:设置 `ignorePaths` 后,除这些路径外其他都代理
234
+ - **优先级**:`includePaths` > `ignorePaths`,`additionalProxies` 优先级最高
235
+
236
+ #### createFileCookieGetter(cookieFile, options)
237
+
238
+ 快速创建 Cookie 获取函数,自动监听文件变化。
239
+
240
+ ```javascript
241
+ const getCookie = createFileCookieGetter('./cookie.txt', {
242
+ watch: true, // 是否监听文件变化,默认 'auto'
243
+ debug: true, // 是否输出调试日志,默认 false
244
+ isDev: process.env.NODE_ENV === 'development', // 是否为开发环境(优先级最高)
245
+ });
246
+ ```
247
+
248
+ **选项:**
249
+
250
+ - `cookieFile` (string): Cookie 文件路径(必需)
251
+ - `watch` (boolean | 'auto'): 是否监听文件变化,默认 `'auto'`
252
+ - `true`: 始终监听
253
+ - `false`: 从不监听
254
+ - `'auto'`: 根据环境自动判断(默认)
255
+ - `debug` (boolean): 是否输出调试日志,默认 `false`
256
+ - `productionEnvs` (string[]): 自定义生产环境变量列表,用于判断是否禁用监听
257
+ - `isDev` (boolean): 是否为开发环境(优先级最高)
258
+ - 设置此参数后,将直接决定是否启用文件监听
259
+ - `true`: 启用监听(开发模式)
260
+ - `false`: 禁用监听(生产模式)
261
+
262
+ **参数优先级:**
263
+
264
+ ```
265
+ isDev (最高) → watch (中等) → 智能检测 (最低)
266
+ ```
267
+
268
+ ### Vite 相关
269
+
270
+ #### viteAutoProxyCookie(options)
271
+
272
+ Vite 插件,自动配置代理和 Cookie 注入。
273
+
274
+ **选项:**
275
+
276
+ - `cookieFile` (string): Cookie 文件路径(必需)
277
+ - `target` (string): 默认代理目标(必需)
278
+ - `debug` (boolean): 是否开启调试日志,默认 `false`
279
+ - `autoRestart` (boolean): 是否启用自动重启标记,默认 `true`
280
+ - `restartMarkerFile` (string): 重启标记文件路径,默认 `.cookie-restart-marker`
281
+ - `ws` (boolean): WebSocket 支持,默认 `true`
282
+ - `changeOrigin` (boolean): 是否改变请求来源,默认 `true`
283
+ - `secure` (boolean): 是否验证 SSL 证书,默认 `false`
284
+ - `followRedirects` (boolean): 是否跟随重定向,默认 `true`
285
+ - `proxyMap` (object): 特定路径映射
286
+ - `includePaths` (string[]): 只代理这些路径
287
+ - `ignorePaths` (array): 忽略的路径
288
+ - `hooks` (object): 钩子函数配置
289
+ - `isDev` (boolean): 是否为开发环境(优先级最高)
290
+ - 设置此参数后,将直接决定是否启用文件监听
291
+ - `true`: 启用监听(开发模式)
292
+ - `false`: 禁用监听(生产模式)
293
+
294
+ #### viteDevProxyCookie(options)
295
+
296
+ Vite 插件,基础 Cookie 注入功能。
297
+
298
+ **选项:**
299
+
300
+ - `cookieFile` (string): Cookie 文件路径(必需)
301
+ - `debug` (boolean): 是否开启调试日志,默认 `false`
302
+ - `onCookieChange` ((cookie: string) => void): Cookie 变化回调
303
+ - `watch` (boolean | 'auto'): 是否监听文件变化,默认 `'auto'`
304
+ - `true`: 始终监听
305
+ - `false`: 从不监听
306
+ - `'auto'`: 根据环境自动判断(默认)
307
+ - `isDev` (boolean): 是否为开发环境(优先级最高)
308
+ - 设置此参数后,将直接决定是否启用文件监听
309
+ - `true`: 启用监听(开发模式)
310
+ - `false`: 禁用监听(生产模式)
311
+
312
+ ### 工具类
313
+
314
+ #### CookieReader
315
+
316
+ Cookie 文件读取器。
317
+
318
+ ```javascript
319
+ import { CookieReader } from 'dev-proxy-cookie';
320
+
321
+ const reader = new CookieReader({
322
+ cookieFile: './cookie.txt',
323
+ encoding: 'utf-8', // 文件编码,默认 utf-8
324
+ });
325
+ const cookie = reader.readCookie();
326
+ ```
327
+
328
+ **方法:**
329
+
330
+ - `readCookie()`: 读取并返回 Cookie 字符串
331
+ - `ensureCookieFile()`: 确保 Cookie 文件存在,不存在则创建
332
+
333
+ #### CookieWatcher
334
+
335
+ Cookie 文件监听器,基于 chokidar。
336
+
337
+ ```javascript
338
+ import { CookieWatcher } from 'dev-proxy-cookie';
339
+
340
+ const watcher = new CookieWatcher({
341
+ cookieFile: './cookie.txt',
342
+ onCookieChange: (cookie) => {
343
+ console.log('Cookie changed:', cookie);
344
+ },
345
+ onError: (error) => {
346
+ console.error('Watcher error:', error);
347
+ },
348
+ autoCreateFile: true, // 自动创建文件,默认 true
349
+ });
350
+
351
+ watcher.start();
352
+ // watcher.stop();
353
+ ```
354
+
355
+ **方法:**
356
+
357
+ - `start()`: 开始监听
358
+ - `stop()`: 停止监听
359
+ - `getCurrentCookie()`: 获取当前 Cookie 值
360
+
361
+ ### 钩子函数
362
+
363
+ 钩子函数允许你在代理过程中插入自定义逻辑。
364
+
365
+ ```javascript
366
+ hooks: {
367
+ // 请求代理前触发
368
+ onProxyReq: (proxyReq, req, res) => {
369
+ console.log('[Proxy] Request:', req.method, req.url);
370
+ // 可以修改 proxyReq 来添加自定义请求头
371
+ proxyReq.setHeader('X-Custom-Header', 'value');
372
+ },
373
+
374
+ // 响应代理前触发
375
+ onProxyRes: (proxyRes, req, res) => {
376
+ console.log('[Proxy] Response:', req.url, proxyRes.statusCode);
377
+ // 可以修改 proxyRes.headers 来修改响应头
378
+ },
379
+
380
+ // 代理错误时触发
381
+ onError: (err, req, res) => {
382
+ console.error('[Proxy] Error:', err.message);
383
+ // 可以自定义错误响应
384
+ res.writeHead(503, { 'Content-Type': 'text/plain' });
385
+ res.end('Proxy error');
386
+ },
387
+
388
+ // WebSocket 错误时触发
389
+ onWsError: (err, req, socket) => {
390
+ console.error('[Proxy] WebSocket Error:', err.message);
391
+ socket.close();
392
+ },
393
+ }
394
+ ```
395
+
396
+ ## Cookie 文件格式
397
+
398
+ 支持两种格式:
399
+
400
+ ### 格式一:单行模式
401
+
402
+ ```
403
+ JSESSIONID=abc123; user=admin; token=xyz789
404
+ ```
405
+
406
+ ### 格式二:多行模式(推荐)
407
+
408
+ 每行一个 Cookie,支持注释:
409
+
410
+ ```
411
+ # ============================================================
412
+ # 开发环境 Cookie 配置文件
413
+ # ============================================================
414
+ # 说明:
415
+ # 1. 每行一个 Cookie 键值对
416
+ # 2. 以 # 开头的行是注释
417
+ # 3. Cookie 值末尾的分号可选
418
+ # 4. 修改此文件后,代理会自动更新 Cookie(无需重启服务器)
419
+ # ============================================================
420
+
421
+ # IRS 会话凭证
422
+ irs-session-id=YTFmYjk0YmQtNTdhZS00ZGFkLThiYTYtNDM3NDc4MzJmYTg4
423
+
424
+ # 用户会话前缀
425
+ uc_session_pre=ttcm1f6JnH2lPpMVLNvHg4bP3LaK6DcQ42O1FoE1xXLBoZNq24qmrcoAlLrYL7M1Y6KG/tOuzcw7TMuXL80orQ==
426
+
427
+ # DOS 会话凭证
428
+ dos-session-id=YWQxMWUwMTktZjI4Yi00NzNmLTkzOTItMWFmMzBiZTYzZTBm
429
+ ```
430
+
431
+ **注意**:多行模式下,空行和以 `#` 开头的注释行会被自动过滤。
432
+
433
+ ## 项目结构
434
+
435
+ ```
436
+ src/
437
+ ├── proxy/ # 代理模块
438
+ │ ├── core.ts # 代理核心逻辑
439
+ │ ├── vite-plugin.ts # Vite自动代理插件
440
+ │ ├── vite-cookie-plugin.ts # Vite Cookie插件
441
+ │ └── webpack-plugin.ts # Webpack代理配置
442
+ ├── utils/ # 工具模块
443
+ │ ├── cookie-reader.ts # Cookie读取器(支持注释过滤)
444
+ │ └── cookie-watcher.ts # Cookie文件监听
445
+ └── index.ts # 主导出
446
+ ```
447
+
448
+ ## 配置选项汇总
449
+
450
+ ### 代理服务器配置
451
+
452
+ | 选项 | 类型 | 默认值 | 说明 |
453
+ | ----------------------- | --------------------- | ------ | ---------------------- |
454
+ | `ws` | boolean | false | WebSocket 支持 |
455
+ | `changeOrigin` | boolean | true | 是否改变请求来源 |
456
+ | `secure` | boolean | false | 是否验证 SSL 证书 |
457
+ | `followRedirects` | boolean | true | 是否跟随重定向 |
458
+ | `autoRewrite` | boolean | false | 自动重写路径 |
459
+ | `protocolRewrite` | string | - | 协议重写(http/https) |
460
+ | `cookieDomainRewrite` | boolean/string/object | - | Cookie 域名重写 |
461
+ | `cookiePathRewrite` | boolean/string/object | - | Cookie 路径重写 |
462
+ | `headers` | object | - | 自定义请求头 |
463
+ | `logLevel` | string | 'info' | 日志级别 |
464
+
465
+ ### 路径过滤配置
466
+
467
+ | 选项 | 类型 | 说明 |
468
+ | ------------------------------------ | -------- | -------------------------- |
469
+ | `includePaths` | string[] | 白名单模式,只代理这些路径 |
470
+ | `ignorePaths` | string[] | 黑名单模式,忽略这些路径 |
471
+ | `proxyMap` / `additionalProxies` | object | 额外代理配置,优先级最高 |
472
+
473
+ ### Cookie 配置
474
+
475
+ | 选项 | 类型 | 默认值 | 说明 |
476
+ | -------------- | -------- | ------ | ---------------- |
477
+ | `cookieFile` | string | - | Cookie 文件路径 |
478
+ | `getCookie` | function | - | Cookie 获取函数 |
479
+ | `watch` | boolean | false | 是否监听文件变化 |
480
+ | `debug` | boolean | false | 是否输出调试日志 |
481
+
482
+ ## 注意事项
483
+
484
+ 1. **Cookie 文件变化**:Cookie 文件变化后,代理会立即使用新的 Cookie,无需重启服务器
485
+ 2. **Git 忽略**:建议将 Cookie 文件添加到 `.gitignore`
486
+ 3. **Vue CLI vs Vite**:Vue CLI 项目建议使用 `createVueProxyConfig` 或 `createAutoProxyConfig`,Vite 项目建议使用 `viteAutoProxyCookie`
487
+ 4. **自动重启**:`autoRestart` 选项会在 Cookie 变化时写入标记文件,需要外部脚本配合检测重启
488
+ 5. **路径优先级**:`includePaths` 和 `ignorePaths` 不能同时生效,`includePaths` 优先
489
+ 6. **代理映射优先级**:`proxyMap`(Vite)或 `additionalProxies`(Vue CLI)中的路径不受 `includePaths`/`ignorePaths` 限制
490
+ 7. **Cookie 格式**:支持单行和多行格式,多行格式支持注释(以 `#` 开头)
491
+
492
+ ## 最佳实践
493
+
494
+ ### 推荐配置
495
+
496
+ ```javascript
497
+ // cookie.txt - 存放登录后的 Cookie
498
+ session-id=abc123
499
+ uc_session_pre=xyz789
500
+ xxx-session-id=def456
501
+
502
+ // .gitignore - 忽略敏感文件
503
+ cookie.txt
504
+ .cookie-restart-marker
505
+
506
+ // vue.config.js - Vue CLI 项目配置
507
+ const { createAutoProxyConfig, createFileCookieGetter } = require('dev-proxy-cookie');
508
+
509
+ module.exports = {
510
+ devServer: {
511
+ proxy: createAutoProxyConfig({
512
+ target: 'http://localhost:3000',
513
+ getCookie: createFileCookieGetter('./cookie.txt', {
514
+ watch: 'auto', // 自动判断环境
515
+ debug: true,
516
+ }),
517
+ ignorePaths: ['/assets/', '/public/'],
518
+ }),
519
+ },
520
+ };
521
+
522
+ // vite.config.js - Vite 项目配置
523
+ import { viteAutoProxyCookie } from 'dev-proxy-cookie';
524
+
525
+ export default defineConfig({
526
+ plugins: [
527
+ viteAutoProxyCookie({
528
+ cookieFile: './cookie.txt',
529
+ target: 'http://localhost:3000',
530
+ isDev: process.env.NODE_ENV === 'development', // 显式指定环境
531
+ ignorePaths: ['/assets/', '/public/'],
532
+ }),
533
+ ],
534
+ });
535
+ ```
536
+
537
+ ### 环境配置建议
538
+
539
+ **开发环境(推荐使用 `isDev`)**
540
+
541
+ ```javascript
542
+ const getCookie = createFileCookieGetter('./cookie.txt', {
543
+ isDev: process.env.NODE_ENV === 'development',
544
+ debug: true,
545
+ });
546
+ ```
547
+
548
+ **预发布环境(需要调试)**
549
+
550
+ ```javascript
551
+ const getCookie = createFileCookieGetter('./cookie.txt', {
552
+ isDev: true, // 强制启用监听
553
+ debug: true,
554
+ });
555
+ ```
556
+
557
+ **生产环境(禁用监听)**
558
+
559
+ ```javascript
560
+ const getCookie = createFileCookieGetter('./cookie.txt', {
561
+ isDev: false, // 强制禁用监听
562
+ debug: false,
563
+ });
564
+ ```
565
+
566
+ **自动检测(默认行为)**
567
+
568
+ ```javascript
569
+ const getCookie = createFileCookieGetter('./cookie.txt', {
570
+ watch: 'auto', // 默认值,自动判断环境
571
+ debug: true,
572
+ });
573
+ ```
574
+
575
+ ## 常见问题
576
+
577
+ ### Q: Cookie 文件修改后没有生效?
578
+
579
+ A: 请检查:
580
+
581
+ 1. 是否启用了 `watch: true` 选项
582
+ 2. 控制台是否输出了 `[CookieWatcher] Cookie updated from file`
583
+ 3. 如果是第一次配置,可能需要重启开发服务器
584
+
585
+ ### Q: 如何获取浏览器中的 Cookie?
586
+
587
+ A:
588
+
589
+ 1. 打开浏览器访问目标系统并登录
590
+ 2. 打开开发者工具(F12)→ Application → Cookies
591
+ 3. 复制需要的 Cookie 值
592
+ 4. 粘贴到 `cookie.txt` 文件中
593
+
594
+ ### Q: Cookie 值包含特殊字符导致错误?
595
+
596
+ A: Cookie 值会被自动处理,支持包含 `/`、`+`、`=` 等特殊字符。如果出现 `ERR_INVALID_CHAR` 错误,请检查是否有不可见字符或注释格式错误。
597
+
598
+ ### Q: 如何调试代理请求?
599
+
600
+ A: 启用 `debug: true` 选项,控制台会输出详细的代理日志。也可以在 `hooks.onProxyReq` 中添加自定义日志。
601
+
602
+ ### Q: 构建完成后进程不退出,一直挂起?
603
+
604
+ A: 这是由于文件监听器在生产环境下仍然运行导致的。解决方案:
605
+
606
+ **方案一:使用 `isDev` 参数(推荐)**
607
+
608
+ ```javascript
609
+ // Vue CLI 项目
610
+ const getCookie = createFileCookieGetter('./cookie.txt', {
611
+ isDev: process.env.NODE_ENV === 'development',
612
+ debug: true,
613
+ });
614
+
615
+ // Vite 项目
616
+ export default defineConfig({
617
+ plugins: [
618
+ viteDevProxyCookie({
619
+ cookieFile: './cookie.txt',
620
+ isDev: process.env.NODE_ENV === 'development',
621
+ }),
622
+ ],
623
+ });
624
+ ```
625
+
626
+ **方案二:设置 `watch: false`**
627
+
628
+ ```javascript
629
+ const getCookie = createFileCookieGetter('./cookie.txt', {
630
+ watch: false, // 禁用文件监听
631
+ });
632
+ ```
633
+
634
+ **方案三:使用智能检测(默认行为)**
635
+
636
+ ```javascript
637
+ const getCookie = createFileCookieGetter('./cookie.txt', {
638
+ watch: 'auto', // 默认值,自动判断环境
639
+ });
640
+ ```
641
+
642
+ 智能检测会检查以下环境变量:
643
+
644
+ - `NODE_ENV`、`BUILD_MODE`、`VUE_APP_ENV`、`VITE_NODE_ENV` 等
645
+ - CI/CD 环境标识(`CI`)
646
+ - npm 生命周期事件(如 `build`)
647
+ - 进程参数(如 `--mode=production`)
648
+
649
+ ### Q: 如何在预发布环境(staging/uat)启用文件监听?
650
+
651
+ A: 预发布环境通常需要调试,建议显式设置 `isDev: true`:
652
+
653
+ ```javascript
654
+ const getCookie = createFileCookieGetter('./cookie.txt', {
655
+ isDev: true, // 强制启用监听
656
+ debug: true,
657
+ });
658
+ ```
659
+
660
+ 或者使用 `watch: true`:
661
+
662
+ ```javascript
663
+ const getCookie = createFileCookieGetter('./cookie.txt', {
664
+ watch: true, // 始终监听
665
+ debug: true,
666
+ });
667
+ ```
668
+
669
+ ### Q: `isDev`、`watch` 和智能检测的优先级是什么?
670
+
671
+ A: 优先级从高到低:
672
+
673
+ ```
674
+ isDev (最高) → watch (中等) → 智能检测 (最低)
675
+ ```
676
+
677
+ - 如果设置了 `isDev`,直接使用该值
678
+ - 如果 `isDev` 未设置但 `watch` 为 `true` 或 `false`,使用 `watch` 值
679
+ - 如果都未设置或 `watch` 为 `'auto'`,使用智能检测
680
+
681
+ ### Q: 如何自定义生产环境检测?
682
+
683
+ A: 使用 `productionEnvs` 参数:
684
+
685
+ ```javascript
686
+ const getCookie = createFileCookieGetter('./cookie.txt', {
687
+ productionEnvs: ['MY_APP_ENV', 'BUILD_TYPE'], // 自定义环境变量
688
+ debug: true,
689
+ });
690
+ ```
691
+
692
+ ### Q: ESLint 报错 `import/no-extraneous-dependencies`?
693
+
694
+ A: 确保在 `.eslintrc.js` 中正确配置:
695
+
696
+ ```javascript
697
+ module.exports = {
698
+ // ...
699
+ rules: {
700
+ 'import/no-extraneous-dependencies': ['error', {
701
+ devDependencies: true,
702
+ optionalDependencies: false,
703
+ }],
704
+ },
705
+ };
706
+ ```
707
+
708
+ ### Q: 如何查看当前环境检测的详细信息?
709
+
710
+ A: 启用 `debug: true` 选项:
711
+
712
+ ```javascript
713
+ const getCookie = createFileCookieGetter('./cookie.txt', {
714
+ watch: 'auto',
715
+ debug: true, // 输出环境检测日志
716
+ });
717
+ ```
718
+
719
+ 控制台会输出类似信息:
720
+
721
+ ```
722
+ [env-detector] Auto-detected production mode - disabling watch
723
+ ```
724
+
725
+
726
+
727
+ ```
728
+ [env-detector] Auto-detected development mode - enabling watch
729
+ ```
730
+
731
+ ## 发布流程
732
+
733
+ 完整的发布流程文档请查看:[docs/release.md](docs/release.md)
734
+
735
+ ## 问题排查
736
+
737
+ ### 构建进程不退出问题
738
+
739
+ 如果遇到构建完成后进程不退出的问题,请查看详细解决方案:[docs/build-hang-issue.md](docs/build-hang-issue.md)
740
+
741
+ ## License
742
+
743
+ MIT License