mphttpx 2.3.0 → 2.4.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.
Files changed (96) hide show
  1. package/README.md +69 -953
  2. package/dist/cjs/fetchP.js +22 -0
  3. package/dist/cjs/index.js +197 -55
  4. package/dist/esm/fetchP.js +12 -0
  5. package/dist/esm/index.js +5 -18
  6. package/dist/index.d.ts +8 -394
  7. package/dist/mphttpx.cjs.js +6646 -0
  8. package/dist/mphttpx.cjs.min.js +1 -1
  9. package/dist/mphttpx.esm.js +6595 -0
  10. package/dist/mphttpx.esm.min.js +1 -1
  11. package/package.json +27 -9
  12. package/README.zh-CN.md +0 -983
  13. package/dist/cjs/encoding/TextDecoderP.js +0 -174
  14. package/dist/cjs/encoding/TextEncoderP.js +0 -121
  15. package/dist/cjs/event-system/AbortControllerP.js +0 -28
  16. package/dist/cjs/event-system/AbortSignalP.js +0 -120
  17. package/dist/cjs/event-system/CloseEventP.js +0 -36
  18. package/dist/cjs/event-system/CustomEventP.js +0 -35
  19. package/dist/cjs/event-system/EventP.js +0 -127
  20. package/dist/cjs/event-system/EventTargetP.js +0 -155
  21. package/dist/cjs/event-system/MessageEventP.js +0 -61
  22. package/dist/cjs/event-system/ProgressEventP.js +0 -42
  23. package/dist/cjs/fetch-api/BodyImpl.js +0 -167
  24. package/dist/cjs/fetch-api/HeadersP.js +0 -155
  25. package/dist/cjs/fetch-api/RequestP.js +0 -163
  26. package/dist/cjs/fetch-api/ResponseP.js +0 -93
  27. package/dist/cjs/fetch-api/fetchP.js +0 -125
  28. package/dist/cjs/file-system/BlobP.js +0 -111
  29. package/dist/cjs/file-system/FileP.js +0 -34
  30. package/dist/cjs/file-system/FileReaderP.js +0 -173
  31. package/dist/cjs/helpers/Payload.js +0 -96
  32. package/dist/cjs/helpers/decode.js +0 -11
  33. package/dist/cjs/helpers/emitEvent.js +0 -14
  34. package/dist/cjs/helpers/emitProgressEvent.js +0 -19
  35. package/dist/cjs/helpers/encode.js +0 -11
  36. package/dist/cjs/helpers/handlers.js +0 -23
  37. package/dist/cjs/helpers/isArrayBuffer.js +0 -11
  38. package/dist/cjs/helpers/isBlob.js +0 -20
  39. package/dist/cjs/helpers/isEventTarget.js +0 -18
  40. package/dist/cjs/helpers/isSequence.js +0 -13
  41. package/dist/cjs/helpers/isURLSearchParams.js +0 -10
  42. package/dist/cjs/helpers/normalizeMethod.js +0 -11
  43. package/dist/cjs/helpers/statusTextMap.js +0 -68
  44. package/dist/cjs/helpers/toBase64.js +0 -28
  45. package/dist/cjs/mini-program/WebSocketImpl.js +0 -197
  46. package/dist/cjs/mini-program/XMLHttpRequestImpl.js +0 -493
  47. package/dist/cjs/mini-program/connectSocket.js +0 -28
  48. package/dist/cjs/mini-program/platform.js +0 -29
  49. package/dist/cjs/mini-program/request.js +0 -36
  50. package/dist/cjs/network/FormDataP.js +0 -160
  51. package/dist/cjs/network/URLSearchParamsP.js +0 -226
  52. package/dist/cjs/network/XMLHttpRequestEventTargetP.js +0 -64
  53. package/dist/cjs/network/XMLHttpRequestUploadP.js +0 -28
  54. package/dist/cjs/utils.js +0 -56
  55. package/dist/esm/encoding/TextDecoderP.js +0 -171
  56. package/dist/esm/encoding/TextEncoderP.js +0 -118
  57. package/dist/esm/event-system/AbortControllerP.js +0 -25
  58. package/dist/esm/event-system/AbortSignalP.js +0 -115
  59. package/dist/esm/event-system/CloseEventP.js +0 -34
  60. package/dist/esm/event-system/CustomEventP.js +0 -32
  61. package/dist/esm/event-system/EventP.js +0 -122
  62. package/dist/esm/event-system/EventTargetP.js +0 -150
  63. package/dist/esm/event-system/MessageEventP.js +0 -59
  64. package/dist/esm/event-system/ProgressEventP.js +0 -40
  65. package/dist/esm/fetch-api/BodyImpl.js +0 -164
  66. package/dist/esm/fetch-api/HeadersP.js +0 -149
  67. package/dist/esm/fetch-api/RequestP.js +0 -160
  68. package/dist/esm/fetch-api/ResponseP.js +0 -90
  69. package/dist/esm/fetch-api/fetchP.js +0 -121
  70. package/dist/esm/file-system/BlobP.js +0 -108
  71. package/dist/esm/file-system/FileP.js +0 -31
  72. package/dist/esm/file-system/FileReaderP.js +0 -170
  73. package/dist/esm/helpers/Payload.js +0 -94
  74. package/dist/esm/helpers/decode.js +0 -9
  75. package/dist/esm/helpers/emitEvent.js +0 -12
  76. package/dist/esm/helpers/emitProgressEvent.js +0 -17
  77. package/dist/esm/helpers/encode.js +0 -9
  78. package/dist/esm/helpers/handlers.js +0 -20
  79. package/dist/esm/helpers/isArrayBuffer.js +0 -9
  80. package/dist/esm/helpers/isBlob.js +0 -18
  81. package/dist/esm/helpers/isEventTarget.js +0 -16
  82. package/dist/esm/helpers/isSequence.js +0 -11
  83. package/dist/esm/helpers/isURLSearchParams.js +0 -8
  84. package/dist/esm/helpers/normalizeMethod.js +0 -9
  85. package/dist/esm/helpers/statusTextMap.js +0 -66
  86. package/dist/esm/helpers/toBase64.js +0 -26
  87. package/dist/esm/mini-program/WebSocketImpl.js +0 -193
  88. package/dist/esm/mini-program/XMLHttpRequestImpl.js +0 -489
  89. package/dist/esm/mini-program/connectSocket.js +0 -26
  90. package/dist/esm/mini-program/platform.js +0 -27
  91. package/dist/esm/mini-program/request.js +0 -34
  92. package/dist/esm/network/FormDataP.js +0 -157
  93. package/dist/esm/network/URLSearchParamsP.js +0 -223
  94. package/dist/esm/network/XMLHttpRequestEventTargetP.js +0 -61
  95. package/dist/esm/network/XMLHttpRequestUploadP.js +0 -25
  96. package/dist/esm/utils.js +0 -48
