cainiaoblog 23.2.348 → 23.2.349

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 (403) hide show
  1. package/{app/manual.html → manual.html} +1 -1
  2. package/package.json +1 -1
  3. package/CNAME +0 -1
  4. package/MP_verify_o6dHCK5mIkxNpzvZ.txt +0 -1
  5. package/README.md +0 -8
  6. package/about/index.html +0 -55
  7. package/ads.txt +0 -1
  8. package/archives/2018/index.html +0 -48
  9. package/archives/2019/index.html +0 -48
  10. package/archives/2019/page/2/index.html +0 -48
  11. package/archives/2020/index.html +0 -48
  12. package/archives/2021/index.html +0 -48
  13. package/archives/2022/index.html +0 -48
  14. package/archives/2023/index.html +0 -48
  15. package/archives/index.html +0 -48
  16. package/archives/page/2/index.html +0 -48
  17. package/archives/page/3/index.html +0 -48
  18. package/article/10047.html +0 -148
  19. package/article/10164.html +0 -65
  20. package/article/10624.html +0 -436
  21. package/article/10745.html +0 -586
  22. package/article/11674.html +0 -71
  23. package/article/11939.html +0 -72
  24. package/article/12238.html +0 -86
  25. package/article/1230.html +0 -533
  26. package/article/13265.html +0 -69
  27. package/article/13823.html +0 -78
  28. package/article/14125.html +0 -72
  29. package/article/14192.html +0 -561
  30. package/article/14375.html +0 -85
  31. package/article/14744.html +0 -83
  32. package/article/14936.html +0 -451
  33. package/article/1518.html +0 -250
  34. package/article/15428.html +0 -71
  35. package/article/15518.html +0 -288
  36. package/article/15569.html +0 -418
  37. package/article/1566.html +0 -122
  38. package/article/16017.html +0 -156
  39. package/article/16947.html +0 -440
  40. package/article/17096.html +0 -82
  41. package/article/17246.html +0 -89
  42. package/article/17575.html +0 -350
  43. package/article/179.html +0 -757
  44. package/article/18039.html +0 -233
  45. package/article/18071.html +0 -375
  46. package/article/18142.html +0 -71
  47. package/article/19909.html +0 -160
  48. package/article/20014.html +0 -89
  49. package/article/20021.html +0 -389
  50. package/article/20037.html +0 -280
  51. package/article/20056.html +0 -95
  52. package/article/20093.html +0 -404
  53. package/article/2021.html +0 -607
  54. package/article/20459.html +0 -115
  55. package/article/20613.html +0 -263
  56. package/article/20635.html +0 -71
  57. package/article/21317.html +0 -71
  58. package/article/21320.html +0 -90
  59. package/article/21782.html +0 -548
  60. package/article/22230.html +0 -435
  61. package/article/22237.html +0 -347
  62. package/article/22398.html +0 -109
  63. package/article/22422.html +0 -270
  64. package/article/22565.html +0 -300
  65. package/article/23046.html +0 -250
  66. package/article/23083.html +0 -215
  67. package/article/23195.html +0 -297
  68. package/article/23301.html +0 -835
  69. package/article/23589.html +0 -285
  70. package/article/23655.html +0 -338
  71. package/article/23864.html +0 -76
  72. package/article/23914.html +0 -96
  73. package/article/24169.html +0 -135
  74. package/article/24581.html +0 -349
  75. package/article/2475.html +0 -500
  76. package/article/24826.html +0 -77
  77. package/article/24924.html +0 -247
  78. package/article/25164.html +0 -1495
  79. package/article/25318.html +0 -394
  80. package/article/25710.html +0 -1129
  81. package/article/25734.html +0 -83
  82. package/article/26083.html +0 -174
  83. package/article/26147.html +0 -283
  84. package/article/26291.html +0 -110
  85. package/article/26354.html +0 -71
  86. package/article/26624.html +0 -145
  87. package/article/26639.html +0 -298
  88. package/article/26850.html +0 -138
  89. package/article/26940.html +0 -258
  90. package/article/27796.html +0 -190
  91. package/article/27800.html +0 -161
  92. package/article/28963.html +0 -159
  93. package/article/28976.html +0 -247
  94. package/article/29042.html +0 -72
  95. package/article/29596.html +0 -81
  96. package/article/29619.html +0 -183
  97. package/article/29623.html +0 -329
  98. package/article/29829.html +0 -205
  99. package/article/29abbd1c.html +0 -112
  100. package/article/30215.html +0 -178
  101. package/article/30552.html +0 -78
  102. package/article/30818.html +0 -201
  103. package/article/31330.html +0 -364
  104. package/article/3154.html +0 -577
  105. package/article/31695.html +0 -348
  106. package/article/31826.html +0 -71
  107. package/article/31843.html +0 -132
  108. package/article/32280.html +0 -212
  109. package/article/32431.html +0 -74
  110. package/article/32443.html +0 -72
  111. package/article/32732.html +0 -122
  112. package/article/3286.html +0 -251
  113. package/article/32960.html +0 -198
  114. package/article/33713.html +0 -72
  115. package/article/33899.html +0 -615
  116. package/article/34351.html +0 -74
  117. package/article/34372.html +0 -89
  118. package/article/34410.html +0 -74
  119. package/article/34431.html +0 -118
  120. package/article/3447.html +0 -75
  121. package/article/34474.html +0 -142
  122. package/article/34871.html +0 -147
  123. package/article/35397.html +0 -175
  124. package/article/3544.html +0 -199
  125. package/article/35503.html +0 -115
  126. package/article/35624.html +0 -84
  127. package/article/35697.html +0 -384
  128. package/article/35863.html +0 -73
  129. package/article/36037.html +0 -253
  130. package/article/36118.html +0 -71
  131. package/article/3621.html +0 -119
  132. package/article/36251.html +0 -296
  133. package/article/36642.html +0 -352
  134. package/article/37102.html +0 -763
  135. package/article/37336.html +0 -351
  136. package/article/37351.html +0 -89
  137. package/article/3760.html +0 -294
  138. package/article/37749.html +0 -75
  139. package/article/37789.html +0 -83
  140. package/article/38005.html +0 -765
  141. package/article/38009.html +0 -284
  142. package/article/38269.html +0 -194
  143. package/article/38344.html +0 -88
  144. package/article/38359.html +0 -334
  145. package/article/38423.html +0 -379
  146. package/article/38530.html +0 -213
  147. package/article/38743.html +0 -268
  148. package/article/38753.html +0 -204
  149. package/article/38881.html +0 -71
  150. package/article/39087.html +0 -414
  151. package/article/39309.html +0 -84
  152. package/article/39486.html +0 -73
  153. package/article/39637.html +0 -306
  154. package/article/39839.html +0 -72
  155. package/article/39937.html +0 -152
  156. package/article/39970.html +0 -71
  157. package/article/402.html +0 -559
  158. package/article/40698.html +0 -71
  159. package/article/40811.html +0 -71
  160. package/article/40964.html +0 -462
  161. package/article/41011.html +0 -322
  162. package/article/41152.html +0 -78
  163. package/article/41696.html +0 -71
  164. package/article/41717.html +0 -281
  165. package/article/41777.html +0 -149
  166. package/article/419.html +0 -985
  167. package/article/4233.html +0 -136
  168. package/article/4292.html +0 -86
  169. package/article/43302.html +0 -96
  170. package/article/43397.html +0 -106
  171. package/article/43724.html +0 -281
  172. package/article/43999.html +0 -224
  173. package/article/44426.html +0 -77
  174. package/article/44964.html +0 -137
  175. package/article/45004.html +0 -123
  176. package/article/4510.html +0 -83
  177. package/article/45156.html +0 -320
  178. package/article/45157.html +0 -52
  179. package/article/45267.html +0 -87
  180. package/article/45641.html +0 -207
  181. package/article/45960.html +0 -75
  182. package/article/46100.html +0 -1262
  183. package/article/46366.html +0 -74
  184. package/article/46771.html +0 -96
  185. package/article/46911.html +0 -517
  186. package/article/46948.html +0 -137
  187. package/article/46ee4850.html +0 -349
  188. package/article/47019.html +0 -84
  189. package/article/47532.html +0 -94
  190. package/article/4783.html +0 -429
  191. package/article/47972.html +0 -72
  192. package/article/48216.html +0 -127
  193. package/article/48252.html +0 -185
  194. package/article/48520.html +0 -74
  195. package/article/48722.html +0 -75
  196. package/article/48807.html +0 -99
  197. package/article/49126.html +0 -323
  198. package/article/50001.html +0 -88
  199. package/article/50058.html +0 -151
  200. package/article/50343.html +0 -410
  201. package/article/50510.html +0 -82
  202. package/article/51082.html +0 -98
  203. package/article/51677.html +0 -111
  204. package/article/5204.html +0 -1085
  205. package/article/52500.html +0 -538
  206. package/article/52689.html +0 -259
  207. package/article/52877.html +0 -569
  208. package/article/53125.html +0 -191
  209. package/article/53428.html +0 -251
  210. package/article/53524.html +0 -74
  211. package/article/53698.html +0 -322
  212. package/article/53803e6.html +0 -93
  213. package/article/53924.html +0 -291
  214. package/article/53962.html +0 -253
  215. package/article/54006.html +0 -71
  216. package/article/54018.html +0 -88
  217. package/article/54161.html +0 -83
  218. package/article/54178.html +0 -69
  219. package/article/54258.html +0 -327
  220. package/article/54295.html +0 -214
  221. package/article/54313.html +0 -1976
  222. package/article/54351.html +0 -90
  223. package/article/54604.html +0 -80
  224. package/article/54632.html +0 -71
  225. package/article/54912.html +0 -756
  226. package/article/54918.html +0 -136
  227. package/article/55119.html +0 -136
  228. package/article/55756.html +0 -118
  229. package/article/55769.html +0 -136
  230. package/article/55870.html +0 -161
  231. package/article/56139.html +0 -92
  232. package/article/56557.html +0 -69
  233. package/article/56604.html +0 -69
  234. package/article/56816.html +0 -266
  235. package/article/56926.html +0 -153
  236. package/article/57747.html +0 -409
  237. package/article/57965.html +0 -475
  238. package/article/58816.html +0 -78
  239. package/article/59059.html +0 -435
  240. package/article/59095.html +0 -350
  241. package/article/59349.html +0 -244
  242. package/article/59402.html +0 -216
  243. package/article/59448.html +0 -55
  244. package/article/59870.html +0 -94
  245. package/article/59877.html +0 -208
  246. package/article/5dbb6f41.html +0 -86
  247. package/article/6008.html +0 -75
  248. package/article/60327.html +0 -126
  249. package/article/6035.html +0 -76
  250. package/article/60428.html +0 -71
  251. package/article/60544.html +0 -128
  252. package/article/61319.html +0 -95
  253. package/article/61367.html +0 -93
  254. package/article/624d1918.html +0 -292
  255. package/article/62543.html +0 -71
  256. package/article/62887.html +0 -169
  257. package/article/63074.html +0 -120
  258. package/article/63266.html +0 -311
  259. package/article/63351.html +0 -74
  260. package/article/63542.html +0 -104
  261. package/article/63824.html +0 -275
  262. package/article/64051.html +0 -653
  263. package/article/64189b69.html +0 -72
  264. package/article/64354.html +0 -75
  265. package/article/64869.html +0 -79
  266. package/article/64923.html +0 -596
  267. package/article/65128.html +0 -95
  268. package/article/65295.html +0 -79
  269. package/article/6888.html +0 -75
  270. package/article/7065.html +0 -84
  271. package/article/7455.html +0 -85
  272. package/article/7a3ef8f.html +0 -315
  273. package/article/8140.html +0 -188
  274. package/article/8190.html +0 -85
  275. package/article/8225.html +0 -78
  276. package/article/84c9ccd6.html +0 -159
  277. package/article/8f9a9ae3.html +0 -82
  278. package/article/9174.html +0 -73
  279. package/article/9738.html +0 -294
  280. package/article/9c3c56c.html +0 -682
  281. package/article/a4145266.html +0 -71
  282. package/article/bedea419.html +0 -72
  283. package/article/bf7e7421.html +0 -78
  284. package/article/c1867fbf.html +0 -103
  285. package/article/dcb0db28.html +0 -76
  286. package/article/fc3b727a.html +0 -79
  287. package/atom.xml +0 -441
  288. package/baidusitemap.xml +0 -1079
  289. package/blocks/dns.txt +0 -291
  290. package/blocks/filter.txt +0 -1068
  291. package/blocks/script.js +0 -42
  292. package/categories/CDN/index.html +0 -48
  293. package/categories/IDE/index.html +0 -48
  294. package/categories/git/index.html +0 -48
  295. package/categories/hexo/index.html +0 -48
  296. package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +0 -48
  297. package/categories//345/210/206/344/272/253/index.html +0 -48
  298. package/categories//345/211/215/347/253/257/index.html +0 -48
  299. package/categories//345/211/215/347/253/257/page/2/index.html +0 -48
  300. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +0 -48
  301. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250//347/275/221/347/273/234/345/215/217/350/256/256/index.html +0 -48
  302. package/categories//345/215/232/345/256/242/index.html +0 -48
  303. package/categories//345/267/245/345/205/267/index.html +0 -48
  304. package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +0 -48
  305. package/categories//345/271/277/345/221/212/350/277/207/346/273/244//345/275/261/350/247/206/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
  306. package/categories//345/271/277/345/221/212/350/277/207/346/273/244//350/247/206/351/242/221/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
  307. package/categories//346/255/243/345/210/231/index.html +0 -48
  308. package/categories//346/265/217/350/247/210/345/231/250/index.html +0 -48
  309. package/categories//347/256/227/346/263/225/index.html +0 -48
  310. package/categories//350/265/204/350/256/257/index.html +0 -48
  311. package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +0 -48
  312. package/cdn/css/font-awesome.min.css +0 -4
  313. package/cdn/css/grids-responsive-min.css +0 -7
  314. package/cdn/css/normalize.css +0 -349
  315. package/cdn/css/pure-min.css +0 -11
  316. package/cdn/fonts/fontawesome-webfont.eot +0 -0
  317. package/cdn/fonts/fontawesome-webfont.svg +0 -2671
  318. package/cdn/fonts/fontawesome-webfont.ttf +0 -0
  319. package/cdn/fonts/fontawesome-webfont.woff +0 -0
  320. package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
  321. package/cdn/js/Valine.min.js +0 -17
  322. package/cdn/js/canvas-nest.js +0 -1
  323. package/cdn/js/clipboard.min.js +0 -7
  324. package/cdn/js/crypto-js.js +0 -25
  325. package/cdn/js/jquery.min.js +0 -2
  326. package/css/default.css +0 -1144
  327. package/css/donate.css +0 -338
  328. package/css/hbe.style.css +0 -749
  329. package/css/style.css +0 -2095
  330. package/donate/index.html +0 -40
  331. package/google917dcf72f6e5c7f5.html +0 -1
  332. package/guestbook/index.html +0 -68
  333. package/hosts/ads.txt +0 -149
  334. package/hosts/flash.txt +0 -9
  335. package/hosts/github.txt +0 -15
  336. package/hosts/google.txt +0 -16936
  337. package/hosts/winrar.txt +0 -2
  338. package/img/alipay.svg +0 -46
  339. package/img/bitcoin.svg +0 -135
  340. package/img/blog.ico +0 -0
  341. package/img/blog.png +0 -0
  342. package/img/gaba.png +0 -0
  343. package/img/github.svg +0 -1
  344. package/img/like.svg +0 -1
  345. package/img/mp-mini.jpg +0 -0
  346. package/img/mp.png +0 -0
  347. package/img/paypal.svg +0 -63
  348. package/img/upy_logo.svg +0 -59
  349. package/img/wechat.svg +0 -49
  350. package/index.html +0 -48
  351. package/jd_root.txt +0 -1
  352. package/js/codeblock-resizer.js +0 -51
  353. package/js/dark.js +0 -12
  354. package/js/donate.js +0 -87
  355. package/js/fixedPage.js +0 -110
  356. package/js/gitment.browser.js +0 -3751
  357. package/js/search.js +0 -86
  358. package/js/share.js +0 -60
  359. package/js/smartresize.js +0 -32
  360. package/js/totop.js +0 -12
  361. package/kankan/index.html +0 -1323
  362. package/lib/hbe.js +0 -297
  363. package/page/10/index.html +0 -49
  364. package/page/11/index.html +0 -59
  365. package/page/12/index.html +0 -67
  366. package/page/13/index.html +0 -63
  367. package/page/14/index.html +0 -66
  368. package/page/15/index.html +0 -60
  369. package/page/16/index.html +0 -60
  370. package/page/17/index.html +0 -62
  371. package/page/18/index.html +0 -61
  372. package/page/19/index.html +0 -58
  373. package/page/2/index.html +0 -48
  374. package/page/20/index.html +0 -57
  375. package/page/21/index.html +0 -61
  376. package/page/22/index.html +0 -55
  377. package/page/23/index.html +0 -64
  378. package/page/24/index.html +0 -60
  379. package/page/25/index.html +0 -58
  380. package/page/26/index.html +0 -48
  381. package/page/27/index.html +0 -58
  382. package/page/3/index.html +0 -48
  383. package/page/4/index.html +0 -48
  384. package/page/5/index.html +0 -51
  385. package/page/6/index.html +0 -51
  386. package/page/7/index.html +0 -51
  387. package/page/8/index.html +0 -53
  388. package/page/9/index.html +0 -48
  389. package/randomcall/README.html +0 -1
  390. package/randomcall/lucker.html +0 -290
  391. package/randomcall/lucky.png +0 -0
  392. package/robots.txt +0 -22
  393. package/search.xml +0 -6728
  394. package/sitemap.xml +0 -2694
  395. package/tags//345/216/237/345/210/233/index.html +0 -48
  396. package/tags//345/250/261/344/271/220/index.html +0 -48
  397. package/tags//346/211/213/345/206/231/index.html +0 -48
  398. package/tags//347/226/253/346/203/205/index.html +0 -48
  399. package/tags//350/275/254/350/275/275/index.html +0 -48
  400. package/tags//350/275/254/350/275/275/page/2/index.html +0 -48
  401. package/v.html +0 -22
  402. /package/{appConfigs/config → config} +0 -0
  403. /package/{extConfigs/extension.json → extension.json} +0 -0
