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.
- package/CNAME +1 -0
- package/MP_verify_o6dHCK5mIkxNpzvZ.txt +1 -0
- package/README.md +8 -0
- package/about/index.html +54 -0
- package/ads.txt +1 -0
- package/app/manual.html +104 -0
- package/appConfigs/config +1 -0
- package/archives/2018/index.html +48 -0
- package/archives/2019/index.html +48 -0
- package/archives/2019/page/2/index.html +48 -0
- package/archives/2020/index.html +48 -0
- package/archives/2021/index.html +48 -0
- package/archives/2022/index.html +48 -0
- package/archives/2023/index.html +48 -0
- package/archives/index.html +48 -0
- package/archives/page/2/index.html +48 -0
- package/archives/page/3/index.html +48 -0
- package/article/10047.html +148 -0
- package/article/10164.html +64 -0
- package/article/10624.html +436 -0
- package/article/10745.html +586 -0
- package/article/11674.html +71 -0
- package/article/11939.html +72 -0
- package/article/12238.html +86 -0
- package/article/1230.html +533 -0
- package/article/13265.html +69 -0
- package/article/13823.html +78 -0
- package/article/14125.html +72 -0
- package/article/14192.html +561 -0
- package/article/14375.html +85 -0
- package/article/14744.html +83 -0
- package/article/14936.html +451 -0
- package/article/1518.html +250 -0
- package/article/15428.html +71 -0
- package/article/15518.html +288 -0
- package/article/15569.html +418 -0
- package/article/1566.html +122 -0
- package/article/16017.html +156 -0
- package/article/16947.html +440 -0
- package/article/17096.html +82 -0
- package/article/17246.html +89 -0
- package/article/17575.html +350 -0
- package/article/179.html +757 -0
- package/article/18039.html +233 -0
- package/article/18071.html +375 -0
- package/article/18142.html +71 -0
- package/article/19909.html +160 -0
- package/article/20014.html +89 -0
- package/article/20021.html +389 -0
- package/article/20037.html +280 -0
- package/article/20056.html +95 -0
- package/article/20093.html +404 -0
- package/article/2021.html +607 -0
- package/article/20459.html +115 -0
- package/article/20613.html +263 -0
- package/article/20635.html +71 -0
- package/article/21317.html +71 -0
- package/article/21320.html +90 -0
- package/article/21782.html +548 -0
- package/article/22230.html +435 -0
- package/article/22237.html +347 -0
- package/article/22398.html +109 -0
- package/article/22422.html +270 -0
- package/article/22565.html +300 -0
- package/article/23046.html +250 -0
- package/article/23083.html +215 -0
- package/article/23195.html +297 -0
- package/article/23301.html +835 -0
- package/article/23589.html +285 -0
- package/article/23655.html +338 -0
- package/article/23864.html +76 -0
- package/article/23914.html +96 -0
- package/article/24169.html +135 -0
- package/article/24581.html +349 -0
- package/article/2475.html +500 -0
- package/article/24826.html +77 -0
- package/article/24924.html +247 -0
- package/article/25164.html +1495 -0
- package/article/25318.html +394 -0
- package/article/25710.html +1129 -0
- package/article/25734.html +83 -0
- package/article/26083.html +174 -0
- package/article/26147.html +283 -0
- package/article/26291.html +110 -0
- package/article/26354.html +71 -0
- package/article/26624.html +145 -0
- package/article/26639.html +298 -0
- package/article/26850.html +138 -0
- package/article/26940.html +258 -0
- package/article/27796.html +190 -0
- package/article/27800.html +161 -0
- package/article/28963.html +159 -0
- package/article/28976.html +247 -0
- package/article/29042.html +72 -0
- package/article/29596.html +81 -0
- package/article/29619.html +183 -0
- package/article/29623.html +329 -0
- package/article/29829.html +205 -0
- package/article/29abbd1c.html +112 -0
- package/article/30215.html +178 -0
- package/article/30552.html +78 -0
- package/article/30818.html +201 -0
- package/article/31330.html +364 -0
- package/article/3154.html +577 -0
- package/article/31695.html +348 -0
- package/article/31826.html +71 -0
- package/article/31843.html +132 -0
- package/article/32280.html +212 -0
- package/article/32431.html +74 -0
- package/article/32443.html +72 -0
- package/article/32732.html +122 -0
- package/article/3286.html +251 -0
- package/article/32960.html +198 -0
- package/article/33713.html +72 -0
- package/article/33899.html +615 -0
- package/article/34351.html +74 -0
- package/article/34372.html +89 -0
- package/article/34410.html +74 -0
- package/article/34431.html +118 -0
- package/article/3447.html +75 -0
- package/article/34474.html +142 -0
- package/article/34871.html +147 -0
- package/article/35397.html +175 -0
- package/article/3544.html +199 -0
- package/article/35503.html +115 -0
- package/article/35624.html +84 -0
- package/article/35697.html +384 -0
- package/article/35863.html +73 -0
- package/article/36037.html +253 -0
- package/article/36118.html +71 -0
- package/article/3621.html +119 -0
- package/article/36251.html +296 -0
- package/article/36642.html +352 -0
- package/article/37102.html +763 -0
- package/article/37336.html +351 -0
- package/article/37351.html +89 -0
- package/article/3760.html +294 -0
- package/article/37749.html +75 -0
- package/article/37789.html +83 -0
- package/article/38005.html +765 -0
- package/article/38009.html +284 -0
- package/article/38269.html +194 -0
- package/article/38344.html +88 -0
- package/article/38359.html +334 -0
- package/article/38423.html +379 -0
- package/article/38530.html +213 -0
- package/article/38743.html +268 -0
- package/article/38753.html +204 -0
- package/article/38881.html +71 -0
- package/article/39087.html +414 -0
- package/article/39309.html +84 -0
- package/article/39486.html +74 -0
- package/article/39637.html +306 -0
- package/article/39839.html +72 -0
- package/article/39937.html +152 -0
- package/article/39970.html +71 -0
- package/article/402.html +559 -0
- package/article/40698.html +71 -0
- package/article/40811.html +71 -0
- package/article/40964.html +462 -0
- package/article/41011.html +322 -0
- package/article/41152.html +78 -0
- package/article/41696.html +71 -0
- package/article/41717.html +281 -0
- package/article/41777.html +149 -0
- package/article/419.html +985 -0
- package/article/4233.html +136 -0
- package/article/4292.html +86 -0
- package/article/43302.html +96 -0
- package/article/43397.html +106 -0
- package/article/43724.html +281 -0
- package/article/43999.html +224 -0
- package/article/44426.html +77 -0
- package/article/44964.html +137 -0
- package/article/45004.html +123 -0
- package/article/4510.html +83 -0
- package/article/45156.html +320 -0
- package/article/45157.html +52 -0
- package/article/45267.html +87 -0
- package/article/45641.html +207 -0
- package/article/45960.html +75 -0
- package/article/46100.html +1262 -0
- package/article/46366.html +74 -0
- package/article/46771.html +96 -0
- package/article/46911.html +517 -0
- package/article/46948.html +137 -0
- package/article/46ee4850.html +349 -0
- package/article/47019.html +84 -0
- package/article/47532.html +94 -0
- package/article/4783.html +429 -0
- package/article/47972.html +72 -0
- package/article/48216.html +127 -0
- package/article/48252.html +185 -0
- package/article/48520.html +74 -0
- package/article/48722.html +75 -0
- package/article/48807.html +99 -0
- package/article/49126.html +323 -0
- package/article/50001.html +88 -0
- package/article/50058.html +151 -0
- package/article/50343.html +410 -0
- package/article/50510.html +82 -0
- package/article/51082.html +98 -0
- package/article/51677.html +111 -0
- package/article/5204.html +1085 -0
- package/article/52500.html +538 -0
- package/article/52689.html +259 -0
- package/article/52877.html +569 -0
- package/article/53125.html +191 -0
- package/article/53428.html +251 -0
- package/article/53524.html +74 -0
- package/article/53698.html +322 -0
- package/article/53803e6.html +93 -0
- package/article/53924.html +291 -0
- package/article/53962.html +253 -0
- package/article/54006.html +71 -0
- package/article/54018.html +88 -0
- package/article/54161.html +83 -0
- package/article/54178.html +69 -0
- package/article/54258.html +327 -0
- package/article/54295.html +214 -0
- package/article/54313.html +1976 -0
- package/article/54351.html +90 -0
- package/article/54604.html +80 -0
- package/article/54632.html +71 -0
- package/article/54912.html +756 -0
- package/article/54918.html +129 -0
- package/article/55119.html +136 -0
- package/article/55756.html +118 -0
- package/article/55769.html +136 -0
- package/article/55870.html +161 -0
- package/article/56139.html +92 -0
- package/article/56557.html +69 -0
- package/article/56604.html +69 -0
- package/article/56816.html +266 -0
- package/article/56926.html +153 -0
- package/article/57747.html +409 -0
- package/article/57965.html +475 -0
- package/article/58816.html +78 -0
- package/article/59059.html +435 -0
- package/article/59095.html +350 -0
- package/article/59349.html +244 -0
- package/article/59402.html +216 -0
- package/article/59448.html +55 -0
- package/article/59870.html +94 -0
- package/article/59877.html +208 -0
- package/article/5dbb6f41.html +86 -0
- package/article/6008.html +75 -0
- package/article/60327.html +126 -0
- package/article/6035.html +76 -0
- package/article/60428.html +71 -0
- package/article/60544.html +128 -0
- package/article/61319.html +95 -0
- package/article/61367.html +93 -0
- package/article/624d1918.html +292 -0
- package/article/62543.html +71 -0
- package/article/62887.html +169 -0
- package/article/63074.html +120 -0
- package/article/63266.html +311 -0
- package/article/63351.html +74 -0
- package/article/63542.html +104 -0
- package/article/63824.html +275 -0
- package/article/64051.html +653 -0
- package/article/64189b69.html +72 -0
- package/article/64354.html +75 -0
- package/article/64869.html +79 -0
- package/article/64923.html +596 -0
- package/article/65128.html +95 -0
- package/article/65295.html +79 -0
- package/article/6888.html +75 -0
- package/article/7065.html +84 -0
- package/article/7455.html +85 -0
- package/article/7a3ef8f.html +315 -0
- package/article/8140.html +188 -0
- package/article/8190.html +85 -0
- package/article/8225.html +78 -0
- package/article/84c9ccd6.html +159 -0
- package/article/8f9a9ae3.html +82 -0
- package/article/9174.html +73 -0
- package/article/9738.html +294 -0
- package/article/a4145266.html +71 -0
- package/article/bedea419.html +72 -0
- package/article/bf7e7421.html +78 -0
- package/article/c1867fbf.html +103 -0
- package/article/c5576490.html +70 -0
- package/article/dcb0db28.html +76 -0
- package/article/fc3b727a.html +79 -0
- package/atom.xml +445 -0
- package/baidusitemap.xml +1079 -0
- package/blocks/dns.txt +264 -0
- package/blocks/filter.txt +1070 -0
- package/blocks/script.js +42 -0
- package/categories/CDN/index.html +48 -0
- package/categories/IDE/index.html +48 -0
- package/categories/git/index.html +48 -0
- package/categories/hexo/index.html +48 -0
- package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +48 -0
- package/categories//345/210/206/344/272/253/index.html +48 -0
- package/categories//345/211/215/347/253/257/index.html +48 -0
- package/categories//345/211/215/347/253/257/page/2/index.html +48 -0
- package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +48 -0
- 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
- package/categories//345/215/232/345/256/242/index.html +48 -0
- package/categories//345/267/245/345/205/267/index.html +48 -0
- package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +48 -0
- 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
- package/categories//346/255/243/345/210/231/index.html +48 -0
- package/categories//346/265/217/350/247/210/345/231/250/index.html +48 -0
- package/categories//347/256/227/346/263/225/index.html +48 -0
- package/categories//350/265/204/350/256/257/index.html +48 -0
- package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +48 -0
- package/cdn/css/font-awesome.min.css +4 -0
- package/cdn/css/grids-responsive-min.css +7 -0
- package/cdn/css/normalize.css +349 -0
- package/cdn/css/pure-min.css +11 -0
- package/cdn/fonts/fontawesome-webfont.eot +0 -0
- package/cdn/fonts/fontawesome-webfont.svg +2671 -0
- package/cdn/fonts/fontawesome-webfont.ttf +0 -0
- package/cdn/fonts/fontawesome-webfont.woff +0 -0
- package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
- package/cdn/js/Valine.min.js +17 -0
- package/cdn/js/canvas-nest.js +1 -0
- package/cdn/js/clipboard.min.js +7 -0
- package/cdn/js/crypto-js.js +25 -0
- package/cdn/js/jquery.min.js +2 -0
- package/css/default.css +1144 -0
- package/css/donate.css +338 -0
- package/css/hbe.style.css +749 -0
- package/css/style.css +2095 -0
- package/donate/index.html +39 -0
- package/google917dcf72f6e5c7f5.html +1 -0
- package/guestbook/index.html +68 -0
- package/hosts/ads.txt +149 -0
- package/hosts/flash.txt +9 -0
- package/hosts/github.txt +6 -0
- package/hosts/google.txt +16936 -0
- package/hosts/winrar.txt +2 -0
- package/img/alipay.svg +46 -0
- package/img/bitcoin.svg +135 -0
- package/img/blog.ico +0 -0
- package/img/blog.png +0 -0
- package/img/gaba.png +0 -0
- package/img/github.svg +1 -0
- package/img/like.svg +1 -0
- package/img/mp-mini.jpg +0 -0
- package/img/mp.png +0 -0
- package/img/paypal.svg +63 -0
- package/img/upy_logo.svg +59 -0
- package/img/wechat.svg +49 -0
- package/index.html +48 -0
- package/jd_root.txt +1 -0
- package/js/codeblock-resizer.js +51 -0
- package/js/dark.js +12 -0
- package/js/donate.js +87 -0
- package/js/fixedPage.js +106 -0
- package/js/gitment.browser.js +3751 -0
- package/js/search.js +86 -0
- package/js/share.js +60 -0
- package/js/smartresize.js +32 -0
- package/js/totop.js +12 -0
- package/kankan/index.html +77 -0
- package/lib/hbe.js +293 -0
- package/package.json +25 -0
- package/page/10/index.html +49 -0
- package/page/11/index.html +59 -0
- package/page/12/index.html +67 -0
- package/page/13/index.html +63 -0
- package/page/14/index.html +66 -0
- package/page/15/index.html +60 -0
- package/page/16/index.html +60 -0
- package/page/17/index.html +62 -0
- package/page/18/index.html +61 -0
- package/page/19/index.html +58 -0
- package/page/2/index.html +48 -0
- package/page/20/index.html +57 -0
- package/page/21/index.html +61 -0
- package/page/22/index.html +55 -0
- package/page/23/index.html +64 -0
- package/page/24/index.html +60 -0
- package/page/25/index.html +58 -0
- package/page/26/index.html +48 -0
- package/page/27/index.html +58 -0
- package/page/3/index.html +48 -0
- package/page/4/index.html +48 -0
- package/page/5/index.html +51 -0
- package/page/6/index.html +51 -0
- package/page/7/index.html +51 -0
- package/page/8/index.html +53 -0
- package/page/9/index.html +48 -0
- package/randomcall/README.html +1 -0
- package/randomcall/lucker.html +290 -0
- package/randomcall/lucky.png +0 -0
- package/robots.txt +22 -0
- package/search.xml +6740 -0
- package/sitemap.xml +2669 -0
- package/tags//345/216/237/345/210/233/index.html +48 -0
- package/tags//345/250/261/344/271/220/index.html +48 -0
- package/tags//346/211/213/345/206/231/index.html +48 -0
- package/tags//347/226/253/346/203/205/index.html +48 -0
- package/tags//350/275/254/350/275/275/index.html +48 -0
- package/tags//350/275/254/350/275/275/page/2/index.html +48 -0
- package/v.html +90 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>React实战视频教程 | 前端壹菜鸟</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">React实战视频教程</h1><div class="post-meta"><span class="date">2019-10-01</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"> 7</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"> 1</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/41696.html#vcomment"><span class="waline-comment-count" data-path="/article/41696.html"></span><span> 条评论</span></a><div class="post-content"><ul>
|
|
20
|
+
<li><a target="_blank" rel="noopener" href="https://jspang.com/posts/2019/09/19/react-demo.html">React实战视频教程</a></li>
|
|
21
|
+
</ul>
|
|
22
|
+
</div><iframe src="/donate/?AliPayQR=https://store.xuehuayu.cn/store/public/alipay_qr.jpg&WeChatQR=https://store.xuehuayu.cn/store/public/wechat_qr.png&UnionPayQR=null&GitHub=null&BTCQR=null&BTCKEY=null&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/41696.html">https://xuehuayu.cn/article/41696.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/23046.html">精读《React Hooks 最佳实践》</a><a class="next" href="/article/62887.html">9102了,你还不会移动端真机调试?</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
|
|
23
|
+
const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
|
|
24
|
+
const locale = {
|
|
25
|
+
placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
|
|
26
|
+
sofa: '沙发空缺中,还不快抢~',
|
|
27
|
+
};
|
|
28
|
+
Waline.init({
|
|
29
|
+
el: '#vcomment',
|
|
30
|
+
serverURL: serverURL,
|
|
31
|
+
pageSize: '20',
|
|
32
|
+
visitor: true, // 阅读量统计
|
|
33
|
+
requiredMeta: ['nick', 'mail'],
|
|
34
|
+
emoji: [
|
|
35
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
|
|
36
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
|
|
37
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
|
|
38
|
+
],
|
|
39
|
+
locale,
|
|
40
|
+
pageview: true
|
|
41
|
+
})
|
|
42
|
+
</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() {
|
|
43
|
+
var val = $(this).val()
|
|
44
|
+
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>'
|
|
45
|
+
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>'
|
|
46
|
+
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>'
|
|
47
|
+
|
|
48
|
+
if (val === 'self') {
|
|
49
|
+
$('#search').html(self)
|
|
50
|
+
var search_path = 'search.xml';
|
|
51
|
+
if (search_path.length == 0) {
|
|
52
|
+
search_path = 'search.xml';
|
|
53
|
+
}
|
|
54
|
+
var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
|
|
55
|
+
searchFunc(path, 'local-search-input', 'local-search-result');
|
|
56
|
+
} else if (val === 'baidu') {
|
|
57
|
+
$('#search').html(baidu)
|
|
58
|
+
} else if (val === 'google') {
|
|
59
|
+
$('#search').html(google)
|
|
60
|
+
}
|
|
61
|
+
})</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(){
|
|
62
|
+
var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
|
|
63
|
+
if (cnb) {
|
|
64
|
+
var gxba =document.getElementById('gxba')
|
|
65
|
+
var gaba =document.getElementById('gaba')
|
|
66
|
+
var gabaLink =document.getElementById('gaba-link')
|
|
67
|
+
gxba.innerText ='京ICP备20007647号-1'
|
|
68
|
+
gaba.innerText ='京公网安备 11010802031254号'
|
|
69
|
+
gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
|
|
70
|
+
}
|
|
71
|
+
})()</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&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,281 @@
|
|
|
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>从多线程到Event Loop全面梳理 | 前端壹菜鸟</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">从多线程到Event Loop全面梳理</h1><div class="post-meta"><span class="date">2019-09-29</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.6k</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/41717.html#vcomment"><span class="waline-comment-count" data-path="/article/41717.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://juejin.im/post/5d5b4c2df265da03dd3d73e5</code><br>几乎在每一本JS相关的书籍中,都会说JS是<code>单线程</code>的,JS是通过事件队列<code>(Event Loop)</code>的方式来实现异步回调的。<br>对很多初学JS的人来说,根本搞不清楚单线程的JS为什么拥有<code>异步</code>的能力,所以,我试图从<code>进程</code>、<code>线程</code>的角度来解释这个问题。</p>
|
|
20
|
+
<span id="more"></span>
|
|
21
|
+
<blockquote>
|
|
22
|
+
<p>你知道的越多,你不知道的越多<br><code>点赞</code>再看,手留余香,与有荣焉</p>
|
|
23
|
+
</blockquote>
|
|
24
|
+
<h2 id="CPU"><a href="#CPU" class="headerlink" title="CPU"></a>CPU</h2><p><img src="https://user-gold-cdn.xitu.io/2019/8/20/16caca3ddada3a3d?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="CPU"><br>计算机的核心是<code>CPU</code>,它承担了所有的计算任务。</p>
|
|
25
|
+
<p>它就像一座工厂,时刻在运行。</p>
|
|
26
|
+
<h2 id="进程"><a href="#进程" class="headerlink" title="进程"></a>进程</h2><p><img src="https://user-gold-cdn.xitu.io/2019/8/20/16caca3ddb1e54c7?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="进程"><br>假定工厂的电力有限,一次只能供给一个车间使用。<br>也就是说,一个车间开工的时候,其他车间都必须停工。<br>背后的含义就是,单个CPU一次只能运行一个任务。</p>
|
|
27
|
+
<p><code>进程</code>就好比工厂的车间,它代表CPU所能处理的单个任务。<br><code>进程</code>之间相互独立,任一时刻,CPU总是运行一个<code>进程</code>,其他<code>进程</code>处于非运行状态。<br>CPU使用时间片轮转进度算法来实现同时运行多个<code>进程</code>。</p>
|
|
28
|
+
<h2 id="线程"><a href="#线程" class="headerlink" title="线程"></a>线程</h2><p><img src="https://user-gold-cdn.xitu.io/2019/8/20/16caca3ddb0197b8?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="线程"><br>一个车间里,可以有很多工人,共享车间所有的资源,他们协同完成一个任务。</p>
|
|
29
|
+
<p><code>线程</code>就好比车间里的工人,一个<code>进程</code>可以包括多个<code>线程</code>,多个<code>线程</code>共享<code>进程</code>资源。</p>
|
|
30
|
+
<h2 id="CPU、进程、线程之间的关系"><a href="#CPU、进程、线程之间的关系" class="headerlink" title="CPU、进程、线程之间的关系"></a>CPU、进程、线程之间的关系</h2><p>从上文我们已经简单了解了CPU、进程、线程,简单汇总一下。</p>
|
|
31
|
+
<ul>
|
|
32
|
+
<li><code>进程</code>是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)</li>
|
|
33
|
+
<li><code>线程</code>是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)</li>
|
|
34
|
+
<li>不同<code>进程</code>之间也可以通信,不过代价较大</li>
|
|
35
|
+
<li><code>单线程</code>与<code>多线程</code>,都是指在一个<code>进程</code>内的单和多</li>
|
|
36
|
+
</ul>
|
|
37
|
+
<h2 id="浏览器是多进程的"><a href="#浏览器是多进程的" class="headerlink" title="浏览器是多进程的"></a>浏览器是多进程的</h2><p>我们已经知道了<code>CPU</code>、<code>进程</code>、<code>线程</code>之间的关系,对于计算机来说,每一个应用程序都是一个<code>进程</code>,<br>而每一个应用程序都会分别有很多的功能模块,这些功能模块实际上是通过<code>子进程</code>来实现的。<br>对于这种<code>子进程</code>的扩展方式,我们可以称这个应用程序是<code>多进程</code>的。</p>
|
|
38
|
+
<p>而对于浏览器来说,浏览器就是多进程的,我在Chrome浏览器中打开了多个tab,然后打开windows控制管理器:<br><img src="https://user-gold-cdn.xitu.io/2019/8/21/16cb1f0a851c86b9?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="浏览器是多进程的"><br>如上图,我们可以看到一个Chrome浏览器启动了好多个进程。</p>
|
|
39
|
+
<p>总结一下:</p>
|
|
40
|
+
<ul>
|
|
41
|
+
<li>浏览器是多进程的</li>
|
|
42
|
+
<li>每一个Tab页,就是一个独立的进程</li>
|
|
43
|
+
</ul>
|
|
44
|
+
<h2 id="浏览器包含了哪些进程"><a href="#浏览器包含了哪些进程" class="headerlink" title="浏览器包含了哪些进程"></a>浏览器包含了哪些进程</h2><ul>
|
|
45
|
+
<li><p>主进程</p>
|
|
46
|
+
</li>
|
|
47
|
+
<li><p>协调控制其他子进程(创建、销毁)</p>
|
|
48
|
+
</li>
|
|
49
|
+
<li><p>浏览器界面显示,用户交互,前进、后退、收藏</p>
|
|
50
|
+
</li>
|
|
51
|
+
<li><p>将渲染进程得到的内存中的Bitmap,绘制到用户界面上</p>
|
|
52
|
+
</li>
|
|
53
|
+
<li><p>处理不可见操作,网络请求,文件访问等</p>
|
|
54
|
+
</li>
|
|
55
|
+
<li><p>第三方插件进程</p>
|
|
56
|
+
</li>
|
|
57
|
+
<li><p>每种类型的插件对应一个进程,仅当使用该插件时才创建</p>
|
|
58
|
+
</li>
|
|
59
|
+
<li><p>GPU进程</p>
|
|
60
|
+
</li>
|
|
61
|
+
<li><p>用于3D绘制等</p>
|
|
62
|
+
</li>
|
|
63
|
+
<li><p><code>渲染进程</code>,就是我们说的<code>浏览器内核</code></p>
|
|
64
|
+
</li>
|
|
65
|
+
<li><p>负责页面渲染,脚本执行,事件处理等</p>
|
|
66
|
+
</li>
|
|
67
|
+
<li><p>每个tab页一个渲染进程</p>
|
|
68
|
+
</li>
|
|
69
|
+
</ul>
|
|
70
|
+
<p>那么浏览器中包含了这么多的进程,那么对于普通的前端操作来说,最重要的是什么呢?</p>
|
|
71
|
+
<p>答案是<code>渲染进程</code>,也就是我们常说的<code>浏览器内核</code></p>
|
|
72
|
+
<h2 id="浏览器内核(渲染进程)"><a href="#浏览器内核(渲染进程)" class="headerlink" title="浏览器内核(渲染进程)"></a>浏览器内核(渲染进程)</h2><p>从前文我们得知,进程和线程是一对多的关系,也就是说一个进程包含了多条线程。</p>
|
|
73
|
+
<p>而对于<code>渲染进程</code>来说,它当然也是多线程的了,接下来我们来看一下渲染进程包含哪些线程。</p>
|
|
74
|
+
<ul>
|
|
75
|
+
<li><p><code>GUI渲染线程</code></p>
|
|
76
|
+
</li>
|
|
77
|
+
<li><p>负责渲染页面,布局和绘制</p>
|
|
78
|
+
</li>
|
|
79
|
+
<li><p>页面需要重绘和回流时,该线程就会执行</p>
|
|
80
|
+
</li>
|
|
81
|
+
<li><p>与js引擎线程互斥,防止渲染结果不可预期</p>
|
|
82
|
+
</li>
|
|
83
|
+
<li><p><code>JS引擎线程</code></p>
|
|
84
|
+
</li>
|
|
85
|
+
<li><p>负责处理解析和执行javascript脚本程序</p>
|
|
86
|
+
</li>
|
|
87
|
+
<li><p>只有一个JS引擎线程(单线程)</p>
|
|
88
|
+
</li>
|
|
89
|
+
<li><p>与GUI渲染线程互斥,防止渲染结果不可预期</p>
|
|
90
|
+
</li>
|
|
91
|
+
<li><p><code>事件触发线程</code></p>
|
|
92
|
+
</li>
|
|
93
|
+
<li><p>用来控制事件循环(鼠标点击、setTimeout、ajax等)</p>
|
|
94
|
+
</li>
|
|
95
|
+
<li><p>当事件满足触发条件时,将事件放入到JS引擎所在的执行队列中</p>
|
|
96
|
+
</li>
|
|
97
|
+
<li><p><code>定时触发器线程</code></p>
|
|
98
|
+
</li>
|
|
99
|
+
<li><p>setInterval与setTimeout所在的线程</p>
|
|
100
|
+
</li>
|
|
101
|
+
<li><p>定时任务并不是由JS引擎计时的,是由定时触发线程来计时的</p>
|
|
102
|
+
</li>
|
|
103
|
+
<li><p>计时完毕后,通知事件触发线程</p>
|
|
104
|
+
</li>
|
|
105
|
+
<li><p><code>异步http请求线程</code></p>
|
|
106
|
+
</li>
|
|
107
|
+
<li><p>浏览器有一个单独的线程用于处理AJAX请求</p>
|
|
108
|
+
</li>
|
|
109
|
+
<li><p>当请求完成时,若有回调函数,通知事件触发线程</p>
|
|
110
|
+
</li>
|
|
111
|
+
</ul>
|
|
112
|
+
<p>当我们了解了渲染进程包含的这些线程后,我们思考两个问题:</p>
|
|
113
|
+
<ol>
|
|
114
|
+
<li>为什么 javascript 是单线程的</li>
|
|
115
|
+
<li>为什么 GUI 渲染线程为什么与 JS 引擎线程互斥</li>
|
|
116
|
+
</ol>
|
|
117
|
+
<h3 id="为什么-javascript-是单线程的"><a href="#为什么-javascript-是单线程的" class="headerlink" title="为什么 javascript 是单线程的"></a>为什么 javascript 是单线程的</h3><p>首先是历史原因,在创建 javascript 这门语言时,多进程多线程的架构并不流行,硬件支持并不好。</p>
|
|
118
|
+
<p>其次是因为多线程的复杂性,多线程操作需要加锁,编码的复杂性会增高。</p>
|
|
119
|
+
<p>而且,如果同时操作 DOM ,在多线程不加锁的情况下,最终会导致 DOM 渲染的结果不可预期。</p>
|
|
120
|
+
<h3 id="为什么-GUI-渲染线程与-JS-引擎线程互斥"><a href="#为什么-GUI-渲染线程与-JS-引擎线程互斥" class="headerlink" title="为什么 GUI 渲染线程与 JS 引擎线程互斥"></a>为什么 GUI 渲染线程与 JS 引擎线程互斥</h3><p>这是由于 JS 是可以操作 DOM 的,如果同时修改元素属性并同时渲染界面(即 <code>JS线程</code>和<code>UI线程</code>同时运行),<br>那么渲染线程前后获得的元素就可能不一致了。</p>
|
|
121
|
+
<p>因此,为了防止渲染出现不可预期的结果,浏览器设定 <code>GUI渲染线程</code>和<code>JS引擎线程</code>为互斥关系,<br>当<code>JS引擎线程</code>执行时<code>GUI渲染线程</code>会被挂起,GUI更新则会被保存在一个队列中等待<code>JS引擎线程</code>空闲时立即被执行。</p>
|
|
122
|
+
<h2 id="从-Event-Loop-看-JS-的运行机制"><a href="#从-Event-Loop-看-JS-的运行机制" class="headerlink" title="从 Event Loop 看 JS 的运行机制"></a>从 Event Loop 看 JS 的运行机制</h2><p>到了这里,终于要进入我们的主题,什么是 Event Loop</p>
|
|
123
|
+
<p>先理解一些概念:</p>
|
|
124
|
+
<ul>
|
|
125
|
+
<li>JS 分为同步任务和异步任务</li>
|
|
126
|
+
<li>同步任务都在JS引擎线程上执行,形成一个<code>执行栈</code></li>
|
|
127
|
+
<li>事件触发线程管理一个<code>任务队列</code>,异步任务触发条件达成,将回调事件放到<code>任务队列</code>中</li>
|
|
128
|
+
<li><code>执行栈</code>中所有同步任务执行完毕,此时JS引擎线程空闲,系统会读取<code>任务队列</code>,将可运行的异步任务回调事件添加到<code>执行栈</code>中,开始执行</li>
|
|
129
|
+
</ul>
|
|
130
|
+
<p><img src="https://user-gold-cdn.xitu.io/2019/8/21/16cb1d70e5120bea?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="xuehuayu.cn"><br>在前端开发中我们会通过<code>setTimeout/setInterval</code>来指定定时任务,会通过<code>XHR/fetch</code>发送网络请求,<br>接下来简述一下<code>setTimeout/setInterval</code>和<code>XHR/fetch</code>到底做了什么事</p>
|
|
131
|
+
<p>我们知道,不管是<code>setTimeout/setInterval</code>和<code>XHR/fetch</code>代码,在这些代码执行时,<br>本身是同步任务,而其中的回调函数才是异步任务。</p>
|
|
132
|
+
<p>当代码执行到<code>setTimeout/setInterval</code>时,实际上是<code>JS引擎线程</code>通知<code>定时触发器线程</code>,间隔一个时间后,会触发一个回调事件,<br>而<code>定时触发器线程</code>在接收到这个消息后,会在等待的时间后,将回调事件放入到由<code>事件触发线程</code>所管理的<code>事件队列</code>中。</p>
|
|
133
|
+
<p>当代码执行到<code>XHR/fetch</code>时,实际上是<code>JS引擎线程</code>通知<code>异步http请求线程</code>,发送一个网络请求,并制定请求完成后的回调事件,<br>而<code>异步http请求线程</code>在接收到这个消息后,会在请求成功后,将回调事件放入到由<code>事件触发线程</code>所管理的<code>事件队列</code>中。</p>
|
|
134
|
+
<p>当我们的同步任务执行完,<code>JS引擎线程</code>会询问<code>事件触发线程</code>,在<code>事件队列</code>中是否有待执行的回调函数,如果有就会加入到执行栈中交给<code>JS引擎线程</code>执行</p>
|
|
135
|
+
<p>用一张图来解释:<br><img src="https://user-gold-cdn.xitu.io/2019/8/21/16cb1d7433f29c46?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" alt="xuehuayu.cn"><br>再用代码来解释一下:</p>
|
|
136
|
+
<pre><code>let timerCallback = function() {
|
|
137
|
+
console.log('wait one second');
|
|
138
|
+
};
|
|
139
|
+
let httpCallback = function() {
|
|
140
|
+
console.log('get server data success');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// 同步任务console.log('hello');
|
|
144
|
+
// 同步任务// 通知定时器线程 1s 后将 timerCallback 交由事件触发线程处理// 1s 后事件触发线程将 timerCallback 加入到事件队列中
|
|
145
|
+
setTimeout(timerCallback,1000);
|
|
146
|
+
// 同步任务// 通知异步http请求线程发送网络请求,请求成功后将 httpCallback 交由事件触发线程处理// 请求成功后事件触发线程将 httpCallback 加入到事件队列中
|
|
147
|
+
$.get('www.xxxx.com',httpCallback);
|
|
148
|
+
// 同步任务console.log('world');
|
|
149
|
+
//...// 所有同步任务执行完后// 询问事件触发线程在事件事件队列中是否有需要执行的回调函数// 如果没有,一直询问,直到有为止// 如果有,将回调事件加入执行栈中,开始执行回调代码复制代码
|
|
150
|
+
</code></pre>
|
|
151
|
+
<p>总结一下:</p>
|
|
152
|
+
<ul>
|
|
153
|
+
<li>JS引擎线程只执行执行栈中的事件</li>
|
|
154
|
+
<li>执行栈中的代码执行完毕,就会读取事件队列中的事件</li>
|
|
155
|
+
<li>事件队列中的回调事件,是由各自线程插入到事件队列中的</li>
|
|
156
|
+
<li>如此循环</li>
|
|
157
|
+
</ul>
|
|
158
|
+
<h2 id="宏任务、微任务"><a href="#宏任务、微任务" class="headerlink" title="宏任务、微任务"></a>宏任务、微任务</h2><p>当我们基本了解了什么是执行栈,什么是事件队列之后,我们深入了解一下事件循环中<code>宏任务</code>、<code>微任务</code></p>
|
|
159
|
+
<h3 id="什么是宏任务"><a href="#什么是宏任务" class="headerlink" title="什么是宏任务"></a>什么是宏任务</h3><p>我们可以将每次执行栈执行的代码当做是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行),<br>每一个宏任务会从头到尾执行完毕,不会执行其他。</p>
|
|
160
|
+
<p>我们前文提到过<code>JS引擎线程</code>和<code>GUI渲染线程</code>是互斥的关系,浏览器为了能够使<code>宏任务</code>和<code>DOM任务</code>有序的进行,会在一个<code>宏任务</code>执行结果后,在下一个<code>宏任务</code>执行前,<code>GUI渲染线程</code>开始工作,对页面进行渲染。</p>
|
|
161
|
+
<pre><code>// 宏任务-->渲染-->宏任务-->渲染-->渲染...复制代码
|
|
162
|
+
</code></pre>
|
|
163
|
+
<p>主代码块,setTimeout,setInterval等,都属于宏任务</p>
|
|
164
|
+
<p><strong>第一个例子:</strong></p>
|
|
165
|
+
<pre><code>document.body.style = 'background:black';
|
|
166
|
+
document.body.style = 'background:red';
|
|
167
|
+
document.body.style = 'background:blue';
|
|
168
|
+
document.body.style = 'background:grey';
|
|
169
|
+
复制代码
|
|
170
|
+
</code></pre>
|
|
171
|
+
<p>我们可以将这段代码放到浏览器的控制台执行以下,看一下效果:<br><img src="https://user-gold-cdn.xitu.io/2019/8/20/16caca3e44d7d357?imageslim" alt="xuehuayu.cn"><br>我们会看到的结果是,页面背景会在瞬间变成灰色,以上代码属于同一次<code>宏任务</code>,所以全部执行完才触发<code>页面渲染</code>,渲染时<code>GUI线程</code>会将所有UI改动优化合并,所以视觉效果上,只会看到页面变成灰色。</p>
|
|
172
|
+
<p><strong>第二个例子:</strong></p>
|
|
173
|
+
<pre><code>document.body.style = 'background:blue';
|
|
174
|
+
setTimeout(function(){
|
|
175
|
+
document.body.style = 'background:black'
|
|
176
|
+
},0)
|
|
177
|
+
复制代码
|
|
178
|
+
</code></pre>
|
|
179
|
+
<p>执行一下,再看效果:<br><img src="https://user-gold-cdn.xitu.io/2019/8/20/16caca3ed44e6b16?imageslim" alt="xuehuayu.cn"><br>我会看到,页面先显示成蓝色背景,然后瞬间变成了黑色背景,这是因为以上代码属于两次<code>宏任务</code>,第一次<code>宏任务</code>执行的代码是将背景变成蓝色,然后触发渲染,将页面变成蓝色,再触发第二次宏任务将背景变成黑色。</p>
|
|
180
|
+
<h3 id="什么是微任务"><a href="#什么是微任务" class="headerlink" title="什么是微任务"></a>什么是微任务</h3><p>我们已经知道<code>宏任务</code>结束后,会执行渲染,然后执行下一个<code>宏任务</code>,<br>而微任务可以理解成在当前<code>宏任务</code>执行后立即执行的任务。</p>
|
|
181
|
+
<p>也就是说,当<code>宏任务</code>执行完,会在渲染前,将执行期间所产生的所有<code>微任务</code>都执行完。</p>
|
|
182
|
+
<p>Promise,process.nextTick等,属于<code>微任务</code>。</p>
|
|
183
|
+
<p><strong>第一个例子:</strong></p>
|
|
184
|
+
<pre><code>document.body.style = 'background:blue'console.log(1);
|
|
185
|
+
Promise.resolve().then(()=>{
|
|
186
|
+
console.log(2);
|
|
187
|
+
document.body.style = 'background:black'
|
|
188
|
+
});
|
|
189
|
+
console.log(3);
|
|
190
|
+
复制代码
|
|
191
|
+
</code></pre>
|
|
192
|
+
<p>执行一下,再看效果:<br><img src="https://user-gold-cdn.xitu.io/2019/8/20/16cad85d2378ccb5?imageslim" alt="xuehuayu.cn"><br>控制台输出 1 3 2 , 是因为 promise 对象的 then 方法的回调函数是异步执行,所以 2 最后输出</p>
|
|
193
|
+
<p>页面的背景色直接变成黑色,没有经过蓝色的阶段,是因为,我们在宏任务中将背景设置为蓝色,但在进行渲染前执行了微任务,<br>在微任务中将背景变成了黑色,然后才执行的渲染</p>
|
|
194
|
+
<p><strong>第二个例子:</strong></p>
|
|
195
|
+
<pre><code>setTimeout(() => {
|
|
196
|
+
console.log(1)
|
|
197
|
+
Promise.resolve(3).then(data =>console.log(data))
|
|
198
|
+
}, 0)
|
|
199
|
+
|
|
200
|
+
setTimeout(() => {
|
|
201
|
+
console.log(2)
|
|
202
|
+
}, 0)
|
|
203
|
+
|
|
204
|
+
// print : 1 3 2复制代码
|
|
205
|
+
</code></pre>
|
|
206
|
+
<p>上面代码共包含两个 setTimeout ,也就是说除主代码块外,共有两个<code>宏任务</code>,<br>其中第一个<code>宏任务</code>执行中,输出 1 ,并且创建了<code>微任务队列</code>,所以在下一个<code>宏任务</code>队列执行前,<br>先执行<code>微任务</code>,在<code>微任务</code>执行中,输出 3 ,微任务执行后,执行下一次<code>宏任务</code>,执行中输出 2</p>
|
|
207
|
+
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul>
|
|
208
|
+
<li>执行一个<code>宏任务</code>(栈中没有就从<code>事件队列</code>中获取)</li>
|
|
209
|
+
<li>执行过程中如果遇到<code>微任务</code>,就将它添加到<code>微任务</code>的任务队列中</li>
|
|
210
|
+
<li><code>宏任务</code>执行完毕后,立即执行当前<code>微任务队列</code>中的所有<code>微任务</code>(依次执行)</li>
|
|
211
|
+
<li>当前<code>宏任务</code>执行完毕,开始检查渲染,然后<code>GUI线程</code>接管渲染</li>
|
|
212
|
+
<li>渲染完毕后,<code>JS线程</code>继续接管,开始下一个<code>宏任务</code>(从事件队列中获取)</li>
|
|
213
|
+
</ul>
|
|
214
|
+
<h2 id="系列文章推荐"><a href="#系列文章推荐" class="headerlink" title="系列文章推荐"></a>系列文章推荐</h2><ul>
|
|
215
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d3e4304f265da1b8608cee5">「前端进阶」如何优雅的处理图片异常</a></li>
|
|
216
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d2d19ccf265da1b7f29b05f">「前端进阶」单页路由解析与实现</a></li>
|
|
217
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d2299faf265da1bb67a3b65">「前端进阶」彻底弄懂函数柯里化</a></li>
|
|
218
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d116a9df265da1bb47d717b">「前端进阶」JS中的栈内存堆内存</a></li>
|
|
219
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d0706a6f265da1bc23f77a9">「前端进阶」JS中的内存管理</a></li>
|
|
220
|
+
<li><a target="_blank" rel="noopener" href="https://juejin.im/post/5d004ad95188257c6b518056">「前端进阶」数组乱序</a></li>
|
|
221
|
+
</ul>
|
|
222
|
+
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul>
|
|
223
|
+
<li><a target="_blank" rel="noopener" href="https://book.douban.com/subject/25910556/">WebKit技术内幕</a></li>
|
|
224
|
+
<li><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/1e455a9226ce">浏览器都包含哪些进程</a></li>
|
|
225
|
+
<li><a target="_blank" rel="noopener" href="http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html">进程与线程的一个简单解释</a></li>
|
|
226
|
+
</ul>
|
|
227
|
+
<h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><ul>
|
|
228
|
+
<li>文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎<code>点赞</code>和<code>关注</code></li>
|
|
229
|
+
<li>本文同步首发与<a target="_blank" rel="noopener" href="https://github.com/chenqf/frontEndBlog">github</a>,可在<a target="_blank" rel="noopener" href="https://github.com/chenqf/frontEndBlog">github</a>中找到更多精品文章,欢迎<code>Watch</code> & <code>Star ★</code></li>
|
|
230
|
+
<li>后续文章参见:<a target="_blank" rel="noopener" href="https://github.com/chenqf/frontEndBlog/blob/master/PLAN.md">计划</a></li>
|
|
231
|
+
</ul>
|
|
232
|
+
</div><iframe src="/donate/?AliPayQR=https://store.xuehuayu.cn/store/public/alipay_qr.jpg&WeChatQR=https://store.xuehuayu.cn/store/public/wechat_qr.png&UnionPayQR=null&GitHub=null&BTCQR=null&BTCKEY=null&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/41717.html">https://xuehuayu.cn/article/41717.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/8140.html">Array.from() 五个超好用的用途</a><a class="next" href="/article/38753.html">可靠React组件设计的7个准则之封装</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
|
|
233
|
+
const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
|
|
234
|
+
const locale = {
|
|
235
|
+
placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
|
|
236
|
+
sofa: '沙发空缺中,还不快抢~',
|
|
237
|
+
};
|
|
238
|
+
Waline.init({
|
|
239
|
+
el: '#vcomment',
|
|
240
|
+
serverURL: serverURL,
|
|
241
|
+
pageSize: '20',
|
|
242
|
+
visitor: true, // 阅读量统计
|
|
243
|
+
requiredMeta: ['nick', 'mail'],
|
|
244
|
+
emoji: [
|
|
245
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
|
|
246
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
|
|
247
|
+
'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
|
|
248
|
+
],
|
|
249
|
+
locale,
|
|
250
|
+
pageview: true
|
|
251
|
+
})
|
|
252
|
+
</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() {
|
|
253
|
+
var val = $(this).val()
|
|
254
|
+
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>'
|
|
255
|
+
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>'
|
|
256
|
+
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>'
|
|
257
|
+
|
|
258
|
+
if (val === 'self') {
|
|
259
|
+
$('#search').html(self)
|
|
260
|
+
var search_path = 'search.xml';
|
|
261
|
+
if (search_path.length == 0) {
|
|
262
|
+
search_path = 'search.xml';
|
|
263
|
+
}
|
|
264
|
+
var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
|
|
265
|
+
searchFunc(path, 'local-search-input', 'local-search-result');
|
|
266
|
+
} else if (val === 'baidu') {
|
|
267
|
+
$('#search').html(baidu)
|
|
268
|
+
} else if (val === 'google') {
|
|
269
|
+
$('#search').html(google)
|
|
270
|
+
}
|
|
271
|
+
})</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(){
|
|
272
|
+
var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
|
|
273
|
+
if (cnb) {
|
|
274
|
+
var gxba =document.getElementById('gxba')
|
|
275
|
+
var gaba =document.getElementById('gaba')
|
|
276
|
+
var gabaLink =document.getElementById('gaba-link')
|
|
277
|
+
gxba.innerText ='京ICP备20007647号-1'
|
|
278
|
+
gaba.innerText ='京公网安备 11010802031254号'
|
|
279
|
+
gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
|
|
280
|
+
}
|
|
281
|
+
})()</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&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>
|