cainiaoblog 23.2.171

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 (401) hide show
  1. package/CNAME +1 -0
  2. package/MP_verify_o6dHCK5mIkxNpzvZ.txt +1 -0
  3. package/README.md +8 -0
  4. package/about/index.html +54 -0
  5. package/ads.txt +1 -0
  6. package/app/manual.html +104 -0
  7. package/appConfigs/config +1 -0
  8. package/archives/2018/index.html +48 -0
  9. package/archives/2019/index.html +48 -0
  10. package/archives/2019/page/2/index.html +48 -0
  11. package/archives/2020/index.html +48 -0
  12. package/archives/2021/index.html +48 -0
  13. package/archives/2022/index.html +48 -0
  14. package/archives/2023/index.html +48 -0
  15. package/archives/index.html +48 -0
  16. package/archives/page/2/index.html +48 -0
  17. package/archives/page/3/index.html +48 -0
  18. package/article/10047.html +148 -0
  19. package/article/10164.html +64 -0
  20. package/article/10624.html +436 -0
  21. package/article/10745.html +586 -0
  22. package/article/11674.html +71 -0
  23. package/article/11939.html +72 -0
  24. package/article/12238.html +86 -0
  25. package/article/1230.html +533 -0
  26. package/article/13265.html +69 -0
  27. package/article/13823.html +78 -0
  28. package/article/14125.html +72 -0
  29. package/article/14192.html +561 -0
  30. package/article/14375.html +85 -0
  31. package/article/14744.html +83 -0
  32. package/article/14936.html +451 -0
  33. package/article/1518.html +250 -0
  34. package/article/15428.html +71 -0
  35. package/article/15518.html +288 -0
  36. package/article/15569.html +418 -0
  37. package/article/1566.html +122 -0
  38. package/article/16017.html +156 -0
  39. package/article/16947.html +440 -0
  40. package/article/17096.html +82 -0
  41. package/article/17246.html +89 -0
  42. package/article/17575.html +350 -0
  43. package/article/179.html +757 -0
  44. package/article/18039.html +233 -0
  45. package/article/18071.html +375 -0
  46. package/article/18142.html +71 -0
  47. package/article/19909.html +160 -0
  48. package/article/20014.html +89 -0
  49. package/article/20021.html +389 -0
  50. package/article/20037.html +280 -0
  51. package/article/20056.html +95 -0
  52. package/article/20093.html +404 -0
  53. package/article/2021.html +607 -0
  54. package/article/20459.html +115 -0
  55. package/article/20613.html +263 -0
  56. package/article/20635.html +71 -0
  57. package/article/21317.html +71 -0
  58. package/article/21320.html +90 -0
  59. package/article/21782.html +548 -0
  60. package/article/22230.html +435 -0
  61. package/article/22237.html +347 -0
  62. package/article/22398.html +109 -0
  63. package/article/22422.html +270 -0
  64. package/article/22565.html +300 -0
  65. package/article/23046.html +250 -0
  66. package/article/23083.html +215 -0
  67. package/article/23195.html +297 -0
  68. package/article/23301.html +835 -0
  69. package/article/23589.html +285 -0
  70. package/article/23655.html +338 -0
  71. package/article/23864.html +76 -0
  72. package/article/23914.html +96 -0
  73. package/article/24169.html +135 -0
  74. package/article/24581.html +349 -0
  75. package/article/2475.html +500 -0
  76. package/article/24826.html +77 -0
  77. package/article/24924.html +247 -0
  78. package/article/25164.html +1495 -0
  79. package/article/25318.html +394 -0
  80. package/article/25710.html +1129 -0
  81. package/article/25734.html +83 -0
  82. package/article/26083.html +174 -0
  83. package/article/26147.html +283 -0
  84. package/article/26291.html +110 -0
  85. package/article/26354.html +71 -0
  86. package/article/26624.html +145 -0
  87. package/article/26639.html +298 -0
  88. package/article/26850.html +138 -0
  89. package/article/26940.html +258 -0
  90. package/article/27796.html +190 -0
  91. package/article/27800.html +161 -0
  92. package/article/28963.html +159 -0
  93. package/article/28976.html +247 -0
  94. package/article/29042.html +72 -0
  95. package/article/29596.html +81 -0
  96. package/article/29619.html +183 -0
  97. package/article/29623.html +329 -0
  98. package/article/29829.html +205 -0
  99. package/article/29abbd1c.html +112 -0
  100. package/article/30215.html +178 -0
  101. package/article/30552.html +78 -0
  102. package/article/30818.html +201 -0
  103. package/article/31330.html +364 -0
  104. package/article/3154.html +577 -0
  105. package/article/31695.html +348 -0
  106. package/article/31826.html +71 -0
  107. package/article/31843.html +132 -0
  108. package/article/32280.html +212 -0
  109. package/article/32431.html +74 -0
  110. package/article/32443.html +72 -0
  111. package/article/32732.html +122 -0
  112. package/article/3286.html +251 -0
  113. package/article/32960.html +198 -0
  114. package/article/33713.html +72 -0
  115. package/article/33899.html +615 -0
  116. package/article/34351.html +74 -0
  117. package/article/34372.html +89 -0
  118. package/article/34410.html +74 -0
  119. package/article/34431.html +118 -0
  120. package/article/3447.html +75 -0
  121. package/article/34474.html +142 -0
  122. package/article/34871.html +147 -0
  123. package/article/35397.html +175 -0
  124. package/article/3544.html +199 -0
  125. package/article/35503.html +115 -0
  126. package/article/35624.html +84 -0
  127. package/article/35697.html +384 -0
  128. package/article/35863.html +73 -0
  129. package/article/36037.html +253 -0
  130. package/article/36118.html +71 -0
  131. package/article/3621.html +119 -0
  132. package/article/36251.html +296 -0
  133. package/article/36642.html +352 -0
  134. package/article/37102.html +763 -0
  135. package/article/37336.html +351 -0
  136. package/article/37351.html +89 -0
  137. package/article/3760.html +294 -0
  138. package/article/37749.html +75 -0
  139. package/article/37789.html +83 -0
  140. package/article/38005.html +765 -0
  141. package/article/38009.html +284 -0
  142. package/article/38269.html +194 -0
  143. package/article/38344.html +88 -0
  144. package/article/38359.html +334 -0
  145. package/article/38423.html +379 -0
  146. package/article/38530.html +213 -0
  147. package/article/38743.html +268 -0
  148. package/article/38753.html +204 -0
  149. package/article/38881.html +71 -0
  150. package/article/39087.html +414 -0
  151. package/article/39309.html +84 -0
  152. package/article/39486.html +74 -0
  153. package/article/39637.html +306 -0
  154. package/article/39839.html +72 -0
  155. package/article/39937.html +152 -0
  156. package/article/39970.html +71 -0
  157. package/article/402.html +559 -0
  158. package/article/40698.html +71 -0
  159. package/article/40811.html +71 -0
  160. package/article/40964.html +462 -0
  161. package/article/41011.html +322 -0
  162. package/article/41152.html +78 -0
  163. package/article/41696.html +71 -0
  164. package/article/41717.html +281 -0
  165. package/article/41777.html +149 -0
  166. package/article/419.html +985 -0
  167. package/article/4233.html +136 -0
  168. package/article/4292.html +86 -0
  169. package/article/43302.html +96 -0
  170. package/article/43397.html +106 -0
  171. package/article/43724.html +281 -0
  172. package/article/43999.html +224 -0
  173. package/article/44426.html +77 -0
  174. package/article/44964.html +137 -0
  175. package/article/45004.html +123 -0
  176. package/article/4510.html +83 -0
  177. package/article/45156.html +320 -0
  178. package/article/45157.html +52 -0
  179. package/article/45267.html +87 -0
  180. package/article/45641.html +207 -0
  181. package/article/45960.html +75 -0
  182. package/article/46100.html +1262 -0
  183. package/article/46366.html +74 -0
  184. package/article/46771.html +96 -0
  185. package/article/46911.html +517 -0
  186. package/article/46948.html +137 -0
  187. package/article/46ee4850.html +349 -0
  188. package/article/47019.html +84 -0
  189. package/article/47532.html +94 -0
  190. package/article/4783.html +429 -0
  191. package/article/47972.html +72 -0
  192. package/article/48216.html +127 -0
  193. package/article/48252.html +185 -0
  194. package/article/48520.html +74 -0
  195. package/article/48722.html +75 -0
  196. package/article/48807.html +99 -0
  197. package/article/49126.html +323 -0
  198. package/article/50001.html +88 -0
  199. package/article/50058.html +151 -0
  200. package/article/50343.html +410 -0
  201. package/article/50510.html +82 -0
  202. package/article/51082.html +98 -0
  203. package/article/51677.html +111 -0
  204. package/article/5204.html +1085 -0
  205. package/article/52500.html +538 -0
  206. package/article/52689.html +259 -0
  207. package/article/52877.html +569 -0
  208. package/article/53125.html +191 -0
  209. package/article/53428.html +251 -0
  210. package/article/53524.html +74 -0
  211. package/article/53698.html +322 -0
  212. package/article/53803e6.html +93 -0
  213. package/article/53924.html +291 -0
  214. package/article/53962.html +253 -0
  215. package/article/54006.html +71 -0
  216. package/article/54018.html +88 -0
  217. package/article/54161.html +83 -0
  218. package/article/54178.html +69 -0
  219. package/article/54258.html +327 -0
  220. package/article/54295.html +214 -0
  221. package/article/54313.html +1976 -0
  222. package/article/54351.html +90 -0
  223. package/article/54604.html +80 -0
  224. package/article/54632.html +71 -0
  225. package/article/54912.html +756 -0
  226. package/article/54918.html +129 -0
  227. package/article/55119.html +136 -0
  228. package/article/55756.html +118 -0
  229. package/article/55769.html +136 -0
  230. package/article/55870.html +161 -0
  231. package/article/56139.html +92 -0
  232. package/article/56557.html +69 -0
  233. package/article/56604.html +69 -0
  234. package/article/56816.html +266 -0
  235. package/article/56926.html +153 -0
  236. package/article/57747.html +409 -0
  237. package/article/57965.html +475 -0
  238. package/article/58816.html +78 -0
  239. package/article/59059.html +435 -0
  240. package/article/59095.html +350 -0
  241. package/article/59349.html +244 -0
  242. package/article/59402.html +216 -0
  243. package/article/59448.html +55 -0
  244. package/article/59870.html +94 -0
  245. package/article/59877.html +208 -0
  246. package/article/5dbb6f41.html +86 -0
  247. package/article/6008.html +75 -0
  248. package/article/60327.html +126 -0
  249. package/article/6035.html +76 -0
  250. package/article/60428.html +71 -0
  251. package/article/60544.html +128 -0
  252. package/article/61319.html +95 -0
  253. package/article/61367.html +93 -0
  254. package/article/624d1918.html +292 -0
  255. package/article/62543.html +71 -0
  256. package/article/62887.html +169 -0
  257. package/article/63074.html +120 -0
  258. package/article/63266.html +311 -0
  259. package/article/63351.html +74 -0
  260. package/article/63542.html +104 -0
  261. package/article/63824.html +275 -0
  262. package/article/64051.html +653 -0
  263. package/article/64189b69.html +72 -0
  264. package/article/64354.html +75 -0
  265. package/article/64869.html +79 -0
  266. package/article/64923.html +596 -0
  267. package/article/65128.html +95 -0
  268. package/article/65295.html +79 -0
  269. package/article/6888.html +75 -0
  270. package/article/7065.html +84 -0
  271. package/article/7455.html +85 -0
  272. package/article/7a3ef8f.html +315 -0
  273. package/article/8140.html +188 -0
  274. package/article/8190.html +85 -0
  275. package/article/8225.html +78 -0
  276. package/article/84c9ccd6.html +159 -0
  277. package/article/8f9a9ae3.html +82 -0
  278. package/article/9174.html +73 -0
  279. package/article/9738.html +294 -0
  280. package/article/a4145266.html +71 -0
  281. package/article/bedea419.html +72 -0
  282. package/article/bf7e7421.html +78 -0
  283. package/article/c1867fbf.html +103 -0
  284. package/article/c5576490.html +70 -0
  285. package/article/dcb0db28.html +76 -0
  286. package/article/fc3b727a.html +79 -0
  287. package/atom.xml +445 -0
  288. package/baidusitemap.xml +1079 -0
  289. package/blocks/dns.txt +264 -0
  290. package/blocks/filter.txt +1070 -0
  291. package/blocks/script.js +42 -0
  292. package/categories/CDN/index.html +48 -0
  293. package/categories/IDE/index.html +48 -0
  294. package/categories/git/index.html +48 -0
  295. package/categories/hexo/index.html +48 -0
  296. package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +48 -0
  297. package/categories//345/210/206/344/272/253/index.html +48 -0
  298. package/categories//345/211/215/347/253/257/index.html +48 -0
  299. package/categories//345/211/215/347/253/257/page/2/index.html +48 -0
  300. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +48 -0
  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 +48 -0
  302. package/categories//345/215/232/345/256/242/index.html +48 -0
  303. package/categories//345/267/245/345/205/267/index.html +48 -0
  304. package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +48 -0
  305. 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 +48 -0
  306. package/categories//346/255/243/345/210/231/index.html +48 -0
  307. package/categories//346/265/217/350/247/210/345/231/250/index.html +48 -0
  308. package/categories//347/256/227/346/263/225/index.html +48 -0
  309. package/categories//350/265/204/350/256/257/index.html +48 -0
  310. package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +48 -0
  311. package/cdn/css/font-awesome.min.css +4 -0
  312. package/cdn/css/grids-responsive-min.css +7 -0
  313. package/cdn/css/normalize.css +349 -0
  314. package/cdn/css/pure-min.css +11 -0
  315. package/cdn/fonts/fontawesome-webfont.eot +0 -0
  316. package/cdn/fonts/fontawesome-webfont.svg +2671 -0
  317. package/cdn/fonts/fontawesome-webfont.ttf +0 -0
  318. package/cdn/fonts/fontawesome-webfont.woff +0 -0
  319. package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
  320. package/cdn/js/Valine.min.js +17 -0
  321. package/cdn/js/canvas-nest.js +1 -0
  322. package/cdn/js/clipboard.min.js +7 -0
  323. package/cdn/js/crypto-js.js +25 -0
  324. package/cdn/js/jquery.min.js +2 -0
  325. package/css/default.css +1144 -0
  326. package/css/donate.css +338 -0
  327. package/css/hbe.style.css +749 -0
  328. package/css/style.css +2095 -0
  329. package/donate/index.html +39 -0
  330. package/google917dcf72f6e5c7f5.html +1 -0
  331. package/guestbook/index.html +68 -0
  332. package/hosts/ads.txt +149 -0
  333. package/hosts/flash.txt +9 -0
  334. package/hosts/github.txt +6 -0
  335. package/hosts/google.txt +16936 -0
  336. package/hosts/winrar.txt +2 -0
  337. package/img/alipay.svg +46 -0
  338. package/img/bitcoin.svg +135 -0
  339. package/img/blog.ico +0 -0
  340. package/img/blog.png +0 -0
  341. package/img/gaba.png +0 -0
  342. package/img/github.svg +1 -0
  343. package/img/like.svg +1 -0
  344. package/img/mp-mini.jpg +0 -0
  345. package/img/mp.png +0 -0
  346. package/img/paypal.svg +63 -0
  347. package/img/upy_logo.svg +59 -0
  348. package/img/wechat.svg +49 -0
  349. package/index.html +48 -0
  350. package/jd_root.txt +1 -0
  351. package/js/codeblock-resizer.js +51 -0
  352. package/js/dark.js +12 -0
  353. package/js/donate.js +87 -0
  354. package/js/fixedPage.js +106 -0
  355. package/js/gitment.browser.js +3751 -0
  356. package/js/search.js +86 -0
  357. package/js/share.js +60 -0
  358. package/js/smartresize.js +32 -0
  359. package/js/totop.js +12 -0
  360. package/kankan/index.html +77 -0
  361. package/lib/hbe.js +293 -0
  362. package/package.json +25 -0
  363. package/page/10/index.html +49 -0
  364. package/page/11/index.html +59 -0
  365. package/page/12/index.html +67 -0
  366. package/page/13/index.html +63 -0
  367. package/page/14/index.html +66 -0
  368. package/page/15/index.html +60 -0
  369. package/page/16/index.html +60 -0
  370. package/page/17/index.html +62 -0
  371. package/page/18/index.html +61 -0
  372. package/page/19/index.html +58 -0
  373. package/page/2/index.html +48 -0
  374. package/page/20/index.html +57 -0
  375. package/page/21/index.html +61 -0
  376. package/page/22/index.html +55 -0
  377. package/page/23/index.html +64 -0
  378. package/page/24/index.html +60 -0
  379. package/page/25/index.html +58 -0
  380. package/page/26/index.html +48 -0
  381. package/page/27/index.html +58 -0
  382. package/page/3/index.html +48 -0
  383. package/page/4/index.html +48 -0
  384. package/page/5/index.html +51 -0
  385. package/page/6/index.html +51 -0
  386. package/page/7/index.html +51 -0
  387. package/page/8/index.html +53 -0
  388. package/page/9/index.html +48 -0
  389. package/randomcall/README.html +1 -0
  390. package/randomcall/lucker.html +290 -0
  391. package/randomcall/lucky.png +0 -0
  392. package/robots.txt +22 -0
  393. package/search.xml +6740 -0
  394. package/sitemap.xml +2669 -0
  395. package/tags//345/216/237/345/210/233/index.html +48 -0
  396. package/tags//345/250/261/344/271/220/index.html +48 -0
  397. package/tags//346/211/213/345/206/231/index.html +48 -0
  398. package/tags//347/226/253/346/203/205/index.html +48 -0
  399. package/tags//350/275/254/350/275/275/index.html +48 -0
  400. package/tags//350/275/254/350/275/275/page/2/index.html +48 -0
  401. package/v.html +90 -0
