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,159 @@
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>修复Web应用程序中的内存泄漏 | 前端壹菜鸟</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">修复Web应用程序中的内存泄漏</h1><div class="post-meta"><span class="date">2020-03-23</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%88%86%E4%BA%AB/">分享 </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.7k</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"> 12</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/28963.html#vcomment"><span class="waline-comment-count" data-path="/article/28963.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://mp.weixin.qq.com/s/2cgZewQAiayUWpU7QjTnjQ</code><br>当我们把web应用从服务端渲染变成了单页面(SPA)的时候,我们突然发现我们需要去关心ui的阻塞、 电脑的风扇旋转速率、 手机的耗电程度等等一系列的用户设备问题,而这些问题并不存在或者很少存在于服务端渲染的时代,是的,我们成功的在提升用户交互的同时又创造了其他的问题。</p>
20
+ <span id="more"></span>
21
+ <p>这些问题的其中一个原因就是 <a target="_blank" rel="noopener" href="http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&amp;mid=2651232816&amp;idx=2&amp;sn=949c22914887fe5b639f6ac7b9ec59c2&amp;chksm=bd4943b48a3ecaa205079823523343737f9709349fb15e56ca77a62bb3897e5372fa5f12f3fe&amp;scene=21#wechat_redirect">内存泄漏</a>, 一些代码质量较差的SPA很容易消耗MB甚至GB的内存,甚至不断的占用资源,即使应用切换到后台也是如此,最终整个应用会变的卡顿,甚至是页面崩溃.</p>
22
+ <p><img src="https://store.xuehuayu.cn/store/20200323/202003231116-1.webp" alt="xuehuayu.cn"></p>
23
+ <p>当然,ssr渲染的网站也可能会造成服务器的内存泄漏。但是,极不可能造成客户端的内存泄漏,因为每次在页面之间切换时时候,浏览器都会清除之前页面的内存。</p>
24
+ <p>其实,很少有web相关的文章来讲述一些内存泄漏的问题,然而,我确信大部分的SPA应用都会造成内存泄漏,除非这个团队有足够的基础设施来捕获并修复这些问题,在javascript中,很容易意外的分配一些内存但是没有及时的释放它。</p>
25
+ <p>那么,为什么关于web内存泄漏的文章少之又少,我猜测的原因有下面几点:</p>
26
+ <ul>
27
+ <li><p>缺少用户反馈:大多数用户都不会在使用应用的时候去查看任务管理器的,除非是应用崩溃或者是明显的卡顿,否则,你是不可能收到用户的反馈的。</p>
28
+ </li>
29
+ <li><p>缺少数据:Chrome团队并没有提供网站使用内存的数据,应用本身也不会去收集这些信息。</p>
30
+ </li>
31
+ <li><p>缺少工具:目前的工具很难去发现和修复内存泄漏问题。</p>
32
+ </li>
33
+ <li><p>用户缺少关注:由于浏览器很擅长杀死占用过多内存的页面,因此用户常常把页面问题归咎于浏览器而非应用本身。</p>
34
+ </li>
35
+ </ul>
36
+ <p>在这篇文章中,我会分享一些我在解决Web应用程序中的内存泄漏方面的经验,并提供一些示例来说明如何有效地跟踪它们。</p>
37
+ <h4 id="内存泄漏剖析"><a href="#内存泄漏剖析" class="headerlink" title="内存泄漏剖析"></a>内存泄漏剖析</h4><p>现在大部分的前端框架比如:React、Vue、Svelte都是基于组件这种范式来开发的,在这种模式下,常见的内存泄漏方式是这样的:</p>
38
+ <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;message&#x27;</span>, <span class="variable language_">this</span>.<span class="property">onMessage</span>.<span class="title function_">bind</span>(<span class="variable language_">this</span>));</span><br></pre></td></tr></table></figure>
39
+
40
+ <p>这样就引入了内存泄漏的风险,如果你在组件调用 addEventListener 一些全局对象(比如window. 或者body标签),并且忘记使用 removeEventListener 来销毁,当组件被卸载时,这些事件仍保存在内存中,这样就创造了一个内存泄漏。</p>
41
+ <p>更糟糕的是,由于this.onMessage绑定到了this,你在泄漏这个组件的同时, 这个组件的子组件以及相关的dom都会被泄漏出去,子组件有它的子组件,周而复始,很快就变的很糟糕了, 正确的解决办法是:</p>
42
+ <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Mount phase</span></span><br><span class="line"><span class="variable language_">this</span>.<span class="property">onMessage</span> = <span class="variable language_">this</span>.<span class="property">onMessage</span>.<span class="title function_">bind</span>(<span class="variable language_">this</span>);</span><br><span class="line"><span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;message&#x27;</span>, <span class="variable language_">this</span>.<span class="property">onMessage</span>);</span><br><span class="line"><span class="comment">// Unmount phase</span></span><br><span class="line"><span class="variable language_">window</span>.<span class="title function_">removeEventListener</span>(<span class="string">&#x27;message&#x27;</span>, <span class="variable language_">this</span>.<span class="property">onMessage</span>);</span><br></pre></td></tr></table></figure>
43
+
44
+ <p>其中需要注意的是,我们保存了函数的绑定来保证你传递到<strong>addEventListener</strong> 和 removeEventListener 中的函数必须是一致的。</p>
45
+ <h4 id="内存泄漏情况"><a href="#内存泄漏情况" class="headerlink" title="内存泄漏情况"></a>内存泄漏情况</h4><p>在我的使用经验中,下面的api是比较容易造成内存泄漏的:</p>
46
+ <ul>
47
+ <li><p>addEventListener 就是其中常见的,需要使用 emoveEventListener 来清除。</p>
48
+ </li>
49
+ <li><p>setTimeout &#x2F; setInterval 如果使用定时器来循环调用方法的时候,需要使用 <strong>clearTimeout&#x2F; clearInterval</strong>来清空定时器,注意setTimeout如果模拟setInterval循环调用也是会造成内存泄漏的。</p>
50
+ </li>
51
+ <li><p>IntersectionObserver, ResizeObserver, MutationObserver, 这些新的事件监听api方便了开发,但要注意的是,最后还是要使用disconnect来取消监听。</p>
52
+ </li>
53
+ <li><p>像Promise, rxjs的Observables, node的EventEmitters这些方法,如果没有回调或者取消监听,也会造成内存泄漏(Promise如果没有resolved或者rejected,会连同then()中的代码一起造成泄漏)。</p>
54
+ </li>
55
+ <li><p>像redux这种挂载在全局的状态管理,如果不注意内存占用就会持续增加不会被清理。</p>
56
+ </li>
57
+ <li><p>如果在没有虚拟dom的计算情况下实现了无限滚动列表,那么DOM节点的数量将无限增加。</p>
58
+ </li>
59
+ </ul>
60
+ <p>当然,还有其他的方式导致内存泄漏,但是这些是最常见的。</p>
61
+ <h4 id="找出内存泄漏"><a href="#找出内存泄漏" class="headerlink" title="找出内存泄漏"></a>找出内存泄漏</h4><p>这是最困难的部分,首先我想说明的是我认为没有什么工具能很好的解决这个问题,我已经尝试了Firefox的内存工具,Edge和IE的内存工具,甚至是Windows Performance Analyzer,相比之下,还是Chrome的DevTools更好用。</p>
62
+ <p>打开开发者工具,选择Memory标签的heap snapshot选项,在Chrome中有其他的内存工具,单我发现这些对找出内存泄漏没有很大的帮助。</p>
63
+ <p><img src="https://store.xuehuayu.cn/store/20200323/202003231116-2.webp" alt="xuehuayu.cn"></p>
64
+ <p>当你点击“Take snapshot” 按钮的时候,你就能捕获到javaScript VM 中包括window和定时器回调引用的<a target="_blank" rel="noopener" href="http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&amp;mid=2651229805&amp;idx=1&amp;sn=a0d14e8e24e6bf89934e14dae37f1060&amp;chksm=bd4957e98a3edeff3f52e07fea3aa3206f2231894f6f0e4a1e55ec1bcb5d22ef7d2beee6283a&amp;scene=21#wechat_redirect">对象环境</a>,可以把这个快照看成那一瞬间的内存静止状态。</p>
65
+ <p>接下来的操作就是重现一些你认为会造成内存泄漏的场景-比如对话框模态层的开关,当对话框关闭的时候,你的期望应该是内存前后一致,因此,我们需要拍摄另一个快照,然后将其与没有打开对话框的快照进行比较。不得不说,这正是很棒的功能。</p>
66
+ <p><img src="https://store.xuehuayu.cn/store/20200323/202003231116-3.webp" alt="xuehuayu.cn"></p>
67
+ <p>当然,你需要清楚这个工具的一些限制:</p>
68
+ <ul>
69
+ <li><p>你需要多生成几个快照(我的经验是三个)来确保<a target="_blank" rel="noopener" href="http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&amp;mid=2651235351&amp;idx=1&amp;sn=c6cc0d1043a55f4372f539daebed4a6c&amp;chksm=bd497d938a3ef485efb3d8a4f140d2f82009878814666a0147d428d18f887a5c51d15a4de62c&amp;scene=21#wechat_redirect">内存</a>真正的稳定的大小(检查每个快照,你应该能拿到最终的稳定状态)。</p>
70
+ </li>
71
+ <li><p>如果你的程序中有web workers, service workers, iframes, shared workers这些特殊的环境,Memory是无法为这些提供快照功能的,因为这些环境有自己的javaScript VM,你需要明确你要分析的是哪个,然后选择对应的进行快照</p>
72
+ </li>
73
+ <li><p>有时候快照工具会卡顿甚至是崩溃,你只需要重启即可。</p>
74
+ </li>
75
+ </ul>
76
+ <h4 id="消除干扰"><a href="#消除干扰" class="headerlink" title="消除干扰"></a>消除干扰</h4><p>我发现最好解决干扰因素的方法是多次复现场景,比如你可以切换弹窗7次(7是比较明显的数值,或者14、21)来代替一次,这样,你就能发现哪些对象是7次都有出现内存泄漏的情况了。(另外一点有用的使用技术是整体运行应用一次,尤其是当你使用代码拆分来异步加载代码的时候,因为加载这些代码需要消耗一定的内存,我们需要排除这种因素)。</p>
77
+ <p><img src="https://store.xuehuayu.cn/store/20200323/202003231116-4.webp" alt="xuehuayu.cn"></p>
78
+ <p>上面的快照是3和6的对比,中间的快照是为了让垃圾回收的更彻底, 注意有些对象泄漏了7次</p>
79
+ <p>此时,你可能会想知道为什么我们要按对象数量来排序而不是内存占用总量,直观的来说,我们正在尝试减少内存泄漏的数量,所以,我们难道不应该更关注内存占用总量吗,原因下面会说到。</p>
80
+ <p>一篇来自Joe Armstrong的文章《你只是想要一个香蕉,但你却得到一只拿着香蕉的大猩猩》向我们说明了,你想要某一部分,却得到了整体,这样并不正确和可靠。让我们回到上面addEventListener这个示例来说明,泄漏的来源是事件监听器,该事件监听器引用一个函数,这个函数又引用一个<a target="_blank" rel="noopener" href="http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&amp;mid=2651235926&amp;idx=2&amp;sn=05eca04fd935897f198b512ae01cf821&amp;chksm=bd497fd28a3ef6c490a63b834c5767e60a1417da849359d3f0d01ce7edfb94da6fefae4b9d82&amp;scene=21#wechat_redirect">组件</a>,该组件可能引用大量的东西,比如数组,字符串和其他对象。如果你按整个内存占用量来排序,那么你会找到一堆数组,字符串和对象,这其中大多数可能与泄漏宿主无关,你真正想要找到的是事件<a target="_blank" rel="noopener" href="http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&amp;mid=2651230052&amp;idx=1&amp;sn=e26cec7d159de9ed5586e7535e6f8031&amp;chksm=bd4956e08a3edff6ea8ad25c727914c40092e556e0434862f007400bec5e71c54436089d0580&amp;scene=21#wechat_redirect">监听器</a>,但是与它所引用的内容相比,它占用的内存很小。要修复泄漏,你想要的是香蕉,而不是丛林(意思是找到直接对象,而不是其他无关的东西,避免干扰)。</p>
81
+ <p>因此,我们按泄漏的数量来排序,我们会看到7个事件监听器,7个组件,亦或是14个子组件等等,7是个不同寻常的数值,因此会很突出。而且,无论你复现该场景多少次,你都应该做到确切看到泄漏的对象数量。这样可以快速找到泄漏源。</p>
82
+ <h4 id="使用固定链"><a href="#使用固定链" class="headerlink" title="使用固定链"></a>使用固定链</h4><p>快照工具提供了一种固定链来显示哪些对象指向哪些其他对象,从而使内存保持活动状态,这样你就能清楚泄漏对象的分配位置</p>
83
+ <p><img src="https://store.xuehuayu.cn/store/20200323/202003231116-5.webp" alt="xuehuayu.cn"></p>
84
+ <p>固定链会显示哪个对象正在引用泄漏的对象。查看的方式就是上面的对象是由下面的对象引用的</p>
85
+ <p>在上面的图片中, 一个由于闭包(环境上下文)所引用的变量 someObject ,被onMessage的监听器引用着,如果你点击旁边的资源链接,你就会跳到改对象位置,很easy</p>
86
+ <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">classSomeObject</span>(<span class="params"></span>)&#123;<span class="comment">/* ... */</span>&#125;</span><br><span class="line"><span class="keyword">const</span> someObject =<span class="title function_">newSomeObject</span>();</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">onMessage</span> =(<span class="params"></span>)=&gt;&#123;<span class="comment">/* ... */</span>&#125;;</span><br><span class="line"><span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;message&#x27;</span>, onMessage);</span><br></pre></td></tr></table></figure>
87
+
88
+ <p>在上面的示例中,onMessage这个函数利用闭包引用someObject变量。(这是一个人为的示例;实际内存泄漏可能不那么明显!)</p>
89
+ <p>但是快照工具在固定链上有几个限制:</p>
90
+ <ul>
91
+ <li><p>如果你通过导出内堆文件然后导入查看,你将丢失对分配对象位置引用的所有文件,所以保存文件没什么卵用。</p>
92
+ </li>
93
+ <li><p>如果你使用了WeakMap,chrome会展示这些引用,即使这些对象没有问题,因为其他引用被清理了,WeakMap也会消失,所以这是个干扰项。</p>
94
+ </li>
95
+ <li><p>chrome是通过原型来分类这些对象的,因此尽量多的使用具名类和函数而少用匿名类和函数,有助于查找真正的泄漏问题,举例来说,假设我们的泄漏是由object而不是监听器引起的。由于object具有极高的通用性,我们可能看不到其中有7个泄漏。</p>
96
+ </li>
97
+ </ul>
98
+ <p>这是我识别内存泄漏的基本策略,在过去我已经成功地使用了这种技术来发现许多内存泄漏。当然,这只是个开始,除此之外,你仍需要打点,记录日志,然后尝试修复这些泄漏,这无疑是一个费时费力的过程。</p>
99
+ <h4 id="内存泄漏分析自动化"><a href="#内存泄漏分析自动化" class="headerlink" title="内存泄漏分析自动化"></a>内存泄漏分析自动化</h4><p>在这之前,我想说明的是并没有一个好的方式来实现自动化,chrome有一个非标准的api - performance.memory ,但出于用户隐私原因,它并不是很准确,因此无法作为生产环境使用,W3C Web性能工作组也曾讨论内存分析的方案,但尚未达成一致。</p>
100
+ <p>在实验室环境中,您可以使用Chrome标志 –enable-precise-memory-info 来增加此API的精确度。你还可以通过调用专有的Chromedriver命令来创建内存快照文件:takeHeapSnapshot,但尽管如此,还是会存在上面的限制。</p>
101
+ <p>由于事件侦听器是最常见的内存泄漏源,因此我使用的另一种技术就是对addEventListener和removeEventListenerAPI进行monkey-patch(猴子补丁)修复,通过引用计数来确保它们最终返回的是零。有个示例供大家参考</p>
102
+ <p>在Chrome DevTools中,你还可以使用getEventListeners()这个方法来查看附加到特定元素的事件监听器。需要注意的是这只能在DevTools中使用。</p>
103
+ <h5 id="有更新:"><a href="#有更新:" class="headerlink" title="有更新:"></a>有更新:</h5><p>Mathias Bynens向我介绍了另一个有用的DevTools API:queryObjects(),它可以向你显示使用特定构造函数创建的所有对象。Christoph Guttandin也有一篇有趣的博客文章,讲的是如何在Puppeteer中使用此API进行自动内存泄漏检测的。</p>
104
+ <h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>目前在web应用中查找并修复内存泄漏仍然是很初级的阶段,这篇文章展示了一些对我比较有帮助的技术点,但是这仍旧是既费时又耗力的过程。</p>
105
+ <p>和大部分的性能问题一样,这种做法是值得的,你会发现,做一些上线前的综合测试要比等出现了问题才开始调试要值得的多,尤其是当页面上有多个泄漏,则可能会变成洋葱剥皮练习-当你修复一个泄漏,然后开始查找另一个泄漏,然后重复(整个过程可以虐你到哭)。当然,code review还是可以帮助你发现一些内存泄漏的常见模式。</p>
106
+ <p>JavaScript本质上是一种内存安全的语言,但是讽刺的是我们可以轻而易举的造成内存泄漏。这一部分的原因还是要归咎于UI交互设计,我们由于业务逻辑会监听用户的鼠标,滚轮,键盘等等的交互行为,这些直接埋下了内存泄漏的隐患。但是,通过尝试降低Web应用的内存使用量,我们可以提高运行时性能,避免崩溃,充分发挥用户设备性能。</p>
107
+ <p>感谢Jake Archibald和Yang Guo对本文的意见反馈。感谢Dinko Bajric发明了“选择质数”方法,该方法对内存泄漏分析有很大帮助。</p>
108
+ <h4 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h4><p>其实,对于内存的分析不仅仅是找出内存泄漏,更应该发现由于内存占用问题导致的用户体验问题,现在市面上很多app都是hybrid的,h5页面占了大头,如果容器没有做好容错机制,h5的崩溃很容易造成容器的出错, 由于手机客户端的性能瓶颈,无法达到pc端的性能,因此做好性能优化也极为重要,当然这个话题的宽泛超出了内存分析,但我想说的是内存分析也是性能优化的重要一环,有条件的可以看看godp</p>
109
+ <p>关于本文<br>译者:@Jooker<br>译文:<a target="_blank" rel="noopener" href="https://juejin.im/post/5e6346f2e51d4526c70fb949">https://juejin.im/post/5e6346f2e51d4526c70fb949</a><br>作者:@Nolan Lawson<br>原文:<a target="_blank" rel="noopener" href="https://nolanlawson.com/2020/02/19/fixing-memory-leaks-in-web-applications/">https://nolanlawson.com/2020/02/19/fixing-memory-leaks-in-web-applications/</a></p>
110
+ </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/28963.html">https://xuehuayu.cn/article/28963.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/15569.html">ES6语法知识点补充</a><a class="next" href="/article/1518.html">一文完全吃透 JavaScript 继承(面试必备良药)</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
111
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
112
+ const locale = {
113
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
114
+ sofa: '沙发空缺中,还不快抢~',
115
+ };
116
+ Waline.init({
117
+ el: '#vcomment',
118
+ serverURL: serverURL,
119
+ pageSize: '20',
120
+ visitor: true, // 阅读量统计
121
+ requiredMeta: ['nick', 'mail'],
122
+ emoji: [
123
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
124
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
125
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
126
+ ],
127
+ locale,
128
+ pageview: true
129
+ })
130
+ </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() {
131
+ var val = $(this).val()
132
+ 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>'
133
+ 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>'
134
+ 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>'
135
+
136
+ if (val === 'self') {
137
+ $('#search').html(self)
138
+ var search_path = 'search.xml';
139
+ if (search_path.length == 0) {
140
+ search_path = 'search.xml';
141
+ }
142
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
143
+ searchFunc(path, 'local-search-input', 'local-search-result');
144
+ } else if (val === 'baidu') {
145
+ $('#search').html(baidu)
146
+ } else if (val === 'google') {
147
+ $('#search').html(google)
148
+ }
149
+ })</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(){
150
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
151
+ if (cnb) {
152
+ var gxba =document.getElementById('gxba')
153
+ var gaba =document.getElementById('gaba')
154
+ var gabaLink =document.getElementById('gaba-link')
155
+ gxba.innerText ='京ICP备20007647号-1'
156
+ gaba.innerText ='京公网安备 11010802031254号'
157
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
158
+ }
159
+ })()</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>
@@ -0,0 +1,247 @@
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>阿里 P6 大佬的面经,送给在面试或学习路上的小伙伴们 | 前端壹菜鸟</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">阿里 P6 大佬的面经,送给在面试或学习路上的小伙伴们</h1><div class="post-meta"><span class="date">2020-02-02</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%88%86%E4%BA%AB/">分享 </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.4k</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"> 11</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/28976.html#vcomment"><span class="waline-comment-count" data-path="/article/28976.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://mp.weixin.qq.com/s/Xneq2FWi-xpJ_SUcq5WdSQ</code><br>17 年从上家公司离职之后就尝试过去阿里面试,结果还没进入状态就被凉凉了,在扇贝呆了 2 年多的时间,赶上正好租的房子要到期了,就想着再次尝试一下吧,结果还蛮顺利的拿到了 p6 的 offer,趁着目前在家里呆着哪里也不让去的功夫整理一下面试的过程,希望能帮到大家~</p>
20
+ <span id="more"></span>
21
+ <h2 id="一面"><a href="#一面" class="headerlink" title="一面"></a>一面</h2><ol>
22
+ <li>自我介绍</li>
23
+ </ol>
24
+ <blockquote>
25
+ <p>此处就省略了,一般自我介绍的时间感觉不宜过长,简单说下就好~</p>
26
+ </blockquote>
27
+ <ol>
28
+ <li>从浅到深咨询一个项目</li>
29
+ </ol>
30
+ <blockquote>
31
+ <p>因为我在目前公司涉及小程序比较早,并且那个时候还没有比较成熟的线上监控方案,所以我们自己搞了一个线上错误监控系统,然后我就拿这个项目来说了,面试官会仔细的从设计思路,运行原理等等方面开始问,一直问到后端数据慢查询怎么解决,这个问题的时间大概占了面试时间的一半还多,然后得到的经验就是大家一定要自己实际去设计和实现一些项目,不能停留在眼高手低只看不落实的层面,如果这个项目不是我带头发起和亲身实现了里面的一些流程可能很容易就卡壳了,在做的过程中遇到的问题都是很宝贵的经验,当然也是成长的一部分~</p>
32
+ </blockquote>
33
+ <ol>
34
+ <li>简单介绍前端模块化,amd,cmd,commonjs es6 的 module</li>
35
+ </ol>
36
+ <blockquote>
37
+ <p>很尴尬,因为我们目前公司都是直接用esm,再加上自己确实没在前端项目中用过amd 和 cmd项目的类库,然后再加上异常的紧张(一面的时候紧张到说话都喘气,哈哈),然后只聊到一个是同步加载,一个是异步加载,没说出来一个是前置依赖,一个是就近依赖,面试官也很耐斯,听到我有点紧张也没继续问了,说了一句安慰我的话-现在已经不怎么用了~,哈哈哈</p>
38
+ </blockquote>
39
+ <ol>
40
+ <li>commonjs 和 es6 的 module 哪个支持异步</li>
41
+ </ol>
42
+ <blockquote>
43
+ <p>紧接着问了这个问题,emmm.. 当时差点没缓过来,冷静分析了一波,然后想到我们最近的项目中在做react组件的异步加载,想到了 es10 版本添加了异步 import() 方式去载入一个模块,所以答案毫无疑问是 esm 目前支持异步,其实返回来想想,如果用排除法这个也很简单,因为 commonjs 规范主要是给 node 层用的,node 层对于 module 的加载无非就是文件的读写,所以它根本没有必要去支持异步加载,读写 io 本身就很快~</p>
44
+ </blockquote>
45
+ <ol>
46
+ <li>async await 和 promise 的关系</li>
47
+ </ol>
48
+ <blockquote>
49
+ <p>这个问题是当初我第一次面试阿里的时候回答的不好的一个问题,所以面试官专门提出来问了我一下,当然现在看这个问题就比较简单了,async await 是 promise 和 generator 函数组合的一个语法糖,这个没啥好说的~</p>
50
+ </blockquote>
51
+ <ol>
52
+ <li>口述代码,实现 promise.all 的 polyfill</li>
53
+ </ol>
54
+ <blockquote>
55
+ <p>可能还是担心我这块不是很熟悉,所以又问了一个相关的问题,这个比较简单,我直接写代码,当时是口述的,思路是一样的;</p>
56
+ </blockquote>
57
+ <pre><code>Promise.myAll = function(...args)&#123;
58
+ const result = [];
59
+ let isFail = false;
60
+ let errInfo;
61
+ let j = args.length;
62
+ for (let i = 0; i &lt; args.length; i++)&#123;
63
+ // 如果有错误就停止循环
64
+ if(isFail) &#123;
65
+ returnPromise.reject(errInfo);
66
+ &#125;;
67
+ // 挨个运行promise
68
+ args[i].then(res =&gt; &#123;
69
+ // 处理结果
70
+ result.push(res);
71
+ j--;
72
+ if(j === 0)&#123;
73
+ returnPromise.resolve(result);
74
+ &#125;
75
+ &#125;).catch(err =&gt; &#123;
76
+ // 设置停止循环的标志,存储错误信息
77
+ isFail = true;
78
+ errInfo = err;
79
+ &#125;)
80
+ &#125;
81
+ &#125;
82
+ // 以上都是未经运行未经测试的伪代码,可能有问题,大致思路就这样~
83
+ </code></pre>
84
+ <ol>
85
+ <li>flex 布局,固定高度,左边定宽,右边自适应?</li>
86
+ </ol>
87
+ <blockquote>
88
+ <p>这个比较简单,flex 布局给父元素设置 <code>display:flex</code>,左边的子元素 <code>flex:none</code>,给个 <code>width:100px</code>,右边的子元素 <code>flex:1</code> 就可以了,当然可能有别的方式,这个应该是最简单的~</p>
89
+ </blockquote>
90
+ <ol>
91
+ <li>如果子元素不能 100% 继承高度,怎么实现撑满?</li>
92
+ </ol>
93
+ <blockquote>
94
+ <p>这个问题我当时没反应过来面试官的意思,我问了一下是不是要纵轴方向的 flex 布局?后来面试官说 嗯。。也可以,这个过了。我就愣了,回来之后想了一下,不知道是不是说如果子元素无法 100% 的继承高度,那是不是可以结合定位的方式,比如父元素 relative,子元素 absolute,然后四个位置都是 0?不知道是不是这个意思<del>无法考究了</del></p>
95
+ </blockquote>
96
+ <ol>
97
+ <li>对 ts 的理解</li>
98
+ </ol>
99
+ <blockquote>
100
+ <p>ts 用的不是很多,因为我们的项目大部分都是基于 h5 的,首先逻辑不是很复杂,因为每个 part 最多就三四个页面而且跟别的 part 基本没关系,业务决定并不是很适合 ts,所以也没在团队中怎么推广,但是有在后台项目,就是管理端用了 ts,所以简单说了一下 ts 和 js 的优缺点~</p>
101
+ </blockquote>
102
+ <ol>
103
+ <li>ts 的泛型是什么作用</li>
104
+ </ol>
105
+ <blockquote>
106
+ <p>一下没反应过来怎么回答,因为本身 ts 用的不多,泛型用的更不多,但是后来我想了一下 java 中的泛型,再加上面试管的提示,我给的答案是泛型决定了一个类型在不同的场景下能够在每个场景下从始至终的保持类型一致,有点拗口,但是应该就是这么个意思~</p>
107
+ </blockquote>
108
+ <ol>
109
+ <li>假如监控系统别的组需要用,并且没满足他们的需求,你会怎么处理</li>
110
+ </ol>
111
+ <blockquote>
112
+ <p>瞬间没反应过来面试官想问啥,因此说了一大堆,比如说要看自己的团队是否有时间,要看这个需求是否合理,要看这个需求是一个定制化的需求还是一个比较通用的需求,等等各种情况下怎么处理都给了自己的方案,然后面试官打断我说我问的不是这个意思,是问你是你来做还是别的组来做?我说还是得分情况看事情和时间的安排,然后就过去了~</p>
113
+ </blockquote>
114
+ <p>基本到这里一面就结束了,emmm,刚挂了电话,正好面试的部门有一个之前从扇贝离职去了的同事,面的还是很巧的同一个部门,大哥就跟我说恭喜一面过了。。哈哈,2 面开始就没那么紧张了</p>
115
+ <h2 id="二面"><a href="#二面" class="headerlink" title="二面"></a>二面</h2><blockquote>
116
+ <p>隔了好像就两天 2 面就来了,2 面因为是晚上 8 点多才开始的,所以面试官本来说准备聊半个小时,结果还是聊多了</p>
117
+ </blockquote>
118
+ <ol>
119
+ <li>设计一个通过拖拽,然后交换位置的组件,给思路就可以。</li>
120
+ </ol>
121
+ <blockquote>
122
+ <p>emmm,网上有很多,大体就是关于拖拽的一些 api,然后怎么携带数据这些,我就不展开了~</p>
123
+ </blockquote>
124
+ <ol>
125
+ <li>假如有 2 个团队,一个团队想用另一个团队的一个类库,并且还是想在用到的时候才加进来,怎么办?</li>
126
+ </ol>
127
+ <blockquote>
128
+ <p>emmm。。我先说答案,是用 webpack 中的 externals 去配置一个 cmd 的异步引入,这个是面试官的答案,但是我印象面试官开始的时候没提到说要用 webpack,我一直在想的就是怎么异步加依赖,我就说可以让他们发布到自己的私服 npm 上,然后另一个团队安装,用的时候用 import 做异步加载。。balabala 说了半天,直到最后面试官来了一句你知道 webpack 的 externals 吗?我才反应过来<del>emmmm,好吧</del></p>
129
+ </blockquote>
130
+ <ol>
131
+ <li>设计一个组件你会考虑哪些问题?</li>
132
+ </ol>
133
+ <blockquote>
134
+ <p>不得不说这个是个好问题,组件天天写,但是确实没好好整理过,当时问完我的时候,我是有点懵逼的,我在想就是看需要啥样子的就怎么样的设计呗,主要就是考虑一下扩展性,其实这个我每次开发的时候都会注意到,但是一下子竟然不知道怎么说了,balabala 讲了一堆,看需求分析啊,确定输入输出啊,考虑扩展性啊,别人怎么用啊之类的,其实我觉得面试官想问的可能是如何设计一个通用的组件,可以参考这个</p>
135
+ </blockquote>
136
+ <ol>
137
+ <li>回到一个我简历上的项目,这个项目的核心是让运营和产品能够自己替换线上活动页或者落地页的图片资源和文案一类的内容,同时还有定点替换的功能,这个面试的时候还没完全实现,不过现在已经上线了一个简单版本了,用着还可以,等待后续再迭代,这个项目问了一下简单的思路,我还准备描述我们在 node 做的缓存,结果面试官说我了解了,emmm,可能太晚了吧,哈哈</li>
138
+ </ol>
139
+ <p>二面就结束了,完了看下时间,超了半小时,主要卡在第 2 个题目上,从始至终都没去向 webpack,这个确实还是自己的思路一下被限制的太死了,再加上我们通过 webpack 的 externals 去做的配置很少,基本就是简单的 jquery 这样引入过,后来为了方便都直接走 npm 装依赖了,其实还是要看场景,有时候偷懒确实是问题~~</p>
140
+ <h2 id="三面"><a href="#三面" class="headerlink" title="三面"></a>三面</h2><p>隔了三天左右,三面的通知就下来了,三面是 p8 的大佬,从头到尾都没问基础知识相关的内容;</p>
141
+ <ol>
142
+ <li>自我介绍</li>
143
+ </ol>
144
+ <blockquote>
145
+ <p>省略。。</p>
146
+ </blockquote>
147
+ <ol>
148
+ <li>主要做的是哪些业务?</li>
149
+ </ol>
150
+ <blockquote>
151
+ <p>简单聊了一下在公司做的业务。。。</p>
152
+ </blockquote>
153
+ <ol>
154
+ <li>为什么感觉你们的产品会比别人家的业务要好?</li>
155
+ </ol>
156
+ <blockquote>
157
+ <p>这个问题涉及到一些产品的核心业务的卖点,没多说,讲了一点点。。</p>
158
+ </blockquote>
159
+ <ol>
160
+ <li>看你在带一个项目,你一般都是怎么协调资源的?</li>
161
+ </ol>
162
+ <blockquote>
163
+ <p>讲了一大堆。。</p>
164
+ </blockquote>
165
+ <p>后面的几个问题不记得了,基本上都是和业务相关的,还有和产品、运营如何沟通协作等等的问题。。</p>
166
+ <p>三面基本都是涉及到业务相关的,总结下来就是我觉得越到后面面试反而更注重业务多一些了,这些东西不是临时抱佛脚能 get 到的东西,如果你对所做的事情不做更多的理解,对业务不做一定的思考,可能在这个环节会凉凉,我之前也一直有说我们每个开发都要做一个有灵魂的开发,不要把自己真的就只定义为码农机器,我们要加入自己的思考,比如,对接到的需求要有自己的理解,怎么样帮助需求方更完美的去实现需求,哪些该做的没有,哪些需求是伪需求不合理,都应该是每个人要学会和掌握的,至少在熟悉的环节要理解透彻~</p>
167
+ <h2 id="四面"><a href="#四面" class="headerlink" title="四面"></a>四面</h2><p>大概也是三天左右,四面的通知也下来了,是一个 p9 的大佬,比我想象的要老一点哈哈,所以小伙伴们不用担心我们吃的是青春饭,加油奋斗吧~</p>
168
+ <ol>
169
+ <li>什么是 h5?</li>
170
+ </ol>
171
+ <blockquote>
172
+ <p>是 html 历史上的一个版本,也是一个协议,规定 html5 支持哪些、不支持哪些特性;</p>
173
+ </blockquote>
174
+ <ol>
175
+ <li>举几个 h5 的新特性</li>
176
+ </ol>
177
+ <blockquote>
178
+ <p>很多,比如媒体啊,storage 相关的等等</p>
179
+ </blockquote>
180
+ <ol>
181
+ <li>我看你做过小程序,你觉得小程序,webview 和 h5 的关系?</li>
182
+ </ol>
183
+ <blockquote>
184
+ <p>开始有点懵,我在想这应该是完全不同的东西吧,后来简单说了一下小程序,webview 属于是容器一类,它们可以用来承载 html 的内容,但是小程序的又不同于标准的 webview,它承载的是自己独有类 html 语法等等。。。</p>
185
+ </blockquote>
186
+ <p>4.你们的业务主要用的是哪些方式?</p>
187
+ <blockquote>
188
+ <p>native + webview 还有小程序,浏览器端只有后台项目,不是很多</p>
189
+ </blockquote>
190
+ <p>后面的问题都不记得了,反而感觉四面的问题比较简单,时间也不久,就二十来分钟,可能是因为晚上快下班了吧~</p>
191
+ <h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>三面和四面都是视频面的,我都是提前十分钟就在线等了,说话的时候面试官都能看到你的一言一行,还是注意点,把周围的环境也弄整齐一些,给面试官留个好印象~</p>
192
+ <p>经历了大概 2 周的时间,顺利面完,最后的 hr 是现场面的,也问了很多个人相关的问题,hr 面的内容还蛮多的,并且 hr 面会涉及到一些技术相关,当然不是基础内容~</p>
193
+ <p>最后就是体检,背调等等,顺利拿到 offer,也拿到自己想要的薪资,特地把能想到的面试内容都分享一下,加油吧,我面的是南京的岗位,有想跳槽到阿里,或者想交流面试经验的,想 get 一些私密经验的,emmm…,还有想技术交流的,都可以添加<strong>瓶子君</strong></p>
194
+ <p>添加成功后,发送关键字<strong>交流</strong>,拉你进群哦~</p>
195
+ <p><img src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==" alt="xuehuayu.cn"></p>
196
+ <h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>武汉加油,中国加油,所有这一切都会过去的~</p>
197
+ <p><strong>最后的最后,大家记得出门戴口罩,勤洗手哟~</strong></p>
198
+ </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/28976.html">https://xuehuayu.cn/article/28976.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/43397.html">HTTPS 到底加密了什么?</a><a class="next" href="/article/26850.html">Chrome 神器,这些神奇的技巧你用过没?</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
199
+ const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
200
+ const locale = {
201
+ placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
202
+ sofa: '沙发空缺中,还不快抢~',
203
+ };
204
+ Waline.init({
205
+ el: '#vcomment',
206
+ serverURL: serverURL,
207
+ pageSize: '20',
208
+ visitor: true, // 阅读量统计
209
+ requiredMeta: ['nick', 'mail'],
210
+ emoji: [
211
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
212
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
213
+ 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
214
+ ],
215
+ locale,
216
+ pageview: true
217
+ })
218
+ </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() {
219
+ var val = $(this).val()
220
+ 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>'
221
+ 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>'
222
+ 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>'
223
+
224
+ if (val === 'self') {
225
+ $('#search').html(self)
226
+ var search_path = 'search.xml';
227
+ if (search_path.length == 0) {
228
+ search_path = 'search.xml';
229
+ }
230
+ var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
231
+ searchFunc(path, 'local-search-input', 'local-search-result');
232
+ } else if (val === 'baidu') {
233
+ $('#search').html(baidu)
234
+ } else if (val === 'google') {
235
+ $('#search').html(google)
236
+ }
237
+ })</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(){
238
+ var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
239
+ if (cnb) {
240
+ var gxba =document.getElementById('gxba')
241
+ var gaba =document.getElementById('gaba')
242
+ var gabaLink =document.getElementById('gaba-link')
243
+ gxba.innerText ='京ICP备20007647号-1'
244
+ gaba.innerText ='京公网安备 11010802031254号'
245
+ gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
246
+ }
247
+ })()</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>