package/README.md CHANGED
@@ -1,994 +1,110 @@
1
1
  # MPHTTPX
2
2
 
3
- The `mphttpx` library aims to provide a more ES6-styled [Blob.js][0],
4
- along with a [fetch][1] polyfill that works seamlessly with the Blob-polyfill.
5
- This allows web code to be reused in other environments (such as mini-programs).
3
+ 小程序中浏览器网络 API 的完整 polyfill 实现,一次安装即可使用 `fetch`、`XMLHttpRequest`、`WebSocket` 等标准接口,让小程序开发不再「小」。
6
4
 
7
- ## Table of Contents
5
+ ---
8
6
 
9
- - [MPHTTPX](#mphttpx)
10
- - [Table of Contents](#table-of-contents)
11
- - [Translations](#translations)
12
- - [Features](#features)
13
- - [Installation](#installation)
14
- - [Mini-Program Support](#mini-program-support)
15
- - [Usage](#usage)
16
- - [TextEncoder](#textencoder)
17
- - [Example](#example)
18
- - [Compatibility](#compatibility)
19
- - [TextDecoder](#textdecoder)
20
- - [Example](#example-1)
21
- - [Compatibility](#compatibility-1)
22
- - [Blob](#blob)
23
- - [Example](#example-2)
24
- - [Compatibility](#compatibility-2)
25
- - [File](#file)
26
- - [Example](#example-3)
27
- - [Compatibility](#compatibility-3)
28
- - [FileReader](#filereader)
29
- - [Example](#example-4)
30
- - [Compatibility](#compatibility-4)
31
- - [URLSearchParams](#urlsearchparams)
32
- - [Example](#example-5)
33
- - [Compatibility](#compatibility-5)
34
- - [FormData](#formdata)
35
- - [Example](#example-6)
36
- - [Compatibility](#compatibility-6)
37
- - [fetch](#fetch)
38
- - [Example](#example-7)
39
- - [Compatibility](#compatibility-7)
40
- - [Request](#request)
41
- - [Example](#example-8)
42
- - [Compatibility](#compatibility-8)
43
- - [Response](#response)
44
- - [Example](#example-9)
45
- - [Compatibility](#compatibility-9)
46
- - [Headers](#headers)
47
- - [Example](#example-10)
48
- - [Compatibility](#compatibility-10)
49
- - [AbortController](#abortcontroller)
50
- - [Example](#example-11)
51
- - [Compatibility](#compatibility-11)
52
- - [EventTarget](#eventtarget)
53
- - [Example](#example-12)
54
- - [Compatibility](#compatibility-12)
55
- - [XMLHttpRequest (mini-programs)](#xmlhttprequest-mini-programs)
56
- - [Example](#example-13)
57
- - [Compatibility](#compatibility-13)
58
- - [WebSocket (mini-programs, since 1.1.0)](#websocket-mini-programs-since-110)
59
- - [Example](#example-14)
60
- - [Compatibility](#compatibility-14)
61
- - [Auto Import](#auto-import)
62
- - [UniApp \& Taro](#uniapp--taro)
63
- - [Node.js](#nodejs)
64
- - [License](#license)
7
+ ## 安装
65
8
 
66
- ## Translations
67
-
68
- * [中文文档][3]
69
-
70
- ## Features
71
-
72
- - **TextEncoder**
73
- - **TextDecoder**
74
- - **Blob**
75
- - **File**
76
- - **FileReader**
77
- - **URLSearchParams**
78
- - **FormData**
79
- - **fetch**
80
- - **Headers**
81
- - **Request**
82
- - **Response**
83
- - **AbortController**
84
- - **EventTarget**
85
- - **XMLHttpRequest (mini-programs)**
86
- - **WebSocket (mini-programs, since 1.1.0)**
87
- - **Supports tree-shaking (since 2.0.0)**
88
-
89
- ## Installation
90
-
91
- ```
9
+ ```bash
92
10
  npm install mphttpx
93
11
  ```
94
12
 
95
- ## Mini-Program Support
96
-
97
- | WeChat | Alipay | Baidu | ByteDance | QQ | Kwai | JD | RedNote |
98
- |:------:|:------:|:-----:|:---------:|:--:|:----:|:--:|:-------:|
99
- | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ |
100
-
101
- Note: Modern browsers such as Chrome, Firefox, Edge, and Safari do not need these polyfills;
102
- the relevant implementations imported from the mphttpx library will directly return the native functions of the browser.
103
-
104
- ## Usage
105
-
106
- Note: Every module in mphttpx has a corresponding version with the same name ending in the letter P.
107
- The difference between them is that the versions ending in P are polyfill implementations.
108
-
109
- For example:
110
-
111
- ```javascript
112
- // mphttpx does not modify globalThis in any way.
113
- import { TextEncoder } from "mphttpx"; // returns the global object first; falls back to the polyfill if unavailable.
114
- import { TextEncoderP } from "mphttpx"; // returns the polyfill directly.
115
- ```
116
-
117
- ### TextEncoder
118
-
119
- #### Example
120
-
121
- ```javascript
122
- import { TextEncoder } from "mphttpx";
123
-
124
- const encoder = new TextEncoder();
125
- const encoded = encoder.encode("€");
126
-
127
- console.log(encoded); // Uint8Array(3) [226, 130, 172]
128
- ```
129
-
130
- #### Compatibility
131
-
132
- Properties
133
-
134
- | Property | Available | Description |
135
- | --------- | --------- | -------------|
136
- | encoding | ✔ | utf-8 |
137
-
138
- Methods
139
-
140
- | Method | Available | Description |
141
- | ------- | --------- | -------------|
142
- | encode(string) | ✔ |
143
- | encodeInto(string, uint8Array) | ✔ |
144
-
145
- ### TextDecoder
146
-
147
- #### Example
148
-
149
- ```javascript
150
- import { TextDecoder } from "mphttpx";
151
-
152
- const utf8decoder = new TextDecoder(); // default 'utf-8'
153
- const encodedText = new Uint8Array([240, 160, 174, 183]);
154
-
155
- console.log(utf8decoder.decode(encodedText)); // 𠮷
156
- ```
157
-
158
- #### Compatibility
159
-
160
- Properties
161
-
162
- | Property | Available | Description |
163
- | --------- | --------- | -------------|
164
- | encoding | ✔ | only utf-8 |
165
- | fatal | ✔ |
166
- | ignoreBOM | ✔ |
167
-
168
- Methods
169
-
170
- | Method | Available | Description |
171
- | ------- | --------- | -------------|
172
- | decode() | ✔ |
173
- | decode(buffer) | ✔ |
174
- | decode(buffer, options) | ✔ |
175
-
176
- ### Blob
177
-
178
- #### Example
179
-
180
- Creating a blob
181
-
182
- ```javascript
183
- import { Blob, fetch } from "mphttpx";
184
-
185
- const obj = { hello: "world" };
186
- const blob = new Blob([JSON.stringify(obj, null, 2)], {
187
- type: "application/json",
188
- });
189
-
190
- const another_blob = new Blob(["Hello, World!"], {
191
- type: "text/plain"
192
- });
193
-
194
- fetch("https://www.test.com/blob", {
195
- method: "POST",
196
- body: another_blob,
197
- });
198
- ```
199
-
200
- Extracting data from a blob
201
-
202
- ```javascript
203
- import { Blob, FileReader, fetch } from "mphttpx";
204
-
205
- const blob = new Blob([JSON.stringify({ foo: "bar" })], {
206
- type: "application/json",
207
- });
208
-
209
- const reader = new FileReader();
210
- reader.addEventListener("loadend", () => {
211
- // reader.result contains the contents of blob as a typed array
212
- });
213
- reader.readAsArrayBuffer(blob);
214
-
215
- fetch("https://www.test.com/blob", {
216
- method: "POST",
217
- body: blob,
218
- })
219
- .then(r => r.blob())
220
- .then(r => {
221
- const reader2 = new FileReader();
222
- reader2.onload = () => {
223
- // reader2.result
224
- }
225
- reader2.readAsDataURL(r); // base64
226
- });
227
- ```
228
-
229
- #### Compatibility
230
-
231
- Properties
232
-
233
- | Property | Available | Description |
234
- | --------- | --------- | -------------|
235
- | size | ✔ |
236
- | type | ✔ |
237
-
238
- Methods
239
-
240
- | Method | Available | Description |
241
- | ------- | --------- | -------------|
242
- | arrayBuffer() | ✔ |
243
- | bytes() | ✔ |
244
- | slice() | ✔ |
245
- | slice(start) | ✔ |
246
- | slice(start, end) | ✔ |
247
- | slice(start, end, contentType) | ✔ |
248
- | stream() | ✖ |
249
- | text() | ✔ |
250
-
251
- ### File
252
-
253
- #### Example
254
-
255
- ```javascript
256
- import { File } from "mphttpx";
257
-
258
- const file = new File(["foo"], "foo.txt", {
259
- type: "text/plain",
260
- });
261
- ```
262
-
263
- #### Compatibility
264
-
265
- Properties
266
-
267
- | Property | Available | Description |
268
- | --------- | --------- | -------------|
269
- | lastModified | ✔ |
270
- | name | ✔ |
271
- | webkitRelativePath | ✖ |
272
-
273
- ### FileReader
274
-
275
- #### Example
276
-
277
- ```javascript
278
- import { File, FileReader } from "mphttpx";
279
-
280
- const file = new File([JSON.stringify({ foo: "bar" })], "test.json", {
281
- type: "application/json",
282
- });
283
-
284
- // Read the file
285
- const reader = new FileReader();
286
- reader.onload = () => {
287
- console.log(reader.result);
288
- };
289
- reader.readAsText(file);
290
- ```
291
-
292
- #### Compatibility
293
-
294
- Properties
295
-
296
- | Property | Available | Description |
297
- | --------- | --------- | -------------|
298
- | error | ✔ |
299
- | readyState | ✔ |
300
- | result | ✔ |
301
-
302
- Methods
303
-
304
- | Method | Available | Description |
305
- | ------- | --------- | -------------|
306
- | abort() | ✔ | simulated |
307
- | readAsArrayBuffer() | ✔ |
308
- | readAsBinaryString() | ✔ |
309
- | readAsDataURL() | ✔ |
310
- | readAsText() | ✔ | only utf-8 |
311
-
312
- ### URLSearchParams
313
-
314
- #### Example
315
-
316
- ```javascript
317
- import { URLSearchParams, fetch } from "mphttpx";
318
-
319
- const paramsString = "q=URLUtils.searchParams&topic=api";
320
- const searchParams = new URLSearchParams(paramsString);
321
-
322
- // Iterating the search parameters
323
- for (const p of searchParams) {
324
- console.log(p);
325
- }
326
-
327
- console.log(searchParams.has("topic")); // true
328
- console.log(searchParams.has("topic", "fish")); // false
329
- console.log(searchParams.get("topic") === "api"); // true
330
- console.log(searchParams.getAll("topic")); // ["api"]
331
- console.log(searchParams.get("foo") === null); // true
332
- console.log(searchParams.append("topic", "webdev"));
333
- console.log(searchParams.toString()); // "q=URLUtils.searchParams&topic=api&topic=webdev"
334
- console.log(searchParams.set("topic", "More webdev"));
335
- console.log(searchParams.toString()); // "q=URLUtils.searchParams&topic=More+webdev"
336
- console.log(searchParams.delete("topic"));
337
- console.log(searchParams.toString()); // "q=URLUtils.searchParams"
338
-
339
- // GET
340
- fetch("https://www.test.com/get" + `?${searchParams.toString()}`);
341
-
342
- // POST
343
- fetch("https://www.test.com/post", {
344
- method: "POST",
345
- body: searchParams,
346
- });
347
- ```
348
-
349
- Search parameters can also be an object.
350
-
351
- ```javascript
352
- import { URLSearchParams } from "mphttpx";
353
-
354
- const paramsObj = { foo: "bar", baz: "bar" };
355
- const searchParams = new URLSearchParams(paramsObj);
356
-
357
- console.log(searchParams.toString()); // "foo=bar&baz=bar"
358
- console.log(searchParams.has("foo")); // true
359
- console.log(searchParams.get("foo")); // "bar"
360
- ```
361
-
362
- #### Compatibility
363
-
364
- Properties
365
-
366
- | Property | Available | Description |
367
- | --------- | --------- | -------------|
368
- | size | ✔ |
369
-
370
- Methods
371
-
372
- | Method | Available | Description |
373
- | ------- | --------- | -------------|
374
- | append(name, value) | ✔ |
375
- | delete(name) | ✔ |
376
- | delete(name, value) | ✔ |
377
- | entries() | ✔ |
378
- | forEach(callback) | ✔ |
379
- | forEach(callback, thisArg) | ✔ |
380
- | get(name) | ✔ |
381
- | getAll(name) | ✔ |
382
- | has(name) | ✔ |
383
- | has(name, value) | ✔ |
384
- | keys() | ✔ |
385
- | set(name, value) | ✔ |
386
- | sort() | ✔ |
387
- | toString() | ✔ |
388
- | values() | ✔ |
389
-
390
- ### FormData
391
-
392
- #### Example
393
-
394
- ```javascript
395
- import { FormData, fetch } from "mphttpx";
396
-
397
- const formData = new FormData();
398
- formData.append("username", "Chris");
399
-
400
- const file = new File(["Hello, World!"], "file.txt", {
401
- type: "text/plain",
402
- });
403
- formData.append("file", file);
404
-
405
- fetch("https://www.test.com/formdata", {
406
- method: "POST",
407
- body: formData,
408
- });
409
- ```
410
-
411
- #### Compatibility
412
-
413
- Constructors
414
-
415
- | Constructor | Available | Description |
416
- | ----------- | --------- | -------------|
417
- | new FormData() | ✔ |
418
- | new FormData(form) | ✖ |
419
- | new FormData(form, submitter) | ✖ |
420
-
421
- Methods
422
-
423
- | Method | Available | Description |
424
- | ------- | --------- | -------------|
425
- | append(name, value) | ✔ |
426
- | append(name, value, filename) | ✔ |
427
- | delete(name) | ✔ |
428
- | entries() | ✔ |
429
- | get(name) | ✔ |
430
- | getAll(name) | ✔ |
431
- | has(name) | ✔ |
432
- | keys() | ✔ |
433
- | set(name, value) | ✔ |
434
- | set(name, value, filename) | ✔ |
435
- | values() | ✔ |
436
-
437
- ### fetch
438
-
439
- #### Example
13
+ ## 快速开始
440
14
 
441
15
  ```javascript
442
16
  import { fetch } from "mphttpx";
443
17
 
444
- fetch("http://example.com/movies.json")
445
- .then((response) => response.json())
446
- .then((data) => console.log(data));
18
+ fetch("https://api.example.com/data")
19
+ .then(r => r.json())
20
+ .then(r => console.log(r));
447
21
  ```
448
22
 
449
- Using fetch() to POST JSON data
23
+ ## 功能模块
450
24
 
451
- ```javascript
452
- import { fetch } from "mphttpx";
25
+ | API | 来源 |
26
+ | -------------------------------------------- | ------------------------------- |
27
+ | `fetch` / `Headers` / `Request` / `Response` | fetch-xhr-shim |
28
+ | `Blob` / `File` / `FileReader` | fetch-xhr-shim |
29
+ | `URLSearchParams` / `FormData` | fetch-xhr-shim |
30
+ | `AbortController` / `AbortSignal` | fetch-xhr-shim |
31
+ | `EventTarget` / `Event` / `CustomEvent` | fetch-xhr-shim |
32
+ | `TextEncoder` / `TextDecoder` | fetch-xhr-shim |
33
+ | `XMLHttpRequest` | miniprogram-xmlhttprequest-shim |
34
+ | `WebSocket` | miniprogram-websocket |
453
35
 
454
- const data = { username: "example" };
455
-
456
- fetch("https://example.com/profile", {
457
- method: "POST", // or 'PUT'
458
- headers: {
459
- "Content-Type": "application/json",
460
- },
461
- body: JSON.stringify(data),
462
- })
463
- .then((response) => response.json())
464
- .then((data) => {
465
- console.log("Success:", data);
466
- })
467
- .catch((error) => {
468
- console.error("Error:", error);
469
- });
470
- ```
471
-
472
- Uploading files
36
+ 每个 API 都有对应的 `P` 后缀版本(如 `fetchP`、`BlobP`、`TextEncoderP`),始终返回 polyfill 实现,不会回退至浏览器原生 API。
473
37
 
474
38
  ```javascript
475
- import { fetch, File, FormData } from "mphttpx";
476
-
477
- const formData = new FormData();
478
-
479
- formData.append("username", "abc123");
480
- formData.append("file", new File(["foo"], "foo.txt", { type: "text/plain" }));
481
-
482
- fetch("https://example.com/profile/avatar", {
483
- method: "PUT",
484
- body: formData,
485
- })
486
- .then((response) => response.json())
487
- .then((result) => {
488
- console.log("Success:", result);
489
- })
490
- .catch((error) => {
491
- console.error("Error:", error);
492
- });
493
- ```
494
-
495
- Note: The fetch method of mphttpx is implemented based on XMLHttpRequest, and this underlying implementation is replaceable.
496
-
497
- ```javascript
498
- import { setXMLHttpRequest } from "mphttpx";
499
- setXMLHttpRequest(another_XMLHttpRequest); // custom XMLHttpRequest implementation
39
+ import { fetch, Blob } from "mphttpx"; // 优先返回全局对象,不存在时返回 polyfill
40
+ import { fetchP, BlobP } from "mphttpx"; // 始终返回 polyfill 实现
500
41
  ```
501
42
 
502
- | Syntax | Available | Description |
503
- | ------- | --------- | -------------|
504
- | fetch(resource) | ✔ |
505
- | fetch(resource, options) | ✔ |
43
+ ## 依赖库
506
44
 
507
- #### Compatibility
45
+ | 库 | 提供的 API |
46
+ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
47
+ | [fetch-xhr-shim](https://www.npmjs.com/package/fetch-xhr-shim) | fetch、Headers、Request、Response、<br>Blob、File、FileReader、<br>URLSearchParams、FormData、<br>AbortController、AbortSignal、<br>EventTarget、Event、CustomEvent、<br>TextEncoder、TextDecoder |
48
+ | [miniprogram-xmlhttprequest-shim](https://www.npmjs.com/package/miniprogram-xmlhttprequest-shim) | XMLHttpRequest、<br>Cookie、enableCookie |
49
+ | [miniprogram-websocket](https://www.npmjs.com/package/miniprogram-websocket) | WebSocket |
508
50
 
509
- Refer to Request below.
51
+ API 的详细文档和兼容性说明及更多功能请参阅对应库的 README。
510
52
 
511
- ### Request
53
+ ## 兼容性
512
54
 
513
- #### Example
55
+ | 微信 | 支付宝 | 百度 | 抖音 | QQ | 快手 | 京东 | 小红书 |
56
+ | :---: | :----: | :---: | :---: | :---: | :---: | :---: | :----: |
57
+ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
514
58
 
515
- ```javascript
516
- import { fetch, Request } from "mphttpx";
59
+ 在 Chrome、Firefox、Edge、Safari 等浏览器中,所有导出均直接使用浏览器原生实现,无额外开销。
517
60
 
518
- const request = new Request("https://www.mozilla.org/favicon.ico");
61
+ ## 自动导入
519
62
 
520
- const url = request.url;
521
- const method = request.method;
522
- const credentials = request.credentials;
523
-
524
- fetch(request)
525
- .then((response) => response.blob())
526
- .then((blob) => {
527
- console.log(blob);
528
- });
529
- ```
530
-
531
- ```javascript
532
- import { fetch, Request } from "mphttpx";
533
-
534
- const request = new Request("https://example.com", {
535
- method: "POST",
536
- body: '{"foo": "bar"}',
537
- });
538
-
539
- const url = request.url;
540
- const method = request.method;
541
- const credentials = request.credentials;
542
- const bodyUsed = request.bodyUsed;
543
-
544
- fetch(request)
545
- .then((response) => {
546
- if (response.status === 200) {
547
- return response.json();
548
- } else {
549
- throw new Error("Something went wrong on API server!");
550
- }
551
- })
552
- .then((response) => {
553
- console.debug(response);
554
- // …
555
- })
556
- .catch((error) => {
557
- console.error(error);
558
- });
559
- ```
560
-
561
- #### Compatibility
562
-
563
- Properties
564
-
565
- | Property | Available | Description |
566
- | --------- | --------- | -------------|
567
- | body | ✖ |
568
- | bodyUsed | ✔ |
569
- | cache | ✔ |
570
- | credentials | ✔ |
571
- | destination | ✖ |
572
- | headers | ✔ |
573
- | integrity | ✖ |
574
- | keepalive | ✖ |
575
- | method | ✔ |
576
- | mode | ✖ |
577
- | redirect | ✖ |
578
- | referrer | ✖ |
579
- | referrerPolicy | ✖ |
580
- | signal | ✔ |
581
- | url | ✔ |
582
-
583
- Methods
584
-
585
- | Method | Available | Description |
586
- | ------- | --------- | -------------|
587
- | arrayBuffer() | ✔ |
588
- | blob() | ✔ |
589
- | bytes() | ✔ |
590
- | clone() | ✔ |
591
- | formData() | ✔ |
592
- | json() | ✔ |
593
- | text() | ✔ |
594
-
595
- ### Response
596
-
597
- #### Example
598
-
599
- ```javascript
600
- import { Response, Blob, fetch } from "mphttpx";
601
-
602
- const myBlob = new Blob();
603
- const myOptions = { status: 200, statusText: "SuperSmashingGreat!" };
604
- const myResponse = new Response(myBlob, myOptions);
605
- ```
606
-
607
- #### Compatibility
608
-
609
- Properties
610
-
611
- | Property | Available | Description |
612
- | --------- | --------- | -------------|
613
- | body | ✖ |
614
- | bodyUsed | ✔ |
615
- | headers | ✔ |
616
- | ok | ✔ |
617
- | redirected | ✖ |
618
- | status | ✔ |
619
- | statusText | ✔ |
620
- | type | ✖ |
621
- | url | ✔ |
622
-
623
- Methods
624
-
625
- | Method | Available | Description |
626
- | ------- | --------- | -------------|
627
- | arrayBuffer() | ✔ |
628
- | blob() | ✔ |
629
- | bytes() | ✔ |
630
- | clone() | ✔ |
631
- | formData() | ✔ |
632
- | json() | ✔ |
633
- | text() | ✔ |
634
-
635
- ### Headers
636
-
637
- #### Example
638
-
639
- ```javascript
640
- import { Headers, fetch } from "mphttpx";
641
-
642
- const myHeaders = new Headers();
643
-
644
- myHeaders.append("Content-Type", "text/plain");
645
- myHeaders.get("Content-Type"); // should return 'text/plain'
646
-
647
- fetch("https://www.test.com/headers", {
648
- headers: myHeaders,
649
- });
650
- ```
651
-
652
- The same can be achieved by passing an array of arrays or an object literal to the constructor:
653
-
654
- ```javascript
655
- import { Headers } from "mphttpx";
656
-
657
- let myHeaders = new Headers({
658
- "Content-Type": "text/plain",
659
- });
660
-
661
- // or, using an array of arrays:
662
- myHeaders = new Headers([["Content-Type", "text/plain"]]);
663
-
664
- myHeaders.get("Content-Type"); // should return 'text/plain'
665
- ```
666
-
667
- #### Compatibility
668
-
669
- Methods
670
-
671
- | Method | Available | Description |
672
- | ------- | --------- | -------------|
673
- | append(name, value) | ✔ |
674
- | delete(name) | ✔ |
675
- | entries() | ✔ |
676
- | forEach(callbackFn) | ✔ |
677
- | forEach(callbackFn, thisArg) | ✔ |
678
- | get(name) | ✔ |
679
- | getSetCookie() | ✔ |
680
- | has(name) | ✔ |
681
- | keys() | ✔ |
682
- | set(name, value) | ✔ |
683
- | values() | ✔ |
684
-
685
- ### AbortController
686
-
687
- #### Example
688
-
689
- ```javascript
690
- import { AbortController, fetch } from "mphttpx";
691
-
692
- const controller = new AbortController();
693
-
694
- fetch("https://www.test.com/abort", {
695
- signal: controller.signal,
696
- });
697
- ```
698
-
699
- ```javascript
700
- import { AbortController, AbortSignal, Request, fetch } from "mphttpx";
701
-
702
- async function get() {
703
- const controller = new AbortController();
704
- const request = new Request("https://example.org/get", {
705
- signal: controller.signal,
706
- });
707
-
708
- const response = await fetch(request);
709
- controller.abort();
710
- // The next line will throw `AbortError`
711
- const text = await response.text();
712
- console.log(text);
713
- }
714
- ```
715
-
716
- #### Compatibility
717
-
718
- AbortController Properties
719
-
720
- | Property | Available | Description |
721
- | --------- | --------- | -------------|
722
- | signal | ✔ |
723
-
724
- AbortController Methods
725
-
726
- | Method | Available | Description |
727
- | ------- | --------- | -------------|
728
- | abort() | ✔ |
729
- | abort(reason) | ✔ |
730
-
731
- AbortSignal Properties
732
-
733
- | Property | Available | Description |
734
- | --------- | --------- | -------------|
735
- | aborted | ✔ |
736
- | reason | ✔ |
737
-
738
- AbortSignal Methods
739
-
740
- | Method | Available | Description |
741
- | ------- | --------- | -------------|
742
- | throwIfAborted() | ✔ |
743
-
744
- ### EventTarget
745
-
746
- #### Example
747
-
748
- ```javascript
749
- import { EventTarget, Event, CustomEvent } from "mphttpx";
750
-
751
- const target = new EventTarget();
752
-
753
- target.addEventListener("foo", function (evt) {
754
- console.log(evt);
755
- });
756
-
757
- const evt = new Event("foo");
758
- target.dispatchEvent(evt);
759
-
760
- target.addEventListener("animalfound", function (evt) {
761
- console.log(evt.detail.name);
762
- });
763
-
764
- const catFound = new CustomEvent("animalfound", {
765
- detail: {
766
- name: "cat",
767
- },
768
- });
769
- target.dispatchEvent(catFound);
770
- ```
771
-
772
- #### Compatibility
773
-
774
- Methods
775
-
776
- | Method | Available | Description |
777
- | ------- | --------- | -------------|
778
- | addEventListener(type, listener) | ✔ |
779
- | addEventListener(type, listener, options) | ✔ |
780
- | addEventListener(type, listener, useCapture) | ✔ |
781
- | dispatchEvent(event) | ✔ |
782
- | removeEventListener(type, listener) | ✔ |
783
- | removeEventListener(type, listener, options) | ✔ |
784
- | removeEventListener(type, listener, useCapture) | ✔ |
785
-
786
- ### XMLHttpRequest (mini-programs)
787
-
788
- #### Example
789
-
790
- GET
791
-
792
- ```javascript
793
- import { XMLHttpRequest } from "mphttpx";
794
-
795
- const xhr = new XMLHttpRequest();
796
- xhr.open("GET", "https://example.com/server?foo=bar&lorem=ipsum");
797
-
798
- xhr.onload = () => {
799
- // Request finished. Do processing here.
800
- };
801
-
802
- xhr.send();
803
- ```
804
-
805
- POST
806
-
807
- ```javascript
808
- import { XMLHttpRequest } from "mphttpx";
809
-
810
- const xhr = new XMLHttpRequest();
811
- xhr.open("POST", "https://example.com/server");
812
-
813
- // Send the proper header information along with the request
814
- xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
815
-
816
- xhr.onreadystatechange = () => {
817
- // Call a function when the state changes.
818
- if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
819
- // Request finished. Do processing here.
820
- }
821
- };
822
-
823
- xhr.send(JSON.stringify({ foo: "bar", lorem: "ipsum" }));
824
- ```
825
-
826
- #### Compatibility
827
-
828
- Properties
829
-
830
- | Property | Available | Description |
831
- | --------- | --------- | -------------|
832
- | readyState | ✔ | 2, 3: simulated |
833
- | response | ✔ |
834
- | responseText | ✔ |
835
- | responseType | ✔ | The `"document"` is not supported |
836
- | responseURL | ✔ | The `responseURL` returns the URL used in the original request. |
837
- | responseXML | ✖ |
838
- | status | ✔ |
839
- | statusText | ✔ |
840
- | timeout | ✔ | This value must be less than the default timeout of mini-programs. |
841
- | upload | ✔ | simulated |
842
- | withCredentials | ✖ |
843
-
844
- Methods
845
-
846
- | Method | Available | Description |
847
- | ------- | --------- | -------------|
848
- | abort() | ✔ |
849
- | getAllResponseHeaders() | ✔ |
850
- | getResponseHeader(headerName) | ✔ |
851
- | open(method, url) | ✔ |
852
- | open(method, url, async) | ✔ |
853
- | open(method, url, async, user) | ✔ |
854
- | open(method, url, async, user, password) | ✔ |
855
- | overrideMimeType(mimeType) | ✖ |
856
- | send() | ✔ |
857
- | send(body) | ✔ |
858
- | setRequestHeader(header, value) | ✔ |
859
-
860
- ### WebSocket (mini-programs, since 1.1.0)
861
-
862
- #### Example
863
-
864
- ```javascript
865
- import { WebSocket } from "mphttpx";
866
-
867
- // Create WebSocket connection.
868
- const socket = new WebSocket("wss://example.com:8080");
869
-
870
- // Change binary type from "blob" to "arraybuffer"
871
- socket.binaryType = "arraybuffer";
872
-
873
- // Listen for messages
874
- socket.addEventListener("message", (event) => {
875
- if (event.data instanceof ArrayBuffer) {
876
- // binary frame
877
- const view = new DataView(event.data);
878
- console.log(view.getInt32(0));
879
- } else {
880
- // text frame
881
- console.log(event.data);
882
- }
883
- });
884
- ```
885
-
886
- #### Compatibility
887
-
888
- Properties
889
-
890
- | Property | Available | Description |
891
- | --------- | --------- | -------------|
892
- | binaryType | ✔ |
893
- | bufferedAmount | ✖ |
894
- | extensions | ✖ |
895
- | protocol | ✔ |
896
- | readyState | ✔ |
897
- | url | ✔ |
898
-
899
- Methods
900
-
901
- | Method | Available | Description |
902
- | ------- | --------- | -------------|
903
- | close() | ✔ |
904
- | close(code) | ✔ |
905
- | close(code, reason) | ✔ |
906
- | send(data) | ✔ |
907
-
908
- ## Auto Import
909
-
910
- See [unplugin-auto-import][2] for more details.
63
+ 配合 [unplugin-auto-import](https://www.npmjs.com/package/unplugin-auto-import) 使用:
911
64
 
912
65
  ```javascript
913
- // for reference only
914
66
  AutoImport({
915
- // other configs
916
-
917
- imports: [
918
- // other imports
919
-
920
- {
921
- "mphttpx": [
922
- "TextEncoder",
923
- "TextDecoder",
924
-
925
- "Blob",
926
- "File",
927
- "FileReader",
67
+ imports: [{
68
+ "mphttpx": [
69
+ "fetch", "Headers", "Request", "Response",
70
+ "Blob", "File", "FileReader",
71
+ "URLSearchParams", "FormData",
72
+ "AbortController", "AbortSignal",
73
+ "EventTarget", "Event", "CustomEvent",
74
+ "TextEncoder", "TextDecoder",
928
75
 
929
- "URLSearchParams",
930
- "FormData",
931
-
932
- "fetch",
933
- "Headers",
934
- "Request",
935
- "Response",
936
-
937
- "AbortController",
938
- "AbortSignal",
939
-
940
- "EventTarget",
941
- "Event",
942
- "CustomEvent",
943
-
944
- "XMLHttpRequest", // mini-programs
945
- "WebSocket", // mini-programs
946
- ],
947
- },
948
-
949
- // other imports
950
- ],
951
-
952
- // other configs
76
+ "XMLHttpRequest", // mini-programs
77
+ "WebSocket", // mini-programs
78
+ ],
79
+ }],
953
80
  });
954
81
  ```
955
82
 
956
- Note for `UniApp` developers: If your project is a UniApp mini-program created via HBuilderX using the legacy Vue2 template,
957
- try installing an older version of the unplugin-auto-import plugin that supports CMD, such as version 0.16.7.
958
-
959
- ## UniApp & Taro
83
+ ## 注意事项
960
84
 
961
- ```javascript
962
- import { setRequest } from "mphttpx";
963
- import { setConnectSocket } from "mphttpx";
85
+ - **UniApp (HBuilderX Vue2)**:可能需要安装较低版本的 `unplugin-auto-import`(如 `0.16.7`)以兼容 CMD 模块格式。
86
+ - **支付宝小程序**:`globalThis`、`window`、`XMLHttpRequest` 等为保留字,导入时建议重命名:`import { XMLHttpRequest as myXHR } from "mphttpx";`。
964
87
 
965
- setRequest(uni.request);
966
- // setRequest(Taro.request);
88
+ ## 开源协议
967
89
 
968
- setConnectSocket(uni.connectSocket);
969
- // setConnectSocket(Taro.connectSocket);
970
- ```
90
+ MIT License
971
91
 
972
- Note: When using in UniApp or Taro, if `fetch`, `XMLHttpRequest` or `WebSocket` fails to work, try explicitly setting the request/connectSocket function.
973
-
974
- ## Node.js
975
-
976
- ```bash
977
- npm install xhr2
978
- ```
979
-
980
- ```javascript
981
- import XMLHttpRequest from "xhr2";
982
- import { setXMLHttpRequest } from "mphttpx";
983
-
984
- setXMLHttpRequest(XMLHttpRequest);
985
- ```
92
+ Copyright (c) 2026
986
93
 
987
- ## License
94
+ Permission is hereby granted, free of charge, to any person obtaining a copy
95
+ of this software and associated documentation files (the "Software"), to deal
96
+ in the Software without restriction, including without limitation the rights
97
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
98
+ copies of the Software, and to permit persons to whom the Software is
99
+ furnished to do so, subject to the following conditions:
988
100
 
989
- MIT
101
+ The above copyright notice and this permission notice shall be included in all
102
+ copies or substantial portions of the Software.
990
103
 
991
- [0]: https://github.com/eligrey/Blob.js
992
- [1]: https://github.com/github/fetch
993
- [2]: https://www.npmjs.com/package/unplugin-auto-import
994
- [3]: https://github.com/baoxingzeng/mphttpx/blob/main/README.zh-CN.md
104
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
105
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
106
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
107
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
108
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
109
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
110
+ SOFTWARE.