@@ -0,0 +1,288 @@
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>13 个 npm 快速开发技巧 | 前端壹菜鸟</title><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/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.staticaly.com/gh/npljy/npljy.github.io/main/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">13 个 npm 快速开发技巧</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"> 3.5k</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"> 14</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/15518.html#vcomment"><span class="waline-comment-count" data-path="/article/15518.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://www.html.cn/web/javascript/13643.html</code></p>
20
+ <p>每天,数以百万计的开发人员使用 <code>npm</code> 或 <code>yarn</code> 来构建项目。运行<code>npm init</code>或<code>npx create- response -app</code>等命令几乎构建JS项目的首选方式,无论是为客户端或服务器端,还是桌面应用程序。</p>
21
+ <span id="more"></span>
22
+ <p><img src="https://img.php.cn/upload/article/000/000/006/5dc2318821b05907.jpg" alt="xuehuayu.cn"></p>
23
+ <p>但是<code>npm</code>不仅仅是初始化项目或安装包。在本文中,我们将会介绍 <code>npm</code> 的13个技巧来最大限度地利用<code>npm</code>:从简单的快捷方式到自定义脚本。</p>
24
+ <p>由于我们中的许多人每天都使用<code>npm</code>,从长远来看,即使节省少量的时间也会产生显著的影响。这些技巧是针对初学者和中级开发人员的,但是即使您是一位经验丰富的开发人员,我希望你仍然能够找到一到两个你以前没有遇到过的特性。</p>
25
+ <h2 id="主要内容"><a href="#主要内容" class="headerlink" title="主要内容"></a>主要内容</h2><ol>
26
+ <li>学习基本快捷方式</li>
27
+ <li>设置默认npm init属性</li>
28
+ <li>让脚本跨平台兼容</li>
29
+ <li>并行运行脚本</li>
30
+ <li>在不同的目录中运行脚本</li>
31
+ <li>延迟运行脚本直到端口准备就绪</li>
32
+ <li>列出并选择可用脚本</li>
33
+ <li>运行前后脚本</li>
34
+ <li>控制应用程序版本</li>
35
+ <li>从命令行编辑package.json</li>
36
+ <li>自动设置和打开你的github库</li>
37
+ <li>自定义<code>npm init</code>脚本</li>
38
+ <li>使用自定义npm init脚本将你的第一个 Commit 提交到 GitHub</li>
39
+ </ol>
40
+ <h2 id="1-学习基本快捷方式"><a href="#1-学习基本快捷方式" class="headerlink" title="1.学习基本快捷方式"></a>1.学习基本快捷方式</h2><p>我们从最基本的开始,学习最常见的npm快捷方式从长远来将会节省很多时间。</p>
41
+ <ul>
42
+ <li>安装  —  常规:<code>npm install</code>,简写:<code>npm i</code>。</li>
43
+ <li>测试  —  常规:<code>npm test</code>,简写:<code>npm t</code>。</li>
44
+ <li>帮助  —  常规:<code>npm --help</code>,简写:<code>npm -h</code>。</li>
45
+ <li>全局标志 —  常规:<code>--global</code>,简写:<code>-g</code>。</li>
46
+ <li>保存为开发依赖 - 常规: <code>- save-dev</code>,简写:<code>-D</code>。</li>
47
+ <li>npm init 默认值 - 常规:<code>npm init --yes</code> 或 <code>npm init --force</code>,简写:<code>npm init -y</code> 或 <code>npm init -f</code></li>
48
+ </ul>
49
+ <p>我们知道使用<code>-save</code>或<code>-S</code>来保存包,但现在这是个已经是默认值。要安装一个包而不保存它,可以使用 <code>——no-save</code>标志。</p>
50
+ <h4 id="不太常见的快捷键"><a href="#不太常见的快捷键" class="headerlink" title="不太常见的快捷键"></a><strong>不太常见的快捷键</strong></h4><p>还有一些不常见的快捷方式,如下:</p>
51
+ <ul>
52
+ <li>安装包信息将加入到<code>optionalDependencies</code>(可选阶段的依赖)- 常规:<code>--save-optional</code>, 简写:<code>-O</code>。</li>
53
+ <li>精确安装指定模块版本 - 常规:<code>--save-optional</code>, 简写:<code>-O</code>。</li>
54
+ </ul>
55
+ <p>如果需要在本地保存一个npm包,或者通过单个文件下载选择一组可用的包,可以使用<code>--save-bundle</code>或<code>-B</code>将它们捆绑在一起,并使用<code>npm pack</code>获得捆绑包。</p>
56
+ <h4 id="根的快捷方式"><a href="#根的快捷方式" class="headerlink" title="根的快捷方式"></a><strong>根的快捷方式</strong></h4><p><code>.</code> 符号通常用于表示应用程序的根目录,npm术语中的应用程序入口点,即<code>package.json</code>中指定为“<code>main</code>”的值</p>
57
+ <pre><code>&#123;
58
+ &quot;main&quot;: &quot;index.js&quot;
59
+ &#125;
60
+ </code></pre>
61
+ <p>这个快捷方式也可以用于像<code>npx create-react-app .</code> 这样的命令。因此,可以运行<code>npx create-react-app .</code>,而不是使用 <code>npx create-react-app my-app</code> 创建一个新的<code>my-app</code>目录。</p>
62
+ <h2 id="2-设置默认npm-init属性"><a href="#2-设置默认npm-init属性" class="headerlink" title="2. 设置默认npm init属性"></a>2. 设置默认npm init属性</h2><p>当运行<code>npm init</code>开始一个新项目时,你可能会发现自己一次又一次地输入配置细节。假如,你可能是项目的主要负责人。有时为了节省时间,可以为这些字段设置默认值,如下所示:</p>
63
+ <pre><code>npm config set init.author.name &quot;Joe Bloggs&quot;
64
+ npm config set init.author.email &quot;JoebLoggs@gmail.com&quot;
65
+ npm config set init.author.url &quot;Joebloggs.com&quot;
66
+ npm config set init.license &quot;MIT&quot;
67
+ </code></pre>
68
+ <p>要检查是否正确添加了这些属性,在终端输入 <code>npm config edit</code>查看配置文件信息。当然也j可以通过直接在打开的配置文件编辑信息。 如果要编辑全局<code>npm</code>设置,使用<code>npm config edit -g</code>。</p>
69
+ <p>要重新初始化默认设置,可以使用以下脚本。第一行用空字符串替换配置文件,第二行用默认设置重新填充配置文件。</p>
70
+ <pre><code>echo &quot;&quot; &gt; $(npm config get userconfig)
71
+ npm config edit
72
+ </code></pre>
73
+ <p>上面的脚本将重置用户默认值,下面的脚本将重置全局默认值</p>
74
+ <pre><code>echo &quot;&quot; &gt; $(npm config get globalconfig)
75
+ npm config --global edit
76
+ </code></pre>
77
+ <h2 id="3-让脚本跨平台兼容"><a href="#3-让脚本跨平台兼容" class="headerlink" title="3. 让脚本跨平台兼容"></a>3. 让脚本跨平台兼容</h2><p>任何在命令行上运行的代码都有兼容性问题的风险,特别是在Windows和基于unix的系统(包括Mac和Linux)之间。如果你只处理特定的项目,那么这不是问题,但是在许多情况下,跨平台兼容性很有必要的:任何开放源码或协作项目,以及示例和教程项目,都应该能够工作,而不管操作系统是什么。</p>
78
+ <p>谢天谢地,解决方案很简单。有几个选项可供选择,但效果最好的是<code>cross-env</code>。使用<code>npm i -D cross-env</code>将其作为开发依赖项安装。然后在任何环境变量之前包括关键字<code>cross-env</code>,就像这样:</p>
79
+ <pre><code>&#123;
80
+ &quot;scripts&quot;: &#123;
81
+ &quot;build&quot;: &quot;cross-env NODE_ENV=production webpack --config build/wepack.config.js&quot;
82
+ &#125;
83
+ &#125;
84
+ </code></pre>
85
+ <p><a target="_blank" rel="noopener" href="https://www.npmjs.com/package/cross-env">cross-env</a> 是 实现跨平台兼容性的最无缝的方法,但还有其他两个流行的工具,它们可以帮助实现跨平台兼容性:</p>
86
+ <ul>
87
+ <li><a target="_blank" rel="noopener" href="https://www.npmjs.com/package/rimraf">rimraf</a> 可以安装在全球运行跨平台脚本</li>
88
+ <li><a target="_blank" rel="noopener" href="https://www.npmjs.com/package/shelljs">ShellJS</a> 是Unix shell命令在Node.js API上的可移植实现。</li>
89
+ </ul>
90
+ <h2 id="4-并行运行脚本"><a href="#4-并行运行脚本" class="headerlink" title="4. 并行运行脚本"></a>4. 并行运行脚本</h2><p>可以使用<code>&amp;&amp;</code>来依次运行两个或多个进程。但是并行运行脚本呢?为此,我们可以从各种npm包中进行选择。<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/concurrently">concurrent</a> 和 <a target="_blank" rel="noopener" href="https://www.npmjs.com/package/concurrently">npm-run-all</a> 是最流行的解决方案。</p>
91
+ <p>首先通过 npm i -D concurrently 安装开发依赖。然后按照以下格式将其添加到脚本中:</p>
92
+ <pre><code>&#123;
93
+ &quot;start&quot;: &quot;concurrently \&quot;command1 arg\&quot; \&quot;command2 arg\&quot;&quot;
94
+ &#125;
95
+ </code></pre>
96
+ <h2 id="5-在不同的目录中运行脚本"><a href="#5-在不同的目录中运行脚本" class="headerlink" title="5. 在不同的目录中运行脚本"></a>5. 在不同的目录中运行脚本</h2><p>有时,在不同的文件夹中拥有一个包含多个<code>package.json</code>文件的应用程序。 从根目录访问这些脚本会很方便,而不是每次要运行脚本时导航到不同的文件夹,有两种方法可以执行此操作。</p>
97
+ <p>第一种是手动 cd 并运行对应的命令:</p>
98
+ <pre><code>cd folder &amp;&amp; npm start &amp;&amp; cd ..
99
+ </code></pre>
100
+ <p>但还有一个更优雅的解决方案,即使用<code>--prefix</code>标志指定路径:</p>
101
+ <pre><code>npm start --prefix path/to/your/folder
102
+ </code></pre>
103
+ <p>下面是一个工作应用程序中此解决方案的示例,我们希望在前端(在客户机目录中)和后端(在服务器目录中)运行 <code>npm start</code>。</p>
104
+ <pre><code>&quot;start&quot;: &quot;concurrently \&quot;(npm start --prefix client)\&quot; \&quot;(npm start --prefix server)\&quot;&quot;,
105
+ </code></pre>
106
+ <h2 id="6-延迟运行脚本直到端口准备就绪"><a href="#6-延迟运行脚本直到端口准备就绪" class="headerlink" title="6. 延迟运行脚本直到端口准备就绪"></a>6. 延迟运行脚本直到端口准备就绪</h2><p>通常,在开发全堆栈应用程序期间,咱们可能希望同时启动服务器和客户端。<code>wait-on</code> 节点模块提供了一种方便的方法来确保进程只在某些进程就绪时发生:在我们的例子中,我们有一个特定的端口。</p>
107
+ <p>例如,这是我在使用React前端的Electron项目中使用的<code>dev</code>脚本。 同时使用,脚本并行加载表示层和Electron窗口。 但是,使用<code>wait-on</code>,只有在 <code>http://localhost:3000</code> 启动好,才会打开Electron窗口。</p>
108
+ <pre><code>&quot;dev&quot;: &quot;concurrently \&quot;cross-env BROWSER=none npm run start\&quot; \&quot;wait-on http://localhost:3000
109
+ &amp;&amp; electron .\&quot;&quot;,
110
+ </code></pre>
111
+ <p>此外,React默认情况下会打开一个浏览器窗口,但对于 Electron 开发来说,这是不必要的。咱们可以通过传递环境变量<code>BROWSER=none</code>来禁用此行为。</p>
112
+ <h2 id="7-列出并选择可用脚本"><a href="#7-列出并选择可用脚本" class="headerlink" title="7. 列出并选择可用脚本"></a>7. 列出并选择可用脚本</h2><p>列出<code>package.json</code>文件中可用的脚本很简单:只需转到项目的根目录并在终端中输入<code>npm run</code>。</p>
113
+ <p>但是有一种更方便的方法可以获得脚本列表,可以立即运行该列表:为此,全局安装 NTL (npm任务列表)模块:</p>
114
+ <pre><code>npm i -g ntl
115
+ </code></pre>
116
+ <p>然后在项目文件夹中运行<code>ntl</code>命令,可以获得一个可用脚本列表,并可以选择其中一个运行。</p>
117
+ <p><img src="https://img.php.cn/upload/image/105/415/111/1573007446316765.png" alt="1573007446316765.png"></p>
118
+ <h2 id="8-运行前后脚本"><a href="#8-运行前后脚本" class="headerlink" title="8. 运行前后脚本"></a>8. 运行前后脚本</h2><p>你可能熟悉<code>prebuild</code>和<code>postbuild</code>这样的脚本,它们允许你定义在构建脚本之前或之后运行的代码。但事实上,<code>pre</code>和<code>post</code>可以在任何脚本之前添加,包括自定义脚本。</p>
119
+ <p>这不仅使你的代码更干净,而且还允许你单独运行<code>pre</code>和<code>post</code>脚本。</p>
120
+ <h2 id="9-控制应用程序版本"><a href="#9-控制应用程序版本" class="headerlink" title="9. 控制应用程序版本"></a>9. 控制应用程序版本</h2><p>与手动更改应用程序的版本相比,npm 提供了一些有用的快捷方式来完成这一点。 要增加版本,请在运行 <code>npm version加上</code>major<code>,</code>minor<code>或</code>patch&#96;:</p>
121
+ <pre><code>// 1.0.0
122
+ npm version patch
123
+ // 1.0.1
124
+ npm version minor
125
+ // 1.1.0
126
+ npm version major
127
+ // 2.0.0
128
+ </code></pre>
129
+ <p>根据更新应用程序的频率,可以通过在每次部署时增加版本号来节省时间,使用以下脚本:</p>
130
+ <pre><code>&#123;
131
+ &quot;predeploy&quot;: &quot;npm version patch&quot;
132
+ &#125;
133
+ </code></pre>
134
+ <h2 id="10-从命令行编辑-package-json"><a href="#10-从命令行编辑-package-json" class="headerlink" title="10. 从命令行编辑 package.json"></a>10. 从命令行编辑 package.json</h2><p><code>package.json</code>是一个常规的<code>json</code>文件,因此可以使用工具库<a target="_blank" rel="noopener" href="http://trentm.com/json/">json</a>从命令行进行编辑。 这在修改<code>package.json</code>提供另外一种新的方式,允许w你q创建超出默认值的快捷方式。 全局安装:</p>
135
+ <pre><code>npm install -g json
136
+ </code></pre>
137
+ <p>然后,可以使用它来使用<code>-I</code>进行就地编辑。 例如,要添加值为“bar”的新脚本“foo”,这样写:</p>
138
+ <pre><code>json -I -f package.json -e &#39;this.scripts.foo=&quot;bar&quot;&#39;
139
+ </code></pre>
140
+ <h2 id="11-自动设置和打开你的github库"><a href="#11-自动设置和打开你的github库" class="headerlink" title="11. 自动设置和打开你的github库"></a>11. 自动设置和打开你的github库</h2><p>如果<code>package.json</code>文件中有“repository”,则可以通过输入 <code>npm repo</code>在默认浏览器中打开它。</p>
141
+ <p>如果你的项目已经连接到远程存储库,并且已经在命令行上安装了<code>git</code>,那您可以使用这个命令找到你的连接存储库</p>
142
+ <pre><code>git config --get remote.origin.url
143
+ </code></pre>
144
+ <p>更好的是,如果你按照上面的提示并安装了<code>json</code>模块,可以使用下面的脚本自动将正确的存储库添加到 <code>package.json</code></p>
145
+ <pre><code>json -I -f package.json -e &quot;this.repository=\&quot;$(git config --get remote.origin.url)\&quot;&quot;
146
+ </code></pre>
147
+ <h2 id="12-自定义npm-init脚本"><a href="#12-自定义npm-init脚本" class="headerlink" title="12. 自定义npm init脚本"></a>12. 自定义<code>npm init</code>脚本</h2><p>让我们更进一步,使用我们自己的<code>npm init</code>脚本,它接受GitHub存储库URL并自动推送我们的第一个提交。在本技巧中,我们将讨论如何创建自定义<code>npm init</code>脚本。在下一个(也是最后一个)技巧中,我们将合并git。</p>
148
+ <p>可以通过重定向到主目录中的<code>.npm-init.js</code>文件来编辑<code>npm init</code>脚本。(在Windows上,通常是 <code>c/Users/&lt;用户名&gt;</code>,在 Mac 上,它是<code>/Users/&lt;用户名&gt;</code>)。</p>
149
+ <p>让我们首先在我们的主目录中创建一个<code>.nmm-init.js</code>文件。为了确保<code>npm init</code>被指向正确的文件,可以运行:</p>
150
+ <pre><code>npm config set init-module ~\.npm-init.js
151
+ </code></pre>
152
+ <p>在集成<code>git</code>之前,这里有一个简单的<code>.npm-init.js</code>文件,它模拟了默认<code>npm init</code>的问题</p>
153
+ <pre><code>module.exports = &#123;
154
+ name: prompt(&#39;package name&#39;, basename || package.name),
155
+ version: prompt(&#39;version&#39;, &#39;0.0.0&#39;),
156
+ decription: prompt(&#39;description&#39;, &#39;&#39;),
157
+ main: prompt(&#39;entry point&#39;, &#39;index.js&#39;),
158
+ repository: prompt(&#39;git repository&#39;, &#39;&#39;),
159
+ keywords: prompt(function (s) &#123; return s.split(/\s+/) &#125;),
160
+ author: prompt(&#39;author&#39;, &#39;Joe Bloggs &lt;joe.bloggs@gmail.com&gt; (joebloggs.com)&#39;),
161
+ license: prompt(&#39;license&#39;, &#39;ISC&#39;)
162
+ &#125;
163
+ </code></pre>
164
+ <p>每个问题都遵循<code>nameInPackage</code>模式:<code>prompt(&#39;nameInPrompt&#39;,&#39;defaultValue&#39;)</code>。要在缺省情况下设置值而不带问题,只需删除<code>prompt</code>方法。</p>
165
+ <p>如果要返回默认设置,只需删除<code>.npm-init.js</code>。</p>
166
+ <h2 id="13-使用自定义npm-init脚本将你的第一个-Commit-提交到-GitHub"><a href="#13-使用自定义npm-init脚本将你的第一个-Commit-提交到-GitHub" class="headerlink" title="13. 使用自定义npm init脚本将你的第一个 Commit 提交到 GitHub"></a>13. 使用自定义npm init脚本将你的第一个 Commit 提交到 GitHub</h2><p>为了将git命令合并到<code>.npm-init.js</code>文件中,需要一种方法来控制命令行。为此,我们可以使用<code>child_process</code> 模块。在文件的顶部引入它,因为我们只需要<code>execSync</code>函数,所以可以使用析构赋值语法自己获取它:</p>
167
+ <pre><code>const &#123; execSync &#125; = require(&#39;child_process&#39;);
168
+ </code></pre>
169
+ <p>我还创建了一个helper函数,它将函数的结果打印到控制台:</p>
170
+ <pre><code>function run(func) &#123;
171
+ console.log(execSync(func).toString())
172
+ &#125;
173
+ </code></pre>
174
+ <p>最后,我们将提示输入GitHub存储库URL,如果提供,我们将生<code>README.md</code>文件,并启动我们的第一次提交。</p>
175
+ <pre><code>repository: prompt(&#39;github repository url&#39;, &#39;&#39;, function (url) &#123;
176
+ if (url) &#123;
177
+ run(&#39;touch README.md&#39;);
178
+ run(&#39;git init&#39;);
179
+ run(&#39;git add README.md&#39;);
180
+ run(&#39;git commit -m &quot;first commit&quot;&#39;);
181
+ run(`git remote add origin $&#123;url&#125;`);
182
+ run(&#39;git push -u origin master&#39;);
183
+ &#125;
184
+ return url;
185
+ &#125;)
186
+ </code></pre>
187
+ <p>总的来说,<code>.npm-init.js</code>文件大概如下:</p>
188
+ <pre><code>const &#123; execSync &#125; = require(&#39;child_process&#39;);
189
+
190
+ function run(func) &#123;
191
+ console.log(execSync(func).toString())
192
+ &#125;
193
+
194
+ module.exports = &#123;
195
+ name: prompt(&#39;package name&#39;, basename || package.name),
196
+ version: prompt(&#39;version&#39;, &#39;0.0.0&#39;),
197
+ decription: prompt(&#39;description&#39;, &#39;&#39;),
198
+ main: prompt(&#39;entry point&#39;, &#39;index.js&#39;),
199
+ keywords: prompt(function (s) &#123; return s.split(/\s+/) &#125;),
200
+ author: prompt(&#39;author&#39;, &#39;Joe Bloggs &lt;joe.bloggs@gmail.com&gt; (joebloggs.com)&#39;),
201
+ license: prompt(&#39;license&#39;, &#39;ISC&#39;),
202
+ repository: prompt(&#39;github repository url&#39;, &#39;&#39;, function (url) &#123;
203
+ if (url) &#123;
204
+ run(&#39;touch README.md&#39;);
205
+ run(&#39;git init&#39;);
206
+ run(&#39;git add README.md&#39;);
207
+ run(&#39;git commit -m &quot;first commit&quot;&#39;);
208
+ run(`git remote add origin $&#123;url&#125;`);
209
+ run(&#39;git push -u origin master&#39;);
210
+ &#125;
211
+ return url;
212
+ &#125;),
213
+ &#125;
214
+ </code></pre>
215
+ <p>package.json文件:</p>
216
+ <pre><code>&#123;
217
+ &quot;name&quot;: &quot;Custom npm init&quot;,
218
+ &quot;version&quot;: &quot;0.0.0&quot;,
219
+ &quot;decription&quot;: &quot;A test project, to demonstrate a custom npm init script.&quot;,
220
+ &quot;main&quot;: &quot;index.js&quot;,
221
+ &quot;keywords&quot;: [],
222
+ &quot;author&quot;: &quot;Joe Bloggs &lt;joe.bloggs@gmail.com&gt; (joebloggs.com)&quot;,
223
+ &quot;license&quot;: &quot;ISC&quot;,
224
+ &quot;repository&quot;: &#123;
225
+ &quot;type&quot;: &quot;git&quot;,
226
+ &quot;url&quot;: &quot;git+https://github.com/JoeBloggs/custom.git&quot;
227
+ &#125;,
228
+ &quot;bugs&quot;: &#123;
229
+ &quot;url&quot;: &quot;https://github.com/JoeBloggs/custom/issues&quot;
230
+ &#125;,
231
+ &quot;homepage&quot;: &quot;https://github.com/JoeBloggs/custom#readme&quot;
232
+ &#125;
233
+ </code></pre>
234
+ <p>你也可以通过合并GitHub API进一步实现这一点,这样就不需要创建一个新的存储库,这部分留给你们自己完成。</p>
235
+ <p>总的来说,希望这篇文章能够让你了解npm可以实现的目标,并展示了一些提高工作效率的方法 - 无论是你知道常见的快捷方式,还是通过充分利用脚本 <code>package.json</code>,或编写自定义版本的<code>npm init</code>。</p>
236
+ <p><code>原文地址:https://medium.com/@bretcameron/13-npm-tricks-for-faster-javascript-development-4fe2a83f87a2</code></p>
237
+ <p>为了保证的可读性,本文采用意译而非直译。</p>
238
+ <p>以上就是13 个 npm 快速开发技巧的详细内容,更多请关注html中文网其它相关文章!</p>
239
+ </div><iframe src="/donate/?AliPayQR=https://store.xuehuayu.cn/store/public/alipay_qr.jpg&amp;WeChatQR=https://store.xuehuayu.cn/store/public/wechat_qr.png&amp;UnionPayQR=null&amp;GitHub=null&amp;BTCQR=null&amp;BTCKEY=null&amp;PayPal=https://www.paypal.com/paypalme/OrdinaryPerson" style="overflow-x:hidden; overflow-y:hidden; border:0xp none #fff; min-height:240px; width:100%;" frameborder="0" scrolling="no"></iframe><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/15518.html">https://xuehuayu.cn/article/15518.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/1566.html">写给前端的正则表达式入门</a><a class="next" href="/article/53428.html">2019年适用于JavaScript开发人员的27种神奇的VSCode工具</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
240
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
241
+ const locale = {
242
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
243
+ sofa: '沙发空缺中,还不快抢~',
244
+ };
245
+ Waline.init({
246
+ el: '#vcomment',
247
+ serverURL: serverURL,
248
+ pageSize: '20',
249
+ visitor: true, // 阅读量统计
250
+ requiredMeta: ['nick', 'mail'],
251
+ emoji: [
252
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
253
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
254
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
255
+ ],
256
+ locale,
257
+ pageview: true
258
+ })
259
+ </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.staticaly.com/gh/npljy/npljy.github.io/main/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() {
260
+ var val = $(this).val()
261
+ 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>'
262
+ 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>'
263
+ 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>'
264
+
265
+ if (val === 'self') {
266
+ $('#search').html(self)
267
+ var search_path = 'search.xml';
268
+ if (search_path.length == 0) {
269
+ search_path = 'search.xml';
270
+ }
271
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
272
+ searchFunc(path, 'local-search-input', 'local-search-result');
273
+ } else if (val === 'baidu') {
274
+ $('#search').html(baidu)
275
+ } else if (val === 'google') {
276
+ $('#search').html(google)
277
+ }
278
+ })</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">191</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/%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">2</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/c5576490.html">面试准备</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(){
279
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
280
+ if (cnb) {
281
+ var gxba =document.getElementById('gxba')
282
+ var gaba =document.getElementById('gaba')
283
+ var gabaLink =document.getElementById('gaba-link')
284
+ gxba.innerText ='京ICP备20007647号-1'
285
+ gaba.innerText ='京公网安备 11010802031254号'
286
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
287
+ }
288
+ })()</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.staticaly.com/gh/npljy/npljy.github.io/main/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/js/smartresize.min.js"></script></div></body></html>