@@ -1,147 +0,0 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>为什么axios先请求options再请求post及解决方法 | 前端壹菜鸟</title><link rel="stylesheet" type="text/css" href="//unpkg.com/cainiaoblog@latest/css/style.css"><link rel="stylesheet" type="text/css" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/cainiaoblog@latest/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/normalize.css@latest/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/pure-min.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/grids-responsive-min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"><link rel="icon" mask="" sizes="any" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="Shortcut Icon" type="image/x-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="apple-touch-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="apple-touch-icon-precomposed" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="alternate" type="application/atom+xml" href="/atom.xml"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8385136408348258"></script><script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script><script>(function(){
2
- var bp = document.createElement('script');
3
- var curProtocol = window.location.protocol.split(':')[0];
4
- if (curProtocol === 'https'){
5
- bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
6
- }
7
- else{
8
- bp.src = 'http://push.zhanzhang.baidu.com/push.js';
9
- }
10
- var s = document.getElementsByTagName("script")[0];
11
- s.parentNode.insertBefore(bp, s);
12
- })();
13
- </script><script>(function(){
14
- var src = 'https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba';
15
- document.write('<script src="' + src + '" id="sozz"><\/script>');
16
- })();
17
- </script><script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src='https://hm.baidu.com/hm.js?011f0b44e8452bfa57fbfa23c5fe7683';var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
18
- </script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-150860401-1"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','UA-150860401-1');
19
- </script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">为什么axios先请求options再请求post及解决方法</h1><div class="post-meta"><span class="date">2019-10-08</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 1.1k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 4</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/34871.html#vcomment"><span class="waline-comment-count" data-path="/article/34871.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://blog.csdn.net/Li_dengke/article/details/85040703</code></p>
20
- <span id="more"></span>
21
- <blockquote>
22
- <p>Axios是干什么的?</p>
23
- </blockquote>
24
- <p>Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。</p>
25
- <blockquote>
26
- <p>CORS是什么?</p>
27
- </blockquote>
28
- <p>CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing)。</p>
29
- <p>它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。</p>
30
- <blockquote>
31
- <p>CORS 的局限性</p>
32
- </blockquote>
33
- <p>CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。</p>
34
- <p>整个CORS通信过程,都是浏览器自动完成,不需要用户参与。</p>
35
- <p>浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求。</p>
36
- <p>实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信。</p>
37
- <blockquote>
38
- <p>CORS 的类别</p>
39
- </blockquote>
40
- <ul>
41
- <li>简单请求(simple request)</li>
42
- <li>非简单请求(not-so-simple request)</li>
43
- </ul>
44
- <p><strong>简单请求(simple request)</strong></p>
45
- <p>只要同时满足以下两大条件,就属于简单请求:</p>
46
- <pre><code>请求方法是以下三种方法之一:-HEAD-GET-POST
47
-
48
- HTTP的头信息不超出以下几种字段:- Accept
49
- - Accept-Language
50
- - Content-Language
51
- - Last-Event-ID- Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
52
- </code></pre>
53
- <p>对于简单请求,浏览器直接发出CORS请求。</p>
54
- <p>具体来说,就是在头信息之中,增加一个Origin字段。</p>
55
- <ul>
56
- <li>Access-Control-Allow-Origin: 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。</li>
57
- <li>Access-Control-Allow-Credentials: 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。</li>
58
- <li>Access-Control-Expose-Headers: 该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。</li>
59
- </ul>
60
- <p><strong>非简单请求(not-so-simple request)</strong></p>
61
- <p>复杂跨域请求要满足以下</p>
62
- <pre><code>- 请求方法不是GET/HEAD/POST-POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
63
- - 请求设置了自定义的header字段
64
-
65
- - 1
66
- - 2
67
- - 3
68
- </code></pre>
69
- <ol>
70
- <li><p>非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application&#x2F;json。</p>
71
- </li>
72
- <li><p>非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。</p>
73
- </li>
74
- <li><p>“预检”请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。</p>
75
- </li>
76
- <li><p>浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。</p>
77
- </li>
78
- <li><p>除了Origin字段,”预检”请求的头信息包括两个特殊字段:</p>
79
- </li>
80
- </ol>
81
- <ul>
82
- <li>Access-Control-Request-Method:该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法。</li>
83
- <li>Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段。</li>
84
- </ul>
85
- <p>一旦服务器通过了”预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。</p>
86
- <h2 id="解决axiox默认请求options的方法"><a href="#解决axiox默认请求options的方法" class="headerlink" title="解决axiox默认请求options的方法"></a>解决axiox默认请求options的方法</h2><p>目前的解决方法是:把非简单请求转换为简单请求,如果有更好的方法也欢迎指出,待以后补充完整。</p>
87
- <blockquote>
88
- <p>具体的做法</p>
89
- </blockquote>
90
- <p>比如:</p>
91
- <ul>
92
- <li><p>设置请求头:Content-Type可能是application&#x2F;json格式 将其改为application&#x2F;x-www-form-urlencoded;charset&#x3D;utf-8</p>
93
- </li>
94
- <li><p>序列化请求参数:paramsSerializer</p>
95
- <p> axios.defaults.headers &#x3D;{“Content-Type”:”application&#x2F;x-www-form-urlencoded;charset&#x3D;utf-8”};&#x2F;&#x2F; <code>paramsSerializer</code> 是一个负责 <code>params</code> 序列化的函数&#x2F;&#x2F; (e.g. <a target="_blank" rel="noopener" href="https://www.npmjs.com/package/qs">https://www.npmjs.com/package/qs</a>, <a target="_blank" rel="noopener" href="http://api.jquery.com/jquery.param/">http://api.jquery.com/jquery.param/</a>)<br> axios.defaults.paramsSerializer&#x3D;(params)&#x3D;&gt;{return Qs.stringify(params,{arrayFormat:’brackets’});}</p>
96
- </li>
97
- </ul>
98
- </div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/34871.html">https://xuehuayu.cn/article/34871.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/31843.html">POST请求变成OPTIONS</a><a class="next" href="/article/26639.html">Ajax跨域,这应该是最全的解决方案了</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
99
- const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
100
- const locale = {
101
- placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
102
- sofa: '沙发空缺中,还不快抢~',
103
- };
104
- Waline.init({
105
- el: '#vcomment',
106
- serverURL: serverURL,
107
- pageSize: '20',
108
- visitor: true, // 阅读量统计
109
- requiredMeta: ['nick', 'mail'],
110
- emoji: [
111
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
112
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
113
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
114
- ],
115
- locale,
116
- pageview: true
117
- })
118
- </script></div></div></div><div class="pure-u-1 pure-u-md-1-4 fixed-search hidden_mid_and_down"><div id="sidebar"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/search.min.js"></script><div class="widget"><div class="widget-search"><input class="search" type="radio" name="search" value="baidu" id="baidu" checked="checked"/><label class="label" for="baidu" title="百度全站搜索">百度</label><input class="search" type="radio" name="search" value="google" id="google"/><label class="label" for="google" title="谷歌全站搜索">谷歌</label><input class="search" type="radio" name="search" value="self" id="self"/><label class="label" for="self" title="使用站内搜索">站内</label></div><div class="widget" id="search"><form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"/><input type="hidden" name="si" value="xuehuayu.cn"/><input type="hidden" name="cl" value="3"/><input type="hidden" name="ct" value="2097152"/><input type="hidden" name="s" value="on"/><input class="search-submit" type="submit" value=""/></form></div></div><script>$('input[type=radio][name=search]').change(function() {
119
- var val = $(this).val()
120
- var self = '<div class="search-form"><input id="local-search-input" placeholder="站内搜索,首次慢" type="search" name="q" results="0"><input class="search-submit" type="submit" value=""/><div id="local-search-result"></div></div>'
121
- var google = '<form class="search-form" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="q" maxlength="30" placeholder="谷歌全站搜索"><input type="hidden" name="sitesearch" value="xuehuayu.cn"><input class="search-submit" type="submit" value=""/></form>'
122
- var baidu = '<form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"><input type="hidden" name="si" value="xuehuayu.cn"><input type="hidden" name="cl" value="3"><input type="hidden" name="ct" value="2097152"><input type="hidden" name="s" value="on"><input class="search-submit" type="submit" value=""/></form>'
123
-
124
- if (val === 'self') {
125
- $('#search').html(self)
126
- var search_path = 'search.xml';
127
- if (search_path.length == 0) {
128
- search_path = 'search.xml';
129
- }
130
- var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
131
- searchFunc(path, 'local-search-input', 'local-search-result');
132
- } else if (val === 'baidu') {
133
- $('#search').html(baidu)
134
- } else if (val === 'google') {
135
- $('#search').html(google)
136
- }
137
- })</script><div class="widget widget-wxmp"><img alt="微信公众号" width="100%" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/mp-mini.jpg"/></div><div class="widget widget-categories"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CDN/">CDN</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/IDE/">IDE</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hexo/">hexo</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%85%AC%E5%85%B1%E8%8A%82%E6%97%A5/">公共节日</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E4%BA%AB/">分享</a><span class="category-list-count">29</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/">前端</a><span class="category-list-count">190</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">1</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/">网络协议</a><span class="category-list-count">1</span></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%8D%9A%E5%AE%A2/">博客</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/">广告过滤</a><span class="category-list-count">8</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E5%BD%B1%E8%A7%86%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">影视电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E8%A7%86%E9%A2%91%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">视频电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%AD%A3%E5%88%99/">正则</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E8%AE%AF/">资讯</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%BD%BB%E6%9D%BE%E4%B8%80%E5%88%BB/">轻松一刻</a><span class="category-list-count">1</span></li></ul></div><div class="widget widget-tags"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/%E5%8E%9F%E5%88%9B/" style="font-size: 15px;">原创</a> <a href="/tags/%E8%BD%AC%E8%BD%BD/" style="font-size: 15px;">转载</a> <a href="/tags/%E6%89%8B%E5%86%99/" style="font-size: 15px;">手写</a> <a href="/tags/%E7%96%AB%E6%83%85/" style="font-size: 15px;">疫情</a> <a href="/tags/%E5%A8%B1%E4%B9%90/" style="font-size: 15px;">娱乐</a></div></div><div class="widget widget-recent-posts"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/article/9c3c56c.html">vue、react、webpack、babel</a></li><li class="post-list-item"><a class="post-list-link" href="/article/84c9ccd6.html">精读《SolidJS》</a></li><li class="post-list-item"><a class="post-list-link" href="/article/53803e6.html">git提交注释规范</a></li><li class="post-list-item"><a class="post-list-link" href="/article/a4145266.html">前端数组拍平flat一行代码</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bedea419.html">一道前端this面试题</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bf7e7421.html">git多账号配置</a></li></ul></div><div class="widget widget-links"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/npljy?utm_source=xuehuayu.cn" title="GitHub" target="_blank">GitHub</a><ul></ul><a href="https://laonongmin.online?utm_source=xuehuayu.cn" title="看看" target="_blank">看看</a><ul></ul><a href="https://cainiaoblog.cn?utm_source=xuehuayu.cn" title="菜鸟博客" target="_blank">菜鸟博客</a><ul></ul><a href="mailto:cainiaoblog@126.com" title="友链联系" target="_blank">友链联系</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer"><div class="flex-block justify-center align-center flex-wrap"><a class="gxba-link" id="gxba" rel="nofollow" target="_blank" href="http://beian.miit.gov.cn/">京ICP备20007647号-2</a><a class="gaba-link" id="gaba-link" rel="nofollow" target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031264"><img class="nofancybox" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/gaba.png" alt=""/><span id="gaba">京公网安备 11010802031264号</span><span style="padding-right: 10px;"></span></a><span>Copyright © 2023 </span><a href="/." rel="nofollow">前端壹菜鸟. </a><script>(function(){
138
- var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
139
- if (cnb) {
140
- var gxba =document.getElementById('gxba')
141
- var gaba =document.getElementById('gaba')
142
- var gabaLink =document.getElementById('gaba-link')
143
- gxba.innerText ='京ICP备20007647号-1'
144
- gaba.innerText ='京公网安备 11010802031254号'
145
- gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
146
- }
147
- })()</script></div><div class="flex-block justify-center align-center flex-wrap"><a rel="nofollow" target="_blank" href="https://v6.51.la/s/Guz3lwHCsVme9Cu"><div class="busuanzi_container" id="busuanzi_container"><span class="busuanzi_container_site_pv" id="busuanzi_container_site_pv">访问量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span></span><span class="busuanzi_container_site_uv" id="busuanzi_container_site_uv">访客数:<span id="busuanzi_value_site_uv"><i class="fa fa-spinner"></i></span></span><span style="padding-right: 10px;"></span></div></a><a rel="nofollow" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&amp;utm_medium=referral"><span style="font-weight:bold;letter-spacing: 1px;">本网站由 </span><img class="nofancybox" height="32" style="vertical-align: middle" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/upy_logo.min.svg" alt=""/><span style="font-weight:bold;letter-spacing: 1px;">提供CDN加速/云存储服务</span></a><span style="padding-right: 10px;"></span><a rel="nofollow" style="font-size:18px;font-weight:bold;vertical-align: middle" target="_blank" title="注册就送代金券可直接使用" href="https://console.upyun.com/register/?invite=HyDsjZHIL">注册</a></div></div></div></div><a class="show" id="rocket" href="#top"></a><div class="darkmode-toggle">🌓</div><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/smartresize.min.js"></script></div></body></html>
@@ -1,175 +0,0 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>React 开发人员应该掌握的 22 种神奇工具 | 前端壹菜鸟</title><link rel="stylesheet" type="text/css" href="//unpkg.com/cainiaoblog@latest/css/style.css"><link rel="stylesheet" type="text/css" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/cainiaoblog@latest/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/normalize.css@latest/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/pure-min.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/grids-responsive-min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"><link rel="icon" mask="" sizes="any" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="Shortcut Icon" type="image/x-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="apple-touch-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="apple-touch-icon-precomposed" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="alternate" type="application/atom+xml" href="/atom.xml"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8385136408348258"></script><script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script><script>(function(){
2
- var bp = document.createElement('script');
3
- var curProtocol = window.location.protocol.split(':')[0];
4
- if (curProtocol === 'https'){
5
- bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
6
- }
7
- else{
8
- bp.src = 'http://push.zhanzhang.baidu.com/push.js';
9
- }
10
- var s = document.getElementsByTagName("script")[0];
11
- s.parentNode.insertBefore(bp, s);
12
- })();
13
- </script><script>(function(){
14
- var src = 'https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba';
15
- document.write('<script src="' + src + '" id="sozz"><\/script>');
16
- })();
17
- </script><script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src='https://hm.baidu.com/hm.js?011f0b44e8452bfa57fbfa23c5fe7683';var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
18
- </script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-150860401-1"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','UA-150860401-1');
19
- </script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">React 开发人员应该掌握的 22 种神奇工具</h1><div class="post-meta"><span class="date">2019-12-09</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 4.1k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 15</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/35397.html#vcomment"><span class="waline-comment-count" data-path="/article/35397.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://mp.weixin.qq.com/s/gTwKeYuRFIbEpr1TjY7X8Q</code></p>
20
- <p>众所周知,React 是 JavaScript 库,用于构建出色的用户界面。但是,并不是每个人都在使用相同的工具或都知道所有有用的工具,这些工具有助于使 React 开发体验更有趣,更主动。</p>
21
- <p>以下是 2019 年大家可以用来构建 React 应用程序的 22 个工具(该列表没有按它们的重要性排序)</p>
22
- <span id="more"></span>
23
-
24
- <p><strong>1. webpack-bundle-analyzer</strong></p>
25
- <p>大家有没有想过自己的应用程序哪些包或哪部分占用了全部空间?好了,我们可以用 webpack-bundle-analyzer(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/kIPVmmv%EF%BC%89%E6%9D%A5%E6%9F%A5%E7%9C%8B%EF%BC%8C%E5%AE%83%E5%B0%86%E5%B8%AE%E5%8A%A9%E6%88%91%E4%BB%AC%E8%AF%86%E5%88%AB%E5%87%BA%E5%8D%A0%E7%94%A8%E6%9C%80%E5%A4%9A%E7%A9%BA%E9%97%B4%E7%9A%84%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E3%80%82">https://url.leanapp.cn/kIPVmmv)来查看,它将帮助我们识别出占用最多空间的输出文件。</a><br>它将创建一个实时服务器,并向您提供捆绑包内容的交互式树图可视化。借助此工具包,您可以查看所显示文件的位置,它们的 gzip 大小,解析后的大小及其所属的父子级之间的的详情。<br>好处是什么呢?您可以根据自己看到的来优化您的 React 应用!<br>这是它的屏幕截图:</p>
26
- <p><img src="https://mmbiz.qpic.cn/mmbiz_png/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DDVUkS5DIwrtn56NkllOWtAia0KC1AXVE9IADh0lKGul4kqqFNm02dlw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
27
- <p>您可以清楚地看到 pdf 软件包在应用程序中占据了最大的空间。它还占据了最大屏幕。这非常有用。<br>但是,屏幕截图非常小。我们还可以传递有用的选项以查看更多详细信息,如 generateStatsFile: true ,并且还可以选择生成静态 HTML 文件,保存在开发环境之外的某个地方,以备后用。<br><strong>2. React-Proto</strong><br>React-Proto(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/uijD5K7%EF%BC%89%E6%98%AF%E9%9D%A2%E5%90%91%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E5%92%8C%E8%AE%BE%E8%AE%A1%E4%BA%BA%E5%91%98%E7%9A%84%E5%8E%9F%E5%9E%8B%E5%88%B6%E4%BD%9C%E5%B7%A5%E5%85%B7%E3%80%82%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%A1%8C%E9%9D%A2%E8%BD%AF%E4%BB%B6%EF%BC%8C%E5%9B%A0%E6%AD%A4%E5%9C%A8%E4%BD%BF%E7%94%A8%E4%B9%8B%E5%89%8D%EF%BC%8C%E6%88%91%E4%BB%AC%E9%9C%80%E8%A6%81%E5%85%88%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E3%80%82">https://url.leanapp.cn/uijD5K7)是面向开发人员和设计人员的原型制作工具。这是一个桌面软件,因此在使用之前,我们需要先下载安装。</a><br>这是此软件的使用示例:</p>
28
- <p><img src="https://mmbiz.qpic.cn/mmbiz_png/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DzlTARnZTBDStSL1ibNsIEBoaibteZpicYXfGX1FRfgUZ84T41OyFibGjSQ/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
29
- <p>该应用程序允许我们声明属性及其类型,在树状图中查看组件,导入背景图像,将其定义为有状态或无状态,定义其父组件,放大&#x2F;缩小,以及将原型导出到一个新的或现有的项目中。<br>该应用程序似乎更适合 Mac 用户,不过,它也支持 Windows。<br>当我们完成用户界面映射后,可以选择导出到现有项目或新项目中。如果您选择导出到现有项目并选择根目录,则将其导出到 .&#x2F;src&#x2F;components,如下所示:</p>
30
- <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DrQ2Qh99g2QwmibkVmSV1FmwscibnJLDJPuwIbazPibhdthicLmR9pjUVDw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
31
- <p>以下是在示例中我们使用组件之一的例子:</p>
32
- <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DAaQM2E9ibMpmJLyabdG1gPhQgABXygDR3sLtWnhGMibBr0LthgSKiajeQ/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
33
- <p>React-Proto 在 GitHub 上获得了 2,000 个星标。<br><strong>3. Why Did You Render</strong><br>Why Did You Render(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/m9ZNIA2%EF%BC%89%E7%8C%B4%E5%AD%90%E8%A1%A5%E4%B8%81%EF%BC%9FReact">https://url.leanapp.cn/m9ZNIA2)猴子补丁?React</a> 通知我们可以避免重渲染。这不仅非常有用,还可以指导我们进行项目的性能修复,并帮助我们了解响应工作的方式。而且,当我们对 React 工作原理有更多的了解时,这也能使我们成为更好的 React 开发人员。</p>
34
- <blockquote>
35
- <p>猴子补丁: 这个叫法起源于 Zope 框架,大家在修正 Zope 的 Bug 的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerilla patch)”,后来 guerilla 就渐渐的写成了 gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。</p>
36
- </blockquote>
37
- <p>我们可以通过声明一个额外的静态属性 why Did You Render,并将其值设置为 true,把一个侦听器附加到任意自定义组件:</p>
38
- <pre><code>import React from&#39;react&#39;import Button from&#39;@material-ui/core/Button&#39;
39
- const Child = (props) =&gt; &lt;div &#123;...props&#125; /&gt;
40
- const Child2 = (&#123; children, ...props &#125;) =&gt; (&lt;div &#123;...props&#125;&gt; &#123;children&#125; &lt;Child /&gt;&lt;/div&gt;)
41
- Child2.whyDidYouRender = true
42
- const App = () =&gt; &#123;const [state, setState] = React.useState(&#123;&#125;)
43
- return (&lt;div&gt;&lt;Child&gt;&#123;JSON.stringify(state, null, 2)&#125;&lt;/Child&gt;&lt;div&gt;&lt;Buttontype=&quot;button&quot;onClick=&#123;() =&gt; setState(&#123; hello: &#39;hi&#39; &#125;)&#125;&gt; Submit&lt;/Button&gt;&lt;/div&gt;&lt;Child2&gt;Child #2&lt;/Child2&gt;&lt;/div&gt; )&#125;
44
- exportdefault App
45
- </code></pre>
46
- <p>只有这样做之后,我们的控制台才会弹出令人难以置信的讨厌警报:</p>
47
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
48
- <p>但请不要误会。把它当成一件好事。利用那些烦人的消息,这样我们就可以修复那些浪费的重渲染。<br><strong>4. Create React App</strong><br>大家都知道 Create React App(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/Q1JbLRB%EF%BC%89%E6%98%AF%E5%90%AF%E5%8A%A8%E5%BC%80%E5%8F%91">https://url.leanapp.cn/Q1JbLRB)是启动开发</a> React 项目最快的方法(拥有开箱即用的现代功能)。<br>还有什么能比 npx create-react-app 更简单的呢?<br>我在 Medium 上的教程(以及 Dev.to)都是用 create-react-app 构建 React 接口界面的,只是因为它又快又简单。<br>我们当中有些人可能不知道如何用 CRA 来创建一个 TypeScript 项目。我们要做的就是在末尾加上 typescript:</p>
49
- <pre><code>npx create-react-app &lt;name&gt; --typescript
50
- </code></pre>
51
- <p>这会帮我们省去给 CRA 项目手工添加 TypeScript 的麻烦。<br><strong>5. React-Lifecycle-Visualizer</strong><br>React-Lifecycle-Visualizer(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/7WKDMBe%EF%BC%89%E6%98%AF%E4%B8%80%E4%B8%AA">https://url.leanapp.cn/7WKDMBe)是一个</a> npm 软件包,用于跟踪和可视化任意 React 组件的生命周期方法。</p>
52
- <p>与 Why Did You Render 相似,我们可以选择任何组件来启动生命周期可视化工具:</p>
53
- <pre><code>import React from&#39;react&#39;import &#123; Log, VisualizerProvider, traceLifecycle,&#125; from&#39;react-lifecycle-visualizer&#39;
54
- classTracedComponentextendsReact.Component&#123; state = &#123;loaded: false, &#125;
55
- componentDidMount() &#123;this.props.onMount() &#125;
56
- render() &#123;return&lt;h2&gt;Traced Component&lt;/h2&gt; &#125; &#125;
57
- const EnhancedTracedComponent = traceLifecycle(TracedComponent)
58
- const App = () =&gt; (&lt;VisualizerProvider&gt;&lt;EnhancedTracedComponent /&gt;&lt;Log /&gt;&lt;/VisualizerProvider&gt;)
59
- </code></pre>
60
- <p>运行结果,如下所示:</p>
61
- <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DhaHv5qlcfrT7vN6JF7af8F1ibuTq7uia2XpbK9MuWI7UfYpsM37m1heg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
62
- <p>但是,其中一个缺点是它目前仅适用于类组件,因此尚不支持 Hook 。<br><strong>6. Guppy</strong><br>**<br>**<br>Guppy(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/UOsByMC%EF%BC%89%E6%98%AF">https://url.leanapp.cn/UOsByMC)是</a> React 的一个友好且免费的应用程序管理器和任务运行器,可以在桌面上运行且支持跨平台,我们可以放心用。<br>它提供了很多友好的图形界面,为 React 开发人员的一些典型任务项目提供支持。例如创建新项目,执行任务和管理依赖项。并在 2018 年 8 月添加支持 Windows,因此可以放心,它肯定是跨平台的。<br>以下是 Guppy 使用时的样子:</p>
63
- <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1Dc70yN2S5efErzBvB6sHCVqibEY40mX3PIsw2vdC9HZPicElxImqwCDjA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
64
- <p><strong>7. react-testing-library</strong><br>我一直很喜欢 react-testing-library(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/AAWrJhu%EF%BC%89%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8%E7%BC%96%E5%86%99%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%97%B6%E6%84%9F%E8%A7%89%E4%B8%8D%E9%94%99%E3%80%82%E8%BF%99%E4%B8%AA%E5%8C%85%E6%8F%90%E4%BE%9B%E4%BA%86">https://url.leanapp.cn/AAWrJhu),因为在编写单元测试时感觉不错。这个包提供了</a> DOM 测试实用程序,鼓励良好的测试实践。<br>此解决方案旨在解决测试实施细节的问题,就像用户可以看到它们一样,而不是测试 React 组件的输入&#x2F;输出。<br>测试实施细节并不是确保应用按预期运行的有效方法。当然,我们能够更清楚的了解如何获取组件所需的数据,使用哪种排序方法等。但是,如果我们必须更改实现方式以指向另一个数据库的话,单元测试就会失败,因为这些是耦合逻辑的实现细节。<br>这是 react-testing-library 解决的一个问题,因为理想情况下,我们只希望我们的用户界面能够正常工作并最终正确显示。只要这些组件能够提供预期的输出,数据如何获取到这些组件实际上并不重要。<br>以下是使用此库进行测试的示例代码:</p>
65
- <pre><code>// Hoist helper functions (but not vars) to reuse between test casesconst renderComponent = (&#123; count &#125;) =&gt; render(&lt;StateMockstate=&#123; &#123;count &#125; &#125;&gt;&lt;StatefulCounter /&gt;&lt;/StateMock&gt;, )
66
- it(&#39;renders initial count&#39;, async () =&gt; &#123;// Render new instance in every test to prevent leaking stateconst &#123; getByText &#125; = renderComponent(&#123; count: 5 &#125;)
67
- await waitForElement(() =&gt; getByText(/clicked 5 times/i))&#125;)
68
- it(&#39;increments count&#39;, async () =&gt; &#123;// Render new instance in every test to prevent leaking stateconst &#123; getByText &#125; = renderComponent(&#123; count: 5 &#125;)
69
- fireEvent.click(getByText(&#39;+1&#39;))await waitForElement(() =&gt; getByText(/clicked 6 times/i))&#125;)
70
- </code></pre>
71
- <p><strong>8. React Developer Tools</strong><br>React Developer Tools(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/bO2m1ju%EF%BC%89%E6%98%AF%E4%B8%80%E4%B8%AA%E6%89%A9%E5%B1%95%EF%BC%8C%E5%AE%83%E5%85%81%E8%AE%B8%E5%9C%A8Chrome">https://url.leanapp.cn/bO2m1ju)是一个扩展,它允许在Chrome</a> 和 Firefox 开发人员工具中查看 React 组件层次结构。<br>这是 React 开发中最常见的扩展插件,并且是 React 开发人员用来调试其应用程序的最有用的工具之一。<br><strong>9. Bit</strong><br>在使用诸如 material-ui 或 semantic-ui-react 之类的组件库时,Bit (<a target="_blank" rel="noopener" href="https://bit.dev/%EF%BC%89%E6%98%AF%E4%B8%80%E4%B8%AA%E5%BE%88%E5%A5%BD%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88%E3%80%82%E5%AE%83%E5%8F%AF%E4%BB%A5%E8%AE%A9%E6%88%91%E4%BB%AC%E6%8E%A2%E7%B4%A2%E6%95%B0%E5%8D%83%E4%B8%AA%E5%BC%80%E6%BA%90%E7%BB%84%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%BD%BF%E7%94%A8%E5%AE%83%E4%BB%AC%E6%9D%A5%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E3%80%82">https://bit.dev/)是一个很好的替代方案。它可以让我们探索数千个开源组件,并使用它们来构建项目。</a></p>
72
- <p><img src="https://mmbiz.qpic.cn/mmbiz_gif/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DlOGicX6VHhuY4SAjMslic3aElSJgg3ibUMZ2hGGesaI4DVReiapQ9X8ElA/640?wx_fmt=gif&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1" alt="xuehuayu.cn"></p>
73
- <p>有很多不同的 React 组件,可供任何人使用,包括选项卡、按钮、图表、表格、导航条、下拉菜单、加载旋转器、日期选择器、面包屑导航(breadcrumbs)、图标、布局等等。<br><strong>10. Storybook</strong><br>如果你还不了解 Storybook(<a target="_blank" rel="noopener" href="https://storybook.js.org/%EF%BC%89%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%B8%8C%E6%9C%9B%E8%83%BD%E5%A4%9F%E8%BD%BB%E6%9D%BE%E5%9C%B0%E6%9E%84%E5%BB%BA">https://storybook.js.org/),并且希望能够轻松地构建</a> UI 组件,我强烈建议你立即使用它。该工具启动了支持热重载的实时开发服务器,让我们可以在其中独立地实时开发 React 组件。<br>另一个很棒的事情是,我们可以使用现有的开源插件,将我们的开发经验提升到一个全新的水平。<br>例如,利用 Storybook README 包,我们可以在同一页面上创建 README 文档,同时开发供生产使用的 React 组件。这足以作为常规文档页面:</p>
74
- <p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/JicvOFVvHEe89iae9edLc4JmRV5fxrlQ1DxibnmmBZ6oGRseDJfCfLnVqHngPjDE4s0R8LicpYGOTx1icGY9qTx4hRg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
75
- <p><strong>11. React Sight</strong><br>你是否想过自己的应用程序在流程图中看起来是什么样的?</p>
76
- <p>React -sight(<a target="_blank" rel="noopener" href="https://www.reactsight.com/%EF%BC%89%E5%8F%AF%E4%BB%A5%E8%AE%A9%E6%95%B4%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BB%A5%E6%A0%91%E7%8A%B6%E5%9B%BE%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%B1%95%E7%A4%BA%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%EF%BC%8C%E6%B8%85%E6%A5%9A%E6%9F%A5%E7%9C%8B%E6%88%91%E4%BB%AC%E7%9A%84">https://www.reactsight.com/)可以让整个应用程序以树状图的形式展示层次结构,清楚查看我们的</a> React 应用程序。它还支持 React Router,Redux 和 React Fibre。<br>使用此工具,您可以将鼠标悬停在节点上,这些节点是指向树中与它们直接相关的组件的链接。<br>如果您在查看结果时遇到问题,可以在 地址栏上输入 chrome:extensions,找到 React Sight 框并单击 Allow access to file URLs 开关,如下所示:</p>
77
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
78
- <p><strong>12. React-cosmos</strong><br>React-cosmos(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/x60eDHB%EF%BC%89%E6%98%AF%E7%94%A8%E4%BA%8E%E5%88%9B%E5%BB%BA%E5%8F%AF%E9%87%8D%E5%A4%8D%E4%BD%BF%E7%94%A8">https://url.leanapp.cn/x60eDHB)是用于创建可重复使用</a> React 组件的开发工具。<br>它会扫描项目中的组件,并且可以实现以下功能:</p>
79
- <ul>
80
- <li><p>用属性、上下文和状态的任意组合下渲染组件</p>
81
- </li>
82
- <li><p>模拟每个外部依赖项(例如 API 响应、localStorage 等)</p>
83
- </li>
84
- <li><p>与正在运行的实例进行交互时,查看应用程序状态的实时变化</p>
85
- </li>
86
- </ul>
87
- <p><strong>13. CodeSandbox</strong><br>这是本次推荐中最好的可用工具之一,它可以让我们手动使用 React 的速度比眨眼还快(好吧,也许也没那么快)。<br>这个称为 CodeSandbox(<a target="_blank" rel="noopener" href="https://codesandbox.io/%EF%BC%89%E7%9A%84%E5%B7%A5%E5%85%B7%E6%98%AF%E4%B8%80%E4%B8%AA%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E5%99%A8%EF%BC%8C%E6%88%91%E4%BB%AC%E4%BB%8E%E5%88%9B%E5%BB%BA%E5%8E%9F%E5%9E%8B%E5%88%B0">https://codesandbox.io/)的工具是一个在线编辑器,我们从创建原型到</a> Web 应用程序部署 - 都可以在这个网站实现!<br>在早期,Codesandbox 仅支持 React,但现在已经扩展到 Vue 和 Angular 等库的其他入门模板。他们还支持常见的静态站点生成器(如 gatsby 或 nextjs )创建项目来启动下一个 React Web 项目。<br>关于 codesandbox,它不仅活跃,还有很多有意思的事情可以讨论。<br>如果大家需要探索一下人们为方便大家起见正在构建的一些项目,那么简单地点击一下 explore 就可以访问一大堆代码示例,来帮助大家更新下一个项目:</p>
88
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
89
- <p><strong>14. React bits</strong><br>React bits(<a target="_blank" rel="noopener" href="https://vasanthk.gitbooks.io/react-bits/%EF%BC%89%E6%98%AF">https://vasanthk.gitbooks.io/react-bits/)是</a> React 模式、技术、技巧和窍门的集合,所有这些都以类似在线文档的格式编写,大家可以在同一个选项卡上快速访问不同的设计模式和技术、反模式、样式、UX 变体以及其他有用的与 React 相关的材料。<br>他们有一个 GitHub 存储库,目前有 10437 星。<br>一些示例包括诸如道具代理,在不同场景下处理各种 UX 的组合之类的概念,甚至还提示了每个开发人员应该避免的一些陷阱。<br>这是他们页面上的样子,如大家在左侧的菜单上看到的那样,有很多信息:)</p>
90
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
91
- <p><strong>15. Folderize</strong><br>Folderize(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/CJDTdfQ%EF%BC%89%E6%98%AF%E4%B8%80%E4%B8%AA">https://url.leanapp.cn/CJDTdfQ)是一个</a> VSCode 扩展。它可以让我们将组件文件转换为组件文件夹结构。转换后 React 组件仍将是一个组件,只是现在转换为一个目录而已。<br>例如,假设我们正在创建一个 React 组件,它把文件作为属性以显示有用的信息,比如它们的元数据。元数据组件的逻辑占用了很多行,因此我们决定将其拆分为一个单独的文件。但是,当我们决定这样做时,我们就有了两个相互关联的文件。<br>因此,如果我们的目录如下所示:</p>
92
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
93
- <p>我们可能想把 FileView.js 和 FileMetadata.js 抽象到目录结构中,像 Apples- 那样,特别是如果我们希望添加更多与文件相关的组件,比如 FileScanner.js 。这就是 folderize 可以为我们做的事情,这样它们就可以具有以下类似结构:</p>
94
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
95
- <pre><code>import React from&#39;react&#39;import FileView from&#39;./src/components/FileView&#39;
96
- const App = (props) =&gt; &lt;FileView &#123;...props&#125; /&gt;
97
- exportdefault App
98
- </code></pre>
99
- <p><strong>16. React Starter Projects</strong><br>React Starter Projects(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/DUi8AFk%EF%BC%89%E6%98%AF%E4%B8%80%E4%B8%AA%E5%BE%88%E6%A3%92%E7%9A%84%E4%BE%9D%E8%B5%96%E5%BA%93%E5%88%97%E8%A1%A8%EF%BC%8C%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%80%E4%B8%AA%E9%A1%B5%E9%9D%A2%E4%B8%AD%E6%9F%A5%E7%9C%8B%E5%85%A8%E9%83%A8%E9%A1%B9%E7%9B%AE%E3%80%82%E5%9B%A0%E6%AD%A4%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E8%A7%89%E5%BE%97%E8%83%BD%E5%90%8C%E6%97%B6%E5%BF%AB%E9%80%9F%E6%9F%A5%E7%9C%8B%E5%88%B0%E5%A4%A7%E9%87%8F%E9%80%89%E9%A1%B9%E6%98%AF%E9%9D%9E%E5%B8%B8%E6%9C%89%E7%94%A8%E7%9A%84%EF%BC%8C%E9%82%A3%E4%B9%88%E8%BF%99%E4%B8%AA%E5%BE%88%E9%80%82%E5%90%88%E6%88%91%E4%BB%AC%E3%80%82">https://url.leanapp.cn/DUi8AFk)是一个很棒的依赖库列表,我们可以在一个页面中查看全部项目。因此,如果我们觉得能同时快速查看到大量选项是非常有用的,那么这个很适合我们。</a><br>一旦看到喜欢的入门项目后,我们就可以简单克隆存储库,根据开发中的应用需要进行简单修改。但是,并非所有的库都用来克隆存储库,因为其中一些库需要通过安装形式,才能成为项目的依赖项。这样可以更轻松地获取更新并保持项目整洁。<br>以下是该页面看起来的样子:</p>
100
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
101
- <p><strong>17. Highlight Updates</strong><br>可以说,这个是每个开发者工具包里都应该有的重要工具。Highlight Updates 是 React DevTools 的一项扩展功能,可以查看页面中的哪些组件正在不必要地重新渲染。</p>
102
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
103
- <p>它们会用橙色&#x2F;红色标出严重的重渲染问题,帮助我们在开发页面时更容易的发现一些性能问题。<br>除非我们的目标是构建平庸的应用程序,否则为什么不试试这个在我们身边的好东西。<br><strong>18. React Diff Viewer</strong></p>
104
- <p>React Diff Viewer(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/s0QPrMa%EF%BC%89%E6%98%AF%E4%BD%BF%E7%94%A8">https://url.leanapp.cn/s0QPrMa)是使用</a> Diff 和 React 制作的简单美观的文本差异查看器。支持多种功能,如:分屏视图,内联视图,单词差异,行高亮显示等。<br>如果我们想将此功能嵌入记事本(如 Boostnote)和自定义至应用程序(比如主题颜色、故事演示文档组合等),那么,它将非常有用。</p>
105
- <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
106
- <p><strong>19. JS.coach</strong><br>JS.coach(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/6uPqXJp%EF%BC%89%E6%98%AF%E6%88%91%E7%BB%8F%E5%B8%B8%E7%94%A8%E6%9D%A5%E6%9F%A5%E6%89%BE">https://url.leanapp.cn/6uPqXJp)是我经常用来查找</a> React 相关材料的网站。我不确定为什么提到这个网站的人不多,但在这个页面我发现了几乎所有我需要的信息,它快捷、方便,并不断更新,总是能为我所有的项目提供所需的结果。<br>最近,他们添加了 React VR 选项卡,这真是太好了!<br><strong>20. Awesome React</strong><br>Awesome React(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/6uPqXJp%EF%BC%89%E5%BC%80%E6%BA%90%E5%BA%93%E6%98%AF%E4%B8%80%E4%B8%AA%E4%B8%8E">https://url.leanapp.cn/6uPqXJp)开源库是一个与</a> React 相关的并非常棒的列表。<br>我可能会忘记其他网站只从从这个链接学习 React 。因为可以在此找到大量有用的资源,这些资源肯定会帮助我们构建出色的 React 应用程序!<br><strong>21. Proton Native</strong><br>Proton Native(<a target="_blank" rel="noopener" href="https://url.leanapp.cn/cLIGRY8%EF%BC%89%E4%B8%BA%E5%A4%A7%E5%AE%B6%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E4%B8%AA">https://url.leanapp.cn/cLIGRY8)为大家提供了一个</a> React 环境来构建跨平台的本机桌面应用程序。<br>它是 Electron 的替代产品,只有一些简洁的功能,包括:</p>
107
- <ul>
108
- <li><p>与 React Native 相同的语法</p>
109
- </li>
110
- <li><p>适用于现存的 React 库,例如 Redux</p>
111
- </li>
112
- <li><p>跨平台</p>
113
- </li>
114
- <li><p>原生组件,不再有 Electron</p>
115
- </li>
116
- <li><p>与所有正常的 Node.js 包兼容</p>
117
- </li>
118
- </ul>
119
- <p>有兴趣了解更多吗?请阅读他们的文档(<a target="_blank" rel="noopener" href="https://proton-native.js.org/#/%EF%BC%89%E3%80%82">https://proton-native.js.org/#/)。</a><br><strong>22. Devhints React.js Cheatsheet</strong><br>一个不错的 React 速查表(<a target="_blank" rel="noopener" href="https://devhints.io/react%EF%BC%89%EF%BC%8C%E5%B0%BD%E7%AE%A1%E5%AE%83%E7%BC%BA%E5%B0%91">https://devhints.io/react),尽管它缺少</a> React Hooks。不用担心,我将为 Reactv16.8 + 创建速查表,请继续关注。<br><strong>结论</strong></p>
120
- <p>以上就是本次分享的全部工具。希望能为大家提供帮助。</p>
121
- <blockquote>
122
- <p>本文经原作者 Jsmanifest 授权 LeanCloud 翻译转载,原文有部分删减。<a target="_blank" rel="noopener" href="https://segmentfault.com/a/1190000020860324">https://segmentfault.com/a/1190000020860324</a></p>
123
- </blockquote>
124
- <p>end</p>
125
- <p><img src="https://mmbiz.qpic.cn/mmbiz_png/aDoYvepE5x2xHc4WIGl2pOfcwQngFZppYC3ZCuJiafqsncuYqfbEe6P60zDG35JVKJteqdq79icibIhs4PYLkL5uw/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="xuehuayu.cn"></p>
126
- </div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/35397.html">https://xuehuayu.cn/article/35397.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/3154.html">35道值得收藏的React面试题</a><a class="next" href="/article/402.html">如何用120行代码,实现一个交互完整的拖拽上传组件?</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
127
- const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
128
- const locale = {
129
- placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
130
- sofa: '沙发空缺中,还不快抢~',
131
- };
132
- Waline.init({
133
- el: '#vcomment',
134
- serverURL: serverURL,
135
- pageSize: '20',
136
- visitor: true, // 阅读量统计
137
- requiredMeta: ['nick', 'mail'],
138
- emoji: [
139
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
140
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
141
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
142
- ],
143
- locale,
144
- pageview: true
145
- })
146
- </script></div></div></div><div class="pure-u-1 pure-u-md-1-4 fixed-search hidden_mid_and_down"><div id="sidebar"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/search.min.js"></script><div class="widget"><div class="widget-search"><input class="search" type="radio" name="search" value="baidu" id="baidu" checked="checked"/><label class="label" for="baidu" title="百度全站搜索">百度</label><input class="search" type="radio" name="search" value="google" id="google"/><label class="label" for="google" title="谷歌全站搜索">谷歌</label><input class="search" type="radio" name="search" value="self" id="self"/><label class="label" for="self" title="使用站内搜索">站内</label></div><div class="widget" id="search"><form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"/><input type="hidden" name="si" value="xuehuayu.cn"/><input type="hidden" name="cl" value="3"/><input type="hidden" name="ct" value="2097152"/><input type="hidden" name="s" value="on"/><input class="search-submit" type="submit" value=""/></form></div></div><script>$('input[type=radio][name=search]').change(function() {
147
- var val = $(this).val()
148
- var self = '<div class="search-form"><input id="local-search-input" placeholder="站内搜索,首次慢" type="search" name="q" results="0"><input class="search-submit" type="submit" value=""/><div id="local-search-result"></div></div>'
149
- var google = '<form class="search-form" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="q" maxlength="30" placeholder="谷歌全站搜索"><input type="hidden" name="sitesearch" value="xuehuayu.cn"><input class="search-submit" type="submit" value=""/></form>'
150
- var baidu = '<form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"><input type="hidden" name="si" value="xuehuayu.cn"><input type="hidden" name="cl" value="3"><input type="hidden" name="ct" value="2097152"><input type="hidden" name="s" value="on"><input class="search-submit" type="submit" value=""/></form>'
151
-
152
- if (val === 'self') {
153
- $('#search').html(self)
154
- var search_path = 'search.xml';
155
- if (search_path.length == 0) {
156
- search_path = 'search.xml';
157
- }
158
- var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
159
- searchFunc(path, 'local-search-input', 'local-search-result');
160
- } else if (val === 'baidu') {
161
- $('#search').html(baidu)
162
- } else if (val === 'google') {
163
- $('#search').html(google)
164
- }
165
- })</script><div class="widget widget-wxmp"><img alt="微信公众号" width="100%" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/mp-mini.jpg"/></div><div class="widget widget-categories"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CDN/">CDN</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/IDE/">IDE</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hexo/">hexo</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%85%AC%E5%85%B1%E8%8A%82%E6%97%A5/">公共节日</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E4%BA%AB/">分享</a><span class="category-list-count">29</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/">前端</a><span class="category-list-count">190</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">1</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/">网络协议</a><span class="category-list-count">1</span></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%8D%9A%E5%AE%A2/">博客</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/">广告过滤</a><span class="category-list-count">8</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E5%BD%B1%E8%A7%86%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">影视电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E8%A7%86%E9%A2%91%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">视频电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%AD%A3%E5%88%99/">正则</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E8%AE%AF/">资讯</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%BD%BB%E6%9D%BE%E4%B8%80%E5%88%BB/">轻松一刻</a><span class="category-list-count">1</span></li></ul></div><div class="widget widget-tags"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/%E5%8E%9F%E5%88%9B/" style="font-size: 15px;">原创</a> <a href="/tags/%E8%BD%AC%E8%BD%BD/" style="font-size: 15px;">转载</a> <a href="/tags/%E6%89%8B%E5%86%99/" style="font-size: 15px;">手写</a> <a href="/tags/%E7%96%AB%E6%83%85/" style="font-size: 15px;">疫情</a> <a href="/tags/%E5%A8%B1%E4%B9%90/" style="font-size: 15px;">娱乐</a></div></div><div class="widget widget-recent-posts"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/article/9c3c56c.html">vue、react、webpack、babel</a></li><li class="post-list-item"><a class="post-list-link" href="/article/84c9ccd6.html">精读《SolidJS》</a></li><li class="post-list-item"><a class="post-list-link" href="/article/53803e6.html">git提交注释规范</a></li><li class="post-list-item"><a class="post-list-link" href="/article/a4145266.html">前端数组拍平flat一行代码</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bedea419.html">一道前端this面试题</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bf7e7421.html">git多账号配置</a></li></ul></div><div class="widget widget-links"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/npljy?utm_source=xuehuayu.cn" title="GitHub" target="_blank">GitHub</a><ul></ul><a href="https://laonongmin.online?utm_source=xuehuayu.cn" title="看看" target="_blank">看看</a><ul></ul><a href="https://cainiaoblog.cn?utm_source=xuehuayu.cn" title="菜鸟博客" target="_blank">菜鸟博客</a><ul></ul><a href="mailto:cainiaoblog@126.com" title="友链联系" target="_blank">友链联系</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer"><div class="flex-block justify-center align-center flex-wrap"><a class="gxba-link" id="gxba" rel="nofollow" target="_blank" href="http://beian.miit.gov.cn/">京ICP备20007647号-2</a><a class="gaba-link" id="gaba-link" rel="nofollow" target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031264"><img class="nofancybox" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/gaba.png" alt=""/><span id="gaba">京公网安备 11010802031264号</span><span style="padding-right: 10px;"></span></a><span>Copyright © 2023 </span><a href="/." rel="nofollow">前端壹菜鸟. </a><script>(function(){
166
- var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
167
- if (cnb) {
168
- var gxba =document.getElementById('gxba')
169
- var gaba =document.getElementById('gaba')
170
- var gabaLink =document.getElementById('gaba-link')
171
- gxba.innerText ='京ICP备20007647号-1'
172
- gaba.innerText ='京公网安备 11010802031254号'
173
- gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
174
- }
175
- })()</script></div><div class="flex-block justify-center align-center flex-wrap"><a rel="nofollow" target="_blank" href="https://v6.51.la/s/Guz3lwHCsVme9Cu"><div class="busuanzi_container" id="busuanzi_container"><span class="busuanzi_container_site_pv" id="busuanzi_container_site_pv">访问量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span></span><span class="busuanzi_container_site_uv" id="busuanzi_container_site_uv">访客数:<span id="busuanzi_value_site_uv"><i class="fa fa-spinner"></i></span></span><span style="padding-right: 10px;"></span></div></a><a rel="nofollow" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&amp;utm_medium=referral"><span style="font-weight:bold;letter-spacing: 1px;">本网站由 </span><img class="nofancybox" height="32" style="vertical-align: middle" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/upy_logo.min.svg" alt=""/><span style="font-weight:bold;letter-spacing: 1px;">提供CDN加速/云存储服务</span></a><span style="padding-right: 10px;"></span><a rel="nofollow" style="font-size:18px;font-weight:bold;vertical-align: middle" target="_blank" title="注册就送代金券可直接使用" href="https://console.upyun.com/register/?invite=HyDsjZHIL">注册</a></div></div></div></div><a class="show" id="rocket" href="#top"></a><div class="darkmode-toggle">🌓</div><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/smartresize.min.js"></script></div></body></html>