@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/LICENSE +21 -0
- package/README.md +743 -0
- package/dist/index.d.mts +264 -0
- package/dist/index.d.ts +264 -0
- package/dist/index.js +847 -0
- package/dist/index.min.js +4 -0
- package/dist/index.min.mjs +4 -0
- package/dist/index.mjs +801 -0
- package/package.json +83 -0
- package/src/index.ts +2 -0
- package/src/proxy/apply-dev-cookie-header.ts +14 -0
- package/src/proxy/core.ts +429 -0
- package/src/proxy/index.ts +5 -0
- package/src/proxy/vite-adapter.ts +98 -0
- package/src/proxy/vite-cookie-plugin.ts +94 -0
- package/src/proxy/vite-plugin.ts +66 -0
- package/src/proxy/vue-proxy-config.ts +192 -0
- package/src/utils/cookie-reader.ts +54 -0
- package/src/utils/cookie-watcher.ts +91 -0
- package/src/utils/env-detector.ts +155 -0
- package/src/utils/index.ts +3 -0
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
|