<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[守俭的博客]]></title><description><![CDATA[The blog of shoujian.]]></description><link>http://blog.zhoushoujian.com/</link><image><url>http://blog.zhoushoujian.com/favicon.png</url><title>守俭的博客</title><link>http://blog.zhoushoujian.com/</link></image><generator>Ghost 4.22</generator><lastBuildDate>Tue, 17 Mar 2026 10:30:42 GMT</lastBuildDate><atom:link href="http://blog.zhoushoujian.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[JavaScript 运行机制详解：再谈Event Loop]]></title><description><![CDATA[上个月，我偶然看到了Philip Roberts的演讲《Help, I'm stuck in an event-loop》。这才尴尬地发现，自己的理解是错的。我决定重写这个题目，详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。]]></description><link>http://blog.zhoushoujian.com/event-loop/</link><guid isPermaLink="false">61909dc21fb04a8779fe12e7</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sun, 14 Nov 2021 05:27:25 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/197e5086ee9649848aefbfd6bd05494d-1.jpeg" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/197e5086ee9649848aefbfd6bd05494d-1.jpeg" alt="JavaScript &#x8FD0;&#x884C;&#x673A;&#x5236;&#x8BE6;&#x89E3;&#xFF1A;&#x518D;&#x8C08;Event Loop"><p>&#x4E0A;&#x4E2A;&#x6708;&#xFF0C;&#x6211;&#x5076;&#x7136;&#x770B;&#x5230;&#x4E86;Philip Roberts&#x7684;&#x6F14;&#x8BB2;<a href="https://vimeo.com/96425312">&#x300A;Help, I&apos;m stuck in an event-loop&#x300B;</a>&#x3002;&#x8FD9;&#x624D;&#x5C34;&#x5C2C;&#x5730;&#x53D1;&#x73B0;&#xFF0C;&#x81EA;&#x5DF1;&#x7684;&#x7406;&#x89E3;&#x662F;&#x9519;&#x7684;&#x3002;&#x6211;&#x51B3;&#x5B9A;&#x91CD;&#x5199;&#x8FD9;&#x4E2A;&#x9898;&#x76EE;&#xFF0C;&#x8BE6;&#x7EC6;&#x3001;&#x5B8C;&#x6574;&#x3001;&#x6B63;&#x786E;&#x5730;&#x63CF;&#x8FF0;JavaScript&#x5F15;&#x64CE;&#x7684;&#x5185;&#x90E8;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x3002;&#x4E0B;&#x9762;&#x5C31;&#x662F;&#x6211;&#x7684;&#x91CD;&#x5199;&#x3002;</p><p>&#x8FDB;&#x5165;&#x6B63;&#x6587;&#x4E4B;&#x524D;&#xFF0C;&#x63D2;&#x64AD;&#x4E00;&#x6761;&#x6D88;&#x606F;&#x3002;&#x6211;&#x7684;&#x65B0;&#x4E66;<a href="https://es6.ruanyifeng.com/">&#x300A;ECMAScript 6&#x5165;&#x95E8;&#x300B;</a>&#x51FA;&#x7248;&#x4E86;&#xFF08;<a href="https://es6.ruanyifeng.com/images/copyright.png">&#x7248;&#x6743;&#x9875;</a>&#xFF0C;<a href="https://es6.ruanyifeng.com/images/page1.png">&#x5185;&#x9875;1</a>&#xFF0C;<a href="https://es6.ruanyifeng.com/images/page2.png">&#x5185;&#x9875;2</a>&#xFF09;&#xFF0C;&#x94DC;&#x7248;&#x7EB8;&#x5168;&#x5F69;&#x5370;&#x5237;&#xFF0C;&#x975E;&#x5E38;&#x7CBE;&#x7F8E;&#xFF0C;&#x8FD8;&#x9644;&#x6709;&#x7D22;&#x5F15;&#xFF08;&#x5F53;&#x7136;&#x4EF7;&#x683C;&#x4E5F;&#x6BD4;&#x540C;&#x7C7B;&#x4E66;&#x7C4D;&#x7565;&#x8D35;&#x4E00;&#x70B9;&#x70B9;&#xFF09;&#x3002;&#x9884;&#x89C8;&#x548C;&#x8D2D;&#x4E70;&#x70B9;&#x51FB;<a href="https://es6.ruanyifeng.com/">&#x8FD9;&#x91CC;</a>&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://es6.ruanyifeng.com/images/cover_thumbnail.jpg" class="kg-image" alt="JavaScript &#x8FD0;&#x884C;&#x673A;&#x5236;&#x8BE6;&#x89E3;&#xFF1A;&#x518D;&#x8C08;Event Loop" loading="lazy"></figure><p>&#xFF08;<strong>2014&#x5E74;10&#x6708;13&#x65E5;&#x66F4;&#x65B0;</strong>&#xFF1A;&#x672C;&#x6587;&#x5DF2;&#x7ECF;&#x505A;&#x4E86;&#x8F83;&#x5927;&#x4FEE;&#x6539;&#xFF0C;&#x53CD;&#x6620;&#x4E86;&#x6211;&#x73B0;&#x5728;&#x7684;&#x8BA4;&#x8BC6;&#x3002;&#x5173;&#x4E8E;setTimeout&#x7684;&#x66F4;&#x591A;&#x89E3;&#x91CA;&#x548C;&#x793A;&#x4F8B;&#xFF0C;&#x8BF7;&#x53C2;&#x9605;&#x6211;&#x6B63;&#x5728;&#x5199;&#x7684;<a href="https://javascript.ruanyifeng.com/bom/timer.html">&#x300A;JavaScript&#x6807;&#x51C6;&#x53C2;&#x8003;&#x6559;&#x7A0B;&#x300B;</a>&#x3002;&#xFF09;</p><p>&#xFF08;<strong>2014&#x5E74;10&#x6708;11&#x65E5;&#x66F4;&#x65B0;</strong>&#xFF1A;&#x6734;&#x7075;&#x8001;&#x5E08;&#x5BF9;&#x672C;&#x6587;&#x505A;&#x4E86;<a href="https://app.yinxiang.com/shard/s8/sh/b72fe246-a89d-434b-85f0-a36420849b84/59bad790bdcf6b0a66b8b93d5eacbead">&#x8BC4;&#x6CE8;</a>&#xFF0C;&#x8BE6;&#x7EC6;&#x5F97;&#x6307;&#x51FA;&#x4E86;&#x6587;&#x4E2D;&#x5B58;&#x5728;&#x7684;&#x9519;&#x8BEF;&#x8BF4;&#x6CD5;&#xFF0C;&#x5EFA;&#x8BAE;&#x9605;&#x8BFB;&#x3002;&#xFF09;</p><h2 id="%E4%B8%80%E3%80%81%E4%B8%BA%E4%BB%80%E4%B9%88javascript%E6%98%AF%E5%8D%95%E7%BA%BF%E7%A8%8B%EF%BC%9F">&#x4E00;&#x3001;&#x4E3A;&#x4EC0;&#x4E48;JavaScript&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#xFF1F;</h2><p>JavaScript&#x8BED;&#x8A00;&#x7684;&#x4E00;&#x5927;&#x7279;&#x70B9;&#x5C31;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x540C;&#x4E00;&#x4E2A;&#x65F6;&#x95F4;&#x53EA;&#x80FD;&#x505A;&#x4E00;&#x4EF6;&#x4E8B;&#x3002;&#x90A3;&#x4E48;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;JavaScript&#x4E0D;&#x80FD;&#x6709;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x5462;&#xFF1F;&#x8FD9;&#x6837;&#x80FD;&#x63D0;&#x9AD8;&#x6548;&#x7387;&#x554A;&#x3002;</p><p>JavaScript&#x7684;&#x5355;&#x7EBF;&#x7A0B;&#xFF0C;&#x4E0E;&#x5B83;&#x7684;&#x7528;&#x9014;&#x6709;&#x5173;&#x3002;&#x4F5C;&#x4E3A;&#x6D4F;&#x89C8;&#x5668;&#x811A;&#x672C;&#x8BED;&#x8A00;&#xFF0C;JavaScript&#x7684;&#x4E3B;&#x8981;&#x7528;&#x9014;&#x662F;&#x4E0E;&#x7528;&#x6237;&#x4E92;&#x52A8;&#xFF0C;&#x4EE5;&#x53CA;&#x64CD;&#x4F5C;DOM&#x3002;&#x8FD9;&#x51B3;&#x5B9A;&#x4E86;&#x5B83;&#x53EA;&#x80FD;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x5E26;&#x6765;&#x5F88;&#x590D;&#x6742;&#x7684;&#x540C;&#x6B65;&#x95EE;&#x9898;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x5047;&#x5B9A;JavaScript&#x540C;&#x65F6;&#x6709;&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x5728;&#x67D0;&#x4E2A;DOM&#x8282;&#x70B9;&#x4E0A;&#x6DFB;&#x52A0;&#x5185;&#x5BB9;&#xFF0C;&#x53E6;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x5220;&#x9664;&#x4E86;&#x8FD9;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x8FD9;&#x65F6;&#x6D4F;&#x89C8;&#x5668;&#x5E94;&#x8BE5;&#x4EE5;&#x54EA;&#x4E2A;&#x7EBF;&#x7A0B;&#x4E3A;&#x51C6;&#xFF1F;</p><p>&#x6240;&#x4EE5;&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x590D;&#x6742;&#x6027;&#xFF0C;&#x4ECE;&#x4E00;&#x8BDE;&#x751F;&#xFF0C;JavaScript&#x5C31;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#xFF0C;&#x8FD9;&#x5DF2;&#x7ECF;&#x6210;&#x4E86;&#x8FD9;&#x95E8;&#x8BED;&#x8A00;&#x7684;&#x6838;&#x5FC3;&#x7279;&#x5F81;&#xFF0C;&#x5C06;&#x6765;&#x4E5F;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x3002;</p><p>&#x4E3A;&#x4E86;&#x5229;&#x7528;&#x591A;&#x6838;CPU&#x7684;&#x8BA1;&#x7B97;&#x80FD;&#x529B;&#xFF0C;HTML5&#x63D0;&#x51FA;Web Worker&#x6807;&#x51C6;&#xFF0C;&#x5141;&#x8BB8;JavaScript&#x811A;&#x672C;&#x521B;&#x5EFA;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#xFF0C;&#x4F46;&#x662F;&#x5B50;&#x7EBF;&#x7A0B;&#x5B8C;&#x5168;&#x53D7;&#x4E3B;&#x7EBF;&#x7A0B;&#x63A7;&#x5236;&#xFF0C;&#x4E14;&#x4E0D;&#x5F97;&#x64CD;&#x4F5C;DOM&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x8FD9;&#x4E2A;&#x65B0;&#x6807;&#x51C6;&#x5E76;&#x6CA1;&#x6709;&#x6539;&#x53D8;JavaScript&#x5355;&#x7EBF;&#x7A0B;&#x7684;&#x672C;&#x8D28;&#x3002;</p><h2 id="%E4%BA%8C%E3%80%81%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97">&#x4E8C;&#x3001;&#x4EFB;&#x52A1;&#x961F;&#x5217;</h2><p>&#x5355;&#x7EBF;&#x7A0B;&#x5C31;&#x610F;&#x5473;&#x7740;&#xFF0C;&#x6240;&#x6709;&#x4EFB;&#x52A1;&#x9700;&#x8981;&#x6392;&#x961F;&#xFF0C;&#x524D;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x7ED3;&#x675F;&#xFF0C;&#x624D;&#x4F1A;&#x6267;&#x884C;&#x540E;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x3002;&#x5982;&#x679C;&#x524D;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x8017;&#x65F6;&#x5F88;&#x957F;&#xFF0C;&#x540E;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x5C31;&#x4E0D;&#x5F97;&#x4E0D;&#x4E00;&#x76F4;&#x7B49;&#x7740;&#x3002;</p><p>&#x5982;&#x679C;&#x6392;&#x961F;&#x662F;&#x56E0;&#x4E3A;&#x8BA1;&#x7B97;&#x91CF;&#x5927;&#xFF0C;CPU&#x5FD9;&#x4E0D;&#x8FC7;&#x6765;&#xFF0C;&#x5012;&#x4E5F;&#x7B97;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x5F88;&#x591A;&#x65F6;&#x5019;CPU&#x662F;&#x95F2;&#x7740;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;IO&#x8BBE;&#x5907;&#xFF08;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x8BBE;&#x5907;&#xFF09;&#x5F88;&#x6162;&#xFF08;&#x6BD4;&#x5982;Ajax&#x64CD;&#x4F5C;&#x4ECE;&#x7F51;&#x7EDC;&#x8BFB;&#x53D6;&#x6570;&#x636E;&#xFF09;&#xFF0C;&#x4E0D;&#x5F97;&#x4E0D;&#x7B49;&#x7740;&#x7ED3;&#x679C;&#x51FA;&#x6765;&#xFF0C;&#x518D;&#x5F80;&#x4E0B;&#x6267;&#x884C;&#x3002;</p><p>JavaScript&#x8BED;&#x8A00;&#x7684;&#x8BBE;&#x8BA1;&#x8005;&#x610F;&#x8BC6;&#x5230;&#xFF0C;&#x8FD9;&#x65F6;&#x4E3B;&#x7EBF;&#x7A0B;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x4E0D;&#x7BA1;IO&#x8BBE;&#x5907;&#xFF0C;&#x6302;&#x8D77;&#x5904;&#x4E8E;&#x7B49;&#x5F85;&#x4E2D;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x5148;&#x8FD0;&#x884C;&#x6392;&#x5728;&#x540E;&#x9762;&#x7684;&#x4EFB;&#x52A1;&#x3002;&#x7B49;&#x5230;IO&#x8BBE;&#x5907;&#x8FD4;&#x56DE;&#x4E86;&#x7ED3;&#x679C;&#xFF0C;&#x518D;&#x56DE;&#x8FC7;&#x5934;&#xFF0C;&#x628A;&#x6302;&#x8D77;&#x7684;&#x4EFB;&#x52A1;&#x7EE7;&#x7EED;&#x6267;&#x884C;&#x4E0B;&#x53BB;&#x3002;</p><p>&#x4E8E;&#x662F;&#xFF0C;&#x6240;&#x6709;&#x4EFB;&#x52A1;&#x53EF;&#x4EE5;&#x5206;&#x6210;&#x4E24;&#x79CD;&#xFF0C;&#x4E00;&#x79CD;&#x662F;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#xFF08;synchronous&#xFF09;&#xFF0C;&#x53E6;&#x4E00;&#x79CD;&#x662F;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF08;asynchronous&#xFF09;&#x3002;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#x6307;&#x7684;&#x662F;&#xFF0C;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0A;&#x6392;&#x961F;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x53EA;&#x6709;&#x524D;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C;&#x624D;&#x80FD;&#x6267;&#x884C;&#x540E;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#xFF1B;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x6307;&#x7684;&#x662F;&#xFF0C;&#x4E0D;&#x8FDB;&#x5165;&#x4E3B;&#x7EBF;&#x7A0B;&#x3001;&#x800C;&#x8FDB;&#x5165;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF08;task queue&#xFF09;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x53EA;&#x6709;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x901A;&#x77E5;&#x4E3B;&#x7EBF;&#x7A0B;&#xFF0C;&#x67D0;&#x4E2A;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x4E86;&#xFF0C;&#x8BE5;&#x4EFB;&#x52A1;&#x624D;&#x4F1A;&#x8FDB;&#x5165;&#x4E3B;&#x7EBF;&#x7A0B;&#x6267;&#x884C;&#x3002;</p><p>&#x5177;&#x4F53;&#x6765;&#x8BF4;&#xFF0C;&#x5F02;&#x6B65;&#x6267;&#x884C;&#x7684;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x5982;&#x4E0B;&#x3002;&#xFF08;&#x540C;&#x6B65;&#x6267;&#x884C;&#x4E5F;&#x662F;&#x5982;&#x6B64;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x53EF;&#x4EE5;&#x88AB;&#x89C6;&#x4E3A;&#x6CA1;&#x6709;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x7684;&#x5F02;&#x6B65;&#x6267;&#x884C;&#x3002;&#xFF09;</p><blockquote>&#xFF08;1&#xFF09;&#x6240;&#x6709;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#x90FD;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0A;&#x6267;&#x884C;&#xFF0C;&#x5F62;&#x6210;&#x4E00;&#x4E2A;<a href="https://www.ruanyifeng.com/blog/2013/11/stack.html">&#x6267;&#x884C;&#x6808;</a>&#xFF08;execution context stack&#xFF09;&#x3002;<br><br>&#xFF08;2&#xFF09;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF08;task queue&#xFF09;&#x3002;&#x53EA;&#x8981;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x6709;&#x4E86;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#xFF0C;&#x5C31;&#x5728;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E4B;&#x4E2D;&#x653E;&#x7F6E;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#x3002;<br><br>&#xFF08;3&#xFF09;&#x4E00;&#x65E6;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C;&#x7CFB;&#x7EDF;&#x5C31;&#x4F1A;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x770B;&#x770B;&#x91CC;&#x9762;&#x6709;&#x54EA;&#x4E9B;&#x4E8B;&#x4EF6;&#x3002;&#x90A3;&#x4E9B;&#x5BF9;&#x5E94;&#x7684;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x4E8E;&#x662F;&#x7ED3;&#x675F;&#x7B49;&#x5F85;&#x72B6;&#x6001;&#xFF0C;&#x8FDB;&#x5165;&#x6267;&#x884C;&#x6808;&#xFF0C;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x3002;<br><br>&#xFF08;4&#xFF09;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0D;&#x65AD;&#x91CD;&#x590D;&#x4E0A;&#x9762;&#x7684;&#x7B2C;&#x4E09;&#x6B65;&#x3002;</blockquote><p>&#x4E0B;&#x56FE;&#x5C31;&#x662F;&#x4E3B;&#x7EBF;&#x7A0B;&#x548C;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x7684;&#x793A;&#x610F;&#x56FE;&#x3002;</p><figure class="kg-card kg-image-card"><img src="http://www.ruanyifeng.com/blogimg/asset/2014/bg2014100801.jpg" class="kg-image" alt="JavaScript &#x8FD0;&#x884C;&#x673A;&#x5236;&#x8BE6;&#x89E3;&#xFF1A;&#x518D;&#x8C08;Event Loop" loading="lazy"></figure><p>&#x53EA;&#x8981;&#x4E3B;&#x7EBF;&#x7A0B;&#x7A7A;&#x4E86;&#xFF0C;&#x5C31;&#x4F1A;&#x53BB;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;JavaScript&#x7684;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x3002;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4F1A;&#x4E0D;&#x65AD;&#x91CD;&#x590D;&#x3002;</p><h2 id="%E4%B8%89%E3%80%81%E4%BA%8B%E4%BB%B6%E5%92%8C%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0">&#x4E09;&#x3001;&#x4E8B;&#x4EF6;&#x548C;&#x56DE;&#x8C03;&#x51FD;&#x6570;</h2><p>&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x662F;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#x7684;&#x961F;&#x5217;&#xFF08;&#x4E5F;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x6210;&#x6D88;&#x606F;&#x7684;&#x961F;&#x5217;&#xFF09;&#xFF0C;IO&#x8BBE;&#x5907;&#x5B8C;&#x6210;&#x4E00;&#x9879;&#x4EFB;&#x52A1;&#xFF0C;&#x5C31;&#x5728;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x8868;&#x793A;&#x76F8;&#x5173;&#x7684;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x53EF;&#x4EE5;&#x8FDB;&#x5165;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x4E86;&#x3002;&#x4E3B;&#x7EBF;&#x7A0B;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x5C31;&#x662F;&#x8BFB;&#x53D6;&#x91CC;&#x9762;&#x6709;&#x54EA;&#x4E9B;&#x4E8B;&#x4EF6;&#x3002;</p><p>&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E2D;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x9664;&#x4E86;IO&#x8BBE;&#x5907;&#x7684;&#x4E8B;&#x4EF6;&#x4EE5;&#x5916;&#xFF0C;&#x8FD8;&#x5305;&#x62EC;&#x4E00;&#x4E9B;&#x7528;&#x6237;&#x4EA7;&#x751F;&#x7684;&#x4E8B;&#x4EF6;&#xFF08;&#x6BD4;&#x5982;&#x9F20;&#x6807;&#x70B9;&#x51FB;&#x3001;&#x9875;&#x9762;&#x6EDA;&#x52A8;&#x7B49;&#x7B49;&#xFF09;&#x3002;&#x53EA;&#x8981;&#x6307;&#x5B9A;&#x8FC7;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x8FD9;&#x4E9B;&#x4E8B;&#x4EF6;&#x53D1;&#x751F;&#x65F6;&#x5C31;&#x4F1A;&#x8FDB;&#x5165;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x7B49;&#x5F85;&#x4E3B;&#x7EBF;&#x7A0B;&#x8BFB;&#x53D6;&#x3002;</p><p>&#x6240;&#x8C13;&quot;&#x56DE;&#x8C03;&#x51FD;&#x6570;&quot;&#xFF08;callback&#xFF09;&#xFF0C;&#x5C31;&#x662F;&#x90A3;&#x4E9B;&#x4F1A;&#x88AB;&#x4E3B;&#x7EBF;&#x7A0B;&#x6302;&#x8D77;&#x6765;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x5FC5;&#x987B;&#x6307;&#x5B9A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x5F53;&#x4E3B;&#x7EBF;&#x7A0B;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x5C31;&#x662F;&#x6267;&#x884C;&#x5BF9;&#x5E94;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p><p>&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x662F;&#x4E00;&#x4E2A;&#x5148;&#x8FDB;&#x5148;&#x51FA;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x6392;&#x5728;&#x524D;&#x9762;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x4F18;&#x5148;&#x88AB;&#x4E3B;&#x7EBF;&#x7A0B;&#x8BFB;&#x53D6;&#x3002;&#x4E3B;&#x7EBF;&#x7A0B;&#x7684;&#x8BFB;&#x53D6;&#x8FC7;&#x7A0B;&#x57FA;&#x672C;&#x4E0A;&#x662F;&#x81EA;&#x52A8;&#x7684;&#xFF0C;&#x53EA;&#x8981;&#x6267;&#x884C;&#x6808;&#x4E00;&#x6E05;&#x7A7A;&#xFF0C;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E0A;&#x7B2C;&#x4E00;&#x4F4D;&#x7684;&#x4E8B;&#x4EF6;&#x5C31;&#x81EA;&#x52A8;&#x8FDB;&#x5165;&#x4E3B;&#x7EBF;&#x7A0B;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x7531;&#x4E8E;&#x5B58;&#x5728;&#x540E;&#x6587;&#x63D0;&#x5230;&#x7684;&quot;&#x5B9A;&#x65F6;&#x5668;&quot;&#x529F;&#x80FD;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x9996;&#x5148;&#x8981;&#x68C0;&#x67E5;&#x4E00;&#x4E0B;&#x6267;&#x884C;&#x65F6;&#x95F4;&#xFF0C;&#x67D0;&#x4E9B;&#x4E8B;&#x4EF6;&#x53EA;&#x6709;&#x5230;&#x4E86;&#x89C4;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x624D;&#x80FD;&#x8FD4;&#x56DE;&#x4E3B;&#x7EBF;&#x7A0B;&#x3002;</p><h2 id="%E5%9B%9B%E3%80%81event-loop">&#x56DB;&#x3001;Event Loop</h2><p>&#x4E3B;&#x7EBF;&#x7A0B;&#x4ECE;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E2D;&#x8BFB;&#x53D6;&#x4E8B;&#x4EF6;&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x662F;&#x5FAA;&#x73AF;&#x4E0D;&#x65AD;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6574;&#x4E2A;&#x7684;&#x8FD9;&#x79CD;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x53C8;&#x79F0;&#x4E3A;Event Loop&#xFF08;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF09;&#x3002;</p><p>&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x5730;&#x7406;&#x89E3;Event Loop&#xFF0C;&#x8BF7;&#x770B;&#x4E0B;&#x56FE;&#xFF08;&#x8F6C;&#x5F15;&#x81EA;Philip Roberts&#x7684;&#x6F14;&#x8BB2;<a href="https://vimeo.com/96425312">&#x300A;Help, I&apos;m stuck in an event-loop&#x300B;</a>&#xFF09;&#x3002;</p><figure class="kg-card kg-image-card"><img src="http://www.ruanyifeng.com/blogimg/asset/2014/bg2014100802.png" class="kg-image" alt="JavaScript &#x8FD0;&#x884C;&#x673A;&#x5236;&#x8BE6;&#x89E3;&#xFF1A;&#x518D;&#x8C08;Event Loop" loading="lazy"></figure><p>&#x4E0A;&#x56FE;&#x4E2D;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x8FD0;&#x884C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4EA7;&#x751F;&#x5806;&#xFF08;heap&#xFF09;&#x548C;&#x6808;&#xFF08;stack&#xFF09;&#xFF0C;&#x6808;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x8C03;&#x7528;&#x5404;&#x79CD;&#x5916;&#x90E8;API&#xFF0C;&#x5B83;&#x4EEC;&#x5728;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E2D;&#x52A0;&#x5165;&#x5404;&#x79CD;&#x4E8B;&#x4EF6;&#xFF08;click&#xFF0C;load&#xFF0C;done&#xFF09;&#x3002;&#x53EA;&#x8981;&#x6808;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x5C31;&#x4F1A;&#x53BB;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x4F9D;&#x6B21;&#x6267;&#x884C;&#x90A3;&#x4E9B;&#x4E8B;&#x4EF6;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p><p>&#x6267;&#x884C;&#x6808;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#xFF08;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#xFF09;&#xFF0C;&#x603B;&#x662F;&#x5728;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF08;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF09;&#x4E4B;&#x524D;&#x6267;&#x884C;&#x3002;&#x8BF7;&#x770B;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x3002;</p><pre><code class="language-javascript">
    var req = new XMLHttpRequest();
    req.open(&apos;GET&apos;, url);    
    req.onload = function (){};    
    req.onerror = function (){};    
    req.send();
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#x7684;req.send&#x65B9;&#x6CD5;&#x662F;Ajax&#x64CD;&#x4F5C;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6570;&#x636E;&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x610F;&#x5473;&#x7740;&#x53EA;&#x6709;&#x5F53;&#x524D;&#x811A;&#x672C;&#x7684;&#x6240;&#x6709;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x5B8C;&#xFF0C;&#x7CFB;&#x7EDF;&#x624D;&#x4F1A;&#x53BB;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5B83;&#x4E0E;&#x4E0B;&#x9762;&#x7684;&#x5199;&#x6CD5;&#x7B49;&#x4EF7;&#x3002;</p><pre><code class="language-javascript">
    var req = new XMLHttpRequest();
    req.open(&apos;GET&apos;, url);
    req.send();
    req.onload = function (){};    
    req.onerror = function (){};   
</code></pre><p>&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x6307;&#x5B9A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x90E8;&#x5206;&#xFF08;onload&#x548C;onerror&#xFF09;&#xFF0C;&#x5728;send()&#x65B9;&#x6CD5;&#x7684;&#x524D;&#x9762;&#x6216;&#x540E;&#x9762;&#x65E0;&#x5173;&#x7D27;&#x8981;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x5C5E;&#x4E8E;&#x6267;&#x884C;&#x6808;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x7CFB;&#x7EDF;&#x603B;&#x662F;&#x6267;&#x884C;&#x5B8C;&#x5B83;&#x4EEC;&#xFF0C;&#x624D;&#x4F1A;&#x53BB;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x3002;</p><h2 id="%E4%BA%94%E3%80%81%E5%AE%9A%E6%97%B6%E5%99%A8">&#x4E94;&#x3001;&#x5B9A;&#x65F6;&#x5668;</h2><p>&#x9664;&#x4E86;&#x653E;&#x7F6E;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x8FD8;&#x53EF;&#x4EE5;&#x653E;&#x7F6E;&#x5B9A;&#x65F6;&#x4E8B;&#x4EF6;&#xFF0C;&#x5373;&#x6307;&#x5B9A;&#x67D0;&#x4E9B;&#x4EE3;&#x7801;&#x5728;&#x591A;&#x5C11;&#x65F6;&#x95F4;&#x4E4B;&#x540E;&#x6267;&#x884C;&#x3002;&#x8FD9;&#x53EB;&#x505A;&quot;&#x5B9A;&#x65F6;&#x5668;&quot;&#xFF08;timer&#xFF09;&#x529F;&#x80FD;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5B9A;&#x65F6;&#x6267;&#x884C;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><p>&#x5B9A;&#x65F6;&#x5668;&#x529F;&#x80FD;&#x4E3B;&#x8981;&#x7531;setTimeout()&#x548C;setInterval()&#x8FD9;&#x4E24;&#x4E2A;&#x51FD;&#x6570;&#x6765;&#x5B8C;&#x6210;&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x5185;&#x90E8;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF0C;&#x533A;&#x522B;&#x5728;&#x4E8E;&#x524D;&#x8005;&#x6307;&#x5B9A;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x4E00;&#x6B21;&#x6027;&#x6267;&#x884C;&#xFF0C;&#x540E;&#x8005;&#x5219;&#x4E3A;&#x53CD;&#x590D;&#x6267;&#x884C;&#x3002;&#x4EE5;&#x4E0B;&#x4E3B;&#x8981;&#x8BA8;&#x8BBA;setTimeout()&#x3002;</p><p>setTimeout()&#x63A5;&#x53D7;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x662F;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x63A8;&#x8FDF;&#x6267;&#x884C;&#x7684;&#x6BEB;&#x79D2;&#x6570;&#x3002;</p><pre><code class="language-javascript">
console.log(1);
setTimeout(function(){console.log(2);},1000);
console.log(3);
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x662F;1&#xFF0C;3&#xFF0C;2&#xFF0C;&#x56E0;&#x4E3A;setTimeout()&#x5C06;&#x7B2C;&#x4E8C;&#x884C;&#x63A8;&#x8FDF;&#x5230;1000&#x6BEB;&#x79D2;&#x4E4B;&#x540E;&#x6267;&#x884C;&#x3002;</p><p>&#x5982;&#x679C;&#x5C06;setTimeout()&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x8BBE;&#x4E3A;0&#xFF0C;&#x5C31;&#x8868;&#x793A;&#x5F53;&#x524D;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x5B8C;&#xFF08;&#x6267;&#x884C;&#x6808;&#x6E05;&#x7A7A;&#xFF09;&#x4EE5;&#x540E;&#xFF0C;&#x7ACB;&#x5373;&#x6267;&#x884C;&#xFF08;0&#x6BEB;&#x79D2;&#x95F4;&#x9694;&#xFF09;&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p><pre><code class="language-javascript">
setTimeout(function(){console.log(1);}, 0);
console.log(2);
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x603B;&#x662F;2&#xFF0C;1&#xFF0C;&#x56E0;&#x4E3A;&#x53EA;&#x6709;&#x5728;&#x6267;&#x884C;&#x5B8C;&#x7B2C;&#x4E8C;&#x884C;&#x4EE5;&#x540E;&#xFF0C;&#x7CFB;&#x7EDF;&#x624D;&#x4F1A;&#x53BB;&#x6267;&#x884C;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x4E2D;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p><p>&#x603B;&#x4E4B;&#xFF0C;setTimeout(fn,0)&#x7684;&#x542B;&#x4E49;&#x662F;&#xFF0C;&#x6307;&#x5B9A;&#x67D0;&#x4E2A;&#x4EFB;&#x52A1;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x6700;&#x65E9;&#x53EF;&#x5F97;&#x7684;&#x7A7A;&#x95F2;&#x65F6;&#x95F4;&#x6267;&#x884C;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5C3D;&#x53EF;&#x80FD;&#x65E9;&#x5F97;&#x6267;&#x884C;&#x3002;&#x5B83;&#x5728;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x7684;&#x5C3E;&#x90E8;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x56E0;&#x6B64;&#x8981;&#x7B49;&#x5230;&#x540C;&#x6B65;&#x4EFB;&#x52A1;&#x548C;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x73B0;&#x6709;&#x7684;&#x4E8B;&#x4EF6;&#x90FD;&#x5904;&#x7406;&#x5B8C;&#xFF0C;&#x624D;&#x4F1A;&#x5F97;&#x5230;&#x6267;&#x884C;&#x3002;</p><p>HTML5&#x6807;&#x51C6;&#x89C4;&#x5B9A;&#x4E86;setTimeout()&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x7684;&#x6700;&#x5C0F;&#x503C;&#xFF08;&#x6700;&#x77ED;&#x95F4;&#x9694;&#xFF09;&#xFF0C;&#x4E0D;&#x5F97;&#x4F4E;&#x4E8E;4&#x6BEB;&#x79D2;&#xFF0C;&#x5982;&#x679C;&#x4F4E;&#x4E8E;&#x8FD9;&#x4E2A;&#x503C;&#xFF0C;&#x5C31;&#x4F1A;&#x81EA;&#x52A8;&#x589E;&#x52A0;&#x3002;&#x5728;&#x6B64;&#x4E4B;&#x524D;&#xFF0C;&#x8001;&#x7248;&#x672C;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x90FD;&#x5C06;&#x6700;&#x77ED;&#x95F4;&#x9694;&#x8BBE;&#x4E3A;10&#x6BEB;&#x79D2;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x5BF9;&#x4E8E;&#x90A3;&#x4E9B;DOM&#x7684;&#x53D8;&#x52A8;&#xFF08;&#x5C24;&#x5176;&#x662F;&#x6D89;&#x53CA;&#x9875;&#x9762;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x7684;&#x90E8;&#x5206;&#xFF09;&#xFF0C;&#x901A;&#x5E38;&#x4E0D;&#x4F1A;&#x7ACB;&#x5373;&#x6267;&#x884C;&#xFF0C;&#x800C;&#x662F;&#x6BCF;16&#x6BEB;&#x79D2;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x3002;&#x8FD9;&#x65F6;&#x4F7F;&#x7528;requestAnimationFrame()&#x7684;&#x6548;&#x679C;&#x8981;&#x597D;&#x4E8E;setTimeout()&#x3002;</p><p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;setTimeout()&#x53EA;&#x662F;&#x5C06;&#x4E8B;&#x4EF6;&#x63D2;&#x5165;&#x4E86;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF0C;&#x5FC5;&#x987B;&#x7B49;&#x5230;&#x5F53;&#x524D;&#x4EE3;&#x7801;&#xFF08;&#x6267;&#x884C;&#x6808;&#xFF09;&#x6267;&#x884C;&#x5B8C;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x624D;&#x4F1A;&#x53BB;&#x6267;&#x884C;&#x5B83;&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;&#x8981;&#x662F;&#x5F53;&#x524D;&#x4EE3;&#x7801;&#x8017;&#x65F6;&#x5F88;&#x957F;&#xFF0C;&#x6709;&#x53EF;&#x80FD;&#x8981;&#x7B49;&#x5F88;&#x4E45;&#xFF0C;&#x6240;&#x4EE5;&#x5E76;&#x6CA1;&#x6709;&#x529E;&#x6CD5;&#x4FDD;&#x8BC1;&#xFF0C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E00;&#x5B9A;&#x4F1A;&#x5728;setTimeout()&#x6307;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#x6267;&#x884C;&#x3002;</p><h2 id="%E5%85%AD%E3%80%81nodejs%E7%9A%84event-loop">&#x516D;&#x3001;Node.js&#x7684;Event Loop</h2><p>Node.js&#x4E5F;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x7684;Event Loop&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x7684;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x4E0D;&#x540C;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x73AF;&#x5883;&#x3002;</p><p>&#x8BF7;&#x770B;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x610F;&#x56FE;&#xFF08;&#x4F5C;&#x8005;<a href="https://twitter.com/BusyRich/status/494959181871316992">@BusyRich</a>&#xFF09;&#x3002;</p><figure class="kg-card kg-image-card"><img src="http://www.ruanyifeng.com/blogimg/asset/2014/bg2014100803.png" class="kg-image" alt="JavaScript &#x8FD0;&#x884C;&#x673A;&#x5236;&#x8BE6;&#x89E3;&#xFF1A;&#x518D;&#x8C08;Event Loop" loading="lazy"></figure><p>&#x6839;&#x636E;&#x4E0A;&#x56FE;&#xFF0C;Node.js&#x7684;&#x8FD0;&#x884C;&#x673A;&#x5236;&#x5982;&#x4E0B;&#x3002;</p><blockquote>&#xFF08;1&#xFF09;V8&#x5F15;&#x64CE;&#x89E3;&#x6790;JavaScript&#x811A;&#x672C;&#x3002;<br><br>&#xFF08;2&#xFF09;&#x89E3;&#x6790;&#x540E;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x8C03;&#x7528;Node API&#x3002;<br><br>&#xFF08;3&#xFF09;<a href="https://github.com/joyent/libuv">libuv&#x5E93;</a>&#x8D1F;&#x8D23;Node API&#x7684;&#x6267;&#x884C;&#x3002;&#x5B83;&#x5C06;&#x4E0D;&#x540C;&#x7684;&#x4EFB;&#x52A1;&#x5206;&#x914D;&#x7ED9;&#x4E0D;&#x540C;&#x7684;&#x7EBF;&#x7A0B;&#xFF0C;&#x5F62;&#x6210;&#x4E00;&#x4E2A;Event Loop&#xFF08;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF09;&#xFF0C;&#x4EE5;&#x5F02;&#x6B65;&#x7684;&#x65B9;&#x5F0F;&#x5C06;&#x4EFB;&#x52A1;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7ED9;V8&#x5F15;&#x64CE;&#x3002;<br><br>&#xFF08;4&#xFF09;V8&#x5F15;&#x64CE;&#x518D;&#x5C06;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7ED9;&#x7528;&#x6237;&#x3002;</blockquote><p>&#x9664;&#x4E86;setTimeout&#x548C;setInterval&#x8FD9;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;Node.js&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x53E6;&#x5916;&#x4E24;&#x4E2A;&#x4E0E;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x6709;&#x5173;&#x7684;&#x65B9;&#x6CD5;&#xFF1A;<a href="https://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback">process.nextTick</a>&#x548C;<a href="https://nodejs.org/docs/latest/api/timers.html#timers_setimmediate_callback_arg">setImmediate</a>&#x3002;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x52A0;&#x6DF1;&#x5BF9;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x7684;&#x7406;&#x89E3;&#x3002;</p><p>process.nextTick&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5728;&#x5F53;&#x524D;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x7684;&#x5C3E;&#x90E8;----&#x4E0B;&#x4E00;&#x6B21;Event Loop&#xFF08;&#x4E3B;&#x7EBF;&#x7A0B;&#x8BFB;&#x53D6;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF09;&#x4E4B;&#x524D;----&#x89E6;&#x53D1;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5B83;&#x6307;&#x5B9A;&#x7684;&#x4EFB;&#x52A1;&#x603B;&#x662F;&#x53D1;&#x751F;&#x5728;&#x6240;&#x6709;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x4E4B;&#x524D;&#x3002;setImmediate&#x65B9;&#x6CD5;&#x5219;&#x662F;&#x5728;&#x5F53;&#x524D;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#x7684;&#x5C3E;&#x90E8;&#x6DFB;&#x52A0;&#x4E8B;&#x4EF6;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5B83;&#x6307;&#x5B9A;&#x7684;&#x4EFB;&#x52A1;&#x603B;&#x662F;&#x5728;&#x4E0B;&#x4E00;&#x6B21;Event Loop&#x65F6;&#x6267;&#x884C;&#xFF0C;&#x8FD9;&#x4E0E;setTimeout(fn, 0)&#x5F88;&#x50CF;&#x3002;&#x8BF7;&#x770B;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#xFF08;via <a href="https://stackoverflow.com/questions/17502948/nexttick-vs-setimmediate-visual-explanation">StackOverflow</a>&#xFF09;&#x3002;</p><pre><code class="language-javascript">
process.nextTick(function A() {
  console.log(1);
  process.nextTick(function B(){console.log(2);});
});

setTimeout(function timeout() {
  console.log(&apos;TIMEOUT FIRED&apos;);
}, 0)
// 1
// 2
// TIMEOUT FIRED
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;&#x7531;&#x4E8E;process.nextTick&#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x603B;&#x662F;&#x5728;&#x5F53;&#x524D;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x7684;&#x5C3E;&#x90E8;&#x89E6;&#x53D1;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4EC5;&#x51FD;&#x6570;A&#x6BD4;setTimeout&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;timeout&#x5148;&#x6267;&#x884C;&#xFF0C;&#x800C;&#x4E14;&#x51FD;&#x6570;B&#x4E5F;&#x6BD4;timeout&#x5148;&#x6267;&#x884C;&#x3002;&#x8FD9;&#x8BF4;&#x660E;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x591A;&#x4E2A;process.nextTick&#x8BED;&#x53E5;&#xFF08;&#x4E0D;&#x7BA1;&#x5B83;&#x4EEC;&#x662F;&#x5426;&#x5D4C;&#x5957;&#xFF09;&#xFF0C;&#x5C06;&#x5168;&#x90E8;&#x5728;&#x5F53;&#x524D;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x6267;&#x884C;&#x3002;</p><p>&#x73B0;&#x5728;&#xFF0C;&#x518D;&#x770B;setImmediate&#x3002;</p><pre><code class="language-javascript">
setImmediate(function A() {
  console.log(1);
  setImmediate(function B(){console.log(2);});
});

setTimeout(function timeout() {
  console.log(&apos;TIMEOUT FIRED&apos;);
}, 0);
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;setImmediate&#x4E0E;setTimeout(fn,0)&#x5404;&#x81EA;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;A&#x548C;timeout&#xFF0C;&#x90FD;&#x662F;&#x5728;&#x4E0B;&#x4E00;&#x6B21;Event Loop&#x89E6;&#x53D1;&#x3002;&#x90A3;&#x4E48;&#xFF0C;&#x54EA;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5148;&#x6267;&#x884C;&#x5462;&#xFF1F;&#x7B54;&#x6848;&#x662F;&#x4E0D;&#x786E;&#x5B9A;&#x3002;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x53EF;&#x80FD;&#x662F;1--TIMEOUT FIRED--2&#xFF0C;&#x4E5F;&#x53EF;&#x80FD;&#x662F;TIMEOUT FIRED--1--2&#x3002;</p><p>&#x4EE4;&#x4EBA;&#x56F0;&#x60D1;&#x7684;&#x662F;&#xFF0C;Node.js&#x6587;&#x6863;&#x4E2D;&#x79F0;&#xFF0C;setImmediate&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x603B;&#x662F;&#x6392;&#x5728;setTimeout&#x524D;&#x9762;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x53EA;&#x53D1;&#x751F;&#x5728;&#x9012;&#x5F52;&#x8C03;&#x7528;&#x7684;&#x65F6;&#x5019;&#x3002;</p><pre><code class="language-javascript">
setImmediate(function (){
  setImmediate(function A() {
    console.log(1);
    setImmediate(function B(){console.log(2);});
  });

  setTimeout(function timeout() {
    console.log(&apos;TIMEOUT FIRED&apos;);
  }, 0);
});
// 1
// TIMEOUT FIRED
// 2
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;setImmediate&#x548C;setTimeout&#x88AB;&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x4E2A;setImmediate&#x91CC;&#x9762;&#xFF0C;&#x5B83;&#x7684;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x603B;&#x662F;1--TIMEOUT FIRED--2&#xFF0C;&#x8FD9;&#x65F6;&#x51FD;&#x6570;A&#x4E00;&#x5B9A;&#x5728;timeout&#x524D;&#x9762;&#x89E6;&#x53D1;&#x3002;&#x81F3;&#x4E8E;2&#x6392;&#x5728;TIMEOUT FIRED&#x7684;&#x540E;&#x9762;&#xFF08;&#x5373;&#x51FD;&#x6570;B&#x5728;timeout&#x540E;&#x9762;&#x89E6;&#x53D1;&#xFF09;&#xFF0C;&#x662F;&#x56E0;&#x4E3A;setImmediate&#x603B;&#x662F;&#x5C06;&#x4E8B;&#x4EF6;&#x6CE8;&#x518C;&#x5230;&#x4E0B;&#x4E00;&#x8F6E;Event Loop&#xFF0C;&#x6240;&#x4EE5;&#x51FD;&#x6570;A&#x548C;timeout&#x662F;&#x5728;&#x540C;&#x4E00;&#x8F6E;Loop&#x6267;&#x884C;&#xFF0C;&#x800C;&#x51FD;&#x6570;B&#x5728;&#x4E0B;&#x4E00;&#x8F6E;Loop&#x6267;&#x884C;&#x3002;</p><p>&#x6211;&#x4EEC;&#x7531;&#x6B64;&#x5F97;&#x5230;&#x4E86;process.nextTick&#x548C;setImmediate&#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x533A;&#x522B;&#xFF1A;&#x591A;&#x4E2A;process.nextTick&#x8BED;&#x53E5;&#x603B;&#x662F;&#x5728;&#x5F53;&#x524D;&quot;&#x6267;&#x884C;&#x6808;&quot;&#x4E00;&#x6B21;&#x6267;&#x884C;&#x5B8C;&#xFF0C;&#x591A;&#x4E2A;setImmediate&#x53EF;&#x80FD;&#x5219;&#x9700;&#x8981;&#x591A;&#x6B21;loop&#x624D;&#x80FD;&#x6267;&#x884C;&#x5B8C;&#x3002;&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;&#x8FD9;&#x6B63;&#x662F;Node.js 10.0&#x7248;&#x6DFB;&#x52A0;setImmediate&#x65B9;&#x6CD5;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x5426;&#x5219;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x7684;&#x9012;&#x5F52;&#x8C03;&#x7528;process.nextTick&#xFF0C;&#x5C06;&#x4F1A;&#x6CA1;&#x5B8C;&#x6CA1;&#x4E86;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x6839;&#x672C;&#x4E0D;&#x4F1A;&#x53BB;&#x8BFB;&#x53D6;&quot;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&quot;&#xFF01;</p><pre><code class="language-javascript">
process.nextTick(function foo() {
  process.nextTick(foo);
});
</code></pre><p>&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;&#x73B0;&#x5728;&#x8981;&#x662F;&#x4F60;&#x5199;&#x51FA;&#x9012;&#x5F52;&#x7684;process.nextTick&#xFF0C;Node.js&#x4F1A;&#x629B;&#x51FA;&#x4E00;&#x4E2A;&#x8B66;&#x544A;&#xFF0C;&#x8981;&#x6C42;&#x4F60;&#x6539;&#x6210;setImmediate&#x3002;</p><p>&#x53E6;&#x5916;&#xFF0C;&#x7531;&#x4E8E;process.nextTick&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;&#x5728;&#x672C;&#x6B21;&quot;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&quot;&#x89E6;&#x53D1;&#xFF0C;&#x800C;setImmediate&#x6307;&#x5B9A;&#x7684;&#x662F;&#x5728;&#x4E0B;&#x6B21;&quot;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&quot;&#x89E6;&#x53D1;&#xFF0C;&#x6240;&#x4EE5;&#x5F88;&#x663E;&#x7136;&#xFF0C;&#x524D;&#x8005;&#x603B;&#x662F;&#x6BD4;&#x540E;&#x8005;&#x53D1;&#x751F;&#x5F97;&#x65E9;&#xFF0C;&#x800C;&#x4E14;&#x6267;&#x884C;&#x6548;&#x7387;&#x4E5F;&#x9AD8;&#xFF08;&#x56E0;&#x4E3A;&#x4E0D;&#x7528;&#x68C0;&#x67E5;&quot;&#x4EFB;&#x52A1;&#x961F;&#x5217;&quot;&#xFF09;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[Centos修改yum源为国内阿里源]]></title><description><![CDATA[以下为修改Centos6.5的yum源：]]></description><link>http://blog.zhoushoujian.com/welcome/</link><guid isPermaLink="false">618fd6d9b518235c786017d4</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:47 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/welcome-to-ghost.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/welcome-to-ghost.png" alt="Centos&#x4FEE;&#x6539;yum&#x6E90;&#x4E3A;&#x56FD;&#x5185;&#x963F;&#x91CC;&#x6E90;"><p>&#x4EE5;&#x4E0B;&#x4E3A;&#x4FEE;&#x6539;Centos6.5&#x7684;yum&#x6E90;&#xFF1A;</p><p>1. &#x5907;&#x4EFD;&#x539F;&#x955C;&#x50CF;&#x6587;&#x4EF6;&#xFF0C;&#x4FBF;&#x4E8E;&#x540E;&#x671F;&#x6062;&#x590D;</p><p>[root@keepmydream ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup</p><p>2.&#x4E0B;&#x8F7D;&#x65B0;&#x7684;CentOS-Base.repo &#x5230;/etc/yum.repos.d/</p><p>Centos5&#x5730;&#x5740;&#xFF1A;</p><p>wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo</p><p>Centos6&#x5730;&#x5740;&#xFF1A;</p><p>wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo</p><p>Centos7&#x5730;&#x5740;&#xFF1A;</p><p>wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</p><p>3. &#x6E05;&#x9664;&#x7F13;&#x5B58;</p><p>yum clean all</p><p>4. &#x751F;&#x6210;&#x7F13;&#x5B58;</p><p>yum makecache</p>]]></content:encoded></item><item><title><![CDATA[求求你，别再问你的种子磁力为什么下不动了！]]></title><description><![CDATA[求求你，别再问你的种子磁力为什么下不动了！]]></description><link>http://blog.zhoushoujian.com/design/</link><guid isPermaLink="false">618fd6d9b518235c786017d2</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:46 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/admin-settings.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/admin-settings.png" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;"><p>&#x963F;&#x865A;&#x66FE;&#x7ECF;&#x5206;&#x4EAB;&#x8FC7;&#x201C;&#x53EF;&#x80FD;&#x662F;&#x6700;&#x5168;&#x7684;BT&#x79CD;&#x5B50; / &#x78C1;&#x529B; / eD2K&#x94FE;&#x63A5;&#x201D;&#xFF1A;</p><ol><li><a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/xq2rahF9swexGgZo634qpQ" rel="nofollow noreferrer">&#x641C;&#x7D22;&#x5DE5;&#x5177;&#x5408;&#x96C6;</a></li><li><a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/NtT1ugq5p4CIvzkdWlPHSQ" rel="nofollow noreferrer">&#x4E0B;&#x8F7D;&#x5DE5;&#x5177;&#x5408;&#x96C6;</a></li></ol><p><br></p><p>&#x4F46;&#x540E;&#x6765;&#x603B;&#x6709;&#x7C89;&#x4E1D;&#x5728;&#x7559;&#x8A00;&#xFF1A;</p><ul><li>&#x6362;&#x4E86;&#x8FC5;&#x96F7;5&#x8FD8;&#x662F;&#x4E0B;&#x4E0D;&#x52A8;&#x554A;&#xFF01;</li><li>&#x8FD8;&#x6709;&#x6CA1;&#x6709;&#x597D;&#x7528;&#x7684;&#x4E0B;&#x8F7D;&#x5668;&#x554A;&#xFF1F;&#x4F60;&#x7ED9;&#x7684;&#x8FD9;&#x4E9B;&#x4E0D;&#x884C;&#x554A;&#xFF01;</li><li>&#x5783;&#x573E;&#xFF0C;&#x5B8C;&#x5168;&#x6CA1;&#x7528;&#xFF0C;&#x8FD8;&#x662F;&#x4E0B;&#x4E0D;&#x4E86;</li><li>&#x6CA1;&#x7528;&#xFF01;&#x6362;&#x4E86;&#x4F60;&#x7ED9;&#x7684;&#x51E0;&#x4E2A;&#x4E0B;&#x8F7D;&#x5668;&#x90FD;&#x4E0B;&#x4E0D;&#x52A8;</li></ul><p><br></p><p>&#x56E0;&#x4E3A;&#x8001;&#x6709;&#x4EBA;&#x628A;&#x4E0B;&#x8F7D;&#x4E0D;&#x4E86;&#x7684;&#x95EE;&#x9898;&#x5F52;&#x548E;&#x4E8E;&#x4E0B;&#x8F7D;&#x5668;&#x4E0A;&#xFF0C;&#x963F;&#x865A;&#x5FCD;&#x65E0;&#x53EF;&#x5FCD;&#xFF0C;&#x5FC5;&#x987B;&#x8981;&#x7AD9;&#x51FA;&#x6765;&#x79D1;&#x666E;&#x4E00;&#x4E0B;&#x4E86;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-1776520e0ec53cb0362169471ef94056_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x8BF4;&#x5230;&#x5E95;&#xFF0C;&#x4F1A;&#x63D0;&#x51FA;&#x4EE5;&#x4E0A;&#x95EE;&#x9898;&#xFF0C;&#x8BF4;&#x5230;&#x5E95;&#x662F;&#x56E0;&#x4E3A;<strong>&#x4F60;&#x6CA1;&#x7406;&#x89E3;&#xFF1A;&#x4E0B;&#x8F7D;&#x4E00;&#x4E2A;&#x4E1C;&#x897F;&#xFF0C;&#x80CC;&#x540E;&#x7684;&#x539F;&#x7406;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</strong></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-8a6caafa3deec0e724d8acb9dd939d3b_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><h2 id="%E4%B8%80%E3%80%81%E4%B8%8B%E8%BD%BD%E5%8D%8F%E8%AE%AE">&#x4E00;&#x3001;&#x4E0B;&#x8F7D;&#x534F;&#x8BAE;</h2><p>&#x5982;&#x4ECA;&#x7684;&#x4E0B;&#x8F7D;&#x534F;&#x8BAE;&#x5F88;&#x591A;&#xFF0C;&#x8FC5;&#x96F7;&#x91CC;&#x9762;&#x65B0;&#x5EFA;&#x4E00;&#x4E0B;&#x4E0B;&#x8F7D;&#xFF0C;&#x4F60;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x5B83;&#x652F;&#x6301;&#x5F88;&#x591A;&#x79CD;&#x4E0B;&#x8F7D;&#x94FE;&#x63A5;&#xFF0C;&#x6BCF;&#x79CD;&#x94FE;&#x63A5;&#x5BF9;&#x5E94;&#x7684;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x4E0B;&#x8F7D;&#x534F;&#x8BAE;</p><p>&#x963F;&#x865A;&#x5C31;&#x6328;&#x7740;&#x6328;&#x7740;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-99200e6ef736db7601c8a544b8d433ae_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><h2 id="%EF%BC%88%E4%B8%80%EF%BC%89http-https-%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE">&#xFF08;&#x4E00;&#xFF09;HTTP / HTTPS &#x8D85;&#x6587;&#x672C;&#x4F20;&#x8F93;&#x534F;&#x8BAE;</h2><p>&#x5C06;&#x6587;&#x4EF6;&#x653E;&#x5230;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#xFF0C;&#x7136;&#x540E;&#x7531;&#x670D;&#x52A1;&#x5668;&#x4F20;&#x9001;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x7528;&#x6237;&#x673A;&#x5668;&#x4E0A;&#xFF0C;&#x79F0;&#x4E3A;Client-Server Model&#x7B80;&#x79F0;C/S&#x6A21;&#x5F0F;&#xFF0C;&#x6216;&#x8005;&#x53EB;<strong><em>&#x4E00;&#x5BF9;&#x591A;&#x6A21;&#x5F0F;</em></strong></p><p><br></p><p>&#x8FD9;&#x79CD;&#x534F;&#x8BAE;&#x7684;&#x7F3A;&#x70B9;&#x662F;&#xFF1A;&#x56E0;&#x4E3A;&#x670D;&#x52A1;&#x5668;&#x7684;&#x4E0A;&#x884C;&#x5E26;&#x5BBD;&#xFF08;&#x4E0A;&#x4F20;&#x901F;&#x5EA6;&#xFF09;&#x6709;&#x9650;&#xFF0C;&#x5982;&#x679C;<em>&#x540C;&#x4E00;&#x65F6;&#x523B;&#x4E0B;&#x8F7D;&#x540C;&#x4E00;&#x6587;&#x4EF6;</em>&#x7684;&#x7528;&#x6237;&#x592A;&#x591A;&#xFF0C;&#x4F1A;&#x5F71;&#x54CD;&#x5230;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-d924f88340839a26adac98ab2c69e7ae_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x4F8B;&#x5982;&#xFF1A;&#x4ECE;&#x67D0;&#x5E38;&#x89C1;&#x8F6F;&#x4EF6;&#x4E0B;&#x8F7D;&#x7AD9;&#x7684;&#x672C;&#x5730;&#x4E0B;&#x8F7D;&#x94FE;&#x63A5;&#x5904;&#xFF0C;&#x53F3;&#x952E;&#x590D;&#x5236;&#x5F97;&#x5230;&#x7684;&#x94FE;&#x63A5;</p><p>&#x5C31;&#x662F;&#x4E00;&#x4E2A;http&#x94FE;&#x63A5;&#xFF1A;<code>http://down.crsky.com/soft/201909/TencentVideo-v10.23.4705.0.zip</code></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-09972e679e040a5b866cfe4519749959_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><h2 id="%EF%BC%88%E4%BA%8C%EF%BC%89ftp-sftp-%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE">&#xFF08;&#x4E8C;&#xFF09;FTP / SFTP &#x6587;&#x4EF6;&#x4F20;&#x8F93;&#x534F;&#x8BAE;</h2><p><strong>FTP&#x8DDF;HTTP&#x4E00;&#x6837;</strong>&#xFF0C;&#x4E5F;&#x662F;&#x5C06;&#x6587;&#x4EF6;&#x653E;&#x5230;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#xFF0C;&#x7136;&#x540E;&#x7531;&#x670D;&#x52A1;&#x5668;&#x4F20;&#x9001;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x7528;&#x6237;&#x673A;&#x5668;&#x4E0A;&#x3002;</p><p><strong>&#x4E0D;&#x540C;&#x7684;&#x662F;</strong>&#xFF1A;FTP&#x9700;&#x8981;&#x8F93;&#x5165;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x6765;&#x9A8C;&#x8BC1;&#x901A;&#x4FE1;&#x5B89;&#x5168;&#x7684;&#x8FC7;&#x7A0B;&#x3002;</p><p>&#x4E0D;&#x8FC7;&#x5927;&#x591A;&#x7684;FTP&#x4E0B;&#x8F7D;&#x7AD9;&#x4F1A;&#x91C7;&#x7528;Anonymous FTP&#xFF08;&#x533F;&#x540D;&#x9A8C;&#x8BC1;&#xFF0C;&#x5BC6;&#x7801;&#x4E3A;&#x7A7A;&#xFF09;&#x6765;&#x8DF3;&#x8FC7;&#x9A8C;&#x8BC1;&#x7684;&#x8FC7;&#x7A0B;&#x3002;&#x8FD9;&#x6837;&#x4E5F;&#x5C31;&#x8DDF;HTTP&#x5DEE;&#x4E0D;&#x591A;&#x7684;&#x4E0B;&#x8F7D;&#x4F53;&#x9A8C;&#x4E86;&#x3002;</p><p><br></p><p>&#x4F8B;&#x5982;&#xFF1A;&#x4ECE;&#x7535;&#x5F71;&#x5929;&#x5802;&#x7F51;&#x7AD9;&#x4E0A;&#x627E;&#x5230;&#x300A;&#x70C8;&#x706B;&#x82F1;&#x96C4;&#x300B;&#x5F97;&#x5230;&#x7684;&#x4E0B;&#x8F7D;&#x94FE;&#x63A5;&#xFF1A;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-765a2f87c05a87dbbe547d89fd1623c3_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><p><br></p><h2 id="%EF%BC%88%E4%B8%89%EF%BC%89bt%E7%A7%8D%E5%AD%90-%E7%A3%81%E5%8A%9B%E9%93%BE%E6%8E%A5">&#xFF08;&#x4E09;&#xFF09;BT&#x79CD;&#x5B50; / &#x78C1;&#x529B;&#x94FE;&#x63A5;</h2><p>BT&#x534F;&#x8BAE;&#x548C;&#x78C1;&#x529B;&#x7406;&#x89E3;&#x8D77;&#x6765;&#x7A0D;&#x663E;&#x590D;&#x6742;&#xFF0C;&#x4E0D;&#x8FC7;&#x5DF2;&#x6709;&#x524D;&#x4EBA;</p><p>&#x975E;&#x5E38;&#x7CBE;&#x5FC3;&#x5236;&#x4F5C;&#x751F;&#x52A8;&#x5F62;&#x8C61;&#x7684;&#x79D1;&#x666E;&#x89C6;&#x9891;&#xFF0C;&#x963F;&#x865A;&#x8FD9;&#x91CC;&#x5C31;&#x501F;&#x82B1;&#x732E;&#x4F5B;&#x4E00;&#x4E0B;&#xFF1A;</p><p><br></p><h3 id="1%E5%88%AB%E5%86%8D%E9%97%AE%E6%88%91%E4%BB%80%E4%B9%88%E5%8F%AB-bt-%E7%A7%8D%E5%AD%90">1.&#x522B;&#x518D;&#x95EE;&#x6211;&#x4EC0;&#x4E48;&#x53EB; BT &#x79CD;&#x5B50;</h3><p>&#x4F5C;&#x8005;&#xFF0C;&#x516C;&#x4F17;&#x53F7;&#xFF1A;&#x56DE;&#x5F62;&#x9488;PaperClip</p><p>&#x89C6;&#x9891;&#x65F6;&#x957F;&#xFF1A;07&#xFF1A;26</p><p>&#x89C6;&#x9891;&#x5730;&#x5740;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/4XfJYG4S9bpmbR72hZLmww" rel="nofollow noreferrer">https://mp.weixin.qq.com/s/4XfJYG4S9bpmbR72hZLmww</a></p><p>&#x89C6;&#x9891;&#x6587;&#x5B57;&#x7A3F;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/c1dkrOZ-Dc8qL_4wgjzDqg" rel="nofollow noreferrer">https://mp.weixin.qq.com/s/c1dkrOZ-Dc8qL_4wgjzDqg</a></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-c903998dbbfade3224730edc0cd10291_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><h3 id="2%E7%A3%81%E5%8A%9B%E4%B8%8B%E8%BD%BD%E6%98%AF%E4%BB%80%E4%B9%88%E5%8E%9F%E7%90%86%EF%BC%9F%E8%B7%9F%E7%94%A8%E7%A7%8D%E5%AD%90%E4%B8%8B%E8%BD%BD%E7%9A%84%E5%8C%BA%E5%88%AB%E5%A4%A7%E4%B8%8D%E5%A4%A7%EF%BC%9F">2.&#x78C1;&#x529B;&#x4E0B;&#x8F7D;&#x662F;&#x4EC0;&#x4E48;&#x539F;&#x7406;&#xFF1F;&#x8DDF;&#x7528;&#x79CD;&#x5B50;&#x4E0B;&#x8F7D;&#x7684;&#x533A;&#x522B;&#x5927;&#x4E0D;&#x5927;&#xFF1F;</h3><p>&#x4F5C;&#x8005;&#xFF0C;B&#x7AD9;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//space.bilibili.com/357193460" rel="nofollow noreferrer">&#x4E07;&#x7269;30&#x79D2;</a></p><p>&#x89C6;&#x9891;&#x65F6;&#x957F;&#xFF1A;03&#xFF1A;52</p><p>&#x89C6;&#x9891;&#x5730;&#x5740;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/av34370450" rel="nofollow noreferrer">https://www.bilibili.com/video/av34370450</a></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic1.zhimg.com/80/v2-92551f43c622b93eee51518d82138ca4_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x8FD9;&#x4E24;&#x4E2A;&#x89C6;&#x9891;&#x770B;&#x5B8C;&#x4E4B;&#x540E;&#xFF0C;&#x4F60;&#x5E94;&#x8BE5;&#x5C31;&#x80FD;&#x660E;&#x767D;BT&#x548C;&#x78C1;&#x529B;&#x4E0B;&#x8F7D;&#x7684;&#x539F;&#x7406;&#x4E86;</p><p><br></p><p>&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x60F3;&#x770B;&#x89C6;&#x9891;&#xFF08;&#x5EFA;&#x8BAE;&#x770B;&#x770B;&#xFF09;&#x963F;&#x865A;&#x8FD8;&#x662F;&#x5728;&#x8FD9;&#x91CC;<strong>&#x7ED3;&#x5408;&#x7F51;&#x4E0A;+&#x81EA;&#x5DF1;&#x7684;&#x7406;&#x89E3;+&#x4E0A;&#x9762;&#x7684;&#x89C6;&#x9891;</strong>&#xFF0C;&#x5199;&#x70B9;&#x4E1C;&#x897F;</p><p><br></p><h3 id="3bt%E7%A7%8D%E5%AD%90">3.BT&#x79CD;&#x5B50;</h3><p>&#x7F8E;&#x56FD;&#x5DE5;&#x7A0B;&#x5E08; Bram Cohen &#x5728; 2001 &#x5E74;&#x53D1;&#x5E03;&#x4E86; BitTorrent &#x534F;&#x8BAE;&#xFF0C;&#x8D44;&#x6E90;&#x4E0D;&#x518D;&#x7531;&#x4E00;&#x4E2A;&#x4EBA;&#x6216;&#x4E00;&#x4E2A;&#x4E2D;&#x5FC3;&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#xFF0C;&#x800C;&#x662F;&#x6240;&#x6709;&#x4EBA;&#x63D0;&#x4F9B;&#x7ED9;&#x6240;&#x6709;&#x4EBA;&#xFF0C;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#x8D8A;&#x591A;&#xFF0C;&#x901F;&#x5EA6;&#x8D8A;&#x5FEB;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4E5F;&#x53EB; peer-to-peer&#xFF08;&#x7528;&#x6237;&#x7FA4;&#x5BF9;&#x7528;&#x6237;&#x7FA4;&#xFF09;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x5E38;&#x8BF4;&#x7684; P2P &#x4E0B;&#x8F7D;&#x3002;</p><blockquote><em>&#x6CE8;1&#xFF1A;&#x4E0D;&#x8981;&#x8DDF;&#x70B9;&#x5BF9;&#x70B9;&#x534F;&#x8BAE;PPP&#xFF08;Point-to-Point Protocol&#xFF09;&#x6DF7;&#x6DC6;&#xFF0C;&#x90A3;&#x4E2A;&#x4E3A;&#x62E8;&#x53F7;&#x4E0A;&#x7F51;&#x534F;&#x8BAE;</em><br><em>&#x6CE8;2&#xFF1A;P2P&#x501F;&#x8D37;&#xFF08;Peer-to-Peer Lending&#xFF09;&#x4E5F;&#x662F;&#x57FA;&#x4E8E;Peer-to-Peer&#x6A21;&#x5F0F;</em></blockquote><p><br></p><p>&#x95EE;&#xFF1A;&#x4EC0;&#x4E48;&#x662F;P2P&#xFF08;Peer-to-Peer&#xFF09;&#xFF1F;</p><p>&#x7B54;&#xFF1A;&#x6027;&#x8D28;&#x5982;&#x4E0B;&#xFF1A;</p><ol><li>&#x5B83;&#x662F;<em>&#x65E0;&#x4E2D;&#x5FC3;&#x670D;&#x52A1;&#x5668;</em>&#x7684;&#x5BF9;&#x7B49;&#x7F51;&#x7EDC;&#x7CFB;&#x7EDF;&#xFF0C;&#x800C;&#x4E0A;&#x6587;&#x8BF4;&#x7684;C/S&#x6A21;&#x5F0F;&#x662F;&#x6709;&#x4E2D;&#x5FC3;&#x670D;&#x52A1;&#x5668;&#x7684;&#x4E2D;&#x592E;&#x7F51;&#x7EDC;&#x7CFB;&#x7EDF;</li><li>&#x5BF9;&#x7B49;&#x7F51;&#x7EDC;&#x7684;&#x6BCF;&#x4E2A;&#x7528;&#x6237;&#x7AEF;&#x65E2;&#x662F;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x4E5F;&#x6709;&#x670D;&#x52A1;&#x5668;&#x7684;&#x529F;&#x80FD;&#x3002;&#x6240;&#x4EE5;<em>&#x7528;&#x6237;&#x5373;&#x53EF;&#x4EE5;&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0A;&#x4F20;&#x6587;&#x4EF6;</em>&#x7ED9;&#x522B;&#x4EBA;</li><li>&#x6240;&#x4EE5;&#x5B83;&#x53EB;&#x7528;&#x6237;&#x7FA4;&#x5BF9;&#x7528;&#x6237;&#x7FA4;&#xFF08;peer-to-peer&#xFF09;&#x6A21;&#x5F0F;&#x3002;&#x7528;&#x6237;&#x8D8A;&#x591A;&#xFF0C;<em>&#x4E0B;&#x8F7D;&#x540C;&#x4E00;&#x6587;&#x4EF6;&#x7684;&#x4EBA;&#x8D8A;&#x591A;&#xFF0C;&#x4E0B;&#x8F7D;&#x8BE5;&#x6587;&#x4EF6;&#x7684;&#x901F;&#x5EA6;&#x5C31;&#x8D8A;&#x5FEB;</em></li></ol><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-f930bd58f6f4dfcb3d8a6a4f9486ce61_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><p>&#x90A3;&#x832B;&#x832B;&#x7F51;&#x7EDC;&#xFF0C;&#x4F60;&#x8981;&#x600E;&#x4E48;&#x627E;&#x5230;&#x6B63;&#x5728;&#x4E0B;&#x8F7D;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x7684;&#x5176;&#x4ED6;&#x4EBA;&#x5462;&#xFF1F;</p><p>&#x8FD9;&#x5C31;&#x8981;&#x63D0;&#x5230;Tracker&#x670D;&#x52A1;&#x5668;&#x4E86;</p><p><br></p><p>&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;BT &#x79CD;&#x5B50;&#x5305;&#x542B;&#x4E86;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#x3001;&#x5927;&#x5C0F;&#xFF0C;&#x5206;&#x5757;&#x540E;&#x6BCF;&#x5757;&#x6587;&#x4EF6;&#x7684;&#x5927;&#x5C0F;&#x3001;&#x54C8;&#x5E0C;&#x503C;&#xFF0C;&#x4EE5;&#x53CA; <strong><em>Tracker &#x670D;&#x52A1;&#x5668;</em></strong>&#x7684;&#x5730;&#x5740;&#x3002;</p><p><br></p><p>Tracker&#xFF0C;&#x5373;&#x8FFD;&#x8E2A;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5B83;&#x5BF9;&#x4E8E;BT&#x4E0B;&#x8F7D;&#x6765;&#x8BF4;&#x975E;&#x5E38;&#x91CD;&#x8981;&#xFF0C;&#x901A;&#x8FC7; Tracker &#x6211;&#x4EEC;&#x624D;&#x80FD;&#x627E;&#x5230;&#x5176;&#x4ED6;&#x4E0B;&#x8F7D;&#x8005;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#x3002;</p><p><br></p><p>&#x5F53;&#x4F60;&#x7528;&#x4E0B;&#x8F7D;&#x8F6F;&#x4EF6;&#x6253;&#x5F00;&#x79CD;&#x5B50;&#xFF0C;&#x5C31;&#x4F1A;&#x5F00;&#x59CB;&#x8054;&#x7CFB;&#x79CD;&#x5B50;&#x6587;&#x4EF6;&#x91CC;&#x5185;&#x7F6E;&#x7684; Tracker &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x544A;&#x8BC9; Tracker &#x6211;&#x8981;&#x4E0B;&#x8F7D;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x8BB0;&#x5F55;&#x4E0B;&#x4F60;&#x7684; IP&#xFF0C;&#x5E76;&#x628A;&#x5176;&#x4ED6;&#x6B63;&#x5728;&#x4E0B;&#x8F7D;&#x6216;&#x4E0B;&#x8F7D;&#x5B8C;&#x6210;&#x7684;&#x4EBA;&#x7684; IP &#x8FD4;&#x56DE;&#x7ED9;&#x4F60;&#xFF0C;&#x8FD9;&#x6837;&#x4F60;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x6109;&#x5FEB;&#x2642; &#x7684;&#x52A0;&#x5165;&#x5927;&#x5BB6;&#x7684;&#x4E0B;&#x8F7D;&#x961F;&#x4F0D;&#x4E86;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-228a3de7d12607f38a2ce006d27ffd6d_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><p>&#x5F53;&#x7136;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x627E;&#x5230;&#x6B63;&#x5728;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#xFF0C;&#x8D44;&#x6E90;&#x53D1;&#x5E03;&#x8005;&#x4E5F;&#x4E0D;&#x5728;&#x7EBF;&#xFF08;&#x6CA1;&#x4EBA;&#x505A;&#x79CD;&#xFF09;&#xFF0C;&#x4F60;&#x5C31;&#x53EA;&#x80FD;&#x4EE5; 0kb/s &#x7684;&#x901F;&#x5EA6;&#x7B49;&#x7740;&#x4E86;&#xFF01;</p><p><br></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-8184f3115bcdb1fec49744c75711cdea_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x5230;&#x8FD9;&#x91CC;&#x5C31;&#x89E3;&#x91CA;&#x4E86;&#xFF0C;&#x672C;&#x6587;&#x4E00;&#x5F00;&#x5934;&#x6240;&#x8BF4;&#x7684;&#x5927;&#x90E8;&#x5206;&#x95EE;&#x9898;&#xFF01;</p><p>&#x8BF4;&#x5230;&#x5E95;&#xFF0C;&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x6839;&#x672C;&#x4E0D;&#x662F;&#x4E0B;&#x8F7D;&#x5668;&#x7684;&#x95EE;&#x9898;&#xFF01;&#x800C;&#x662F;</p><ol><li>&#x8981;&#x4E48;&#x8FD9;&#x6839;&#x672C;&#x5C31;&#x662F;&#x4E2A;&#x51B7;&#x95E8;&#x79CD;&#x5B50;&#xFF0C;<em>&#x51E0;&#x4E4E;&#x6CA1;&#x4EBA;&#x5728;&#x4E0B;&#x8F7D;</em>&#xFF0C;&#x6240;&#x4EE5;&#x5F53;&#x7136;&#x4E0D;&#x4F1A;&#x6709;&#x901F;&#x5EA6;&#xFF01;</li><li>&#x8981;&#x4E48;&#x662F;&#x56E0;&#x4E3A;&#x79CD;&#x5B50;&#x4E2D;&#x63D0;&#x4F9B;&#x7684; Tracker &#x670D;&#x52A1;&#x5668; &#x592A;&#x5C11;&#xFF08;&#x6216;&#x8005;&#x8BF4;&#x88AB;&#x5C01;&#x4E86;&#xFF09;&#xFF0C;&#x5BFC;&#x81F4;&#x4F60;&#x627E;&#x4E0D;&#x5230;&#x5176;&#x4ED6;&#x6B63;&#x5728;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4F1A;&#x6709;&#x901F;&#x5EA6;&#xFF01;</li></ol><p>&#x8981;&#x8BF4;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x7684;&#x8BDD;&#xFF1A;</p><ol><li>&#x5BF9;&#x4E8E;&#x4E0A;&#x9762;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x60C5;&#x51B5;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x6362;&#x65F6;&#x95F4;&#x6BB5;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;&#xFF08;&#x67D0;&#x4E9B;&#x8D44;&#x6E90;&#x665A;&#x4E0A;&#x4E0B;&#x8F7D;&#x4F1A;&#x66F4;&#x5FEB;&#xFF09;&#xFF0C;&#x5F53;&#x7136;&#x6700;&#x9760;&#x8C31;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x662F;&#xFF1A;&#x5C1D;&#x8BD5;&#x5176;&#x4ED6;&#x70ED;&#x95E8;&#x79CD;&#x5B50;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;</li><li>&#x5BF9;&#x4E8E;&#x4E0A;&#x9762;&#x7684;&#x7B2C;&#x4E8C;&#x4E2A;&#x60C5;&#x51B5;&#xFF0C;&#x6DFB;&#x52A0;&#x66F4;&#x591A;&#x7684;Tracker&#x670D;&#x52A1;&#x5668;&#x5219;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x5E2E;&#x52A9;&#xFF0C;&#x5173;&#x4E8E;<strong>&#x5982;&#x4F55;&#x5728;BT&#x4E0B;&#x8F7D;&#x5668;&#x4E2D;&#x6DFB;&#x52A0; Tracker &#x670D;&#x52A1;&#x5668;</strong>&#xFF0C;&#x963F;&#x865A;&#x4E4B;&#x524D;&#x7684;&#x6587;&#x7AE0;&#x63D0;&#x4F9B;&#x7684;&#x8F6F;&#x4EF6;&#x4E0B;&#x8F7D;&#x538B;&#x7F29;&#x5305;&#x91CC;&#x5C31;&#x6709;&#x8BE6;&#x7EC6;&#x7684;&#x6559;&#x7A0B;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x591A;&#x505A;&#x8BF4;&#x660E;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/NtT1ugq5p4CIvzkdWlPHSQ" rel="nofollow noreferrer">&#x53EF;&#x80FD;&#x662F;&#x6700;&#x5168;&#x7684;BT&#x79CD;&#x5B50; / &#x78C1;&#x529B; / eD2K&#x94FE;&#x63A5;&#x4E0B;&#x8F7D;&#x5DE5;&#x5177;&#x5408;&#x96C6;</a></li></ol><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-d27570d06f85decd4a61285804423f56_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x8FD9;&#x91CC;&#x53C8;&#x8981;&#x63D0;&#x4E00;&#x63D0;&#x4E3A;&#x4E1A;&#x754C;&#x6240;&#x4E0D;&#x803B;&#x7684;&#x5927;&#x8FC5;&#x96F7;&#x4E86;&#xFF0C;&#x8FC5;&#x96F7;&#xFF0C;&#x4FD7;&#x79F0;<em>&#x5438;&#x8840;&#x96F7;</em>&#x3002;</p><ul><li>&#x5438;&#x8840;&#x5C31;&#x662F;&#x6307;&#x4E00;&#x4E9B;&#x5BA2;&#x6237;&#x7AEF;&#x5728;&#x8FDB;&#x884C;P2P&#x4E0B;&#x8F7D;&#x65F6;&#xFF0C;&#x4ECE;&#x5176;&#x5B83;&#x5BA2;&#x6237;&#x7AEF;&#x4E0B;&#x8F7D;&#x7684;&#x6570;&#x636E;&#x91CF;&#x975E;&#x5E38;&#x591A;&#xFF0C;&#x4F46;&#x662F;&#x5206;&#x4EAB;&#x7ED9;&#x5176;&#x5B83;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x6570;&#x636E;&#x975E;&#x5E38;&#x5C11;&#xFF0C;&#x4E0B;&#x8F7D;&#x5B8C;&#x6210;&#x540E;&#x7ACB;&#x5373;&#x5173;&#x673A;&#x8D70;&#x4EBA;&#x7684;&#x884C;&#x4E3A;</li><li>&#x800C;&#x8FC5;&#x96F7;&#x5C31;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x4E2A;&#x4E0B;&#x8F7D;&#x5668;&#xFF0C;&#x8FC5;&#x96F7;&#x7684;&#x670D;&#x52A1;&#x5668;&#x75AF;&#x72C2;&#x7D22;&#x53D6;&#x8D44;&#x6E90;&#xFF0C;&#x4F46;&#x81EA;&#x5DF1;&#x53C8;&#x4E0D;&#x4E0A;&#x4F20;&#x8D44;&#x6E90;&#x7ED9;&#x522B;&#x4EBA;&#xFF09;&#xFF0C;&#x5F53;&#x6536;&#x96C6;&#x4E86;&#x5927;&#x91CF;&#x8D44;&#x6E90;&#x540E;&#xFF0C;&#x8FDB;&#x800C;&#x4E0B;&#x8F7D;&#x9650;&#x901F;&#xFF0C;&#x5F00;&#x542F;&#x4ED8;&#x8D39;&#x4F1A;&#x5458;&#x5236;&#x5EA6;</li></ul><p><br></p><p>BT&#x4E0B;&#x8F7D;&#x8BB2;&#x7A76;&#x5171;&#x4EAB;&#x7CBE;&#x795E;&#xFF0C;&#x8FD9;&#x8DDF;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x5171;&#x4EAB;&#x7CBE;&#x795E;&#x4E00;&#x8109;&#x76F8;&#x627F;&#xFF0C;&#x6240;&#x4EE5;&#x8BF7;&#x4E0D;&#x8981;&#x5728;BT&#x4E0B;&#x8F7D;&#x5668;&#x8BBE;&#x7F6E;&#x91CC;&#x9762;&#x9650;&#x5236;&#x4E0A;&#x4F20;&#x901F;&#x5EA6;&#x3002;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-00d7df54d88df905d3ccba16d1edf9a1_720w.png" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x9274;&#x4E8E;&#x8FD9;&#x7C7B;&#x81EA;&#x79C1;&#x884C;&#x4E3A;&#x5BF9;&#x5176;&#x5B83;&#x5408;&#x7406;&#x4F7F;&#x7528;P2P&#x7F51;&#x7EDC;&#x7684;&#x7528;&#x6237;&#x7684;&#x4F24;&#x5BB3;&#xFF0C;&#x73B0;&#x5728;&#x7684;&#x5F88;&#x591A;P2P&#x8F6F;&#x4EF6;&#x90FD;&#x52A0;&#x5165;<em>&#x53CD;&#x5438;&#x8840;&#x529F;&#x80FD;</em>&#x3002;</p><p>&#x5C31;&#x662F;&#x8BF4;&#x68C0;&#x6D4B;&#x5230;&#x7279;&#x5B9A;&#x7528;&#x6237;&#x7684;&#x5438;&#x8840;&#x884C;&#x4E3A;&#x6216;&#x8005;&#x5438;&#x8840;&#x8F6F;&#x4EF6;&#x65F6;&#x81EA;&#x52A8;&#x5BF9;&#x8FD9;&#x4E9B;&#x7528;&#x6237;&#x964D;&#x6743;&#x5904;&#x7406;&#xFF0C;&#x7B80;&#x5355;&#x6765;&#x8BF4;&#x5C31;&#x662F;&#x4F60;&#x7684;<em>&#x4E0A;&#x4F20;&#x901F;&#x5EA6;&#x4F4E;&#x7684;&#x8BDD;&#xFF0C;&#x4F60;&#x7684;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4E5F;&#x4E0D;&#x4F1A;&#x7279;&#x522B;&#x5FEB;</em></p><p><br></p><p>&#x8FD9;&#x91CC;&#x53C8;&#x8981;&#x591A;&#x5634;&#x4E00;&#x53E5;</p><ul><li>&#x8FC5;&#x96F7;&#x9760;&#x7740;&#x81EA;&#x8EAB;&#x5728;&#x56FD;&#x5185;&#x591A;&#x5E74;&#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x91CC;&#x56E4;&#x79EF;&#x4E86;&#x5927;&#x91CF;&#x8D44;&#x6E90;&#xFF0C;&#x6240;&#x4EE5;&#x5F88;&#x591A;&#x5176;&#x4ED6;BT&#x4E0B;&#x8F7D;&#x5668;&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x53EF;&#x80FD;&#x53EA;&#x6709;&#x8FC5;&#x96F7;&#x4E0B;&#x8F7D;&#x7684;&#x52A8;&#xFF08;&#x56E0;&#x4E3A;&#x5B83;&#x539F;&#x6765;&#x4ECE;&#x522B;&#x4EBA;&#x90A3;&#x91CC;&#x4E0B;&#x8F7D;&#x4E86;&#x540E;&#x5B58;&#x5728;&#x4E86;&#x5B83;&#x7684;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#xFF09;</li><li>&#x540C;&#x7406;&#xFF0C;&#x5F88;&#x591A;&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x53EA;&#x6709;115&#x624D;&#x80FD;&#x80FD;&#x79BB;&#x7EBF;&#x4E0B;&#x8F7D;&#xFF0C;&#x4E5F;&#x662F;&#x56E0;&#x4E3A;&#x5F53;&#x5E74;&#x7684;115&#x5C31;&#x5B58;&#x50A8;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x8D44;&#x6E90;&#x5728;&#x5B83;&#x670D;&#x52A1;&#x5668;&#x4E0A;</li><li>&#x8FD9;&#x91CC;&#x987A;&#x4FBF;&#x53EF;&#x4EE5;&#x8BF4;&#x4E00;&#x4E0B;&#xFF0C;&#x6240;&#x8C13;&#x7684;&#x767E;&#x5EA6;&#x4E91;&#x79D2;&#x79BB;&#x7EBF;&#x529F;&#x80FD;&#xFF0C;&#x4E0D;&#x8FC7;&#x662F;&#x5728;&#x4F60;&#x79BB;&#x7EBF;&#x4E0B;&#x8F7D;&#x4E4B;&#x524D;&#xFF0C;&#x5DF2;&#x7ECF;&#x6709;&#x4EBA;&#x628A;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x79BB;&#x7EBF;&#x4E0B;&#x8F7D;&#x5230;&#x767E;&#x5EA6;&#x4E91;&#x670D;&#x52A1;&#x5668;&#x4E2D;&#x4E86;</li><li>&#x6700;&#x540E;&#xFF0C;&#x963F;&#x865A;&#x4E4B;&#x524D;&#x5199;&#x8FC7;&#x7684;&#x4E00;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x53EF;&#x80FD;&#x5BF9;&#x4F60;&#x6709;&#x5E2E;&#x52A9;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/Sobuvc8J56dryQ5jeLfyMw" rel="nofollow noreferrer">&#x6559;&#x4F60;&#x4E0B;&#x8F7D;&#x88AB;&#x8FC5;&#x96F7;&amp;&#x767E;&#x5EA6;&#x4E91;&#x5C4F;&#x853D;&#x7684;&#x8D44;&#x6E90;</a></li></ul><p><br></p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-8184f3115bcdb1fec49744c75711cdea_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x4E0B;&#x9762;&#x63A5;&#x7740;&#x8BB2;</p><p>BT&#x4E0B;&#x8F7D;&#x5E26;&#x6765;&#x7684;&#x597D;&#x5904;</p><ol><li>&#x5FEB;&#x3002;&#x51CF;&#x5C11;&#x4E86;&#x7F51;&#x8DEF;&#x4F20;&#x8F93;&#x8282;&#x70B9;&#x3002;</li><li>&#x51CF;&#x8F7B;&#x670D;&#x52A1;&#x5668;&#x538B;&#x529B;&#x3002;&#x5982;&#x679C;&#x67D0;&#x516C;&#x53F8;&#x6709;&#x65B0;&#x7248;&#x672C;&#x8F6F;&#x4EF6;&#x63A8;&#x51FA;&#xFF08;&#x5982;LOL&#x6E38;&#x620F;&#x66F4;&#x65B0;&#x65F6;&#xFF09;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x5FC5;&#x5B9A;&#x4F1A;&#x4EBA;&#x5C71;&#x4EBA;&#x6D77;&#xFF0C;&#x800C;&#x4F7F;&#x7528;BT&#x80FD;&#x5927;&#x5927;&#x51CF;&#x8F7B;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8D1F;&#x62C5;&#xFF0C;&#x8282;&#x7EA6;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8D2D;&#x7F6E;&#x6210;&#x672C;&#x3002;</li><li>&#x4FDD;&#x62A4;&#x9690;&#x79C1;&#x3002;&#x4E0E;&#x6709;http&#x90A3;&#x79CD;&#x4E2D;&#x592E;&#x670D;&#x52A1;&#x5668;&#x7684;&#x7F51;&#x7EDC;&#x7CFB;&#x7EDF;&#x4E0D;&#x540C;&#xFF0C;BT&#x4E0B;&#x8F7D;&#x8282;&#x70B9;&#x80FD;&#x904D;&#x5E03;&#x6574;&#x4E2A;&#x4E92;&#x8054;&#x7F51;&#xFF08;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x662F;&#x5206;&#x4EAB;&#x8005;&#x4E0E;&#x4E0B;&#x8F7D;&#x8005;&#xFF09;&#xFF0C;&#x7ED9;&#x5305;&#x62EC;&#x5F00;&#x53D1;&#x8005;&#x5728;&#x5185;&#x7684;&#x4EFB;&#x4F55;&#x4EBA;&#x3001;&#x7EC4;&#x7EC7;&#x3001;&#x6216;&#x653F;&#x5E9C;&#x5E26;&#x6765;<em>&#x76D1;&#x63A7;&#x96BE;&#x9898;</em>&#x3002;</li></ol><p><br></p><p>&#x574F;&#x5904;&#x5F53;&#x7136;&#x4E5F;&#x6709;&#xFF0C;&#x4ECE;&#x4E0A;&#x9762;&#x7B2C;3&#x70B9;&#x4E0D;&#x96BE;&#x5F97;&#x51FA;&#xFF0C;BT&#x4E0B;&#x8F7D;&#x5F88;&#x5BB9;&#x6613;&#x5BFC;&#x81F4;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;<strong><em>&#x76D7;&#x7248;&#x6CDB;&#x6EE5;</em></strong></p><p><br></p><p>&#x4ECE;&#x524D;&#x6709;&#x4E2A;&#x53EB;&#x6D77;&#x76D7;&#x6E7E;&#x7684;&#x7F51;&#x7AD9;&#xFF08;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x7531;&#x745E;&#x5178;&#x7684;&#x6C11;&#x95F4;&#x53CD;&#x7248;&#x6743;&#x7EC4;&#x7EC7;&#x6D77;&#x76D7;&#x7F72;&#x6210;&#x7ACB;&#x4E8E;2003&#x5E74;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x53F7;&#x79F0;&#x62E5;&#x6709;&#x4E16;&#x754C;&#x6700;&#x5927;&#x7684;BT&#x79CD;&#x5B50;&#x670D;&#x52A1;&#x5668;&#xFF09;&#xFF0C;&#x6D41;&#x51FA;&#x4E86;<em>&#x4E92;&#x8054;&#x7F51;&#x767E;&#x5206;&#x4E4B;&#x516B;&#x5341;&#x7684;&#x76D7;&#x7248;&#x8D44;&#x6E90;</em>&#xFF0C;&#x582A;&#x79F0;&#x76D7;&#x7248;&#x59CB;&#x7956;&#xFF0C;&#x4E07;&#x6076;&#x4E4B;&#x6E90;&#xFF01;</p><p><br></p><p>&#x5173;&#x4E8E;&#x6D77;&#x76D7;&#x6E7E;&#x7684;&#x53F2;&#x8BDD;&#xFF0C;&#x6709;&#x5174;&#x8DA3;&#x53EF;&#x4EE5;&#x524D;&#x5F80;&#x8FD9;&#x91CC;&#x4E86;&#x89E3;&#xFF1A;<a href="https://www.zhihu.com/question/20060329/answer/815485162">https://www.zhihu.com/question/20060329/answer/815485162</a></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-939739da1cb04ab76473e3793973c02b_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x8FD9;&#x6BB5;&#x4F20;&#x5947;&#x7ECF;&#x5386;&#x751A;&#x81F3;&#x8FD8;&#x88AB;&#x62CD;&#x6210;&#x4E86;&#x7EAA;&#x5F55;&#x7247;&#xFF1A;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-a9436cebb6ce4d6a2683ecf6cd16734d_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><p>&#x968F;&#x7740;BT&#x4E0B;&#x8F7D;&#x5728;&#x5168;&#x4E16;&#x754C;&#x7684;&#x98CE;&#x9761;&#xFF0C;&#x4E5F;&#x8BDE;&#x751F;&#x4E86;&#x6D77;&#x76D7;&#x6E7E;&#x8FD9;&#x6837;&#x7684;&#x5DE8;&#x5934;&#xFF0C;&#x8FD9;&#x5F15;&#x8D77;&#x4E86;&#x7248;&#x6743;&#x62E5;&#x6709;&#x65B9;&#x4EEC;&#x7684;&#x5F3A;&#x70C8;&#x4E0D;&#x6EE1;&#xFF1A;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-ad095a84b2ee0b54245afa7e67a9d2f3_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x4E0A;&#x9762;&#x8BF4;&#x8FC7;&#x4E86;&#xFF0C;&#x60F3;&#x52A0;&#x5165;BT&#x4E0B;&#x8F7D;&#x7684;&#x65E0;&#x4E2D;&#x5FC3;&#x7F51;&#x7EDC;&#xFF0C;<strong>&#x9996;&#x5148;&#x9700;&#x8981;&#x627E;Tracker&#x670D;&#x52A1;&#x5668;&#x95EE;&#x8DEF;</strong></p><p>&#x4E8E;&#x662F;Tracker&#x670D;&#x52A1;&#x5668;&#x6210;&#x4E3A;&#x4E86;&#x7248;&#x6743;&#x7EC4;&#x7EC7;&#x6253;&#x51FB;&#x7684;&#x91CD;&#x70B9;&#xFF0C;&#x4ED6;&#x4EEC;&#x7684;&#x60F3;&#x6CD5;&#x5F88;&#x660E;&#x786E;&#xFF0C;&#x53EA;&#x8981;&#x9664;&#x6389;&#x4E86;Tracker&#xFF0C;BT&#x4E0B;&#x8F7D;&#x5C31;&#x5B8C;&#x4E86;&#x3002;</p><p>&#x4E8E;&#x662F;&#x4ECE;2009&#x5E74;&#x5F00;&#x59CB;&#xFF0C;&#x5F88;&#x591A;BT&#x670D;&#x52A1;&#x5668;&#x88AB;&#x8FEB;&#x5173;&#x95ED;&#xFF0C;&#x4E0D;&#x4EC5;&#x4EC5;&#x662F;&#x5F88;&#x591A;&#x79CD;&#x5B50;&#x6587;&#x4EF6;&#x4ECE;&#x6B64;&#x9500;&#x58F0;&#x533F;&#x8FF9;&#xFF0C;&#x5C31;&#x8FDE;BT Tracker&#x670D;&#x52A1;&#x5668;&#x4E5F;&#x505C;&#x6B62;&#x89E3;&#x6790;&#x5DE5;&#x4F5C;&#xFF0C;&#x8FD9;&#x65F6;&#x5168;&#x4E16;&#x754C;&#x7684;BT&#x4E0B;&#x8F7D;&#x8FDB;&#x5165;&#x4E86;&#x4E00;&#x4E2A;&#x51B0;&#x6CB3;&#x65F6;&#x4EE3;&#x3002;</p><p>&#x7136;&#x800C;&#x9B54;&#x9AD8;&#x4E00;&#x5C3A;&#x9053;&#x9AD8;&#x4E00;&#x4E08;&#xFF0C;&#x9700;&#x6C42;&#x5E26;&#x52A8;&#x53D1;&#x5C55;&#xFF0C;&#x8FD9;&#x53CD;&#x800C;&#x4FC3;&#x4F7F;&#x4E86;BT&#x6280;&#x672F;&#x7684;&#x4E00;&#x6B21;&#x5927;&#x5347;&#x7EA7;&#xFF0C;&#x8FD9;&#x5E26;&#x6765;&#x4E86;&#x78C1;&#x529B;&#x94FE;&#x63A5;</p><p><br></p><h3 id="4%E7%A3%81%E5%8A%9B%E9%93%BE%E6%8E%A5">4.&#x78C1;&#x529B;&#x94FE;&#x63A5;</h3><p>&#x78C1;&#x529B;&#x94FE;&#x63A5;&#x57FA;&#x4E8E;&#x7684;&#x662F;<strong><em>DHT&#x7F51;&#x7EDC;&#x6280;&#x672F;</em></strong>&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5728;&#x65E0;&#x56FA;&#x5B9A;Tracker&#x670D;&#x52A1;&#x5668;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4E0B;&#x8F7D;&#xFF0C;&#x5B9E;&#x9645;&#x8FC7;&#x7A0B;&#x662F;&#x628A;&#x6240;&#x6709;&#x4E0B;&#x8F7D;&#x8005;&#x90FD;&#x53D8;&#x6210;&#x4E00;&#x4E2A;&#x5C0F;&#x578B;Tracker&#x670D;&#x52A1;</p><p><br></p><p>DHT&#x7F51;&#x7EDC;&#x7684;&#x5177;&#x4F53;&#x539F;&#x7406;&#x5C31;&#x76F8;&#x5F53;&#x4E8E;&#x5341;&#x5206;&#x590D;&#x6742;&#x4E86;&#xFF0C;&#x963F;&#x865A;&#x7528;&#x767D;&#x8BDD;&#x6765;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#xFF1A;</p><ul><li>&#x5F53;&#x4F60;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x78C1;&#x529B;&#x94FE;&#x63A5;&#x5E76;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x6BD4;&#x5982;&#x8FC5;&#x96F7;&#xFF0C;&#x8FC5;&#x96F7;&#x5C31;&#x4F1A;&#x5B9E;&#x4F8B;&#x5316;&#x51FA;&#x4E00;&#x4E2A;DHT&#x8282;&#x70B9;&#xFF0C;&#x52A0;&#x5165;DHT&#x7F51;&#x7EDC;</li><li>&#x628A;DHT&#x7F51;&#x7EDC;&#x6BD4;&#x4F5C;&#x4E00;&#x4E2A;&#x670B;&#x53CB;&#x5708;&#x5B50;&#xFF0C;&#x5F53;&#x4F60;&#x88AB;A&#x5E26;&#x8FDB;&#x8FD9;&#x4E2A;&#x670B;&#x53CB;&#x5708;&#xFF0C;&#x6B64;&#x523B;&#x4F60;&#x5C31;&#x53EA;&#x8BA4;&#x8BC6;A&#x800C;&#x5DF2;</li><li>&#x4F46;&#x662F;&#x4F60;&#x7684;&#x76EE;&#x7684;&#x662F;&#x60F3;&#x627E;&#x5510;&#x7EB3;&#x5FB7;&#xB7;&#x7279;&#x6717;&#x666E;&#xFF08;&#x5DDD;&#x666E;&#xFF09;&#x603B;&#x7EDF;&#xFF0C;&#x6240;&#x4EE5;&#x4F60;&#x5C31;&#x95EE;A&#x8981;&#x5DDD;&#x666E;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x662F;A&#x4E5F;&#x6CA1;&#x6709;&#x5DDD;&#x666E;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF0C; &#x4ED6;&#x4ECB;&#x7ECD;&#x4E86;&#x4E00;&#x4E2A;&#x7F8E;&#x56FD;&#x670B;&#x53CB;B&#x7ED9;&#x4F60;&#x8BA4;&#x8BC6;</li><li>&#x4E8E;&#x662F;&#x4F60;&#x53BB;&#x95EE;B&#x8981;&#x5DDD;&#x666E;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF0C;B&#x5176;&#x5B9E;&#x4E5F;&#x6CA1;&#x6709;&#x5DDD;&#x666E;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x662F;B&#x8BA4;&#x8BC6;&#x4E00;&#x4E2A;&#x7F8E;&#x56FD;&#x5DDE;&#x957F;C</li><li>&#x4E8E;&#x662F;&#x4F60;&#x53C8;&#x5F97;&#x5230;&#x4E86;C&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#xFF0C;C&#x628A;&#x5DDD;&#x666E;&#x7684;&#x8054;&#x7CFB;&#x65B9;&#x5F0F;&#x544A;&#x8BC9;&#x4F60;&#x4E4B;&#x540E;&#xFF0C;&#x4F60;&#x5C31;&#x53EF;&#x4EE5;&#x5199;&#x4FE1;&#x6216;&#x8005;&#x81F4;&#x7535;&#x7ED9;&#x5DDD;&#x666E;&#x4E86;</li></ul><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-136cdbf29baf49ca1c0bca4a2df8b319_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><blockquote><em>&#x8FD9;&#x91CC;&#x76F8;&#x5173;&#x7684;&#x6709;&#x4E2A;&#x6709;&#x8DA3;&#x7684;&#x7406;&#x8BBA;&#x300C;&#x516D;&#x5EA6;&#x5206;&#x9694;&#x7406;&#x8BBA;&#x300D;&#xFF08;&#x4E5F;&#x53EB;&#x516D;&#x5EA6;&#x7A7A;&#x95F4;&#x7406;&#x8BBA;&#xFF09;&#xFF1A;&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;&#x5C31;&#x662F;&#x6700;&#x591A;&#x901A;&#x8FC7;6&#x4E2A;&#x4E2D;&#x95F4;&#x4EBA;&#x4F60;&#x5C31;&#x80FD;&#x591F;&#x8BA4;&#x8BC6;&#x4E16;&#x754C;&#x4E0A;&#x4EFB;&#x4F55;&#x4E00;&#x4E2A;&#x964C;&#x751F;&#x4EBA;&#x3002;</em></blockquote><p><br></p><p>&#x4F46;&#x8BF7;&#x6CE8;&#x610F;&#xFF1A;</p><p>&#x7528;&#x79CD;&#x5B50;&#x4E0B;&#x8F7D;&#x548C;&#x78C1;&#x529B;&#x4E0B;&#x8F7D;&#xFF0C;&#x5728;&#x672C;&#x8D28;&#x7684;&#x4E0B;&#x8F7D;&#x65B9;&#x5F0F;&#x4E0A;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF1A;<em><strong>&#x90FD;&#x662F;P2P&#x4E0B;&#x8F7D;</strong></em></p><p>&#x4ED6;&#x4EEC;&#x7684;&#x533A;&#x522B;&#xFF1A;<em><strong>&#x4EC5;&#x4EC5;&#x662F;&#x5BFB;&#x627E;&#x5176;&#x4ED6;&#x4E0B;&#x8F7D;&#x8005;&#x7684;&#x65B9;&#x5F0F;&#x4E0D;&#x540C;</strong></em></p><p><br></p><h2 id="%EF%BC%88%E5%9B%9B%EF%BC%89ed2k%E9%93%BE%E6%8E%A5">&#xFF08;&#x56DB;&#xFF09;eD2k&#x94FE;&#x63A5;</h2><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-0d164fbecf6bc60040008e1affb49adf_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>eD2k&#x94FE;&#x63A5;&#x5BF9;&#x5E94;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x5982;eMule&#x7535;&#x9AA1;&#x662F;<strong>&#x5171;&#x4EAB;&#x8F6F;&#x4EF6;</strong>&#xFF0C;&#x800C;Magnet&#x78C1;&#x94FE;&#x5BF9;&#x5E94;&#x7684;BT&#x8F6F;&#x4EF6;&#x5219;&#x662F;<strong>&#x4E0B;&#x8F7D;&#x8F6F;&#x4EF6;</strong>&#x3002;&#x8FD9;&#x8BA9;&#x5B83;&#x4EEC;&#x5728;&#x4F7F;&#x7528;&#x4E0A;&#xFF0C;&#x6709;&#x7740;&#x5F88;&#x591A;&#x6839;&#x672C;&#x6027;&#x7684;&#x533A;&#x522B;&#xFF1A;</p><ul><li>BT&#x4F7F;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x53EA;&#x8981;&#x4F60;&#x4E0D;&#x4E0B;&#x8F7D;&#x4E1C;&#x897F;&#x4F60;&#x5C31;&#x4E0D;&#x4F1A;&#x4E0A;&#x4F20;</li><li>eMule&#x7535;&#x9AA1;&#x4E0D;&#x540C;&#xFF0C;&#x6BD4;&#x5982;&#xFF0C;&#x5F00;&#x542F;eMule&#x7535;&#x9AA1;&#x540E;&#xFF0C;&#x7B2C;&#x4E00;&#x4EF6;&#x4E8B;&#x505A;&#x7684;&#x5E76;&#x4E0D;&#x662F;&#x4EC0;&#x4E48;&#x4E0B;&#x8F7D;&#xFF0C;&#x800C;&#x662F;&#x8BBE;&#x7F6E;&#x5171;&#x4EAB;&#x76EE;&#x5F55;&#xFF0C;&#x8BE5;&#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6587;&#x4EF6;&#xFF0C;&#x90FD;&#x4F1A;&#x5B9E;&#x65F6;&#x5171;&#x4EAB;&#x5230;eD2k&#x7F51;&#x7EDC;&#x548C;KAD&#x7F51;&#x7EDC;&#x4E2D;&#x3002;</li><li>&#x76EE;&#x5F55;&#x4E2D;&#x5171;&#x4EAB;&#x4E86;&#x7684;&#x6587;&#x4EF6;&#x90FD;&#x4F1A;&#x751F;&#x6210;eD2k&#x94FE;&#x63A5;&#xFF0C;&#x6240;&#x6709;&#x4EBA;&#x901A;&#x8FC7;&#x76F8;&#x5E94;&#x7684;eD2k&#x94FE;&#x63A5;&#xFF0C;&#x90FD;&#x80FD;&#x591F;&#x62FF;&#x5230;&#x4F60;&#x5171;&#x4EAB;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x4E00;&#x65E6;&#x6709;&#x4EBA;&#x4E0B;&#x8F7D;&#x76F8;&#x5E94;&#x6587;&#x4EF6;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x7684;eMule&#x5BA2;&#x6237;&#x7AEF;&#x5C31;&#x4F1A;&#x4E0A;&#x4F20;&#x6570;&#x636E;&#xFF0C;<em>&#x6362;&#x8A00;&#x4E4B;&#xFF0C;&#x4F60;&#x60F3;&#x4E0B;&#x8F7D;&#x522B;&#x4EBA;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x522B;&#x4EBA;&#x5F00;&#x7740;eMule&#x5BA2;&#x6237;&#x7AEF;</em></li><li>&#x6211;&#x4EEC;&#x5E73;&#x65F6;&#x4F7F;&#x7528;eD2k&#x94FE;&#x63A5;&#x4E0B;&#x8F7D;&#xFF0C;&#x8D44;&#x6E90;&#x4E5F;&#x662F;&#x6765;&#x81EA;&#x4ED6;&#x4EBA;eMule&#x6240;&#x5171;&#x4EAB;&#x7684;&#x6587;&#x4EF6;&#x7684;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x5171;&#x4EAB;&#x76EE;&#x5F55;&#x4E2D;&#x4E5F;&#x53EF;&#x4EE5;&#x5565;&#x90FD;&#x4E0D;&#x653E;&#xFF0C;&#x4F46;&#x5F88;&#x591A;eMule&#x5BA2;&#x6237;&#x7AEF;&#x90FD;&#x62E5;&#x6709;&#x961F;&#x5217;&#x4F18;&#x5148;&#x7EA7;&#x673A;&#x5236;&#xFF0C;&#x4E0A;&#x4F20;&#x5F97;&#x5C11;&#xFF0C;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4E5F;&#x4F1A;&#x88AB;&#x9650;&#x5236;&#x3002;</li></ul><p><br></p><p>&#x7535;&#x9A74;&#x53EF;&#x4EE5;&#x8BF4;&#x662F;&#x8FDB;&#x5316;&#x7248;&#x7684;BT&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x9700;&#x8981;&#x4E0B;&#x8F7D;&#x4EC0;&#x4E48;&#x79CD;&#x5B50;&#x6587;&#x4EF6;&#x4E86;&#xFF0C;&#x76F4;&#x63A5;&#x5728;&#x201C;&#x7535;&#x9A74;&#x201D;&#x8F6F;&#x4EF6;&#x4E0A;&#x8F93;&#x5165;eD2k&#x5F00;&#x5934;&#x7684;&#x4E00;&#x957F;&#x4E32;&#x4EE3;&#x7801;&#x4E00;&#x6837;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x5C31;&#x80FD;&#x4E0B;&#x8F7D;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-2e3e12fd36e9801f42a8420ee5752d43_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x4F8B;&#x5982;&#x6211;&#x5728;&#x7535;&#x5F71;&#x6E2F;&#x627E;&#x5230;&#x7684;&#x300A;&#x7EC0;&#x9752;&#x4E4B;&#x62F3;&#x300B;&#x7684;&#x7535;&#x9A74;eD2k&#x94FE;&#x63A5;&#xFF1A;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-c7836edf0ec96e39fff9806b70451b1a_720w.png" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x7535;&#x9A74;&#x4EE5;&#x53CA;&#x540E;&#x6765;&#x7684;&#x7535;&#x9AA1;&#x3001;VERYCD&#x7535;&#x9A74;&#x8FD8;&#x6709;&#x5404;&#x79CD;&#x7C7B;&#x4F3C;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x91C7;&#x7528;&#x7684;eD2k&#x7F51;&#x7EDC;&#x4ECD;&#x662F;&#x57FA;&#x4E8E;&#x670D;&#x52A1;&#x5668;&#x7684;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x8FDE;&#x63A5;&#x5230;&#x670D;&#x52A1;&#x5668;&#x5E76;&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x7D22;&#x5F15; / &#x67E5;&#x627E;&#x7528;&#x6237;&#x6216;&#x8005;&#x6587;&#x4EF6;</p><p>&#x91CD;&#x8981;&#x7684;&#x662F;&#x7535;&#x9A74;&#x63D0;&#x4F9B;&#x7684;&#x5176;&#x4E2D;&#x4E00;&#x79CD;&#x6A21;&#x5F0F;&#x2014;&#x2014;KAD&#x7F51;&#x7EDC;&#xFF08;&#x7C7B;&#x4F3C;&#x78C1;&#x529B;&#x4E0B;&#x8F7D;&#x4E2D;&#x7684;DHT&#x7F51;&#x7EDC;&#xFF09;&#xFF0C;&#x80FD;&#x591F;&#x8131;&#x79BB;&#x4E2D;&#x592E;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x76F4;&#x63A5;&#x5B9E;&#x73B0;&#x7F51;&#x7EDC;&#x6765;&#x7528;&#x6237;&#x4E4B;&#x95F4;&#x7684;&#x70B9;&#x5BF9;&#x70B9;&#x4F20;&#x8F93;</p><p>&#x5386;&#x53F2;&#x8BC1;&#x660E;&#xFF0C;&#x8FD9;&#x4E2A;&#x8131;&#x79BB;&#x4E2D;&#x592E;&#x670D;&#x52A1;&#x5668;&#x7684;&#x9769;&#x65B0;&#xFF0C;&#x771F;&#x7684;&#x5341;&#x5206;&#x5341;&#x5206;&#x7684;&#x91CD;&#x8981;&#x2014;&#x2014;&#x8FD9;&#x662F;&#x7535;&#x9A74;&#x8F6F;&#x4EF6;&#x5728;&#x9762;&#x5BF9;&#x76D7;&#x7248;&#x95EE;&#x9898;&#x65F6;&#xFF0C;&#x80FD;&#x591F;&#x751F;&#x5B58;&#x4E0B;&#x6765;&#x7684;&#x4E3B;&#x8981;&#x539F;&#x56E0;&#xFF0C;&#x56E0;&#x4E3A;&#x4ED6;&#x4EEC;&#x53EF;&#x4EE5;&#x8BF4;&#xFF0C;&#x90A3;&#x662F;&#x7528;&#x6237;&#x4E4B;&#x95F4;&#x7684;&#x81EA;&#x53D1;&#x4F20;&#x8F93;&#x884C;&#x4E3A;&#xFF0C;&#x6CA1;&#x6709;&#x7ECF;&#x8FC7;&#x670D;&#x52A1;&#x5668;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic4.zhimg.com/80/v2-6a800d38e4eb3ea5b6f6095ecca2d063_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x4F46;&#x662F;&#xFF0C;&#x5C3D;&#x7BA1;&#x7535;&#x9A74;&#x505A;&#x4E86;&#x5982;&#x6B64;&#x591A;&#x7684;&#x9769;&#x65B0;&#xFF0C;&#x4F46;&#x8FD8;&#x662F;&#x9003;&#x4E0D;&#x8FC7;&#x88AB;&#x65F6;&#x4EE3;&#x6DD8;&#x6C70;&#x7684;&#x547D;&#x8FD0;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x5BF9;&#x4E8E;&#x5927;&#x90E8;&#x5206;&#x4EBA;&#x6765;&#x8BF4;&#x914D;&#x7F6E;&#x8D77;&#x6765;&#x5341;&#x5206;&#x590D;&#x6742;&#xFF0C;&#x613F;&#x610F;&#x4E00;&#x76F4;&#x5F00;&#x7740;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4F20;&#x8D44;&#x6E90;&#x7684;&#x4EBA;&#x8D8A;&#x6765;&#x8D8A;&#x5C11;&#xFF0C;&#x66F4;&#x591A;&#x4EBA;&#x53EA;&#x60F3;&#x5355;&#x7EAF;&#x7684;&#x7D22;&#x53D6;&#xFF08;&#x7C7B;&#x4F3C;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x7684;&#x8FC5;&#x96F7;&#x5438;&#x8840;&#x884C;&#x4E3A;&#xFF09;&#xFF0C;&#x5982;&#x4ECA;&#x4F7F;&#x7528;eD2k&#x5206;&#x4EAB;&#x8D44;&#x6E90;&#x7684;&#x4EBA;&#x5B9E;&#x5728;&#x7B97;&#x5C11;&#x6570;&#xFF0C;&#x8FDC;&#x4E0D;&#x5982;&#x78C1;&#x529B;&#x4E0B;&#x8F7D;&#x3002;</p><p><br></p><h2 id="%EF%BC%88%E4%BA%94%EF%BC%89%E5%85%B6%E4%BB%96">&#xFF08;&#x4E94;&#xFF09;&#x5176;&#x4ED6;</h2><p>&#x8FC5;&#x96F7;&#x94FE;&#x63A5;&#xFF0C;&#x5305;&#x62EC;&#x66FE;&#x7ECF;&#x7684;&#x5FEB;&#x8F66;&#x94FE;&#x63A5;&#x3001;&#x65CB;&#x98CE;&#x94FE;&#x63A5;&#x90FD;&#x4E0D;&#x662F;&#x534F;&#x8BAE;&#xFF0C;&#x53EA;&#x662F;&#x5355;&#x7EAF;&#x5BF9;&#x5B57;&#x7B26;&#x4E32;&#x505A;&#x4E00;&#x4E9B;&#x7F16;&#x7801;&#x64CD;&#x4F5C;&#xFF0C;&#x597D;&#x8BA9;&#x522B;&#x7684;&#x4E0B;&#x8F7D;&#x8F6F;&#x4EF6;&#x8BC6;&#x522B;&#x4E0D;&#x4E86;&#xFF0C;&#x800C;&#x81EA;&#x5BB6;&#x7684;&#x8F6F;&#x4EF6;&#x56E0;&#x4E3A;&#x77E5;&#x9053;&#x89E3;&#x7801;&#x89C4;&#x5219;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x3002;</p><p>&#x4F46;&#x662F;&#x7F51;&#x4E0A;&#x6709;&#x53EF;&#x4EE5;&#x89E3;&#x7801;&#x7684;&#x5DE5;&#x5177;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//tool.lu/urlconvert/" rel="nofollow noreferrer">https://tool.lu/urlconvert/</a></p><p><br></p><p>&#x4F8B;&#x5982;&#xFF1A;&#x628A;FTP&#x534F;&#x8BAE;&#x4E0B;&#x8F7D;&#x5730;&#x5740;&#x8F6C;&#x6210;&#x8FD9;&#x4E09;&#x4E2A;&#x8F6F;&#x4EF6;&#x5404;&#x81EA;&#x652F;&#x6301;&#x7684;&#x4E13;&#x6709;&#x94FE;&#x63A5;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://pic2.zhimg.com/80/v2-77ba9e5643faf1b8907f444441c13d69_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p><br></p><h2 id="%E4%BA%8C%E3%80%81%E6%80%BB%E7%BB%93%E4%B8%80%E4%B8%8B">&#x4E8C;&#x3001;&#x603B;&#x7ED3;&#x4E00;&#x4E0B;</h2><p>BT / &#x78C1;&#x529B; / eD2k&#x90FD;&#x662F;P2P&#x6280;&#x672F;&#xFF0C;&#x90FD;&#x662F;&#x540C;&#x65F6;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#x8D8A;&#x591A;&#xFF0C;&#x4F60;&#x7684;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x4E5F;&#x4F1A;&#x8D8A;&#x5FEB;&#xFF0C;&#x9047;&#x5230;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x4E0B;&#x4E0D;&#x52A8;&#x7684;&#x539F;&#x56E0;&#xFF1A;</p><ol><li>&#x4E00;&#x4E9B;&#x51B7;&#x95E8;&#xFF08;&#x8FDD;&#x89C4;&#xFF09;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x80FD;&#x7528;&#x767E;&#x5EA6;&#x4E91; / 115&#x79BB;&#x7EBF;&#x4E0B;&#x8F7D;&#x5C31;&#x4E0D;&#x8981;&#x7528;BT&#xFF0C;&#x7528;BT&#x4E0B;&#x8F7D;&#x9996;&#x5148;&#x5C1D;&#x8BD5;&#x8FC5;&#x96F7;&#x4E0B;&#x8F7D;&#xFF0C;&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x8868;&#x793A;&#x8FC5;&#x96F7;&#x670D;&#x52A1;&#x5668;&#x91CC;&#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;</li><li>&#x6362;&#x7528;&#x5176;&#x4ED6;&#x4E0B;&#x8F7D;&#x5668;&#x8FD8;&#x662F;&#x4E0B;&#x4E0D;&#x52A8;&#xFF0C;&#x8868;&#x793A;&#x8FD9;&#x591A;&#x534A;&#x5C31;&#x662F;&#x4E2A;&#x51B7;&#x95E8;&#x8D44;&#x6E90;&#xFF0C;<em>&#x51E0;&#x4E4E;&#x6CA1;&#x4EBA;&#x5728;&#x4E0B;&#x8F7D; = &#x51E0;&#x4E4E;&#x6CA1;&#x4EBA;&#x4F20;&#x4E0A;&#x4F20;&#x8D44;&#x6E90;&#x7ED9;&#x4F60;</em>&#xFF0C;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x662F;&#x4E0D;&#x8981;&#x540A;&#x6B7B;&#x5728;&#x4E00;&#x9897;&#x79CD;&#x5B50;&#x4E0A;&#xFF0C;&#x589E;&#x5F3A;&#x81EA;&#x5DF1;&#x83B7;&#x53D6;&#x4F18;&#x8D28;&#x79CD;&#x5B50;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x5373;&#x591A;&#x6362;&#x79CD;&#x5B50;&#xFF0C;&#x627E;&#x5230;&#x70ED;&#x95E8;&#x79CD;&#x5B50;</li><li>&#x4E0B;&#x8F7D;&#x5230;&#x4E00;&#x534A;&#x5C31;&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x4E86;&#xFF1A;&#x8868;&#x793A;&#x8FD9;&#x4E2A;&#x51B7;&#x95E8;&#x8D44;&#x6E90;&#xFF0C;&#x5176;&#x4ED6;&#x548C;&#x4F60;&#x4E00;&#x8D77;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#x79BB;&#x7EBF;&#x4E86;&#xFF08;&#x6216;&#x8005;&#x4E0B;&#x8F7D;&#x5B8C;&#x540E;&#x5C31;&#x5173;&#x673A;&#x4E86;&#xFF09;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x6362;&#x65F6;&#x95F4;&#x6BB5;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;&#xFF08;&#x67D0;&#x4E9B;&#x8D44;&#x6E90;&#x665A;&#x4E0A;&#x4E0B;&#x8F7D;&#x4F1A;&#x66F4;&#x591A;&#xFF09;</li><li>&#x5982;&#x679C;&#x56E0;&#x4E3A;&#x79CD;&#x5B50;&#x4E2D;&#x63D0;&#x4F9B;&#x7684; Tracker &#x670D;&#x52A1;&#x5668;&#x592A;&#x5C11;&#xFF08;&#x6216;&#x8005;&#x8BF4;&#x88AB;&#x5C01;&#x4E86;&#xFF09;&#xFF0C;&#x5BFC;&#x81F4;&#x4F60;&#x627E;&#x4E0D;&#x5230;&#x5176;&#x4ED6;&#x6B63;&#x5728;&#x4E0B;&#x8F7D;&#x7684;&#x4EBA;&#xFF0C;&#x6DFB;&#x52A0;&#x66F4;&#x591A;&#x7684;Tracker&#x670D;&#x52A1;&#x5668;&#x5219;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x5E2E;&#x52A9;&#xFF0C;&#x5173;&#x4E8E;&#x5982;&#x4F55;&#x5728;BT&#x4E0B;&#x8F7D;&#x5668;&#x4E2D;&#x6DFB;&#x52A0; Tracker &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x963F;&#x865A;&#x66FE;&#x7ECF;&#x63D0;&#x4F9B;&#x7684;&#x8F6F;&#x4EF6;&#x538B;&#x7F29;&#x5305;&#x91CC;&#x5C31;&#x6709;&#x8BE6;&#x7EC6;&#x7684;&#x6559;&#x7A0B;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x591A;&#x505A;&#x8BF4;&#x660E;&#xFF1A;<a href="https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/NtT1ugq5p4CIvzkdWlPHSQ" rel="nofollow noreferrer">&#x53EF;&#x80FD;&#x662F;&#x6700;&#x5168;&#x7684;BT&#x79CD;&#x5B50; / &#x78C1;&#x529B; / eD2K&#x94FE;&#x63A5;&#x4E0B;&#x8F7D;&#x5DE5;&#x5177;&#x5408;&#x96C6;</a></li></ol><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic1.zhimg.com/80/v2-252cde2fdda64792debbe5704a28ffa4_720w.png" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><br></p><p>&#x6700;&#x540E;&#x8BF4;&#x4E00;&#x4E0B;&#x4E00;&#x4E2A;&#x5E38;&#x89C1;&#x7684;&#x95EE;&#x9898;&#xFF1A;&#x4E0B;&#x8F7D;&#x5230;99%&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x4E86;&#x600E;&#x4E48;&#x529E;</p><p>&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5176;&#x5B9E;&#x662F;&#x5728;&#x6700;&#x540E;&#x5B8C;&#x6210;&#x65F6;&#x7684;&#x6821;&#x9A8C;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x53D1;&#x73B0;&#x4E2A;&#x522B;&#x5757;&#x6709;&#x95EE;&#x9898;&#x9700;&#x8981;&#x91CD;&#x4E0B;&#xFF0C;&#x4E8E;&#x662F;&#x5C31;&#x5361;&#x5728;&#x8FD9;&#x91CC;&#x3002;</p><p><br></p><p>&#x5982;&#x679C;&#x662F;&#x5A92;&#x4F53;&#x683C;&#x5F0F;&#xFF0C;&#x5982;&#x89C6;&#x9891;&#xFF0C;&#x5176;&#x5B9E;&#x53EF;&#x4EE5;&#x624B;&#x52A8;&#x505C;&#x6B62;&#xFF0C;&#x7136;&#x540E;&#x6539;&#x6269;&#x5C55;&#x540D;&#xFF1A;</p><ul><li>&#x8FD9;&#x79CD;&#x672A;&#x4E0B;&#x8F7D;&#x5B8C;&#x6210;&#x7684;&#x6587;&#x4EF6;&#x4E00;&#x822C;&#x8FC5;&#x96F7;&#x662F;&#x5728;&#x300C;&#x539F;&#x89C6;&#x9891;&#x6587;&#x4EF6;&#x683C;&#x5F0F;&#x540E;&#x7F00;&#x300D;&#x540E;&#x9762;&#x52A0;&#x4E0A;&#x300C;&#x7F13;&#x5B58;&#x6587;&#x4EF6;&#x683C;&#x5F0F;&#x540E;&#x7F00;&#x300D;</li><li>&#x6BD4;&#x5982;<code>XXX.mp4.xltd</code>&#xFF0C;&#x4F60;&#x53EA;&#x9700;&#x8981;&#x591A;&#x4F59;&#x7684;&#x7F13;&#x5B58;&#x6587;&#x4EF6;&#x683C;&#x5F0F;&#x540E;&#x7F00;&#x53BB;&#x6389;&#xFF0C;&#x6539;&#x4E3A;&#xFF1A;<code>XXX.mp4</code>&#xFF0C;&#x5C31;&#x80FD;&#x64AD;&#x653E;&#x4E86;&#xFF0C;&#x800C;&#x4E14;&#x57FA;&#x672C;&#x4E0D;&#x5F71;&#x54CD;&#x6574;&#x4F53;&#x4F53;&#x9A8C;&#xFF08;&#x5982;&#x679C;&#x4F60;&#x7528;&#x8FC7;&#x8FC5;&#x96F7;&#x7684;&#x8FB9;&#x4E0B;&#x8FB9;&#x64AD;&#xFF0C;&#x5927;&#x6982;&#x5C31;&#x80FD;&#x7406;&#x89E3;&#xFF09;</li></ul><p>&#x4F46;&#x5982;&#x679C;&#x4F60;&#x4E0B;&#x8F7D;&#x7684;&#x662F;&#x7A0B;&#x5E8F;&#xFF0C;&#x538B;&#x7F29;&#x5305;&#x7B49;&#xFF0C;&#x8FD9;&#x79CD;&#x6539;&#x540E;&#x7F00;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5C31;&#x6709;&#x5F88;&#x5927;&#x98CE;&#x9669;&#xFF0C;&#x6539;&#x5B8C;&#x540E;&#x4E0D;&#x80FD;&#x8FD0;&#x884C;&#x548C;&#x89E3;&#x538B;</p><p><br></p><p>&#x8FD8;&#x6709;&#x79CD;&#x60C5;&#x51B5;&#x662F;&#x79CD;&#x5B50;&#x5185;&#x67D0;&#x4E2A;&#x6587;&#x4EF6;&#x65E0;&#x6E90;&#xFF0C;&#x6BD4;&#x5982;&#x4E00;&#x4E9B;BT&#x79CD;&#x5B50;&#x91CC;&#x9762;&#x5305;&#x542B;&#x4E86;&#x7535;&#x5F71;&#x548C;&#x5B57;&#x5E55;&#xFF1B;&#x800C;&#x5361;&#x5728;99%&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#x5C31;&#x662F;&#x56E0;&#x4E3A;&#x5B57;&#x5E55;&#x6587;&#x4EF6;&#x4E0B;&#x8F7D;&#x4E0D;&#x52A8;&#xFF0C;&#x5728;BT&#x8F6F;&#x4EF6;&#x4E2D;&#x67E5;&#x770B;&#x4E0B;&#x628A;&#x5B8C;&#x6210;0%&#x7684;&#x6587;&#x4EF6;&#x524D;&#x9762;&#x7684;&#x52FE;&#x53BB;&#x6389;&#xFF0C;&#x5C31;&#x80FD;&#x987A;&#x5229;&#x4E0B;&#x8F7D;&#x4E86;</p><p><br></p><figure class="kg-card kg-image-card"><img src="https://pic3.zhimg.com/80/v2-6c008c14781c44a4e5112b61efa42dda_720w.jpg" class="kg-image" alt="&#x6C42;&#x6C42;&#x4F60;&#xFF0C;&#x522B;&#x518D;&#x95EE;&#x4F60;&#x7684;&#x79CD;&#x5B50;&#x78C1;&#x529B;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x4E0D;&#x52A8;&#x4E86;&#xFF01;" loading="lazy"></figure><p><em>&#x7B54;&#x5E94;&#x6211;&#xFF0C;&#x4EE5;&#x540E;&#x518D;&#x6709;&#x4EBA;&#x95EE;&#x4E3A;&#x4EC0;&#x4E48;&#x4E0B;&#x8F7D;&#x4E0D;&#x61C2;&#x7684;&#x95EE;&#x9898;.</em></p>]]></content:encoded></item><item><title><![CDATA[【干货】Chrome插件(扩展)开发全攻略]]></title><description><![CDATA[我花了将近一个多月的时间断断续续写下这篇博文，并精心写下完整demo，写博客的辛苦大家懂的，所以转载务必保留出处。本文所有涉及到的大部分代码均在这个demo里面：https://github.com/sxei/chrome-plugin-demo ，大家可以直接下载下来运行。]]></description><link>http://blog.zhoushoujian.com/write/</link><guid isPermaLink="false">618fd6d9b518235c786017d0</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:45 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/app-integrations-1.png" medium="image"/><content:encoded><![CDATA[<h1 id="%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2"><strong>&#x5199;&#x5728;&#x524D;&#x9762;</strong></h1><img src="http://blog.zhoushoujian.com/content/images/2021/11/app-integrations-1.png" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;"><p>&#x6211;&#x82B1;&#x4E86;&#x5C06;&#x8FD1;&#x4E00;&#x4E2A;&#x591A;&#x6708;&#x7684;&#x65F6;&#x95F4;&#x65AD;&#x65AD;&#x7EED;&#x7EED;&#x5199;&#x4E0B;&#x8FD9;&#x7BC7;&#x535A;&#x6587;&#xFF0C;&#x5E76;&#x7CBE;&#x5FC3;&#x5199;&#x4E0B;&#x5B8C;&#x6574;demo&#xFF0C;&#x5199;&#x535A;&#x5BA2;&#x7684;&#x8F9B;&#x82E6;&#x5927;&#x5BB6;&#x61C2;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x8F6C;&#x8F7D;&#x52A1;&#x5FC5;&#x4FDD;&#x7559;<a href="http://blog.haoji.me/chrome-plugin-develop.html">&#x51FA;&#x5904;</a>&#x3002;&#x672C;&#x6587;&#x6240;&#x6709;&#x6D89;&#x53CA;&#x5230;&#x7684;&#x5927;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#x5747;&#x5728;&#x8FD9;&#x4E2A;demo&#x91CC;&#x9762;&#xFF1A;<a href="https://github.com/sxei/chrome-plugin-demo">https://github.com/sxei/chrome-plugin-demo</a> &#xFF0C;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4E0B;&#x8F7D;&#x4E0B;&#x6765;&#x8FD0;&#x884C;&#x3002;</p><h1 id="%E5%89%8D%E8%A8%80"><strong>&#x524D;&#x8A00;</strong></h1><h2 id="21-%E4%BB%80%E4%B9%88%E6%98%AFchrome%E6%8F%92%E4%BB%B6"><strong>2.1. &#x4EC0;&#x4E48;&#x662F;Chrome&#x63D2;&#x4EF6;</strong></h2><p>&#x4E25;&#x683C;&#x6765;&#x8BB2;&#xFF0C;&#x6211;&#x4EEC;&#x6B63;&#x5728;&#x8BF4;&#x7684;&#x4E1C;&#x897F;&#x5E94;&#x8BE5;&#x53EB;Chrome&#x6269;&#x5C55;(<code>Chrome Extension</code>)&#xFF0C;&#x771F;&#x6B63;&#x610F;&#x4E49;&#x4E0A;&#x7684;Chrome&#x63D2;&#x4EF6;&#x662F;&#x66F4;&#x5E95;&#x5C42;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x529F;&#x80FD;&#x6269;&#x5C55;&#xFF0C;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x5BF9;&#x6D4F;&#x89C8;&#x5668;&#x6E90;&#x7801;&#x6709;&#x4E00;&#x5B9A;&#x638C;&#x63E1;&#x624D;&#x6709;&#x80FD;&#x529B;&#x53BB;&#x5F00;&#x53D1;&#x3002;&#x9274;&#x4E8E;Chrome&#x63D2;&#x4EF6;&#x7684;&#x53EB;&#x6CD5;&#x5DF2;&#x7ECF;&#x4E60;&#x60EF;&#xFF0C;&#x672C;&#x6587;&#x4E5F;&#x5168;&#x90E8;&#x91C7;&#x7528;&#x8FD9;&#x79CD;&#x53EB;&#x6CD5;&#xFF0C;&#x4F46;&#x8BFB;&#x8005;&#x9700;&#x6DF1;&#x77E5;&#x672C;&#x6587;&#x6240;&#x63CF;&#x8FF0;&#x7684;Chrome&#x63D2;&#x4EF6;&#x5B9E;&#x9645;&#x4E0A;&#x6307;&#x7684;&#x662F;Chrome&#x6269;&#x5C55;&#x3002;</p><p>Chrome&#x63D2;&#x4EF6;&#x662F;&#x4E00;&#x4E2A;&#x7528;Web&#x6280;&#x672F;&#x5F00;&#x53D1;&#x3001;&#x7528;&#x6765;&#x589E;&#x5F3A;&#x6D4F;&#x89C8;&#x5668;&#x529F;&#x80FD;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x5B83;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x7531;HTML&#x3001;CSS&#x3001;JS&#x3001;&#x56FE;&#x7247;&#x7B49;&#x8D44;&#x6E90;&#x7EC4;&#x6210;&#x7684;&#x4E00;&#x4E2A;<a href="https://developer.chrome.com/extensions/crx">.crx</a>&#x540E;&#x7F00;&#x7684;&#x538B;&#x7F29;&#x5305;.</p><p>&#x4E2A;&#x4EBA;&#x731C;&#x6D4B;<code>crx</code>&#x53EF;&#x80FD;&#x662F;<code>Chrome Extension</code>&#x5982;&#x4E0B;3&#x4E2A;&#x5B57;&#x6BCD;&#x7684;&#x7B80;&#x5199;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711100448275-555008903.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x53E6;&#x5916;&#xFF0C;&#x5176;&#x5B9E;&#x4E0D;&#x53EA;&#x662F;&#x524D;&#x7AEF;&#x6280;&#x672F;&#xFF0C;Chrome&#x63D2;&#x4EF6;&#x8FD8;&#x53EF;&#x4EE5;&#x914D;&#x5408;C++&#x7F16;&#x5199;&#x7684;dll&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#x5B9E;&#x73B0;&#x4E00;&#x4E9B;&#x66F4;&#x5E95;&#x5C42;&#x7684;&#x529F;&#x80FD;(NPAPI)&#xFF0C;&#x6BD4;&#x5982;&#x5168;&#x5C4F;&#x5E55;&#x622A;&#x56FE;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711100549040-348646504.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><blockquote>&#x7531;&#x4E8E;&#x5B89;&#x5168;&#x539F;&#x56E0;&#xFF0C;Chrome&#x6D4F;&#x89C8;&#x5668;42&#x4EE5;&#x4E0A;&#x7248;&#x672C;&#x5DF2;&#x7ECF;&#x9646;&#x7EED;&#x4E0D;&#x518D;&#x652F;&#x6301;NPAPI&#x63D2;&#x4EF6;&#xFF0C;&#x53D6;&#x800C;&#x4EE3;&#x4E4B;&#x7684;&#x662F;&#x66F4;&#x5B89;&#x5168;&#x7684;PPAPI&#x3002;</blockquote><h2 id="22-%E5%AD%A6%E4%B9%A0chrome%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89"><strong>2.2. &#x5B66;&#x4E60;Chrome&#x63D2;&#x4EF6;&#x5F00;&#x53D1;&#x6709;&#x4EC0;&#x4E48;&#x610F;&#x4E49;</strong></h2><p>&#x589E;&#x5F3A;&#x6D4F;&#x89C8;&#x5668;&#x529F;&#x80FD;&#xFF0C;&#x8F7B;&#x677E;&#x5B9E;&#x73B0;&#x5C5E;&#x4E8E;&#x81EA;&#x5DF1;&#x7684;&#x201C;&#x5B9A;&#x5236;&#x7248;&#x201D;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x7B49;&#x7B49;&#x3002;</p><p>Chrome&#x63D2;&#x4EF6;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x5B9E;&#x7528;API&#x4F9B;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#xFF0C;&#x5305;&#x62EC;&#x4F46;&#x4E0D;&#x9650;&#x4E8E;&#xFF1A;</p><ul><li>&#x4E66;&#x7B7E;&#x63A7;&#x5236;&#xFF1B;</li><li>&#x4E0B;&#x8F7D;&#x63A7;&#x5236;&#xFF1B;</li><li>&#x7A97;&#x53E3;&#x63A7;&#x5236;&#xFF1B;</li><li>&#x6807;&#x7B7E;&#x63A7;&#x5236;&#xFF1B;</li><li>&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x63A7;&#x5236;&#xFF0C;&#x5404;&#x7C7B;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#xFF1B;</li><li>&#x81EA;&#x5B9A;&#x4E49;&#x539F;&#x751F;&#x83DC;&#x5355;&#xFF1B;</li><li>&#x5B8C;&#x5584;&#x7684;&#x901A;&#x4FE1;&#x673A;&#x5236;&#xFF1B;</li><li>&#x7B49;&#x7B49;&#xFF1B;</li></ul><h2 id="23-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AFchrome%E6%8F%92%E4%BB%B6%E8%80%8C%E4%B8%8D%E6%98%AFfirefox%E6%8F%92%E4%BB%B6"><strong>2.3. &#x4E3A;&#x4EC0;&#x4E48;&#x662F;Chrome&#x63D2;&#x4EF6;&#x800C;&#x4E0D;&#x662F;Firefox&#x63D2;&#x4EF6;</strong></h2><ol><li>Chrome&#x5360;&#x6709;&#x7387;&#x66F4;&#x9AD8;&#xFF0C;&#x66F4;&#x591A;&#x4EBA;&#x7528;&#xFF1B;</li><li>&#x5F00;&#x53D1;&#x66F4;&#x7B80;&#x5355;&#xFF1B;</li><li>&#x5E94;&#x7528;&#x573A;&#x666F;&#x66F4;&#x5E7F;&#x6CDB;&#xFF0C;Firefox&#x63D2;&#x4EF6;&#x53EA;&#x80FD;&#x8FD0;&#x884C;&#x5728;Firefox&#x4E0A;&#xFF0C;&#x800C;Chrome&#x9664;&#x4E86;Chrome&#x6D4F;&#x89C8;&#x5668;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x5728;&#x6240;&#x6709;webkit&#x5185;&#x6838;&#x7684;&#x56FD;&#x4EA7;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x6BD4;&#x5982;360&#x6781;&#x901F;&#x6D4F;&#x89C8;&#x5668;&#x3001;360&#x5B89;&#x5168;&#x6D4F;&#x89C8;&#x5668;&#x3001;&#x641C;&#x72D7;&#x6D4F;&#x89C8;&#x5668;&#x3001;QQ&#x6D4F;&#x89C8;&#x5668;&#x7B49;&#x7B49;&#xFF1B;</li><li>&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;Firefox&#x6D4F;&#x89C8;&#x5668;&#x4E5F;&#x5BF9;Chrome&#x63D2;&#x4EF6;&#x7684;&#x8FD0;&#x884C;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x652F;&#x6301;&#xFF1B;</li></ol><h1 id="%E5%BC%80%E5%8F%91%E4%B8%8E%E8%B0%83%E8%AF%95"><strong>&#x5F00;&#x53D1;&#x4E0E;&#x8C03;&#x8BD5;</strong></h1><p>Chrome&#x63D2;&#x4EF6;&#x6CA1;&#x6709;&#x4E25;&#x683C;&#x7684;&#x9879;&#x76EE;&#x7ED3;&#x6784;&#x8981;&#x6C42;&#xFF0C;&#x53EA;&#x8981;&#x4FDD;&#x8BC1;&#x672C;&#x76EE;&#x5F55;&#x6709;&#x4E00;&#x4E2A;<code>manifest.json</code>&#x5373;&#x53EF;&#xFF0C;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#x4E13;&#x95E8;&#x7684;IDE&#xFF0C;&#x666E;&#x901A;&#x7684;web&#x5F00;&#x53D1;&#x5DE5;&#x5177;&#x5373;&#x53EF;&#x3002;</p><p>&#x4ECE;&#x53F3;&#x4E0A;&#x89D2;&#x83DC;&#x5355;-&gt;&#x66F4;&#x591A;&#x5DE5;&#x5177;-&gt;&#x6269;&#x5C55;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x8FDB;&#x5165; &#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x9762;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728;&#x5730;&#x5740;&#x680F;&#x8F93;&#x5165; <a>chrome://extensions</a> &#x8BBF;&#x95EE;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101025931-1366345527.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x52FE;&#x9009;<code>&#x5F00;&#x53D1;&#x8005;&#x6A21;&#x5F0F;</code>&#x5373;&#x53EF;&#x4EE5;&#x6587;&#x4EF6;&#x5939;&#x7684;&#x5F62;&#x5F0F;&#x76F4;&#x63A5;&#x52A0;&#x8F7D;&#x63D2;&#x4EF6;&#xFF0C;&#x5426;&#x5219;&#x53EA;&#x80FD;&#x5B89;&#x88C5;<code>.crx</code>&#x683C;&#x5F0F;&#x7684;&#x6587;&#x4EF6;&#x3002;Chrome&#x8981;&#x6C42;&#x63D2;&#x4EF6;&#x5FC5;&#x987B;&#x4ECE;&#x5B83;&#x7684;Chrome&#x5E94;&#x7528;&#x5546;&#x5E97;&#x5B89;&#x88C5;&#xFF0C;&#x5176;&#x5B83;&#x4EFB;&#x4F55;&#x7F51;&#x7AD9;&#x4E0B;&#x8F7D;&#x7684;&#x90FD;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x5B89;&#x88C5;&#xFF0C;&#x6240;&#x4EE5;&#xFF0C;&#x5176;&#x5B9E;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;<code>crx</code>&#x6587;&#x4EF6;&#x89E3;&#x538B;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;&#x5F00;&#x53D1;&#x8005;&#x6A21;&#x5F0F;&#x76F4;&#x63A5;&#x52A0;&#x8F7D;&#x3002;</p><p>&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x4EE3;&#x7801;&#x6709;&#x4EFB;&#x4F55;&#x6539;&#x52A8;&#x90FD;&#x5FC5;&#x987B;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x63D2;&#x4EF6;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728;&#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x6309;&#x4E0B;<code>Ctrl+R</code>&#x5373;&#x53EF;&#xFF0C;&#x4EE5;&#x9632;&#x4E07;&#x4E00;&#x6700;&#x597D;&#x8FD8;&#x628A;&#x9875;&#x9762;&#x5237;&#x65B0;&#x4E00;&#x4E0B;&#x3002;</p><h1 id="%E6%A0%B8%E5%BF%83%E4%BB%8B%E7%BB%8D"><strong>&#x6838;&#x5FC3;&#x4ECB;&#x7ECD;</strong></h1><h2 id="41-manifestjson"><strong>4.1. manifest.json</strong></h2><p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;Chrome&#x63D2;&#x4EF6;&#x6700;&#x91CD;&#x8981;&#x4E5F;&#x662F;&#x5FC5;&#x4E0D;&#x53EF;&#x5C11;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7528;&#x6765;&#x914D;&#x7F6E;&#x6240;&#x6709;&#x548C;&#x63D2;&#x4EF6;&#x76F8;&#x5173;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x5FC5;&#x987B;&#x653E;&#x5728;&#x6839;&#x76EE;&#x5F55;&#x3002;&#x5176;&#x4E2D;&#xFF0C;<code>manifest_version</code>&#x3001;<code>name</code>&#x3001;<code>version</code>3&#x4E2A;&#x662F;&#x5FC5;&#x4E0D;&#x53EF;&#x5C11;&#x7684;&#xFF0C;<code>description</code>&#x548C;<code>icons</code>&#x662F;&#x63A8;&#x8350;&#x7684;&#x3002;</p><p>&#x4E0B;&#x9762;&#x7ED9;&#x51FA;&#x7684;&#x662F;&#x4E00;&#x4E9B;&#x5E38;&#x89C1;&#x7684;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x5747;&#x6709;&#x4E2D;&#x6587;&#x6CE8;&#x91CA;&#xFF0C;&#x5B8C;&#x6574;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x6863;&#x8BF7;&#x6233;<a href="https://developer.chrome.com/extensions/manifest">&#x8FD9;&#x91CC;</a>&#x3002;</p><pre><code class="language-javascript">{
	// &#x6E05;&#x5355;&#x6587;&#x4EF6;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x8FD9;&#x4E2A;&#x5FC5;&#x987B;&#x5199;&#xFF0C;&#x800C;&#x4E14;&#x5FC5;&#x987B;&#x662F;2
	&quot;manifest_version&quot;: 2,
	// &#x63D2;&#x4EF6;&#x7684;&#x540D;&#x79F0;
	&quot;name&quot;: &quot;demo&quot;,
	// &#x63D2;&#x4EF6;&#x7684;&#x7248;&#x672C;
	&quot;version&quot;: &quot;1.0.0&quot;,
	// &#x63D2;&#x4EF6;&#x63CF;&#x8FF0;
	&quot;description&quot;: &quot;&#x7B80;&#x5355;&#x7684;Chrome&#x6269;&#x5C55;demo&quot;,
	// &#x56FE;&#x6807;&#xFF0C;&#x4E00;&#x822C;&#x5077;&#x61D2;&#x5168;&#x90E8;&#x7528;&#x4E00;&#x4E2A;&#x5C3A;&#x5BF8;&#x7684;&#x4E5F;&#x6CA1;&#x95EE;&#x9898;
	&quot;icons&quot;:
	{
		&quot;16&quot;: &quot;img/icon.png&quot;,
		&quot;48&quot;: &quot;img/icon.png&quot;,
		&quot;128&quot;: &quot;img/icon.png&quot;
	},
	// &#x4F1A;&#x4E00;&#x76F4;&#x5E38;&#x9A7B;&#x7684;&#x540E;&#x53F0;JS&#x6216;&#x540E;&#x53F0;&#x9875;&#x9762;
	&quot;background&quot;:
	{
		// 2&#x79CD;&#x6307;&#x5B9A;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x6307;&#x5B9A;JS&#xFF0C;&#x90A3;&#x4E48;&#x4F1A;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x80CC;&#x666F;&#x9875;
		&quot;page&quot;: &quot;background.html&quot;
		//&quot;scripts&quot;: [&quot;js/background.js&quot;]
	},
	// &#x6D4F;&#x89C8;&#x5668;&#x53F3;&#x4E0A;&#x89D2;&#x56FE;&#x6807;&#x8BBE;&#x7F6E;&#xFF0C;browser_action&#x3001;page_action&#x3001;app&#x5FC5;&#x987B;&#x4E09;&#x9009;&#x4E00;
	&quot;browser_action&quot;: 
	{
		&quot;default_icon&quot;: &quot;img/icon.png&quot;,
		// &#x56FE;&#x6807;&#x60AC;&#x505C;&#x65F6;&#x7684;&#x6807;&#x9898;&#xFF0C;&#x53EF;&#x9009;
		&quot;default_title&quot;: &quot;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x793A;&#x4F8B;Chrome&#x63D2;&#x4EF6;&quot;,
		&quot;default_popup&quot;: &quot;popup.html&quot;
	},
	// &#x5F53;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x9875;&#x9762;&#x6253;&#x5F00;&#x624D;&#x663E;&#x793A;&#x7684;&#x56FE;&#x6807;
	/*&quot;page_action&quot;:
	{
		&quot;default_icon&quot;: &quot;img/icon.png&quot;,
		&quot;default_title&quot;: &quot;&#x6211;&#x662F;pageAction&quot;,
		&quot;default_popup&quot;: &quot;popup.html&quot;
	},*/
	// &#x9700;&#x8981;&#x76F4;&#x63A5;&#x6CE8;&#x5165;&#x9875;&#x9762;&#x7684;JS
	&quot;content_scripts&quot;: 
	[
		{
			//&quot;matches&quot;: [&quot;http://*/*&quot;, &quot;https://*/*&quot;],
			// &quot;&lt;all_urls&gt;&quot; &#x8868;&#x793A;&#x5339;&#x914D;&#x6240;&#x6709;&#x5730;&#x5740;
			&quot;matches&quot;: [&quot;&lt;all_urls&gt;&quot;],
			// &#x591A;&#x4E2A;JS&#x6309;&#x987A;&#x5E8F;&#x6CE8;&#x5165;
			&quot;js&quot;: [&quot;js/jquery-1.8.3.js&quot;, &quot;js/content-script.js&quot;],
			// JS&#x7684;&#x6CE8;&#x5165;&#x53EF;&#x4EE5;&#x968F;&#x4FBF;&#x4E00;&#x70B9;&#xFF0C;&#x4F46;&#x662F;CSS&#x7684;&#x6CE8;&#x610F;&#x5C31;&#x8981;&#x5343;&#x4E07;&#x5C0F;&#x5FC3;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x4E00;&#x4E0D;&#x5C0F;&#x5FC3;&#x5C31;&#x53EF;&#x80FD;&#x5F71;&#x54CD;&#x5168;&#x5C40;&#x6837;&#x5F0F;
			&quot;css&quot;: [&quot;css/custom.css&quot;],
			// &#x4EE3;&#x7801;&#x6CE8;&#x5165;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x53EF;&#x9009;&#x503C;&#xFF1A; &quot;document_start&quot;, &quot;document_end&quot;, or &quot;document_idle&quot;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x9875;&#x9762;&#x7A7A;&#x95F2;&#x65F6;&#xFF0C;&#x9ED8;&#x8BA4;document_idle
			&quot;run_at&quot;: &quot;document_start&quot;
		},
		// &#x8FD9;&#x91CC;&#x4EC5;&#x4EC5;&#x662F;&#x4E3A;&#x4E86;&#x6F14;&#x793A;content-script&#x53EF;&#x4EE5;&#x914D;&#x7F6E;&#x591A;&#x4E2A;&#x89C4;&#x5219;
		{
			&quot;matches&quot;: [&quot;*://*/*.png&quot;, &quot;*://*/*.jpg&quot;, &quot;*://*/*.gif&quot;, &quot;*://*/*.bmp&quot;],
			&quot;js&quot;: [&quot;js/show-image-content-size.js&quot;]
		}
	],
	// &#x6743;&#x9650;&#x7533;&#x8BF7;
	&quot;permissions&quot;:
	[
		&quot;contextMenus&quot;, // &#x53F3;&#x952E;&#x83DC;&#x5355;
		&quot;tabs&quot;, // &#x6807;&#x7B7E;
		&quot;notifications&quot;, // &#x901A;&#x77E5;
		&quot;webRequest&quot;, // web&#x8BF7;&#x6C42;
		&quot;webRequestBlocking&quot;,
		&quot;storage&quot;, // &#x63D2;&#x4EF6;&#x672C;&#x5730;&#x5B58;&#x50A8;
		&quot;http://*/*&quot;, // &#x53EF;&#x4EE5;&#x901A;&#x8FC7;executeScript&#x6216;&#x8005;insertCSS&#x8BBF;&#x95EE;&#x7684;&#x7F51;&#x7AD9;
		&quot;https://*/*&quot; // &#x53EF;&#x4EE5;&#x901A;&#x8FC7;executeScript&#x6216;&#x8005;insertCSS&#x8BBF;&#x95EE;&#x7684;&#x7F51;&#x7AD9;
	],
	// &#x666E;&#x901A;&#x9875;&#x9762;&#x80FD;&#x591F;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7684;&#x63D2;&#x4EF6;&#x8D44;&#x6E90;&#x5217;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x8BBE;&#x7F6E;&#x662F;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7684;
	&quot;web_accessible_resources&quot;: [&quot;js/inject.js&quot;],
	// &#x63D2;&#x4EF6;&#x4E3B;&#x9875;&#xFF0C;&#x8FD9;&#x4E2A;&#x5F88;&#x91CD;&#x8981;&#xFF0C;&#x4E0D;&#x8981;&#x6D6A;&#x8D39;&#x4E86;&#x8FD9;&#x4E2A;&#x514D;&#x8D39;&#x5E7F;&#x544A;&#x4F4D;
	&quot;homepage_url&quot;: &quot;https://www.baidu.com&quot;,
	// &#x8986;&#x76D6;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x9875;&#x9762;
	&quot;chrome_url_overrides&quot;:
	{
		// &#x8986;&#x76D6;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x7684;&#x65B0;&#x6807;&#x7B7E;&#x9875;
		&quot;newtab&quot;: &quot;newtab.html&quot;
	},
	// Chrome40&#x4EE5;&#x524D;&#x7684;&#x63D2;&#x4EF6;&#x914D;&#x7F6E;&#x9875;&#x5199;&#x6CD5;
	&quot;options_page&quot;: &quot;options.html&quot;,
	// Chrome40&#x4EE5;&#x540E;&#x7684;&#x63D2;&#x4EF6;&#x914D;&#x7F6E;&#x9875;&#x5199;&#x6CD5;&#xFF0C;&#x5982;&#x679C;2&#x4E2A;&#x90FD;&#x5199;&#xFF0C;&#x65B0;&#x7248;Chrome&#x53EA;&#x8BA4;&#x540E;&#x9762;&#x8FD9;&#x4E00;&#x4E2A;
	&quot;options_ui&quot;:
	{
		&quot;page&quot;: &quot;options.html&quot;,
		// &#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x9ED8;&#x8BA4;&#x7684;&#x6837;&#x5F0F;&#xFF0C;&#x63A8;&#x8350;&#x4F7F;&#x7528;
		&quot;chrome_style&quot;: true
	},
	// &#x5411;&#x5730;&#x5740;&#x680F;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5B57;&#x4EE5;&#x63D0;&#x4F9B;&#x641C;&#x7D22;&#x5EFA;&#x8BAE;&#xFF0C;&#x53EA;&#x80FD;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5B57;
	&quot;omnibox&quot;: { &quot;keyword&quot; : &quot;go&quot; },
	// &#x9ED8;&#x8BA4;&#x8BED;&#x8A00;
	&quot;default_locale&quot;: &quot;zh_CN&quot;,
	// devtools&#x9875;&#x9762;&#x5165;&#x53E3;&#xFF0C;&#x6CE8;&#x610F;&#x53EA;&#x80FD;&#x6307;&#x5411;&#x4E00;&#x4E2A;HTML&#x6587;&#x4EF6;&#xFF0C;&#x4E0D;&#x80FD;&#x662F;JS&#x6587;&#x4EF6;
	&quot;devtools_page&quot;: &quot;devtools.html&quot;
}
</code></pre><h2 id="42-content-scripts"><strong>4.2. content-scripts</strong></h2><p>&#x6240;&#x8C13;<a href="https://developer.chrome.com/extensions/content_scripts">content-scripts</a>&#xFF0C;&#x5176;&#x5B9E;&#x5C31;&#x662F;Chrome&#x63D2;&#x4EF6;&#x4E2D;&#x5411;&#x9875;&#x9762;&#x6CE8;&#x5165;&#x811A;&#x672C;&#x7684;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#xFF08;&#x867D;&#x7136;&#x540D;&#x4E3A;script&#xFF0C;&#x5176;&#x5B9E;&#x8FD8;&#x53EF;&#x4EE5;&#x5305;&#x62EC;css&#x7684;&#xFF09;&#xFF0C;&#x501F;&#x52A9;<code>content-scripts</code>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x7684;&#x65B9;&#x5F0F;&#x8F7B;&#x677E;&#x5411;&#x6307;&#x5B9A;&#x9875;&#x9762;&#x6CE8;&#x5165;JS&#x548C;CSS&#xFF08;&#x5982;&#x679C;&#x9700;&#x8981;&#x52A8;&#x6001;&#x6CE8;&#x5165;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x4E0B;&#x6587;&#xFF09;&#xFF0C;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x6BD4;&#x5982;&#xFF1A;&#x5E7F;&#x544A;&#x5C4F;&#x853D;&#x3001;&#x9875;&#x9762;CSS&#x5B9A;&#x5236;&#xFF0C;&#x7B49;&#x7B49;&#x3002;</p><p>&#x793A;&#x4F8B;&#x914D;&#x7F6E;&#xFF1A;</p><pre><code class="language-javascript">{
	// &#x9700;&#x8981;&#x76F4;&#x63A5;&#x6CE8;&#x5165;&#x9875;&#x9762;&#x7684;JS
	&quot;content_scripts&quot;: 
	[
		{
			//&quot;matches&quot;: [&quot;http://*/*&quot;, &quot;https://*/*&quot;],
			// &quot;&lt;all_urls&gt;&quot; &#x8868;&#x793A;&#x5339;&#x914D;&#x6240;&#x6709;&#x5730;&#x5740;
			&quot;matches&quot;: [&quot;&lt;all_urls&gt;&quot;],
			// &#x591A;&#x4E2A;JS&#x6309;&#x987A;&#x5E8F;&#x6CE8;&#x5165;
			&quot;js&quot;: [&quot;js/jquery-1.8.3.js&quot;, &quot;js/content-script.js&quot;],
			// JS&#x7684;&#x6CE8;&#x5165;&#x53EF;&#x4EE5;&#x968F;&#x4FBF;&#x4E00;&#x70B9;&#xFF0C;&#x4F46;&#x662F;CSS&#x7684;&#x6CE8;&#x610F;&#x5C31;&#x8981;&#x5343;&#x4E07;&#x5C0F;&#x5FC3;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x4E00;&#x4E0D;&#x5C0F;&#x5FC3;&#x5C31;&#x53EF;&#x80FD;&#x5F71;&#x54CD;&#x5168;&#x5C40;&#x6837;&#x5F0F;
			&quot;css&quot;: [&quot;css/custom.css&quot;],
			// &#x4EE3;&#x7801;&#x6CE8;&#x5165;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x53EF;&#x9009;&#x503C;&#xFF1A; &quot;document_start&quot;, &quot;document_end&quot;, or &quot;document_idle&quot;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x9875;&#x9762;&#x7A7A;&#x95F2;&#x65F6;&#xFF0C;&#x9ED8;&#x8BA4;document_idle
			&quot;run_at&quot;: &quot;document_start&quot;
		}
	],
}
</code></pre><p>&#x7279;&#x522B;&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x4E3B;&#x52A8;&#x6307;&#x5B9A;<code>run_at</code>&#x4E3A;<code>document_start</code>&#xFF08;&#x9ED8;&#x8BA4;&#x4E3A;<code>document_idle</code>&#xFF09;&#xFF0C;&#x4E0B;&#x9762;&#x8FD9;&#x79CD;&#x4EE3;&#x7801;&#x662F;&#x4E0D;&#x4F1A;&#x751F;&#x6548;&#x7684;&#xFF1A;</p><pre><code class="language-javascript">document.addEventListener(&apos;DOMContentLoaded&apos;, function()
{
	console.log(&apos;&#x6211;&#x88AB;&#x6267;&#x884C;&#x4E86;&#xFF01;&apos;);
});
</code></pre><p><code>content-scripts</code>&#x548C;&#x539F;&#x59CB;&#x9875;&#x9762;&#x5171;&#x4EAB;DOM&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x5171;&#x4EAB;JS&#xFF0C;&#x5982;&#x8981;&#x8BBF;&#x95EE;&#x9875;&#x9762;JS&#xFF08;&#x4F8B;&#x5982;&#x67D0;&#x4E2A;JS&#x53D8;&#x91CF;&#xFF09;&#xFF0C;&#x53EA;&#x80FD;&#x901A;&#x8FC7;<code>injected js</code>&#x6765;&#x5B9E;&#x73B0;&#x3002;<code>content-scripts</code>&#x4E0D;&#x80FD;&#x8BBF;&#x95EE;&#x7EDD;&#x5927;&#x90E8;&#x5206;<code>chrome.xxx.api</code>&#xFF0C;&#x9664;&#x4E86;&#x4E0B;&#x9762;&#x8FD9;4&#x79CD;&#xFF1A;</p><ul><li>chrome.extension(getURL , inIncognitoContext , lastError , onRequest , sendRequest)</li><li>chrome.i18n</li><li>chrome.runtime(connect , getManifest , getURL , id , onConnect , onMessage , sendMessage)</li><li>chrome.storage</li></ul><p>&#x5176;&#x5B9E;&#x770B;&#x5230;&#x8FD9;&#x91CC;&#x4E0D;&#x8981;&#x60B2;&#x89C2;&#xFF0C;&#x8FD9;&#x4E9B;API&#x7EDD;&#x5927;&#x90E8;&#x5206;&#x65F6;&#x5019;&#x90FD;&#x591F;&#x7528;&#x4E86;&#xFF0C;&#x975E;&#x8981;&#x8C03;&#x7528;&#x5176;&#x5B83;API&#x7684;&#x8BDD;&#xFF0C;&#x4F60;&#x8FD8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x901A;&#x4FE1;&#x6765;&#x5B9E;&#x73B0;&#x8BA9;background&#x6765;&#x5E2E;&#x4F60;&#x8C03;&#x7528;&#xFF08;&#x5173;&#x4E8E;&#x901A;&#x4FE1;&#xFF0C;&#x540E;&#x6587;&#x6709;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#xFF09;&#x3002;</p><p>&#x597D;&#x4E86;&#xFF0C;Chrome&#x63D2;&#x4EF6;&#x7ED9;&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x4E86;&#x8FD9;&#x4E48;&#x5F3A;&#x5927;&#x7684;JS&#x6CE8;&#x5165;&#x529F;&#x80FD;&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x5C31;&#x662F;&#x53D1;&#x6325;&#x4F60;&#x7684;&#x60F3;&#x8C61;&#x529B;&#x53BB;&#x73A9;&#x5F04;&#x6D4F;&#x89C8;&#x5668;&#x4E86;&#x3002;</p><h2 id="43-background"><strong>4.3. background</strong></h2><p>&#x540E;&#x53F0;&#xFF08;&#x59D1;&#x4E14;&#x8FD9;&#x4E48;&#x7FFB;&#x8BD1;&#x5427;&#xFF09;&#xFF0C;&#x662F;&#x4E00;&#x4E2A;&#x5E38;&#x9A7B;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x5B83;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x662F;&#x63D2;&#x4EF6;&#x4E2D;&#x6240;&#x6709;&#x7C7B;&#x578B;&#x9875;&#x9762;&#x4E2D;&#x6700;&#x957F;&#x7684;&#xFF0C;&#x5B83;&#x968F;&#x7740;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6253;&#x5F00;&#x800C;&#x6253;&#x5F00;&#xFF0C;&#x968F;&#x7740;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x5173;&#x95ED;&#x800C;&#x5173;&#x95ED;&#xFF0C;&#x6240;&#x4EE5;&#x901A;&#x5E38;&#x628A;&#x9700;&#x8981;&#x4E00;&#x76F4;&#x8FD0;&#x884C;&#x7684;&#x3001;&#x542F;&#x52A8;&#x5C31;&#x8FD0;&#x884C;&#x7684;&#x3001;&#x5168;&#x5C40;&#x7684;&#x4EE3;&#x7801;&#x653E;&#x5728;background&#x91CC;&#x9762;&#x3002;</p><p>background&#x7684;&#x6743;&#x9650;&#x975E;&#x5E38;&#x9AD8;&#xFF0C;&#x51E0;&#x4E4E;&#x53EF;&#x4EE5;&#x8C03;&#x7528;&#x6240;&#x6709;&#x7684;Chrome&#x6269;&#x5C55;API&#xFF08;&#x9664;&#x4E86;devtools&#xFF09;&#xFF0C;&#x800C;&#x4E14;&#x5B83;&#x53EF;&#x4EE5;&#x65E0;&#x9650;&#x5236;&#x8DE8;&#x57DF;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x53EF;&#x4EE5;&#x8DE8;&#x57DF;&#x8BBF;&#x95EE;&#x4EFB;&#x4F55;&#x7F51;&#x7AD9;&#x800C;&#x65E0;&#x9700;&#x8981;&#x6C42;&#x5BF9;&#x65B9;&#x8BBE;&#x7F6E;<code>CORS</code>&#x3002;</p><blockquote>&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x5176;&#x5B9E;&#x4E0D;&#x6B62;&#x662F;background&#xFF0C;&#x6240;&#x6709;&#x7684;&#x76F4;&#x63A5;&#x901A;&#x8FC7;<code>chrome-extension://id/xx.html</code>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#x7684;&#x7F51;&#x9875;&#x90FD;&#x53EF;&#x4EE5;&#x65E0;&#x9650;&#x5236;&#x8DE8;&#x57DF;&#x3002;</blockquote><p>&#x914D;&#x7F6E;&#x4E2D;&#xFF0C;<code>background</code>&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>page</code>&#x6307;&#x5B9A;&#x4E00;&#x5F20;&#x7F51;&#x9875;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>scripts</code>&#x76F4;&#x63A5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;JS&#xFF0C;Chrome&#x4F1A;&#x81EA;&#x52A8;&#x4E3A;&#x8FD9;&#x4E2A;JS&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x9ED8;&#x8BA4;&#x7684;&#x7F51;&#x9875;&#xFF1A;</p><pre><code class="language-javascript">{
	// &#x4F1A;&#x4E00;&#x76F4;&#x5E38;&#x9A7B;&#x7684;&#x540E;&#x53F0;JS&#x6216;&#x540E;&#x53F0;&#x9875;&#x9762;
	&quot;background&quot;:
	{
		// 2&#x79CD;&#x6307;&#x5B9A;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x6307;&#x5B9A;JS&#xFF0C;&#x90A3;&#x4E48;&#x4F1A;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x80CC;&#x666F;&#x9875;
		&quot;page&quot;: &quot;background.html&quot;
		//&quot;scripts&quot;: [&quot;js/background.js&quot;]
	},
}
</code></pre><p>&#x9700;&#x8981;&#x7279;&#x522B;&#x8BF4;&#x660E;&#x7684;&#x662F;&#xFF0C;&#x867D;&#x7136;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>chrome-extension://xxx/background.html</code>&#x76F4;&#x63A5;&#x6253;&#x5F00;&#x540E;&#x53F0;&#x9875;&#xFF0C;&#x4F46;&#x662F;&#x4F60;&#x6253;&#x5F00;&#x7684;&#x540E;&#x53F0;&#x9875;&#x548C;&#x771F;&#x6B63;&#x4E00;&#x76F4;&#x5728;&#x540E;&#x53F0;&#x8FD0;&#x884C;&#x7684;&#x90A3;&#x4E2A;&#x9875;&#x9762;&#x4E0D;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#xFF0C;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x6253;&#x5F00;&#x65E0;&#x6570;&#x4E2A;<code>background.html</code>&#xFF0C;&#x4F46;&#x662F;&#x771F;&#x6B63;&#x5728;&#x540E;&#x53F0;&#x5E38;&#x9A7B;&#x7684;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#xFF0C;&#x800C;&#x4E14;&#x8FD9;&#x4E2A;&#x4F60;&#x6C38;&#x8FDC;&#x770B;&#x4E0D;&#x5230;&#x5B83;&#x7684;&#x754C;&#x9762;&#xFF0C;&#x53EA;&#x80FD;&#x8C03;&#x8BD5;&#x5B83;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><h2 id="44-event-pages"><strong>4.4. event-pages</strong></h2><p>&#x8FD9;&#x91CC;&#x987A;&#x5E26;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;<a href="https://developer.chrome.com/extensions/event_pages">event-pages</a>&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x4EC0;&#x4E48;&#x4E1C;&#x897F;&#x5462;&#xFF1F;&#x9274;&#x4E8E;background&#x751F;&#x547D;&#x5468;&#x671F;&#x592A;&#x957F;&#xFF0C;&#x957F;&#x65F6;&#x95F4;&#x6302;&#x8F7D;&#x540E;&#x53F0;&#x53EF;&#x80FD;&#x4F1A;&#x5F71;&#x54CD;&#x6027;&#x80FD;&#xFF0C;&#x6240;&#x4EE5;Google&#x53C8;&#x5F04;&#x4E00;&#x4E2A;<code>event-pages</code>&#xFF0C;&#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E0A;&#xFF0C;&#x5B83;&#x4E0E;background&#x7684;&#x552F;&#x4E00;&#x533A;&#x522B;&#x5C31;&#x662F;&#x591A;&#x4E86;&#x4E00;&#x4E2A;<code>persistent</code>&#x53C2;&#x6570;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;background&quot;:
	{
		&quot;scripts&quot;: [&quot;event-page.js&quot;],
		&quot;persistent&quot;: false
	},
}
</code></pre><p>&#x5B83;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x662F;&#xFF1A;&#x5728;&#x88AB;&#x9700;&#x8981;&#x65F6;&#x52A0;&#x8F7D;&#xFF0C;&#x5728;&#x7A7A;&#x95F2;&#x65F6;&#x88AB;&#x5173;&#x95ED;&#xFF0C;&#x4EC0;&#x4E48;&#x53EB;&#x88AB;&#x9700;&#x8981;&#x65F6;&#x5462;&#xFF1F;&#x6BD4;&#x5982;&#x7B2C;&#x4E00;&#x6B21;&#x5B89;&#x88C5;&#x3001;&#x63D2;&#x4EF6;&#x66F4;&#x65B0;&#x3001;&#x6709;content-script&#x5411;&#x5B83;&#x53D1;&#x9001;&#x6D88;&#x606F;&#xFF0C;&#x7B49;&#x7B49;&#x3002;</p><p>&#x9664;&#x4E86;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x4EE3;&#x7801;&#x4E0A;&#x4E5F;&#x6709;&#x4E00;&#x4E9B;&#x7EC6;&#x5FAE;&#x53D8;&#x5316;&#xFF0C;&#x4E2A;&#x4EBA;&#x8FD9;&#x4E2A;&#x7B80;&#x5355;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x5C31;&#x884C;&#x4E86;&#xFF0C;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;background&#x4E5F;&#x4E0D;&#x4F1A;&#x5F88;&#x6D88;&#x8017;&#x6027;&#x80FD;&#x7684;&#x3002;</p><h2 id="45-popup"><strong>4.5. popup</strong></h2><p><code>popup</code>&#x662F;&#x70B9;&#x51FB;<code>browser_action</code>&#x6216;&#x8005;<code>page_action</code>&#x56FE;&#x6807;&#x65F6;&#x6253;&#x5F00;&#x7684;&#x4E00;&#x4E2A;&#x5C0F;&#x7A97;&#x53E3;&#x7F51;&#x9875;&#xFF0C;&#x7126;&#x70B9;&#x79BB;&#x5F00;&#x7F51;&#x9875;&#x5C31;&#x7ACB;&#x5373;&#x5173;&#x95ED;&#xFF0C;&#x4E00;&#x822C;&#x7528;&#x6765;&#x505A;&#x4E00;&#x4E9B;&#x4E34;&#x65F6;&#x6027;&#x7684;&#x4EA4;&#x4E92;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101054353-176942304.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p><code>popup</code>&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x4EFB;&#x610F;&#x4F60;&#x60F3;&#x8981;&#x7684;HTML&#x5185;&#x5BB9;&#xFF0C;&#x5E76;&#x4E14;&#x4F1A;&#x81EA;&#x9002;&#x5E94;&#x5927;&#x5C0F;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>default_popup</code>&#x5B57;&#x6BB5;&#x6765;&#x6307;&#x5B9A;popup&#x9875;&#x9762;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x8C03;&#x7528;<code>setPopup()</code>&#x65B9;&#x6CD5;&#x3002;</p><p>&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;browser_action&quot;:
	{
		&quot;default_icon&quot;: &quot;img/icon.png&quot;,
		// &#x56FE;&#x6807;&#x60AC;&#x505C;&#x65F6;&#x7684;&#x6807;&#x9898;&#xFF0C;&#x53EF;&#x9009;
		&quot;default_title&quot;: &quot;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x793A;&#x4F8B;Chrome&#x63D2;&#x4EF6;&quot;,
		&quot;default_popup&quot;: &quot;popup.html&quot;
	}
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101114415-2019243064.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x9700;&#x8981;&#x7279;&#x522B;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x7531;&#x4E8E;&#x5355;&#x51FB;&#x56FE;&#x6807;&#x6253;&#x5F00;popup&#xFF0C;&#x7126;&#x70B9;&#x79BB;&#x5F00;&#x53C8;&#x7ACB;&#x5373;&#x5173;&#x95ED;&#xFF0C;&#x6240;&#x4EE5;popup&#x9875;&#x9762;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E00;&#x822C;&#x5F88;&#x77ED;&#xFF0C;&#x9700;&#x8981;&#x957F;&#x65F6;&#x95F4;&#x8FD0;&#x884C;&#x7684;&#x4EE3;&#x7801;&#x5343;&#x4E07;&#x4E0D;&#x8981;&#x5199;&#x5728;popup&#x91CC;&#x9762;&#x3002;</p><p>&#x5728;&#x6743;&#x9650;&#x4E0A;&#xFF0C;&#x5B83;&#x548C;background&#x975E;&#x5E38;&#x7C7B;&#x4F3C;&#xFF0C;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x6700;&#x5927;&#x7684;&#x4E0D;&#x540C;&#x662F;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x4E0D;&#x540C;&#xFF0C;popup&#x4E2D;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x901A;&#x8FC7;<code>chrome.extension.getBackgroundPage()</code>&#x83B7;&#x53D6;background&#x7684;window&#x5BF9;&#x8C61;&#x3002;</p><h2 id="46-injected-script"><strong>4.6. injected-script</strong></h2><p>&#x8FD9;&#x91CC;&#x7684;<code>injected-script</code>&#x662F;&#x6211;&#x7ED9;&#x5B83;&#x53D6;&#x7684;&#xFF0C;&#x6307;&#x7684;&#x662F;&#x901A;&#x8FC7;DOM&#x64CD;&#x4F5C;&#x7684;&#x65B9;&#x5F0F;&#x5411;&#x9875;&#x9762;&#x6CE8;&#x5165;&#x7684;&#x4E00;&#x79CD;JS&#x3002;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x628A;&#x8FD9;&#x79CD;JS&#x5355;&#x72EC;&#x62FF;&#x51FA;&#x6765;&#x8BA8;&#x8BBA;&#x5462;&#xFF1F;&#x53C8;&#x6216;&#x8005;&#x8BF4;&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6CE8;&#x5165;JS&#x5462;&#xFF1F;</p><p>&#x8FD9;&#x662F;&#x56E0;&#x4E3A;<code>content-script</code>&#x6709;&#x4E00;&#x4E2A;&#x5F88;&#x5927;&#x7684;&#x201C;&#x7F3A;&#x9677;&#x201D;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#x9875;&#x9762;&#x4E2D;&#x7684;JS&#xFF0C;&#x867D;&#x7136;&#x5B83;&#x53EF;&#x4EE5;&#x64CD;&#x4F5C;DOM&#xFF0C;&#x4F46;&#x662F;DOM&#x5374;&#x4E0D;&#x80FD;&#x8C03;&#x7528;&#x5B83;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x65E0;&#x6CD5;&#x5728;DOM&#x4E2D;&#x901A;&#x8FC7;&#x7ED1;&#x5B9A;&#x4E8B;&#x4EF6;&#x7684;&#x65B9;&#x5F0F;&#x8C03;&#x7528;<code>content-script</code>&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#xFF08;&#x5305;&#x62EC;&#x76F4;&#x63A5;&#x5199;<code>onclick</code>&#x548C;<code>addEventListener</code>2&#x79CD;&#x65B9;&#x5F0F;&#x90FD;&#x4E0D;&#x884C;&#xFF09;&#xFF0C;&#x4F46;&#x662F;&#xFF0C;&#x201C;&#x5728;&#x9875;&#x9762;&#x4E0A;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x6309;&#x94AE;&#x5E76;&#x8C03;&#x7528;&#x63D2;&#x4EF6;&#x7684;&#x6269;&#x5C55;API&#x201D;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x5E38;&#x89C1;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x90A3;&#x8BE5;&#x600E;&#x4E48;&#x529E;&#x5462;&#xFF1F;&#x5176;&#x5B9E;&#x8FD9;&#x5C31;&#x662F;&#x672C;&#x5C0F;&#x8282;&#x8981;&#x8BB2;&#x7684;&#x3002;</p><p>&#x5728;<code>content-script</code>&#x4E2D;&#x901A;&#x8FC7;DOM&#x65B9;&#x5F0F;&#x5411;&#x9875;&#x9762;&#x6CE8;&#x5165;<code>inject-script</code>&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#xFF1A;</p><pre><code class="language-javascript">// &#x5411;&#x9875;&#x9762;&#x6CE8;&#x5165;JS
function injectCustomJs(jsPath)
{
	jsPath = jsPath || &apos;js/inject.js&apos;;
	var temp = document.createElement(&apos;script&apos;);
	temp.setAttribute(&apos;type&apos;, &apos;text/javascript&apos;);
	// &#x83B7;&#x5F97;&#x7684;&#x5730;&#x5740;&#x7C7B;&#x4F3C;&#xFF1A;chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js
	temp.src = chrome.extension.getURL(jsPath);
	temp.onload = function()
	{
		// &#x653E;&#x5728;&#x9875;&#x9762;&#x4E0D;&#x597D;&#x770B;&#xFF0C;&#x6267;&#x884C;&#x5B8C;&#x540E;&#x79FB;&#x9664;&#x6389;
		this.parentNode.removeChild(this);
	};
	document.head.appendChild(temp);
}
</code></pre><p>&#x4F60;&#x4EE5;&#x4E3A;&#x8FD9;&#x6837;&#x5C31;&#x884C;&#x4E86;&#xFF1F;&#x6267;&#x884C;&#x4E00;&#x4E0B;&#x4F60;&#x4F1A;&#x770B;&#x5230;&#x5982;&#x4E0B;&#x62A5;&#x9519;&#xFF1A;</p><pre><code>Denying load of chrome-extension://efbllncjkjiijkppagepehoekjojdclc/js/inject.js. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension.
</code></pre><p>&#x610F;&#x601D;&#x5C31;&#x662F;&#x4F60;&#x60F3;&#x8981;&#x5728;web&#x4E2D;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x63D2;&#x4EF6;&#x4E2D;&#x7684;&#x8D44;&#x6E90;&#x7684;&#x8BDD;&#x5FC5;&#x987B;&#x663E;&#x793A;&#x58F0;&#x660E;&#x624D;&#x884C;&#xFF0C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x589E;&#x52A0;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-javascript">{
	// &#x666E;&#x901A;&#x9875;&#x9762;&#x80FD;&#x591F;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7684;&#x63D2;&#x4EF6;&#x8D44;&#x6E90;&#x5217;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x8BBE;&#x7F6E;&#x662F;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x7684;
	&quot;web_accessible_resources&quot;: [&quot;js/inject.js&quot;],
}
</code></pre><p>&#x81F3;&#x4E8E;<code>inject-script</code>&#x5982;&#x4F55;&#x8C03;&#x7528;<code>content-script</code>&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x540E;&#x9762;&#x6211;&#x4F1A;&#x5728;&#x4E13;&#x95E8;&#x7684;&#x4E00;&#x4E2A;&#x6D88;&#x606F;&#x901A;&#x4FE1;&#x7AE0;&#x8282;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x3002;</p><h2 id="47-homepageurl"><strong>4.7. homepage_url</strong></h2><p>&#x5F00;&#x53D1;&#x8005;&#x6216;&#x8005;&#x63D2;&#x4EF6;&#x4E3B;&#x9875;&#x8BBE;&#x7F6E;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x5728;&#x5982;&#x4E0B;2&#x4E2A;&#x5730;&#x65B9;&#x663E;&#x793A;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101138368-1160396252.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101153556-956484967.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h1 id="chrome%E6%8F%92%E4%BB%B6%E7%9A%848%E7%A7%8D%E5%B1%95%E7%A4%BA%E5%BD%A2%E5%BC%8F"><strong>Chrome&#x63D2;&#x4EF6;&#x7684;8&#x79CD;&#x5C55;&#x793A;&#x5F62;&#x5F0F;</strong></h1><h2 id="51-browseraction%E6%B5%8F%E8%A7%88%E5%99%A8%E5%8F%B3%E4%B8%8A%E8%A7%92"><strong>5.1. browserAction(&#x6D4F;&#x89C8;&#x5668;&#x53F3;&#x4E0A;&#x89D2;)</strong></h2><p>&#x901A;&#x8FC7;&#x914D;&#x7F6E;<code>browser_action</code>&#x53EF;&#x4EE5;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x53F3;&#x4E0A;&#x89D2;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x56FE;&#x6807;&#xFF0C;&#x4E00;&#x4E2A;<code>browser_action</code>&#x53EF;&#x4EE5;&#x62E5;&#x6709;&#x4E00;&#x4E2A;&#x56FE;&#x6807;&#xFF0C;&#x4E00;&#x4E2A;<code>tooltip</code>&#xFF0C;&#x4E00;&#x4E2A;<code>badge</code>&#x548C;&#x4E00;&#x4E2A;<code>popup</code>&#x3002;</p><p>&#x793A;&#x4F8B;&#x914D;&#x7F6E;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-json">&quot;browser_action&quot;:
{
	&quot;default_icon&quot;: &quot;img/icon.png&quot;,
	&quot;default_title&quot;: &quot;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x793A;&#x4F8B;Chrome&#x63D2;&#x4EF6;&quot;,
	&quot;default_popup&quot;: &quot;popup.html&quot;
}
</code></pre><h3 id="511-%E5%9B%BE%E6%A0%87"><strong>5.1.1. &#x56FE;&#x6807;</strong></h3><p><code>browser_action</code>&#x56FE;&#x6807;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#x5BBD;&#x9AD8;&#x90FD;&#x4E3A;19&#x50CF;&#x7D20;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x66F4;&#x5927;&#x7684;&#x56FE;&#x6807;&#x4F1A;&#x88AB;&#x7F29;&#x5C0F;&#xFF0C;&#x683C;&#x5F0F;&#x968F;&#x610F;&#xFF0C;&#x4E00;&#x822C;&#x63A8;&#x8350;png&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;manifest&#x4E2D;<code>default_icon</code>&#x5B57;&#x6BB5;&#x914D;&#x7F6E;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x8C03;&#x7528;setIcon()&#x65B9;&#x6CD5;&#x3002;</p><h3 id="512-tooltip"><strong>5.1.2. tooltip</strong></h3><p>&#x4FEE;&#x6539;<code>browser_action</code>&#x7684;manifest&#x4E2D;<code>default_title</code>&#x5B57;&#x6BB5;&#xFF0C;&#x6216;&#x8005;&#x8C03;&#x7528;<code>setTitle()</code>&#x65B9;&#x6CD5;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101210759-683039077.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h3 id="513-badge"><strong>5.1.3. badge</strong></h3><p>&#x6240;&#x8C13;<code>badge</code>&#x5C31;&#x662F;&#x5728;&#x56FE;&#x6807;&#x4E0A;&#x663E;&#x793A;&#x4E00;&#x4E9B;&#x6587;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x66F4;&#x65B0;&#x4E00;&#x4E9B;&#x5C0F;&#x7684;&#x6269;&#x5C55;&#x72B6;&#x6001;&#x63D0;&#x793A;&#x4FE1;&#x606F;&#x3002;&#x56E0;&#x4E3A;badge&#x7A7A;&#x95F4;&#x6709;&#x9650;&#xFF0C;&#x6240;&#x4EE5;&#x53EA;&#x652F;&#x6301;4&#x4E2A;&#x4EE5;&#x4E0B;&#x7684;&#x5B57;&#x7B26;&#xFF08;&#x82F1;&#x6587;4&#x4E2A;&#xFF0C;&#x4E2D;&#x6587;2&#x4E2A;&#xFF09;&#x3002;badge&#x65E0;&#x6CD5;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6765;&#x6307;&#x5B9A;&#xFF0C;&#x5FC5;&#x987B;&#x901A;&#x8FC7;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF0C;&#x8BBE;&#x7F6E;badge&#x6587;&#x5B57;&#x548C;&#x989C;&#x8272;&#x53EF;&#x4EE5;&#x5206;&#x522B;&#x4F7F;&#x7528;<code>setBadgeText()</code>&#x548C;<code>setBadgeBackgroundColor()</code>&#x3002;</p><pre><code class="language-javascript">chrome.browserAction.setBadgeText({text: &apos;new&apos;});
chrome.browserAction.setBadgeBackgroundColor({color: [255, 0, 0, 255]});
</code></pre><p>&#x6548;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101228056-2133169218.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h2 id="52-pageaction%E5%9C%B0%E5%9D%80%E6%A0%8F%E5%8F%B3%E4%BE%A7"><strong>5.2. pageAction(&#x5730;&#x5740;&#x680F;&#x53F3;&#x4FA7;)</strong></h2><p>&#x6240;&#x8C13;<code>pageAction</code>&#xFF0C;&#x6307;&#x7684;&#x662F;&#x53EA;&#x6709;&#x5F53;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x9875;&#x9762;&#x6253;&#x5F00;&#x624D;&#x663E;&#x793A;&#x7684;&#x56FE;&#x6807;&#xFF0C;&#x5B83;&#x548C;<code>browserAction</code>&#x6700;&#x5927;&#x7684;&#x533A;&#x522B;&#x662F;&#x4E00;&#x4E2A;&#x59CB;&#x7EC8;&#x90FD;&#x663E;&#x793A;&#xFF0C;&#x4E00;&#x4E2A;&#x53EA;&#x5728;&#x7279;&#x5B9A;&#x60C5;&#x51B5;&#x624D;&#x663E;&#x793A;&#x3002;</p><p>&#x9700;&#x8981;&#x7279;&#x522B;&#x8BF4;&#x660E;&#x7684;&#x662F;&#x65E9;&#x4E9B;&#x7248;&#x672C;&#x7684;Chrome&#x662F;&#x5C06;pageAction&#x653E;&#x5728;&#x5730;&#x5740;&#x680F;&#x7684;&#x6700;&#x53F3;&#x8FB9;&#xFF0C;&#x5DE6;&#x952E;&#x5355;&#x51FB;&#x5F39;&#x51FA;popup&#xFF0C;&#x53F3;&#x952E;&#x5355;&#x51FB;&#x5219;&#x5F39;&#x51FA;&#x76F8;&#x5173;&#x9ED8;&#x8BA4;&#x7684;&#x9009;&#x9879;&#x83DC;&#x5355;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101549665-519093069.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x800C;&#x65B0;&#x7248;&#x7684;Chrome&#x66F4;&#x6539;&#x4E86;&#x8FD9;&#x4E00;&#x7B56;&#x7565;&#xFF0C;pageAction&#x548C;&#x666E;&#x901A;&#x7684;browserAction&#x4E00;&#x6837;&#x4E5F;&#x662F;&#x653E;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x53F3;&#x4E0A;&#x89D2;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x6CA1;&#x6709;&#x70B9;&#x4EAE;&#x65F6;&#x662F;&#x7070;&#x8272;&#x7684;&#xFF0C;&#x70B9;&#x4EAE;&#x4E86;&#x624D;&#x662F;&#x5F69;&#x8272;&#x7684;&#xFF0C;&#x7070;&#x8272;&#x65F6;&#x65E0;&#x8BBA;&#x5DE6;&#x952E;&#x8FD8;&#x662F;&#x53F3;&#x952E;&#x5355;&#x51FB;&#x90FD;&#x662F;&#x5F39;&#x51FA;&#x9009;&#x9879;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101604947-1619892598.gif" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><blockquote>&#x5177;&#x4F53;&#x662F;&#x4ECE;&#x54EA;&#x4E00;&#x7248;&#x672C;&#x5F00;&#x59CB;&#x6539;&#x7684;&#x6CA1;&#x53BB;&#x4ED4;&#x7EC6;&#x8003;&#x7A76;&#xFF0C;&#x53CD;&#x6B63;&#x77E5;&#x9053;v50.0&#x7684;&#x65F6;&#x5019;&#x8FD8;&#x662F;&#x524D;&#x8005;&#xFF0C;v58.0&#x7684;&#x65F6;&#x5019;&#x5DF2;&#x6539;&#x4E3A;&#x540E;&#x8005;&#x3002;</blockquote><p>&#x8C03;&#x6574;&#x4E4B;&#x540E;&#x7684;<code>pageAction</code>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x5730;&#x628A;&#x5B83;&#x770B;&#x6210;&#x662F;&#x53EF;&#x4EE5;&#x7F6E;&#x7070;&#x7684;<code>browserAction</code>&#x3002;</p><ul><li>chrome.pageAction.show(tabId) &#x663E;&#x793A;&#x56FE;&#x6807;&#xFF1B;</li><li>chrome.pageAction.hide(tabId) &#x9690;&#x85CF;&#x56FE;&#x6807;&#xFF1B;</li></ul><p>&#x793A;&#x4F8B;(&#x53EA;&#x6709;&#x6253;&#x5F00;&#x767E;&#x5EA6;&#x624D;&#x663E;&#x793A;&#x56FE;&#x6807;)&#xFF1A;</p><pre><code class="language-javascript">// manifest.json
{
	&quot;page_action&quot;:
	{
		&quot;default_icon&quot;: &quot;img/icon.png&quot;,
		&quot;default_title&quot;: &quot;&#x6211;&#x662F;pageAction&quot;,
		&quot;default_popup&quot;: &quot;popup.html&quot;
	},
	&quot;permissions&quot;: [&quot;declarativeContent&quot;]
}

// background.js
chrome.runtime.onInstalled.addListener(function(){
	chrome.declarativeContent.onPageChanged.removeRules(undefined, function(){
		chrome.declarativeContent.onPageChanged.addRules([
			{
				conditions: [
					// &#x53EA;&#x6709;&#x6253;&#x5F00;&#x767E;&#x5EA6;&#x624D;&#x663E;&#x793A;pageAction
					new chrome.declarativeContent.PageStateMatcher({pageUrl: {urlContains: &apos;baidu.com&apos;}})
				],
				actions: [new chrome.declarativeContent.ShowPageAction()]
			}
		]);
	});
});
</code></pre><p>&#x6548;&#x679C;&#x56FE;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101633728-1835819108.gif" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h2 id="53-%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95"><strong>5.3. &#x53F3;&#x952E;&#x83DC;&#x5355;</strong></h2><p>&#x901A;&#x8FC7;&#x5F00;&#x53D1;Chrome&#x63D2;&#x4EF6;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x53F3;&#x952E;&#x83DC;&#x5355;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x901A;&#x8FC7;<code>chrome.contextMenus</code>API&#x5B9E;&#x73B0;&#xFF0C;&#x53F3;&#x952E;&#x83DC;&#x5355;&#x53EF;&#x4EE5;&#x51FA;&#x73B0;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#xFF0C;&#x6BD4;&#x5982;&#x666E;&#x901A;&#x9875;&#x9762;&#x3001;&#x9009;&#x4E2D;&#x7684;&#x6587;&#x5B57;&#x3001;&#x56FE;&#x7247;&#x3001;&#x94FE;&#x63A5;&#xFF0C;&#x7B49;&#x7B49;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x540C;&#x4E00;&#x4E2A;&#x63D2;&#x4EF6;&#x91CC;&#x9762;&#x5B9A;&#x4E49;&#x4E86;&#x591A;&#x4E2A;&#x83DC;&#x5355;&#xFF0C;Chrome&#x4F1A;&#x81EA;&#x52A8;&#x7EC4;&#x5408;&#x653E;&#x5230;&#x4EE5;&#x63D2;&#x4EF6;&#x540D;&#x5B57;&#x547D;&#x540D;&#x7684;&#x4E8C;&#x7EA7;&#x83DC;&#x5355;&#x91CC;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101651618-268310284.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h3 id="531-%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E7%A4%BA%E4%BE%8B"><strong>5.3.1. &#x6700;&#x7B80;&#x5355;&#x7684;&#x53F3;&#x952E;&#x83DC;&#x5355;&#x793A;&#x4F8B;</strong></h3><pre><code class="language-javascript">// manifest.json
{&quot;permissions&quot;: [&quot;contextMenus&quot;]}

// background.js
chrome.contextMenus.create({
	title: &quot;&#x6D4B;&#x8BD5;&#x53F3;&#x952E;&#x83DC;&#x5355;&quot;,
	onclick: function(){alert(&apos;&#x60A8;&#x70B9;&#x51FB;&#x4E86;&#x53F3;&#x952E;&#x83DC;&#x5355;&#xFF01;&apos;);}
});
</code></pre><p>&#x6548;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101704775-1000780193.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h3 id="532-%E6%B7%BB%E5%8A%A0%E5%8F%B3%E9%94%AE%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2"><strong>5.3.2. &#x6DFB;&#x52A0;&#x53F3;&#x952E;&#x767E;&#x5EA6;&#x641C;&#x7D22;</strong></h3><pre><code class="language-javascript">// manifest.json
{&quot;permissions&quot;: [&quot;contextMenus&quot;&#xFF0C; &quot;tabs&quot;]}

// background.js
chrome.contextMenus.create({
	title: &apos;&#x4F7F;&#x7528;&#x5EA6;&#x5A18;&#x641C;&#x7D22;&#xFF1A;%s&apos;, // %s&#x8868;&#x793A;&#x9009;&#x4E2D;&#x7684;&#x6587;&#x5B57;
	contexts: [&apos;selection&apos;], // &#x53EA;&#x6709;&#x5F53;&#x9009;&#x4E2D;&#x6587;&#x5B57;&#x65F6;&#x624D;&#x4F1A;&#x51FA;&#x73B0;&#x6B64;&#x53F3;&#x952E;&#x83DC;&#x5355;
	onclick: function(params)
	{
		// &#x6CE8;&#x610F;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;location.href&#xFF0C;&#x56E0;&#x4E3A;location&#x662F;&#x5C5E;&#x4E8E;background&#x7684;window&#x5BF9;&#x8C61;
		chrome.tabs.create({url: &apos;https://www.baidu.com/s?ie=utf-8&amp;wd=&apos; + encodeURI(params.selectionText)});
	}
});
</code></pre><p>&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101721384-916526079.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h3 id="533-%E8%AF%AD%E6%B3%95%E8%AF%B4%E6%98%8E"><strong>5.3.3. &#x8BED;&#x6CD5;&#x8BF4;&#x660E;</strong></h3><p>&#x8FD9;&#x91CC;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5217;&#x4E3E;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#xFF0C;&#x5B8C;&#x6574;API&#x53C2;&#x89C1;&#xFF1A;<a href="https://developer.chrome.com/extensions/contextMenus">https://developer.chrome.com/extensions/contextMenus</a></p><pre><code class="language-javascript">chrome.contextMenus.create({
	type: &apos;normal&apos;&#xFF0C; // &#x7C7B;&#x578B;&#xFF0C;&#x53EF;&#x9009;&#xFF1A;[&quot;normal&quot;, &quot;checkbox&quot;, &quot;radio&quot;, &quot;separator&quot;]&#xFF0C;&#x9ED8;&#x8BA4; normal
	title: &apos;&#x83DC;&#x5355;&#x7684;&#x540D;&#x5B57;&apos;, // &#x663E;&#x793A;&#x7684;&#x6587;&#x5B57;&#xFF0C;&#x9664;&#x975E;&#x4E3A;&#x201C;separator&#x201D;&#x7C7B;&#x578B;&#x5426;&#x5219;&#x6B64;&#x53C2;&#x6570;&#x5FC5;&#x9700;&#xFF0C;&#x5982;&#x679C;&#x7C7B;&#x578B;&#x4E3A;&#x201C;selection&#x201D;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;%s&#x663E;&#x793A;&#x9009;&#x5B9A;&#x7684;&#x6587;&#x672C;
	contexts: [&apos;page&apos;], // &#x4E0A;&#x4E0B;&#x6587;&#x73AF;&#x5883;&#xFF0C;&#x53EF;&#x9009;&#xFF1A;[&quot;all&quot;, &quot;page&quot;, &quot;frame&quot;, &quot;selection&quot;, &quot;link&quot;, &quot;editable&quot;, &quot;image&quot;, &quot;video&quot;, &quot;audio&quot;]&#xFF0C;&#x9ED8;&#x8BA4;page
	onclick: function(){}, // &#x5355;&#x51FB;&#x65F6;&#x89E6;&#x53D1;&#x7684;&#x65B9;&#x6CD5;
	parentId: 1, // &#x53F3;&#x952E;&#x83DC;&#x5355;&#x9879;&#x7684;&#x7236;&#x83DC;&#x5355;&#x9879;ID&#x3002;&#x6307;&#x5B9A;&#x7236;&#x83DC;&#x5355;&#x9879;&#x5C06;&#x4F1A;&#x4F7F;&#x6B64;&#x83DC;&#x5355;&#x9879;&#x6210;&#x4E3A;&#x7236;&#x83DC;&#x5355;&#x9879;&#x7684;&#x5B50;&#x83DC;&#x5355;
	documentUrlPatterns: &apos;https://*.baidu.com/*&apos; // &#x53EA;&#x5728;&#x67D0;&#x4E9B;&#x9875;&#x9762;&#x663E;&#x793A;&#x6B64;&#x53F3;&#x952E;&#x83DC;&#x5355;
});
// &#x5220;&#x9664;&#x67D0;&#x4E00;&#x4E2A;&#x83DC;&#x5355;&#x9879;
chrome.contextMenus.remove(menuItemId)&#xFF1B;
// &#x5220;&#x9664;&#x6240;&#x6709;&#x81EA;&#x5B9A;&#x4E49;&#x53F3;&#x952E;&#x83DC;&#x5355;
chrome.contextMenus.removeAll();
// &#x66F4;&#x65B0;&#x67D0;&#x4E00;&#x4E2A;&#x83DC;&#x5355;&#x9879;
chrome.contextMenus.update(menuItemId, updateProperties);
</code></pre><h2 id="54-override%E8%A6%86%E7%9B%96%E7%89%B9%E5%AE%9A%E9%A1%B5%E9%9D%A2"><strong>5.4. override(&#x8986;&#x76D6;&#x7279;&#x5B9A;&#x9875;&#x9762;)</strong></h2><p>&#x4F7F;&#x7528;<code>override</code>&#x9875;&#x53EF;&#x4EE5;&#x5C06;Chrome&#x9ED8;&#x8BA4;&#x7684;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x9875;&#x9762;&#x66FF;&#x6362;&#x6389;&#xFF0C;&#x6539;&#x4E3A;&#x4F7F;&#x7528;&#x6269;&#x5C55;&#x63D0;&#x4F9B;&#x7684;&#x9875;&#x9762;&#x3002;</p><p>&#x6269;&#x5C55;&#x53EF;&#x4EE5;&#x66FF;&#x4EE3;&#x5982;&#x4E0B;&#x9875;&#x9762;&#xFF1A;</p><ul><li>&#x5386;&#x53F2;&#x8BB0;&#x5F55;&#xFF1A;&#x4ECE;&#x5DE5;&#x5177;&#x83DC;&#x5355;&#x4E0A;&#x70B9;&#x51FB;&#x5386;&#x53F2;&#x8BB0;&#x5F55;&#x65F6;&#x8BBF;&#x95EE;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x6216;&#x8005;&#x4ECE;&#x5730;&#x5740;&#x680F;&#x76F4;&#x63A5;&#x8F93;&#x5165; <a>chrome://history</a></li><li>&#x65B0;&#x6807;&#x7B7E;&#x9875;&#xFF1A;&#x5F53;&#x521B;&#x5EFA;&#x65B0;&#x6807;&#x7B7E;&#x7684;&#x65F6;&#x5019;&#x8BBF;&#x95EE;&#x7684;&#x9875;&#x9762;&#xFF0C;&#x6216;&#x8005;&#x4ECE;&#x5730;&#x5740;&#x680F;&#x76F4;&#x63A5;&#x8F93;&#x5165; <a>chrome://newtab</a></li><li>&#x4E66;&#x7B7E;&#xFF1A;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4E66;&#x7B7E;&#xFF0C;&#x6216;&#x8005;&#x76F4;&#x63A5;&#x8F93;&#x5165; <a>chrome://bookmarks</a></li></ul><p>&#x6CE8;&#x610F;&#xFF1A;</p><ul><li>&#x4E00;&#x4E2A;&#x6269;&#x5C55;&#x53EA;&#x80FD;&#x66FF;&#x4EE3;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#xFF1B;</li><li>&#x4E0D;&#x80FD;&#x66FF;&#x4EE3;&#x9690;&#x8EAB;&#x7A97;&#x53E3;&#x7684;&#x65B0;&#x6807;&#x7B7E;&#x9875;&#xFF1B;</li><li>&#x7F51;&#x9875;&#x5FC5;&#x987B;&#x8BBE;&#x7F6E;title&#xFF0C;&#x5426;&#x5219;&#x7528;&#x6237;&#x53EF;&#x80FD;&#x4F1A;&#x770B;&#x5230;&#x7F51;&#x9875;&#x7684;URL&#xFF0C;&#x9020;&#x6210;&#x56F0;&#x6270;&#xFF1B;</li></ul><p>&#x4E0B;&#x9762;&#x7684;&#x622A;&#x56FE;&#x662F;&#x9ED8;&#x8BA4;&#x7684;&#x65B0;&#x6807;&#x7B7E;&#x9875;&#x548C;&#x88AB;&#x6269;&#x5C55;&#x66FF;&#x6362;&#x6389;&#x7684;&#x65B0;&#x6807;&#x7B7E;&#x9875;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101740947-1059479610.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x4EE3;&#x7801;&#xFF08;&#x6CE8;&#x610F;&#xFF0C;&#x4E00;&#x4E2A;&#x63D2;&#x4EF6;&#x53EA;&#x80FD;&#x66FF;&#x4EE3;&#x4E00;&#x4E2A;&#x9ED8;&#x8BA4;&#x9875;&#xFF0C;&#x4EE5;&#x4E0B;&#x4EC5;&#x4E3A;&#x6F14;&#x793A;&#xFF09;&#xFF1A;</p><pre><code class="language-javascript">&quot;chrome_url_overrides&quot;:
{
	&quot;newtab&quot;: &quot;newtab.html&quot;,
	&quot;history&quot;: &quot;history.html&quot;,
	&quot;bookmarks&quot;: &quot;bookmarks.html&quot;
}
</code></pre><h2 id="55-devtools%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7"><strong>5.5. devtools(&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;)</strong></h2><h3 id="551-%E9%A2%84%E7%83%AD"><strong>5.5.1. &#x9884;&#x70ED;</strong></h3><p>&#x4F7F;&#x7528;&#x8FC7;vue&#x7684;&#x5E94;&#x8BE5;&#x89C1;&#x8FC7;&#x8FD9;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x63D2;&#x4EF6;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101756868-1307680533.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x662F;&#x7684;&#xFF0C;Chrome&#x5141;&#x8BB8;&#x63D2;&#x4EF6;&#x5728;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;(devtools)&#x4E0A;&#x52A8;&#x624B;&#x811A;&#xFF0C;&#x4E3B;&#x8981;&#x8868;&#x73B0;&#x5728;&#xFF1A;</p><ul><li>&#x81EA;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x548C;&#x591A;&#x4E2A;&#x548C;<code>Elements</code>&#x3001;<code>Console</code>&#x3001;<code>Sources</code>&#x7B49;&#x540C;&#x7EA7;&#x522B;&#x7684;&#x9762;&#x677F;&#xFF1B;</li><li>&#x81EA;&#x5B9A;&#x4E49;&#x4FA7;&#x8FB9;&#x680F;(sidebar)&#xFF0C;&#x76EE;&#x524D;&#x53EA;&#x80FD;&#x81EA;&#x5B9A;&#x4E49;<code>Elements</code>&#x9762;&#x677F;&#x7684;&#x4FA7;&#x8FB9;&#x680F;&#xFF1B;</li></ul><p>&#x5148;&#x6765;&#x770B;2&#x5F20;&#x7B80;&#x5355;&#x7684;demo&#x622A;&#x56FE;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;&#x9762;&#x677F;&#xFF08;&#x5224;&#x65AD;&#x5F53;&#x524D;&#x9875;&#x9762;&#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E86;jQuery&#xFF09;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101815243-1381068889.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x81EA;&#x5B9A;&#x4E49;&#x4FA7;&#x8FB9;&#x680F;&#xFF08;&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x9875;&#x9762;&#x6240;&#x6709;&#x56FE;&#x7247;&#xFF09;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101832259-552804777.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h3 id="552-devtools%E6%89%A9%E5%B1%95%E4%BB%8B%E7%BB%8D"><strong>5.5.2. devtools&#x6269;&#x5C55;&#x4ECB;&#x7ECD;</strong></h3><p>&#x4E3B;&#x9875;&#xFF1A;<a href="https://developer.chrome.com/extensions/devtools">https://developer.chrome.com/extensions/devtools</a></p><p>&#x6765;&#x4E00;&#x5F20;&#x5B98;&#x65B9;&#x56FE;&#x7247;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101847493-273760238.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x6BCF;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x7A97;&#x53E3;&#xFF0C;&#x90FD;&#x4F1A;&#x521B;&#x5EFA;devtools&#x9875;&#x9762;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;F12&#x7A97;&#x53E3;&#x5173;&#x95ED;&#xFF0C;&#x9875;&#x9762;&#x4E5F;&#x968F;&#x7740;&#x5173;&#x95ED;&#xFF0C;&#x6240;&#x4EE5;devtools&#x9875;&#x9762;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x548C;devtools&#x7A97;&#x53E3;&#x662F;&#x4E00;&#x81F4;&#x7684;&#x3002;devtools&#x9875;&#x9762;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x4E00;&#x7EC4;&#x7279;&#x6709;&#x7684;<code>DevTools API</code>&#x4EE5;&#x53CA;&#x6709;&#x9650;&#x7684;&#x6269;&#x5C55;API&#xFF0C;&#x8FD9;&#x7EC4;&#x7279;&#x6709;&#x7684;<code>DevTools API</code>&#x53EA;&#x6709;devtools&#x9875;&#x9762;&#x624D;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#xFF0C;background&#x90FD;&#x65E0;&#x6743;&#x8BBF;&#x95EE;&#xFF0C;&#x8FD9;&#x4E9B;API&#x5305;&#x62EC;&#xFF1A;</p><ul><li><code>chrome.devtools.panels</code>&#xFF1A;&#x9762;&#x677F;&#x76F8;&#x5173;&#xFF1B;</li><li><code>chrome.devtools.inspectedWindow</code>&#xFF1A;&#x83B7;&#x53D6;&#x88AB;&#x5BA1;&#x67E5;&#x7A97;&#x53E3;&#x7684;&#x6709;&#x5173;&#x4FE1;&#x606F;&#xFF1B;</li><li><code>chrome.devtools.network</code>&#xFF1A;&#x83B7;&#x53D6;&#x6709;&#x5173;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x4FE1;&#x606F;&#xFF1B;</li></ul><p>&#x5927;&#x90E8;&#x5206;&#x6269;&#x5C55;API&#x90FD;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x88AB;<code>DevTools</code>&#x9875;&#x9762;&#x8C03;&#x7528;&#xFF0C;&#x4F46;&#x5B83;&#x53EF;&#x4EE5;&#x50CF;<code>content-script</code>&#x4E00;&#x6837;&#x76F4;&#x63A5;&#x8C03;&#x7528;<code>chrome.extension</code>&#x548C;<code>chrome.runtime</code>API&#xFF0C;&#x540C;&#x65F6;&#x5B83;&#x4E5F;&#x53EF;&#x4EE5;&#x50CF;<code>content-script</code>&#x4E00;&#x6837;&#x4F7F;&#x7528;Message&#x4EA4;&#x4E92;&#x7684;&#x65B9;&#x5F0F;&#x4E0E;background&#x9875;&#x9762;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x3002;</p><h3 id="553-%E5%AE%9E%E4%BE%8B%EF%BC%9A%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAdevtools%E6%89%A9%E5%B1%95"><strong>5.5.3. &#x5B9E;&#x4F8B;&#xFF1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;devtools&#x6269;&#x5C55;</strong></h3><p>&#x9996;&#x5148;&#xFF0C;&#x8981;&#x9488;&#x5BF9;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x5F00;&#x53D1;&#x63D2;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#x58F0;&#x660E;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-javascript">{
	// &#x53EA;&#x80FD;&#x6307;&#x5411;&#x4E00;&#x4E2A;HTML&#x6587;&#x4EF6;&#xFF0C;&#x4E0D;&#x80FD;&#x662F;JS&#x6587;&#x4EF6;
	&quot;devtools_page&quot;: &quot;devtools.html&quot;
}
</code></pre><p>&#x8FD9;&#x4E2A;<code>devtools.html</code>&#x91CC;&#x9762;&#x4E00;&#x822C;&#x4EC0;&#x4E48;&#x90FD;&#x6CA1;&#x6709;&#xFF0C;&#x5C31;&#x5F15;&#x5165;&#x4E00;&#x4E2A;js&#xFF1A;</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;js/devtools.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x6765;&#xFF0C;&#x5176;&#x5B9E;&#x771F;&#x6B63;&#x4EE3;&#x7801;&#x662F;<code>devtools.js</code>&#xFF0C;html&#x6587;&#x4EF6;&#x662F;&#x201C;&#x591A;&#x4F59;&#x201D;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x89C9;&#x5F97;&#x6709;&#x70B9;&#x5751;&#xFF0C;<code>devtools_page</code>&#x5E72;&#x561B;&#x4E0D;&#x5141;&#x8BB8;&#x76F4;&#x63A5;&#x6307;&#x5B9A;JS&#x5462;&#xFF1F;</p><p>&#x518D;&#x6765;&#x770B;devtools.js&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p><pre><code class="language-javascript">// &#x521B;&#x5EFA;&#x81EA;&#x5B9A;&#x4E49;&#x9762;&#x677F;&#xFF0C;&#x540C;&#x4E00;&#x4E2A;&#x63D2;&#x4EF6;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x591A;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x9762;&#x677F;
// &#x51E0;&#x4E2A;&#x53C2;&#x6570;&#x4F9D;&#x6B21;&#x4E3A;&#xFF1A;panel&#x6807;&#x9898;&#x3001;&#x56FE;&#x6807;&#xFF08;&#x5176;&#x5B9E;&#x8BBE;&#x7F6E;&#x4E86;&#x4E5F;&#x6CA1;&#x5730;&#x65B9;&#x663E;&#x793A;&#xFF09;&#x3001;&#x8981;&#x52A0;&#x8F7D;&#x7684;&#x9875;&#x9762;&#x3001;&#x52A0;&#x8F7D;&#x6210;&#x529F;&#x540E;&#x7684;&#x56DE;&#x8C03;
chrome.devtools.panels.create(&apos;MyPanel&apos;, &apos;img/icon.png&apos;, &apos;mypanel.html&apos;, function(panel)
{
	console.log(&apos;&#x81EA;&#x5B9A;&#x4E49;&#x9762;&#x677F;&#x521B;&#x5EFA;&#x6210;&#x529F;&#xFF01;&apos;); // &#x6CE8;&#x610F;&#x8FD9;&#x4E2A;log&#x4E00;&#x822C;&#x770B;&#x4E0D;&#x5230;
});

// &#x521B;&#x5EFA;&#x81EA;&#x5B9A;&#x4E49;&#x4FA7;&#x8FB9;&#x680F;
chrome.devtools.panels.elements.createSidebarPane(&quot;Images&quot;, function(sidebar)
{
	// sidebar.setPage(&apos;../sidebar.html&apos;); // &#x6307;&#x5B9A;&#x52A0;&#x8F7D;&#x67D0;&#x4E2A;&#x9875;&#x9762;
	sidebar.setExpression(&apos;document.querySelectorAll(&quot;img&quot;)&apos;, &apos;All Images&apos;); // &#x901A;&#x8FC7;&#x8868;&#x8FBE;&#x5F0F;&#x6765;&#x6307;&#x5B9A;
	//sidebar.setObject({aaa: 111, bbb: &apos;Hello World!&apos;}); // &#x76F4;&#x63A5;&#x8BBE;&#x7F6E;&#x663E;&#x793A;&#x67D0;&#x4E2A;&#x5BF9;&#x8C61;
});
</code></pre><p>setPage&#x65F6;&#x7684;&#x6548;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101903837-2079245455.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x4EE5;&#x4E0B;&#x622A;&#x56FE;&#x793A;&#x4F8B;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101928103-1093454821.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><pre><code class="language-javascript">// &#x68C0;&#x6D4B;jQuery
document.getElementById(&apos;check_jquery&apos;).addEventListener(&apos;click&apos;, function()
{
	// &#x8BBF;&#x95EE;&#x88AB;&#x68C0;&#x67E5;&#x7684;&#x9875;&#x9762;DOM&#x9700;&#x8981;&#x4F7F;&#x7528;inspectedWindow
	// &#x7B80;&#x5355;&#x4F8B;&#x5B50;&#xFF1A;&#x68C0;&#x6D4B;&#x88AB;&#x68C0;&#x67E5;&#x9875;&#x9762;&#x662F;&#x5426;&#x4F7F;&#x7528;&#x4E86;jQuery
	chrome.devtools.inspectedWindow.eval(&quot;jQuery.fn.jquery&quot;, function(result, isException)
	{
		var html = &apos;&apos;;
		if (isException) html = &apos;&#x5F53;&#x524D;&#x9875;&#x9762;&#x6CA1;&#x6709;&#x4F7F;&#x7528;jQuery&#x3002;&apos;;
		else html = &apos;&#x5F53;&#x524D;&#x9875;&#x9762;&#x4F7F;&#x7528;&#x4E86;jQuery&#xFF0C;&#x7248;&#x672C;&#x4E3A;&#xFF1A;&apos;+result;
		alert(html);
	});
});

// &#x6253;&#x5F00;&#x67D0;&#x4E2A;&#x8D44;&#x6E90;
document.getElementById(&apos;open_resource&apos;).addEventListener(&apos;click&apos;, function()
{
	chrome.devtools.inspectedWindow.eval(&quot;window.location.href&quot;, function(result, isException)
	{
		chrome.devtools.panels.openResource(result, 20, function()
		{
			console.log(&apos;&#x8D44;&#x6E90;&#x6253;&#x5F00;&#x6210;&#x529F;&#xFF01;&apos;);
		});
	});
});

// &#x5BA1;&#x67E5;&#x5143;&#x7D20;
document.getElementById(&apos;test_inspect&apos;).addEventListener(&apos;click&apos;, function()
{
	chrome.devtools.inspectedWindow.eval(&quot;inspect(document.images[0])&quot;, function(result, isException){});
});

// &#x83B7;&#x53D6;&#x6240;&#x6709;&#x8D44;&#x6E90;
document.getElementById(&apos;get_all_resources&apos;).addEventListener(&apos;click&apos;, function()
{
	chrome.devtools.inspectedWindow.getResources(function(resources)
	{
		alert(JSON.stringify(resources));
	});
});
</code></pre><h3 id="554-%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7"><strong>5.5.4. &#x8C03;&#x8BD5;&#x6280;&#x5DE7;</strong></h3><p>&#x4FEE;&#x6539;&#x4E86;devtools&#x9875;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x5728; chrome://extensions &#x9875;&#x9762;&#x6309;&#x4E0B;<code>Ctrl+R</code>&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x63D2;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5173;&#x95ED;&#x518D;&#x6253;&#x5F00;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x5373;&#x53EF;&#xFF0C;&#x65E0;&#x9700;&#x5237;&#x65B0;&#x9875;&#x9762;&#xFF08;&#x800C;&#x4E14;&#x53EA;&#x5237;&#x65B0;&#x9875;&#x9762;&#x4E0D;&#x5237;&#x65B0;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x7684;&#x8BDD;&#x662F;&#x4E0D;&#x4F1A;&#x751F;&#x6548;&#x7684;&#xFF09;&#x3002;</p><p>&#x7531;&#x4E8E;devtools&#x672C;&#x8EAB;&#x5C31;&#x662F;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x9875;&#x9762;&#xFF0C;&#x6240;&#x4EE5;&#x51E0;&#x4E4E;&#x6CA1;&#x6709;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8C03;&#x8BD5;&#x5B83;&#xFF0C;&#x76F4;&#x63A5;&#x7528; <code>chrome-extension://extid/devtools.html&quot;</code>&#x7684;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#x9875;&#x9762;&#x80AF;&#x5B9A;&#x62A5;&#x9519;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0D;&#x652F;&#x6301;&#x76F8;&#x5173;&#x7279;&#x6B8A;API&#xFF0C;&#x53EA;&#x80FD;&#x5148;&#x81EA;&#x5DF1;&#x5199;&#x4E00;&#x4E9B;&#x65B9;&#x6CD5;&#x5C4F;&#x853D;&#x8FD9;&#x4E9B;&#x9519;&#x8BEF;&#xFF0C;&#x8C03;&#x8BD5;&#x901A;&#x4E86;&#x518D;&#x653E;&#x5F00;&#x3002;</p><h2 id="56-option%E9%80%89%E9%A1%B9%E9%A1%B5"><strong>5.6. option(&#x9009;&#x9879;&#x9875;)</strong></h2><p>&#x6240;&#x8C13;<code>options</code>&#x9875;&#xFF0C;&#x5C31;&#x662F;&#x63D2;&#x4EF6;&#x7684;&#x8BBE;&#x7F6E;&#x9875;&#x9762;&#xFF0C;&#x6709;2&#x4E2A;&#x5165;&#x53E3;&#xFF0C;&#x4E00;&#x4E2A;&#x662F;&#x53F3;&#x952E;&#x56FE;&#x6807;&#x6709;&#x4E00;&#x4E2A;&#x201C;&#x9009;&#x9879;&#x201D;&#x83DC;&#x5355;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x5728;&#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x9762;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711101949603-1425351182.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102004775-83441694.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x5728;Chrome40&#x4EE5;&#x524D;&#xFF0C;options&#x9875;&#x9762;&#x548C;&#x5176;&#x5B83;&#x666E;&#x901A;&#x9875;&#x9762;&#x6CA1;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#xFF0C;Chrome40&#x4EE5;&#x540E;&#x5219;&#x6709;&#x4E86;&#x4E00;&#x4E9B;&#x53D8;&#x5316;&#x3002;</p><p>&#x6211;&#x4EEC;&#x5148;&#x770B;&#x8001;&#x7248;&#x7684;<a href="https://developer.chrome.com/extensions/options">options</a>&#xFF1A;</p><pre><code class="language-javascript">{
	// Chrome40&#x4EE5;&#x524D;&#x7684;&#x63D2;&#x4EF6;&#x914D;&#x7F6E;&#x9875;&#x5199;&#x6CD5;
	&quot;options_page&quot;: &quot;options.html&quot;,
}
</code></pre><p>&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x968F;&#x4F60;&#x81EA;&#x5DF1;&#x53D1;&#x6325;&#x4E86;&#xFF0C;&#x914D;&#x7F6E;&#x4E4B;&#x540E;&#x5728;&#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x5C31;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x4E2A;<code>&#x9009;&#x9879;</code>&#x6309;&#x94AE;&#x5165;&#x53E3;&#xFF0C;&#x70B9;&#x8FDB;&#x53BB;&#x5C31;&#x662F;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x7F51;&#x9875;&#xFF0C;&#x6CA1;&#x5565;&#x597D;&#x8BB2;&#x7684;&#x3002;</p><p>&#x6548;&#x679C;:</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102020962-228055231.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x518D;&#x6765;&#x770B;&#x65B0;&#x7248;&#x7684;<a href="https://developer.chrome.com/extensions/optionsV2">optionsV2</a>&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;options_ui&quot;:
	{
    	&quot;page&quot;: &quot;options.html&quot;,
		// &#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x9ED8;&#x8BA4;&#x7684;&#x6837;&#x5F0F;&#xFF0C;&#x63A8;&#x8350;&#x4F7F;&#x7528;
    	&quot;chrome_style&quot;: true
	},
}
</code></pre><p><code>options.html</code>&#x7684;&#x4EE3;&#x7801;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x6539;&#x52A8;&#xFF0C;&#x53EA;&#x662F;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6539;&#x4E86;&#xFF0C;&#x4E4B;&#x540E;&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102036665-607005369.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x770B;&#x8D77;&#x6765;&#x662F;&#x4E0D;&#x662F;&#x9AD8;&#x5927;&#x4E0A;&#x4E86;&#xFF1F;</p><p>&#x51E0;&#x70B9;&#x6CE8;&#x610F;&#xFF1A;</p><ul><li>&#x4E3A;&#x4E86;&#x517C;&#x5BB9;&#xFF0C;&#x5EFA;&#x8BAE;2&#x79CD;&#x90FD;&#x5199;&#xFF0C;&#x5982;&#x679C;&#x90FD;&#x5199;&#x4E86;&#xFF0C;Chrome40&#x4EE5;&#x540E;&#x4F1A;&#x9ED8;&#x8BA4;&#x8BFB;&#x53D6;&#x65B0;&#x7248;&#x7684;&#x65B9;&#x5F0F;&#xFF1B;</li><li>&#x65B0;&#x7248;options&#x4E2D;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;alert&#xFF1B;</li><li>&#x6570;&#x636E;&#x5B58;&#x50A8;&#x5EFA;&#x8BAE;&#x7528;chrome.storage&#xFF0C;&#x56E0;&#x4E3A;&#x4F1A;&#x968F;&#x7528;&#x6237;&#x81EA;&#x52A8;&#x540C;&#x6B65;&#xFF1B;</li></ul><h2 id="57-omnibox"><strong>5.7. omnibox</strong></h2><p><code>omnibox</code>&#x662F;&#x5411;&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x641C;&#x7D22;&#x5EFA;&#x8BAE;&#x7684;&#x4E00;&#x79CD;&#x65B9;&#x5F0F;&#x3002;&#x5148;&#x6765;&#x770B;&#x4E2A;<code>gif</code>&#x56FE;&#x4EE5;&#x4FBF;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x8FD9;&#x4E1C;&#x897F;&#x5230;&#x5E95;&#x662F;&#x4E2A;&#x4EC0;&#x4E48;&#x9B3C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102052275-866111894.gif" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x6CE8;&#x518C;&#x67D0;&#x4E2A;&#x5173;&#x952E;&#x5B57;&#x4EE5;&#x89E6;&#x53D1;&#x63D2;&#x4EF6;&#x81EA;&#x5DF1;&#x7684;&#x641C;&#x7D22;&#x5EFA;&#x8BAE;&#x754C;&#x9762;&#xFF0C;&#x7136;&#x540E;&#x53EF;&#x4EE5;&#x4EFB;&#x610F;&#x53D1;&#x6325;&#x4E86;&#x3002;</p><p>&#x9996;&#x5148;&#xFF0C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-javascript">{
	// &#x5411;&#x5730;&#x5740;&#x680F;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5B57;&#x4EE5;&#x63D0;&#x4F9B;&#x641C;&#x7D22;&#x5EFA;&#x8BAE;&#xFF0C;&#x53EA;&#x80FD;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5B57;
	&quot;omnibox&quot;: { &quot;keyword&quot; : &quot;go&quot; },
}
</code></pre><p>&#x7136;&#x540E;<code>background.js</code>&#x4E2D;&#x6CE8;&#x518C;&#x76D1;&#x542C;&#x4E8B;&#x4EF6;&#xFF1A;</p><pre><code class="language-javascript">// omnibox &#x6F14;&#x793A;
chrome.omnibox.onInputChanged.addListener((text, suggest) =&gt; {
	console.log(&apos;inputChanged: &apos; + text);
	if(!text) return;
	if(text == &apos;&#x7F8E;&#x5973;&apos;) {
		suggest([
			{content: &apos;&#x4E2D;&#x56FD;&apos; + text, description: &apos;&#x4F60;&#x8981;&#x627E;&#x201C;&#x4E2D;&#x56FD;&#x7F8E;&#x5973;&#x201D;&#x5417;&#xFF1F;&apos;},
			{content: &apos;&#x65E5;&#x672C;&apos; + text, description: &apos;&#x4F60;&#x8981;&#x627E;&#x201C;&#x65E5;&#x672C;&#x7F8E;&#x5973;&#x201D;&#x5417;&#xFF1F;&apos;},
			{content: &apos;&#x6CF0;&#x56FD;&apos; + text, description: &apos;&#x4F60;&#x8981;&#x627E;&#x201C;&#x6CF0;&#x56FD;&#x7F8E;&#x5973;&#x6216;&#x4EBA;&#x5996;&#x201D;&#x5417;&#xFF1F;&apos;},
			{content: &apos;&#x97E9;&#x56FD;&apos; + text, description: &apos;&#x4F60;&#x8981;&#x627E;&#x201C;&#x97E9;&#x56FD;&#x7F8E;&#x5973;&#x201D;&#x5417;&#xFF1F;&apos;}
		]);
	}
	else if(text == &apos;&#x5FAE;&#x535A;&apos;) {
		suggest([
			{content: &apos;&#x65B0;&#x6D6A;&apos; + text, description: &apos;&#x65B0;&#x6D6A;&apos; + text},
			{content: &apos;&#x817E;&#x8BAF;&apos; + text, description: &apos;&#x817E;&#x8BAF;&apos; + text},
			{content: &apos;&#x641C;&#x72D0;&apos; + text, description: &apos;&#x641C;&#x7D22;&apos; + text},
		]);
	}
	else {
		suggest([
			{content: &apos;&#x767E;&#x5EA6;&#x641C;&#x7D22; &apos; + text, description: &apos;&#x767E;&#x5EA6;&#x641C;&#x7D22; &apos; + text},
			{content: &apos;&#x8C37;&#x6B4C;&#x641C;&#x7D22; &apos; + text, description: &apos;&#x8C37;&#x6B4C;&#x641C;&#x7D22; &apos; + text},
		]);
	}
});

// &#x5F53;&#x7528;&#x6237;&#x63A5;&#x6536;&#x5173;&#x952E;&#x5B57;&#x5EFA;&#x8BAE;&#x65F6;&#x89E6;&#x53D1;
chrome.omnibox.onInputEntered.addListener((text) =&gt; {
    console.log(&apos;inputEntered: &apos; + text);
	if(!text) return;
	var href = &apos;&apos;;
    if(text.endsWith(&apos;&#x7F8E;&#x5973;&apos;)) href = &apos;http://image.baidu.com/search/index?tn=baiduimage&amp;ie=utf-8&amp;word=&apos; + text;
	else if(text.startsWith(&apos;&#x767E;&#x5EA6;&#x641C;&#x7D22;&apos;)) href = &apos;https://www.baidu.com/s?ie=UTF-8&amp;wd=&apos; + text.replace(&apos;&#x767E;&#x5EA6;&#x641C;&#x7D22; &apos;, &apos;&apos;);
	else if(text.startsWith(&apos;&#x8C37;&#x6B4C;&#x641C;&#x7D22;&apos;)) href = &apos;https://www.google.com.tw/search?q=&apos; + text.replace(&apos;&#x8C37;&#x6B4C;&#x641C;&#x7D22; &apos;, &apos;&apos;);
	else href = &apos;https://www.baidu.com/s?ie=UTF-8&amp;wd=&apos; + text;
	openUrlCurrentTab(href);
});
// &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x9009;&#x9879;&#x5361;ID
function getCurrentTabId(callback)
{
	chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
	{
		if(callback) callback(tabs.length ? tabs[0].id: null);
	});
}

// &#x5F53;&#x524D;&#x6807;&#x7B7E;&#x6253;&#x5F00;&#x67D0;&#x4E2A;&#x94FE;&#x63A5;
function openUrlCurrentTab(url)
{
	getCurrentTabId(tabId =&gt; {
		chrome.tabs.update(tabId, {url: url});
	})
}
</code></pre><h2 id="58-%E6%A1%8C%E9%9D%A2%E9%80%9A%E7%9F%A5"><strong>5.8. &#x684C;&#x9762;&#x901A;&#x77E5;</strong></h2><p>Chrome&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;<code>chrome.notifications</code>API&#x4EE5;&#x4FBF;&#x63D2;&#x4EF6;&#x63A8;&#x9001;&#x684C;&#x9762;&#x901A;&#x77E5;&#xFF0C;&#x6682;&#x672A;&#x627E;&#x5230;<code>chrome.notifications</code>&#x548C;HTML5&#x81EA;&#x5E26;&#x7684;<code>Notification</code>&#x7684;&#x663E;&#x8457;&#x533A;&#x522B;&#x53CA;&#x4F18;&#x52BF;&#x3002;</p><p>&#x5728;&#x540E;&#x53F0;JS&#x4E2D;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x4F7F;&#x7528;<code>chrome.notifications</code>&#x8FD8;&#x662F;<code>Notification</code>&#x90FD;&#x4E0D;&#x9700;&#x8981;&#x7533;&#x8BF7;&#x6743;&#x9650;&#xFF08;HTML5&#x65B9;&#x5F0F;&#x9700;&#x8981;&#x7533;&#x8BF7;&#x6743;&#x9650;&#xFF09;&#xFF0C;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x5373;&#x53EF;&#x3002;</p><p>&#x6700;&#x7B80;&#x5355;&#x7684;&#x901A;&#x77E5;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102111697-515392377.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x4EE3;&#x7801;&#xFF1A;</p><pre><code class="language-javascript">chrome.notifications.create(null, {
	type: &apos;basic&apos;,
	iconUrl: &apos;img/icon.png&apos;,
	title: &apos;&#x8FD9;&#x662F;&#x6807;&#x9898;&apos;,
	message: &apos;&#x60A8;&#x521A;&#x624D;&#x70B9;&#x51FB;&#x4E86;&#x81EA;&#x5B9A;&#x4E49;&#x53F3;&#x952E;&#x83DC;&#x5355;&#xFF01;&apos;
});
</code></pre><p>&#x901A;&#x77E5;&#x7684;&#x6837;&#x5F0F;&#x53EF;&#x4EE5;&#x5F88;&#x4E30;&#x5BCC;&#xFF1A;</p><p>&#x8FD9;&#x4E2A;&#x6CA1;&#x6709;&#x6DF1;&#x5165;&#x7814;&#x7A76;&#xFF0C;&#x6709;&#x9700;&#x8981;&#x7684;&#x53EF;&#x4EE5;&#x53BB;&#x770B;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x3002;</p><h1 id="5%E7%A7%8D%E7%B1%BB%E5%9E%8B%E7%9A%84js%E5%AF%B9%E6%AF%94"><strong>5&#x79CD;&#x7C7B;&#x578B;&#x7684;JS&#x5BF9;&#x6BD4;</strong></h1><p>Chrome&#x63D2;&#x4EF6;&#x7684;JS&#x4E3B;&#x8981;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x8FD9;5&#x7C7B;&#xFF1A;<code>injected script</code>&#x3001;<code>content-script</code>&#x3001;<code>popup js</code>&#x3001;<code>background js</code>&#x548C;<code>devtools js</code>&#xFF0C;</p><h2 id="61-%E6%9D%83%E9%99%90%E5%AF%B9%E6%AF%94"><strong>6.1. &#x6743;&#x9650;&#x5BF9;&#x6BD4;</strong></h2><!--kg-card-begin: html--><table style="margin: 20px 0px 0px; padding: 0px; box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; word-break: break-word;"><thead style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">JS&#x79CD;&#x7C7B;</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x8BBF;&#x95EE;&#x7684;API</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">DOM&#x8BBF;&#x95EE;&#x60C5;&#x51B5;</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">JS&#x8BBF;&#x95EE;&#x60C5;&#x51B5;</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x76F4;&#x63A5;&#x8DE8;&#x57DF;</th></tr></thead><tbody style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">injected script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x548C;&#x666E;&#x901A;JS&#x65E0;&#x4EFB;&#x4F55;&#x5DEE;&#x522B;&#xFF0C;&#x4E0D;&#x80FD;&#x8BBF;&#x95EE;&#x4EFB;&#x4F55;&#x6269;&#x5C55;API</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">content script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EA;&#x80FD;&#x8BBF;&#x95EE; extension&#x3001;runtime&#x7B49;&#x90E8;&#x5206;API</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">popup js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x8BBF;&#x95EE;&#x7EDD;&#x5927;&#x90E8;&#x5206;API&#xFF0C;&#x9664;&#x4E86;devtools&#x7CFB;&#x5217;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">background js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x8BBF;&#x95EE;&#x7EDD;&#x5927;&#x90E8;&#x5206;API&#xFF0C;&#x9664;&#x4E86;devtools&#x7CFB;&#x5217;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">devtools js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EA;&#x80FD;&#x8BBF;&#x95EE; devtools&#x3001;extension&#x3001;runtime&#x7B49;&#x90E8;&#x5206;API</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x53EF;&#x4EE5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x4E0D;&#x53EF;&#x4EE5;</td></tr></tbody></table><!--kg-card-end: html--><h2 id="62-%E8%B0%83%E8%AF%95%E6%96%B9%E5%BC%8F%E5%AF%B9%E6%AF%94"><strong>6.2. &#x8C03;&#x8BD5;&#x65B9;&#x5F0F;&#x5BF9;&#x6BD4;</strong></h2><!--kg-card-begin: html--><table style="margin: 20px 0px 0px; padding: 0px; box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; word-break: break-word;"><thead style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">JS&#x7C7B;&#x578B;</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x8C03;&#x8BD5;&#x65B9;&#x5F0F;</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x56FE;&#x7247;&#x8BF4;&#x660E;</th></tr></thead><tbody style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">injected script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x76F4;&#x63A5;&#x666E;&#x901A;&#x7684;F12&#x5373;&#x53EF;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x61D2;&#x5F97;&#x622A;&#x56FE;</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">content-script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x6253;&#x5F00;Console,&#x5982;&#x56FE;&#x5207;&#x6362;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170712142454118-1741772825.png" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy" class="medium-zoom-image" style="margin: 0px; padding: 0px; box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1) 0s !important; height: auto !important;"></td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">popup-js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">popup&#x9875;&#x9762;&#x53F3;&#x952E;&#x5BA1;&#x67E5;&#x5143;&#x7D20;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170712142508275-102456585.png" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy" class="medium-zoom-image" style="margin: 0px; padding: 0px; box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1) 0s !important; height: auto !important;"></td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">background</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x70B9;&#x51FB;&#x80CC;&#x666F;&#x9875;&#x5373;&#x53EF;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170712142524665-745904947.png" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy" class="medium-zoom-image" style="margin: 0px; padding: 0px; box-sizing: border-box; border: 0px; max-width: 100%; cursor: zoom-in; transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1) 0s !important; height: auto !important;"></td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">devtools-js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">&#x6682;&#x672A;&#x627E;&#x5230;&#x6709;&#x6548;&#x65B9;&#x6CD5;</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td></tr></tbody></table><!--kg-card-end: html--><h1 id="%E6%B6%88%E6%81%AF%E9%80%9A%E4%BF%A1"><strong>&#x6D88;&#x606F;&#x901A;&#x4FE1;</strong></h1><p>&#x901A;&#x4FE1;&#x4E3B;&#x9875;&#xFF1A;<a href="https://developer.chrome.com/extensions/messaging">https://developer.chrome.com/extensions/messaging</a></p><p>&#x524D;&#x9762;&#x6211;&#x4EEC;&#x4ECB;&#x7ECD;&#x4E86;Chrome&#x63D2;&#x4EF6;&#x4E2D;&#x5B58;&#x5728;&#x7684;5&#x79CD;JS&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x5982;&#x4F55;&#x4E92;&#x76F8;&#x901A;&#x4FE1;&#x5462;&#xFF1F;&#x4E0B;&#x9762;&#x5148;&#x6765;&#x7CFB;&#x7EDF;&#x6982;&#x51B5;&#x4E00;&#x4E0B;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5206;&#x7C7B;&#x7EC6;&#x8BF4;&#x3002;&#x9700;&#x8981;&#x77E5;&#x9053;&#x7684;&#x662F;&#xFF0C;popup&#x548C;background&#x5176;&#x5B9E;&#x51E0;&#x4E4E;&#x53EF;&#x4EE5;&#x89C6;&#x4E3A;&#x4E00;&#x79CD;&#x4E1C;&#x897F;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x53EF;&#x8BBF;&#x95EE;&#x7684;API&#x90FD;&#x4E00;&#x6837;&#x3001;&#x901A;&#x4FE1;&#x673A;&#x5236;&#x4E00;&#x6837;&#x3001;&#x90FD;&#x53EF;&#x4EE5;&#x8DE8;&#x57DF;&#x3002;</p><h2 id="71-%E4%BA%92%E7%9B%B8%E9%80%9A%E4%BF%A1%E6%A6%82%E8%A7%88"><strong>7.1. &#x4E92;&#x76F8;&#x901A;&#x4FE1;&#x6982;&#x89C8;</strong></h2><p>&#x6CE8;&#xFF1A;<code>-</code>&#x8868;&#x793A;&#x4E0D;&#x5B58;&#x5728;&#x6216;&#x8005;&#x65E0;&#x610F;&#x4E49;&#xFF0C;&#x6216;&#x8005;&#x5F85;&#x9A8C;&#x8BC1;&#x3002;</p><!--kg-card-begin: html--><table style="margin: 20px 0px 0px; padding: 0px; box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; word-break: break-word;"><thead style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;"></th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">injected-script</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">content-script</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">popup-js</th><th style="margin: 0px; padding: 8px 14px; box-sizing: border-box; background-color: rgb(250, 250, 250); border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">background-js</th></tr></thead><tbody style="margin: 0px; padding: 0px; box-sizing: border-box;"><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">injected-script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">window.postMessage</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">content-script</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">window.postMessage</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.runtime.sendMessage chrome.runtime.connect</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.runtime.sendMessage chrome.runtime.connect</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">popup-js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.tabs.sendMessage chrome.tabs.connect</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.extension. getBackgroundPage()</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box; background-color: rgb(248, 248, 248);"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">background-js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.tabs.sendMessage chrome.tabs.connect</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.extension.getViews</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td></tr><tr style="margin: 0px; padding: 0px; box-sizing: border-box;"><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">devtools-js</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.devtools. inspectedWindow.eval</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">-</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.runtime.sendMessage</td><td style="margin: 0px; padding: 6px; box-sizing: border-box; border: 1px solid rgb(192, 192, 192); border-collapse: collapse; min-width: 50px;">chrome.runtime.sendMessage</td></tr></tbody></table><!--kg-card-end: html--><h2 id="72-%E9%80%9A%E4%BF%A1%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D"><strong>7.2. &#x901A;&#x4FE1;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;</strong></h2><h3 id="721-popup%E5%92%8Cbackground"><strong>7.2.1. popup&#x548C;background</strong></h3><p>popup&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8C03;&#x7528;background&#x4E2D;&#x7684;JS&#x65B9;&#x6CD5;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;background&#x7684;DOM&#xFF1A;</p><pre><code class="language-javascript">// background.js
function test()
{
	alert(&apos;&#x6211;&#x662F;background&#xFF01;&apos;);
}

// popup.js
var bg = chrome.extension.getBackgroundPage();
bg.test(); // &#x8BBF;&#x95EE;bg&#x7684;&#x51FD;&#x6570;
alert(bg.document.body.innerHTML); // &#x8BBF;&#x95EE;bg&#x7684;DOM
</code></pre><blockquote>&#x5C0F;&#x63D2;&#x66F2;&#xFF0C;&#x4ECA;&#x5929;&#x78B0;&#x5230;&#x4E00;&#x4E2A;&#x60C5;&#x51B5;&#xFF0C;&#x53D1;&#x73B0;popup&#x65E0;&#x6CD5;&#x83B7;&#x53D6;background&#x7684;&#x4EFB;&#x4F55;&#x65B9;&#x6CD5;&#xFF0C;&#x627E;&#x4E86;&#x534A;&#x5929;&#x624D;&#x53D1;&#x73B0;&#x662F;&#x56E0;&#x4E3A;background&#x7684;js&#x62A5;&#x9519;&#x4E86;&#xFF0C;&#x800C;&#x4F60;&#x5982;&#x679C;&#x4E0D;&#x4E3B;&#x52A8;&#x67E5;&#x770B;background&#x7684;js&#x7684;&#x8BDD;&#xFF0C;&#x662F;&#x770B;&#x4E0D;&#x5230;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x7684;&#xFF0C;&#x7279;&#x6B64;&#x63D0;&#x9192;&#x3002;</blockquote><p>&#x81F3;&#x4E8E;<code>background</code>&#x8BBF;&#x95EE;<code>popup</code>&#x5982;&#x4E0B;&#xFF08;&#x524D;&#x63D0;&#x662F;<code>popup</code>&#x5DF2;&#x7ECF;&#x6253;&#x5F00;&#xFF09;&#xFF1A;</p><pre><code class="language-javascript">var views = chrome.extension.getViews({type:&apos;popup&apos;});
if(views.length &gt; 0) {
	console.log(views[0].location.href);
}
</code></pre><h3 id="722-popup%E6%88%96%E8%80%85bg%E5%90%91content%E4%B8%BB%E5%8A%A8%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF"><strong>7.2.2. popup&#x6216;&#x8005;bg&#x5411;content&#x4E3B;&#x52A8;&#x53D1;&#x9001;&#x6D88;&#x606F;</strong></h3><p>background.js&#x6216;&#x8005;popup.js&#xFF1A;</p><pre><code class="language-javascript">function sendMessageToContentScript(message, callback)
{
	chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
	{
		chrome.tabs.sendMessage(tabs[0].id, message, function(response)
		{
			if(callback) callback(response);
		});
	});
}
sendMessageToContentScript({cmd:&apos;test&apos;, value:&apos;&#x4F60;&#x597D;&#xFF0C;&#x6211;&#x662F;popup&#xFF01;&apos;}, function(response)
{
	console.log(&apos;&#x6765;&#x81EA;content&#x7684;&#x56DE;&#x590D;&#xFF1A;&apos;+response);
});
</code></pre><p><code>content-script.js</code>&#x63A5;&#x6536;&#xFF1A;</p><pre><code class="language-javascript">chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
	// console.log(sender.tab ?&quot;from a content script:&quot; + sender.tab.url :&quot;from the extension&quot;);
	if(request.cmd == &apos;test&apos;) alert(request.value);
	sendResponse(&apos;&#x6211;&#x6536;&#x5230;&#x4E86;&#x4F60;&#x7684;&#x6D88;&#x606F;&#xFF01;&apos;);
});
</code></pre><p>&#x53CC;&#x65B9;&#x901A;&#x4FE1;&#x76F4;&#x63A5;&#x53D1;&#x9001;&#x7684;&#x90FD;&#x662F;JSON&#x5BF9;&#x8C61;&#xFF0C;&#x4E0D;&#x662F;JSON&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x6240;&#x4EE5;&#x65E0;&#x9700;&#x89E3;&#x6790;&#xFF0C;&#x5F88;&#x65B9;&#x4FBF;&#xFF08;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x53D1;&#x9001;&#x5B57;&#x7B26;&#x4E32;&#xFF09;&#x3002;</p><blockquote>&#x7F51;&#x4E0A;&#x6709;&#x4E9B;&#x8001;&#x4EE3;&#x7801;&#x4E2D;&#x7528;&#x7684;&#x662F;<code>chrome.extension.onMessage</code>&#xFF0C;&#x6CA1;&#x6709;&#x5B8C;&#x5168;&#x67E5;&#x6E05;&#x4E8C;&#x8005;&#x7684;&#x533A;&#x522B;(&#x8C8C;&#x4F3C;&#x662F;&#x522B;&#x540D;)&#xFF0C;&#x4F46;&#x662F;&#x5EFA;&#x8BAE;&#x7EDF;&#x4E00;&#x4F7F;&#x7528;<code>chrome.runtime.onMessage</code>&#x3002;</blockquote><h3 id="723-content-script%E4%B8%BB%E5%8A%A8%E5%8F%91%E6%B6%88%E6%81%AF%E7%BB%99%E5%90%8E%E5%8F%B0"><strong>7.2.3. content-script&#x4E3B;&#x52A8;&#x53D1;&#x6D88;&#x606F;&#x7ED9;&#x540E;&#x53F0;</strong></h3><p>content-script.js&#xFF1A;</p><pre><code class="language-javascript">chrome.runtime.sendMessage({greeting: &apos;&#x4F60;&#x597D;&#xFF0C;&#x6211;&#x662F;content-script&#x5440;&#xFF0C;&#x6211;&#x4E3B;&#x52A8;&#x53D1;&#x6D88;&#x606F;&#x7ED9;&#x540E;&#x53F0;&#xFF01;&apos;}, function(response) {
	console.log(&apos;&#x6536;&#x5230;&#x6765;&#x81EA;&#x540E;&#x53F0;&#x7684;&#x56DE;&#x590D;&#xFF1A;&apos; + response);
});
</code></pre><p>background.js &#x6216;&#x8005; popup.js&#xFF1A;</p><pre><code class="language-javascript">// &#x76D1;&#x542C;&#x6765;&#x81EA;content-script&#x7684;&#x6D88;&#x606F;
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
	console.log(&apos;&#x6536;&#x5230;&#x6765;&#x81EA;content-script&#x7684;&#x6D88;&#x606F;&#xFF1A;&apos;);
	console.log(request, sender, sendResponse);
	sendResponse(&apos;&#x6211;&#x662F;&#x540E;&#x53F0;&#xFF0C;&#x6211;&#x5DF2;&#x6536;&#x5230;&#x4F60;&#x7684;&#x6D88;&#x606F;&#xFF1A;&apos; + JSON.stringify(request));
});
</code></pre><p>&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#xFF1A;</p><ul><li>content_scripts&#x5411;<code>popup</code>&#x4E3B;&#x52A8;&#x53D1;&#x6D88;&#x606F;&#x7684;&#x524D;&#x63D0;&#x662F;popup&#x5FC5;&#x987B;&#x6253;&#x5F00;&#xFF01;&#x5426;&#x5219;&#x9700;&#x8981;&#x5229;&#x7528;background&#x4F5C;&#x4E2D;&#x8F6C;&#xFF1B;</li><li>&#x5982;&#x679C;background&#x548C;popup&#x540C;&#x65F6;&#x76D1;&#x542C;&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x4EEC;&#x90FD;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x6536;&#x5230;&#x6D88;&#x606F;&#xFF0C;&#x4F46;&#x662F;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;sendResponse&#xFF0C;&#x4E00;&#x4E2A;&#x5148;&#x53D1;&#x9001;&#x4E86;&#xFF0C;&#x90A3;&#x4E48;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x518D;&#x53D1;&#x9001;&#x5C31;&#x65E0;&#x6548;&#xFF1B;</li></ul><h3 id="724-injected-script%E5%92%8Ccontent-script"><strong>7.2.4. injected script&#x548C;content-script</strong></h3><p><code>content-script</code>&#x548C;&#x9875;&#x9762;&#x5185;&#x7684;&#x811A;&#x672C;&#xFF08;<code>injected-script</code>&#x81EA;&#x7136;&#x4E5F;&#x5C5E;&#x4E8E;&#x9875;&#x9762;&#x5185;&#x7684;&#x811A;&#x672C;&#xFF09;&#x4E4B;&#x95F4;&#x552F;&#x4E00;&#x5171;&#x4EAB;&#x7684;&#x4E1C;&#x897F;&#x5C31;&#x662F;&#x9875;&#x9762;&#x7684;DOM&#x5143;&#x7D20;&#xFF0C;&#x6709;2&#x79CD;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x4E8C;&#x8005;&#x901A;&#x8BAF;&#xFF1A;</p><ol><li>&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>window.postMessage</code>&#x548C;<code>window.addEventListener</code>&#x6765;&#x5B9E;&#x73B0;&#x4E8C;&#x8005;&#x6D88;&#x606F;&#x901A;&#x8BAF;&#xFF1B;</li><li>&#x901A;&#x8FC7;&#x81EA;&#x5B9A;&#x4E49;DOM&#x4E8B;&#x4EF6;&#x6765;&#x5B9E;&#x73B0;&#xFF1B;</li></ol><p>&#x7B2C;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#xFF08;&#x63A8;&#x8350;&#xFF09;&#xFF1A;</p><p><code>injected-script</code>&#x4E2D;&#xFF1A;</p><pre><code class="language-javascript">window.postMessage({&quot;test&quot;: &apos;&#x4F60;&#x597D;&#xFF01;&apos;}, &apos;*&apos;);
</code></pre><p>content script&#x4E2D;&#xFF1A;</p><pre><code class="language-javascript">window.addEventListener(&quot;message&quot;, function(e)
{
	console.log(e.data);
}, false);
</code></pre><p>&#x7B2C;&#x4E8C;&#x79CD;&#x65B9;&#x6CD5;&#xFF1A;</p><p><code>injected-script</code>&#x4E2D;&#xFF1A;</p><pre><code class="language-javascript">var customEvent = document.createEvent(&apos;Event&apos;);
customEvent.initEvent(&apos;myCustomEvent&apos;, true, true);
function fireCustomEvent(data) {
	hiddenDiv = document.getElementById(&apos;myCustomEventDiv&apos;);
	hiddenDiv.innerText = data
	hiddenDiv.dispatchEvent(customEvent);
}
fireCustomEvent(&apos;&#x4F60;&#x597D;&#xFF0C;&#x6211;&#x662F;&#x666E;&#x901A;JS&#xFF01;&apos;);
</code></pre><p><code>content-script.js</code>&#x4E2D;&#xFF1A;</p><pre><code class="language-javascript">var hiddenDiv = document.getElementById(&apos;myCustomEventDiv&apos;);
if(!hiddenDiv) {
	hiddenDiv = document.createElement(&apos;div&apos;);
	hiddenDiv.style.display = &apos;none&apos;;
	document.body.appendChild(hiddenDiv);
}
hiddenDiv.addEventListener(&apos;myCustomEvent&apos;, function() {
	var eventData = document.getElementById(&apos;myCustomEventDiv&apos;).innerText;
	console.log(&apos;&#x6536;&#x5230;&#x81EA;&#x5B9A;&#x4E49;&#x4E8B;&#x4EF6;&#x6D88;&#x606F;&#xFF1A;&apos; + eventData);
});
</code></pre><h2 id="73-%E9%95%BF%E8%BF%9E%E6%8E%A5%E5%92%8C%E7%9F%AD%E8%BF%9E%E6%8E%A5"><strong>7.3. &#x957F;&#x8FDE;&#x63A5;&#x548C;&#x77ED;&#x8FDE;&#x63A5;</strong></h2><p>&#x5176;&#x5B9E;&#x4E0A;&#x9762;&#x5DF2;&#x7ECF;&#x6D89;&#x53CA;&#x5230;&#x4E86;&#xFF0C;&#x8FD9;&#x91CC;&#x518D;&#x5355;&#x72EC;&#x8BF4;&#x660E;&#x4E00;&#x4E0B;&#x3002;Chrome&#x63D2;&#x4EF6;&#x4E2D;&#x6709;2&#x79CD;&#x901A;&#x4FE1;&#x65B9;&#x5F0F;&#xFF0C;&#x4E00;&#x4E2A;&#x662F;&#x77ED;&#x8FDE;&#x63A5;&#xFF08;<code>chrome.tabs.sendMessage</code>&#x548C;<code>chrome.runtime.sendMessage</code>&#xFF09;&#xFF0C;&#x4E00;&#x4E2A;&#x662F;&#x957F;&#x8FDE;&#x63A5;&#xFF08;<code>chrome.tabs.connect</code>&#x548C;<code>chrome.runtime.connect</code>&#xFF09;&#x3002;</p><p>&#x77ED;&#x8FDE;&#x63A5;&#x7684;&#x8BDD;&#x5C31;&#x662F;&#x6324;&#x7259;&#x818F;&#x4E00;&#x6837;&#xFF0C;&#x6211;&#x53D1;&#x9001;&#x4E00;&#x4E0B;&#xFF0C;&#x4F60;&#x6536;&#x5230;&#x4E86;&#x518D;&#x56DE;&#x590D;&#x4E00;&#x4E0B;&#xFF0C;&#x5982;&#x679C;&#x5BF9;&#x65B9;&#x4E0D;&#x56DE;&#x590D;&#xFF0C;&#x4F60;&#x53EA;&#x80FD;&#x91CD;&#x65B0;&#x53D1;&#xFF0C;&#x800C;&#x957F;&#x8FDE;&#x63A5;&#x7C7B;&#x4F3C;<code>WebSocket</code>&#x4F1A;&#x4E00;&#x76F4;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#xFF0C;&#x53CC;&#x65B9;&#x53EF;&#x4EE5;&#x968F;&#x65F6;&#x4E92;&#x53D1;&#x6D88;&#x606F;&#x3002;</p><p>&#x77ED;&#x8FDE;&#x63A5;&#x4E0A;&#x9762;&#x5DF2;&#x7ECF;&#x6709;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#x4E86;&#xFF0C;&#x8FD9;&#x91CC;&#x53EA;&#x8BB2;&#x4E00;&#x4E0B;&#x957F;&#x8FDE;&#x63A5;&#x3002;</p><p>popup.js&#xFF1A;</p><pre><code class="language-javascript">getCurrentTabId((tabId) =&gt; {
	var port = chrome.tabs.connect(tabId, {name: &apos;test-connect&apos;});
	port.postMessage({question: &apos;&#x4F60;&#x662F;&#x8C01;&#x554A;&#xFF1F;&apos;});
	port.onMessage.addListener(function(msg) {
		alert(&apos;&#x6536;&#x5230;&#x6D88;&#x606F;&#xFF1A;&apos;+msg.answer);
		if(msg.answer &amp;&amp; msg.answer.startsWith(&apos;&#x6211;&#x662F;&apos;))
		{
			port.postMessage({question: &apos;&#x54E6;&#xFF0C;&#x539F;&#x6765;&#x662F;&#x4F60;&#x554A;&#xFF01;&apos;});
		}
	});
});
</code></pre><p>content-script.js&#xFF1A;</p><pre><code class="language-javascript">// &#x76D1;&#x542C;&#x957F;&#x8FDE;&#x63A5;
chrome.runtime.onConnect.addListener(function(port) {
	console.log(port);
	if(port.name == &apos;test-connect&apos;) {
		port.onMessage.addListener(function(msg) {
			console.log(&apos;&#x6536;&#x5230;&#x957F;&#x8FDE;&#x63A5;&#x6D88;&#x606F;&#xFF1A;&apos;, msg);
			if(msg.question == &apos;&#x4F60;&#x662F;&#x8C01;&#x554A;&#xFF1F;&apos;) port.postMessage({answer: &apos;&#x6211;&#x662F;&#x4F60;&#x7238;&#xFF01;&apos;});
		});
	}
});
</code></pre><h1 id="%E5%85%B6%E5%AE%83%E8%A1%A5%E5%85%85"><strong>&#x5176;&#x5B83;&#x8865;&#x5145;</strong></h1><h2 id="81-%E5%8A%A8%E6%80%81%E6%B3%A8%E5%85%A5%E6%88%96%E6%89%A7%E8%A1%8Cjs"><strong>8.1. &#x52A8;&#x6001;&#x6CE8;&#x5165;&#x6216;&#x6267;&#x884C;JS</strong></h2><p>&#x867D;&#x7136;&#x5728;<code>background</code>&#x548C;<code>popup</code>&#x4E2D;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x9875;&#x9762;DOM&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>chrome.tabs.executeScript</code>&#x6765;&#x6267;&#x884C;&#x811A;&#x672C;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x8BBF;&#x95EE;web&#x9875;&#x9762;&#x7684;DOM&#xFF08;&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x4E5F;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x9875;&#x9762;JS&#xFF09;&#x3002;</p><p>&#x793A;&#x4F8B;<code>manifest.json</code>&#x914D;&#x7F6E;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;name&quot;: &quot;&#x52A8;&#x6001;JS&#x6CE8;&#x5165;&#x6F14;&#x793A;&quot;,
	...
	&quot;permissions&quot;: [
		&quot;tabs&quot;, &quot;http://*/*&quot;, &quot;https://*/*&quot;
	],
	...
}
</code></pre><p>JS&#xFF1A;</p><pre><code class="language-javascript">// &#x52A8;&#x6001;&#x6267;&#x884C;JS&#x4EE3;&#x7801;
chrome.tabs.executeScript(tabId, {code: &apos;document.body.style.backgroundColor=&quot;red&quot;&apos;});
// &#x52A8;&#x6001;&#x6267;&#x884C;JS&#x6587;&#x4EF6;
chrome.tabs.executeScript(tabId, {file: &apos;some-script.js&apos;});
</code></pre><h2 id="82-%E5%8A%A8%E6%80%81%E6%B3%A8%E5%85%A5css"><strong>8.2. &#x52A8;&#x6001;&#x6CE8;&#x5165;CSS</strong></h2><p>&#x793A;&#x4F8B;<code>manifest.json</code>&#x914D;&#x7F6E;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;name&quot;: &quot;&#x52A8;&#x6001;CSS&#x6CE8;&#x5165;&#x6F14;&#x793A;&quot;,
	...
	&quot;permissions&quot;: [
		&quot;tabs&quot;, &quot;http://*/*&quot;, &quot;https://*/*&quot;
	],
	...
}
</code></pre><p>JS&#x4EE3;&#x7801;&#xFF1A;</p><pre><code class="language-javascript">// &#x52A8;&#x6001;&#x6267;&#x884C;CSS&#x4EE3;&#x7801;&#xFF0C;TODO&#xFF0C;&#x8FD9;&#x91CC;&#x6709;&#x5F85;&#x9A8C;&#x8BC1;
chrome.tabs.insertCSS(tabId, {code: &apos;xxx&apos;});
// &#x52A8;&#x6001;&#x6267;&#x884C;CSS&#x6587;&#x4EF6;
chrome.tabs.insertCSS(tabId, {file: &apos;some-style.css&apos;});
</code></pre><h2 id="83-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%AA%97%E5%8F%A3id"><strong>8.3. &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x7A97;&#x53E3;ID</strong></h2><pre><code class="language-javascript">chrome.windows.getCurrent(function(currentWindow)
{
	console.log(&apos;&#x5F53;&#x524D;&#x7A97;&#x53E3;ID&#xFF1A;&apos; + currentWindow.id);
});
</code></pre><h2 id="84-%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E6%A0%87%E7%AD%BE%E9%A1%B5id"><strong>8.4. &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6807;&#x7B7E;&#x9875;ID</strong></h2><p>&#x4E00;&#x822C;&#x6709;2&#x79CD;&#x65B9;&#x6CD5;&#xFF1A;</p><pre><code class="language-javascript">// &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x9009;&#x9879;&#x5361;ID
function getCurrentTabId(callback)
{
	chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
	{
		if(callback) callback(tabs.length ? tabs[0].id: null);
	});
}
</code></pre><p>&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x9009;&#x9879;&#x5361;id&#x7684;&#x53E6;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x65F6;&#x5019;&#x90FD;&#x7C7B;&#x4F3C;&#xFF0C;&#x53EA;&#x6709;&#x5C11;&#x90E8;&#x5206;&#x65F6;&#x5019;&#x4F1A;&#x4E0D;&#x4E00;&#x6837;&#xFF08;&#x4F8B;&#x5982;&#x5F53;&#x7A97;&#x53E3;&#x6700;&#x5C0F;&#x5316;&#x65F6;&#xFF09;</p><pre><code class="language-javascript">// &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x9009;&#x9879;&#x5361;ID
function getCurrentTabId2()
{
	chrome.windows.getCurrent(function(currentWindow)
	{
		chrome.tabs.query({active: true, windowId: currentWindow.id}, function(tabs)
		{
			if(callback) callback(tabs.length ? tabs[0].id: null);
		});
	});
}
</code></pre><h2 id="85-%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8"><strong>8.5. &#x672C;&#x5730;&#x5B58;&#x50A8;</strong></h2><p>&#x672C;&#x5730;&#x5B58;&#x50A8;&#x5EFA;&#x8BAE;&#x7528;<code>chrome.storage</code>&#x800C;&#x4E0D;&#x662F;&#x666E;&#x901A;&#x7684;<code>localStorage</code>&#xFF0C;&#x533A;&#x522B;&#x6709;&#x597D;&#x51E0;&#x70B9;&#xFF0C;&#x4E2A;&#x4EBA;&#x8BA4;&#x4E3A;&#x6700;&#x91CD;&#x8981;&#x7684;2&#x70B9;&#x533A;&#x522B;&#x662F;&#xFF1A;</p><ul><li><code>chrome.storage</code>&#x662F;&#x9488;&#x5BF9;&#x63D2;&#x4EF6;&#x5168;&#x5C40;&#x7684;&#xFF0C;&#x5373;&#x4F7F;&#x4F60;&#x5728;<code>background</code>&#x4E2D;&#x4FDD;&#x5B58;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5728;<code>content-script</code>&#x4E5F;&#x80FD;&#x83B7;&#x53D6;&#x5230;&#xFF1B;</li><li><code>chrome.storage.sync</code>&#x53EF;&#x4EE5;&#x8DDF;&#x968F;&#x5F53;&#x524D;&#x767B;&#x5F55;&#x7528;&#x6237;&#x81EA;&#x52A8;&#x540C;&#x6B65;&#xFF0C;&#x8FD9;&#x53F0;&#x7535;&#x8111;&#x4FEE;&#x6539;&#x7684;&#x8BBE;&#x7F6E;&#x4F1A;&#x81EA;&#x52A8;&#x540C;&#x6B65;&#x5230;&#x5176;&#x5B83;&#x7535;&#x8111;&#xFF0C;&#x5F88;&#x65B9;&#x4FBF;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x767B;&#x5F55;&#x6216;&#x8005;&#x672A;&#x8054;&#x7F51;&#x5219;&#x5148;&#x4FDD;&#x5B58;&#x5230;&#x672C;&#x5730;&#xFF0C;&#x7B49;&#x767B;&#x5F55;&#x4E86;&#x518D;&#x540C;&#x6B65;&#x81F3;&#x7F51;&#x7EDC;&#xFF1B;</li></ul><p>&#x9700;&#x8981;&#x58F0;&#x660E;<code>storage</code>&#x6743;&#x9650;&#xFF0C;&#x6709;<code>chrome.storage.sync</code>&#x548C;<code>chrome.storage.local</code>2&#x79CD;&#x65B9;&#x5F0F;&#x53EF;&#x4F9B;&#x9009;&#x62E9;&#xFF0C;&#x4F7F;&#x7528;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-javascript">// &#x8BFB;&#x53D6;&#x6570;&#x636E;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x6307;&#x5B9A;&#x8981;&#x8BFB;&#x53D6;&#x7684;key&#x4EE5;&#x53CA;&#x8BBE;&#x7F6E;&#x9ED8;&#x8BA4;&#x503C;
chrome.storage.sync.get({color: &apos;red&apos;, age: 18}, function(items) {
	console.log(items.color, items.age);
});
// &#x4FDD;&#x5B58;&#x6570;&#x636E;
chrome.storage.sync.set({color: &apos;blue&apos;}, function() {
	console.log(&apos;&#x4FDD;&#x5B58;&#x6210;&#x529F;&#xFF01;&apos;);
});
</code></pre><h2 id="86-webrequest"><strong>8.6. webRequest</strong></h2><p>&#x901A;&#x8FC7;webRequest&#x7CFB;&#x5217;API&#x53EF;&#x4EE5;&#x5BF9;HTTP&#x8BF7;&#x6C42;&#x8FDB;&#x884C;&#x4EFB;&#x6027;&#x5730;&#x4FEE;&#x6539;&#x3001;&#x5B9A;&#x5236;&#xFF0C;&#x8FD9;&#x91CC;&#x901A;&#x8FC7;<code>beforeRequest</code>&#x6765;&#x7B80;&#x5355;&#x6F14;&#x793A;&#x4E00;&#x4E0B;&#x5B83;&#x7684;&#x51B0;&#x5C71;&#x4E00;&#x89D2;&#xFF1A;</p><pre><code class="language-javascript">//manifest.json
{
	// &#x6743;&#x9650;&#x7533;&#x8BF7;
	&quot;permissions&quot;:
	[
		&quot;webRequest&quot;, // web&#x8BF7;&#x6C42;
		&quot;webRequestBlocking&quot;, // &#x963B;&#x585E;&#x5F0F;web&#x8BF7;&#x6C42;
		&quot;storage&quot;, // &#x63D2;&#x4EF6;&#x672C;&#x5730;&#x5B58;&#x50A8;
		&quot;http://*/*&quot;, // &#x53EF;&#x4EE5;&#x901A;&#x8FC7;executeScript&#x6216;&#x8005;insertCSS&#x8BBF;&#x95EE;&#x7684;&#x7F51;&#x7AD9;
		&quot;https://*/*&quot; // &#x53EF;&#x4EE5;&#x901A;&#x8FC7;executeScript&#x6216;&#x8005;insertCSS&#x8BBF;&#x95EE;&#x7684;&#x7F51;&#x7AD9;
	],
}


// background.js
// &#x662F;&#x5426;&#x663E;&#x793A;&#x56FE;&#x7247;
var showImage;
chrome.storage.sync.get({showImage: true}, function(items) {
	showImage = items.showImage;
});
// web&#x8BF7;&#x6C42;&#x76D1;&#x542C;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x8868;&#x793A;&#x963B;&#x585E;&#x5F0F;&#xFF0C;&#x9700;&#x5355;&#x72EC;&#x58F0;&#x660E;&#x6743;&#x9650;&#xFF1A;webRequestBlocking
chrome.webRequest.onBeforeRequest.addListener(details =&gt; {
	// cancel &#x8868;&#x793A;&#x53D6;&#x6D88;&#x672C;&#x6B21;&#x8BF7;&#x6C42;
	if(!showImage &amp;&amp; details.type == &apos;image&apos;) return {cancel: true};
	// &#x7B80;&#x5355;&#x7684;&#x97F3;&#x89C6;&#x9891;&#x68C0;&#x6D4B;
	// &#x5927;&#x90E8;&#x5206;&#x7F51;&#x7AD9;&#x89C6;&#x9891;&#x7684;type&#x5E76;&#x4E0D;&#x662F;media&#xFF0C;&#x4E14;&#x89C6;&#x9891;&#x505A;&#x4E86;&#x9632;&#x4E0B;&#x8F7D;&#x5904;&#x7406;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x4EC5;&#x4EC5;&#x662F;&#x4E3A;&#x4E86;&#x6F14;&#x793A;&#x6548;&#x679C;&#xFF0C;&#x65E0;&#x5B9E;&#x9645;&#x610F;&#x4E49;
	if(details.type == &apos;media&apos;) {
		chrome.notifications.create(null, {
			type: &apos;basic&apos;,
			iconUrl: &apos;img/icon.png&apos;,
			title: &apos;&#x68C0;&#x6D4B;&#x5230;&#x97F3;&#x89C6;&#x9891;&apos;,
			message: &apos;&#x97F3;&#x89C6;&#x9891;&#x5730;&#x5740;&#xFF1A;&apos; + details.url,
		});
	}
}, {urls: [&quot;&lt;all_urls&gt;&quot;]}, [&quot;blocking&quot;]);
</code></pre><h2 id="87-%E5%9B%BD%E9%99%85%E5%8C%96"><strong>8.7. &#x56FD;&#x9645;&#x5316;</strong></h2><p>&#x63D2;&#x4EF6;&#x6839;&#x76EE;&#x5F55;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;<code>_locales</code>&#x7684;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x518D;&#x5728;&#x4E0B;&#x9762;&#x65B0;&#x5EFA;&#x4E00;&#x4E9B;&#x8BED;&#x8A00;&#x7684;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x5982;<code>en</code>&#x3001;<code>zh_CN</code>&#x3001;<code>zh_TW</code>&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5728;&#x6BCF;&#x4E2A;&#x6587;&#x4EF6;&#x5939;&#x653E;&#x5165;&#x4E00;&#x4E2A;<code>messages.json</code>&#xFF0C;&#x540C;&#x65F6;&#x5FC5;&#x987B;&#x5728;&#x6E05;&#x5355;&#x6587;&#x4EF6;&#x4E2D;&#x8BBE;&#x7F6E;<code>default_locale</code>&#x3002;</p><p><code>_locales\en\messages.json</code>&#x5185;&#x5BB9;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;pluginDesc&quot;: {&quot;message&quot;: &quot;A simple chrome extension demo&quot;},
	&quot;helloWorld&quot;: {&quot;message&quot;: &quot;Hello World!&quot;}
}
</code></pre><p><code>_locales\zh_CN\messages.json</code>&#x5185;&#x5BB9;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;pluginDesc&quot;: {&quot;message&quot;: &quot;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;Chrome&#x63D2;&#x4EF6;demo&quot;},
	&quot;helloWorld&quot;: {&quot;message&quot;: &quot;&#x4F60;&#x597D;&#x554A;&#xFF0C;&#x4E16;&#x754C;&#xFF01;&quot;}
}
</code></pre><p>&#x5728;<code>manifest.json</code>&#x548C;<code>CSS</code>&#x6587;&#x4EF6;&#x4E2D;&#x901A;&#x8FC7;<code>__MSG_messagename__</code>&#x5F15;&#x5165;&#xFF0C;&#x5982;&#xFF1A;</p><pre><code class="language-javascript">{
	&quot;description&quot;: &quot;__MSG_pluginDesc__&quot;,
	// &#x9ED8;&#x8BA4;&#x8BED;&#x8A00;
	&quot;default_locale&quot;: &quot;zh_CN&quot;,
}
</code></pre><p>JS&#x4E2D;&#x5219;&#x76F4;&#x63A5;<code>chrome.i18n.getMessage(&quot;helloWorld&quot;)</code>&#x3002;</p><p>&#x6D4B;&#x8BD5;&#x65F6;&#xFF0C;&#x901A;&#x8FC7;&#x7ED9;chrome&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x5FEB;&#x6377;&#x65B9;&#x5F0F;<code>chrome.exe --lang=en</code>&#x6765;&#x5207;&#x6362;&#x8BED;&#x8A00;&#xFF0C;&#x5982;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102158259-417770023.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x82F1;&#x6587;&#x6548;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102210868-1502746521.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x4E2D;&#x6587;&#x6548;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102221478-1089926751.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h2 id="88-api%E6%80%BB%E7%BB%93"><strong>8.8. API&#x603B;&#x7ED3;</strong></h2><p>&#x6BD4;&#x8F83;&#x5E38;&#x7528;&#x7528;&#x7684;&#x4E00;&#x4E9B;API&#x7CFB;&#x5217;&#xFF1A;</p><ul><li>chrome.tabs</li><li>chrome.runtime</li><li>chrome.webRequest</li><li>chrome.window</li><li>chrome.storage</li><li>chrome.contextMenus</li><li>chrome.devtools</li><li>chrome.extension</li></ul><h1 id="%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93"><strong>&#x7ECF;&#x9A8C;&#x603B;&#x7ED3;</strong></h1><h2 id="91-%E6%9F%A5%E7%9C%8B%E5%B7%B2%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6%E8%B7%AF%E5%BE%84"><strong>9.1. &#x67E5;&#x770B;&#x5DF2;&#x5B89;&#x88C5;&#x63D2;&#x4EF6;&#x8DEF;&#x5F84;</strong></h2><p>&#x5DF2;&#x5B89;&#x88C5;&#x7684;&#x63D2;&#x4EF6;&#x6E90;&#x7801;&#x8DEF;&#x5F84;&#xFF1A;<code>C:\Users\&#x7528;&#x6237;&#x540D;\AppData\Local\Google\Chrome\User Data\Default\Extensions</code>&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x63D2;&#x4EF6;&#x88AB;&#x653E;&#x5728;&#x4EE5;&#x63D2;&#x4EF6;ID&#x4E3A;&#x540D;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x91CC;&#x9762;&#xFF0C;&#x60F3;&#x8981;&#x5B66;&#x4E60;&#x67D0;&#x4E2A;&#x63D2;&#x4EF6;&#x7684;&#x67D0;&#x4E2A;&#x529F;&#x80FD;&#x662F;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x770B;&#x4EBA;&#x5BB6;&#x7684;&#x6E90;&#x7801;&#x662F;&#x6700;&#x597D;&#x7684;&#x65B9;&#x6CD5;&#x4E86;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102256712-51940037.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x5982;&#x4F55;&#x67E5;&#x770B;&#x67D0;&#x4E2A;&#x63D2;&#x4EF6;&#x7684;ID&#xFF1F;&#x8FDB;&#x5165; chrome://extensions &#xFF0C;&#x7136;&#x540E;&#x52FE;&#x7EBF;&#x5F00;&#x53D1;&#x8005;&#x6A21;&#x5F0F;&#x5373;&#x53EF;&#x770B;&#x5230;&#x4E86;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102308431-360409003.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h2 id="92-%E7%89%B9%E5%88%AB%E6%B3%A8%E6%84%8Fbackground%E7%9A%84%E6%8A%A5%E9%94%99"><strong>9.2. &#x7279;&#x522B;&#x6CE8;&#x610F;background&#x7684;&#x62A5;&#x9519;</strong></h2><p>&#x5F88;&#x591A;&#x65F6;&#x5019;&#x4F60;&#x53D1;&#x73B0;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x4F1A;&#x83AB;&#x540D;&#x5176;&#x5999;&#x7684;&#x5931;&#x6548;&#xFF0C;&#x627E;&#x6765;&#x627E;&#x53BB;&#x53C8;&#x627E;&#x4E0D;&#x5230;&#x539F;&#x56E0;&#xFF0C;&#x8FD9;&#x65F6;&#x6253;&#x5F00;background&#x7684;&#x63A7;&#x5236;&#x53F0;&#x624D;&#x53D1;&#x73B0;&#x539F;&#x6765;&#x67D0;&#x4E2A;&#x5730;&#x65B9;&#x5199;&#x9519;&#x4E86;&#x5BFC;&#x81F4;&#x4EE3;&#x7801;&#x6CA1;&#x751F;&#x6548;&#xFF0C;&#x6B63;&#x5F0F;&#x7531;&#x4E8E;background&#x62A5;&#x9519;&#x7684;&#x9690;&#x853D;&#x6027;(&#x9700;&#x8981;&#x4E3B;&#x52A8;&#x6253;&#x5F00;&#x5BF9;&#x5E94;&#x7684;&#x63A7;&#x5236;&#x53F0;&#x624D;&#x80FD;&#x770B;&#x5230;&#x9519;&#x8BEF;)&#xFF0C;&#x6240;&#x4EE5;&#x7279;&#x522B;&#x6CE8;&#x610F;&#x8FD9;&#x70B9;&#x3002;</p><h2 id="93-%E5%A6%82%E4%BD%95%E8%AE%A9popup%E9%A1%B5%E9%9D%A2%E4%B8%8D%E5%85%B3%E9%97%AD"><strong>9.3. &#x5982;&#x4F55;&#x8BA9;popup&#x9875;&#x9762;&#x4E0D;&#x5173;&#x95ED;</strong></h2><p>&#x5728;&#x5BF9;popup&#x9875;&#x9762;&#x5BA1;&#x67E5;&#x5143;&#x7D20;&#x7684;&#x65F6;&#x5019;popup&#x4F1A;&#x88AB;&#x5F3A;&#x5236;&#x6253;&#x5F00;&#x65E0;&#x6CD5;&#x5173;&#x95ED;&#xFF0C;&#x53EA;&#x6709;&#x63A7;&#x5236;&#x53F0;&#x5173;&#x95ED;&#x4E86;&#x624D;&#x53EF;&#x4EE5;&#x5173;&#x95ED;popup&#xFF0C;&#x539F;&#x56E0;&#x5F88;&#x7B80;&#x5355;&#xFF1A;&#x5982;&#x679C;popup&#x5173;&#x95ED;&#x4E86;&#x63A7;&#x5236;&#x53F0;&#x5C31;&#x6CA1;&#x7528;&#x4E86;&#x3002;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#x5F88;&#x5B9E;&#x7528;&#xFF01;</p><h2 id="94-%E4%B8%8D%E6%94%AF%E6%8C%81%E5%86%85%E8%81%94javascript%E7%9A%84%E6%89%A7%E8%A1%8C"><strong>9.4. &#x4E0D;&#x652F;&#x6301;&#x5185;&#x8054;JavaScript&#x7684;&#x6267;&#x884C;</strong></h2><p>&#x4E5F;&#x5C31;&#x662F;&#x4E0D;&#x652F;&#x6301;&#x5C06;js&#x76F4;&#x63A5;&#x5199;&#x5728;html&#x4E2D;&#xFF0C;&#x6BD4;&#x5982;&#xFF1A;</p><pre><code class="language-html">&lt;input id=&quot;btn&quot; type=&quot;button&quot; value=&quot;&#x6536;&#x85CF;&quot; onclick=&quot;test()&quot;/&gt;
</code></pre><p>&#x62A5;&#x9519;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code>Refused to execute inline event handler because it violates the following Content Security Policy directive: &quot;script-src &apos;self&apos; blob: filesystem: chrome-extension-resource:&quot;. Either the &apos;unsafe-inline&apos; keyword, a hash (&apos;sha256-...&apos;), or a nonce (&apos;nonce-...&apos;) is required to enable inline execution.
</code></pre><p>&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x5C31;&#x662F;&#x7528;JS&#x7ED1;&#x5B9A;&#x4E8B;&#x4EF6;&#xFF1A;</p><pre><code class="language-javascript">$(&apos;#btn&apos;).on(&apos;click&apos;, function(){alert(&apos;&#x6D4B;&#x8BD5;&apos;)});
</code></pre><p>&#x53E6;&#x5916;&#xFF0C;&#x5BF9;&#x4E8E;A&#x6807;&#x7B7E;&#xFF0C;&#x8FD9;&#x6837;&#x5199;<code>href=&quot;javascript:;&quot;</code>&#x7136;&#x540E;&#x7528;JS&#x7ED1;&#x5B9A;&#x4E8B;&#x4EF6;&#x867D;&#x7136;&#x63A7;&#x5236;&#x53F0;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x53D7;&#x5F71;&#x54CD;&#xFF0C;&#x5F53;&#x7136;&#x5F3A;&#x8FEB;&#x75C7;&#x60A3;&#x8005;&#x53D7;&#x4E0D;&#x4E86;&#x7684;&#x8BDD;&#x53EA;&#x80FD;&#x5199;&#x6210;<code>href=&quot;#&quot;</code>&#x4E86;&#x3002;</p><p>&#x5982;&#x679C;&#x8FD9;&#x6837;&#x5199;&#xFF1A;</p><pre><code>&lt;a href=&quot;javascript:;&quot; id=&quot;get_secret&quot;&gt;&#x8BF7;&#x6C42;secret&lt;/a&gt;
</code></pre><p>&#x62A5;&#x9519;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code>Refused to execute JavaScript URL because it violates the following Content Security Policy directive: &quot;script-src &apos;self&apos; blob: filesystem: chrome-extension-resource:&quot;. Either the &apos;unsafe-inline&apos; keyword, a hash (&apos;sha256-...&apos;), or a nonce (&apos;nonce-...&apos;) is required to enable inline execution.
</code></pre><h2 id="95-%E6%B3%A8%E5%85%A5css%E7%9A%84%E6%97%B6%E5%80%99%E5%BF%85%E9%A1%BB%E5%B0%8F%E5%BF%83"><strong>9.5. &#x6CE8;&#x5165;CSS&#x7684;&#x65F6;&#x5019;&#x5FC5;&#x987B;&#x5C0F;&#x5FC3;</strong></h2><p>&#x7531;&#x4E8E;&#x901A;&#x8FC7;<code>content_scripts</code>&#x6CE8;&#x5165;&#x7684;CSS&#x4F18;&#x5148;&#x7EA7;&#x975E;&#x5E38;&#x9AD8;&#xFF0C;&#x51E0;&#x4E4E;&#x4EC5;&#x6B21;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x9ED8;&#x8BA4;&#x6837;&#x5F0F;&#xFF0C;&#x7A0D;&#x4E0D;&#x6CE8;&#x610F;&#x53EF;&#x80FD;&#x5C31;&#x4F1A;&#x5F71;&#x54CD;&#x4E00;&#x4E9B;&#x7F51;&#x7AD9;&#x7684;&#x5C55;&#x793A;&#x6548;&#x679C;&#xFF0C;&#x6240;&#x4EE5;&#x5C3D;&#x91CF;&#x4E0D;&#x8981;&#x5199;&#x4E00;&#x4E9B;&#x5F71;&#x54CD;&#x5168;&#x5C40;&#x7684;&#x6837;&#x5F0F;&#x3002;</p><p>&#x4E4B;&#x6240;&#x4EE5;&#x5F3A;&#x8C03;&#x8FD9;&#x4E2A;&#xFF0C;&#x662F;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#x5E26;&#x6765;&#x7684;&#x95EE;&#x9898;&#x975E;&#x5E38;&#x9690;&#x853D;&#xFF0C;&#x4E0D;&#x592A;&#x5BB9;&#x6613;&#x627E;&#x5230;&#xFF0C;&#x53EF;&#x80FD;&#x4F60;&#x6B63;&#x5728;&#x5199;&#x67D0;&#x4E2A;&#x7F51;&#x9875;&#xFF0C;&#x6628;&#x5929;&#x6837;&#x5F0F;&#x8FD8;&#x662F;&#x597D;&#x597D;&#x7684;&#xFF0C;&#x600E;&#x4E48;&#x4ECA;&#x5929;&#x5C31;&#x7A81;&#x7136;&#x4E0D;&#x884C;&#x4E86;&#xFF1F;&#x7136;&#x540E;&#x4F60;&#x8F9B;&#x8F9B;&#x82E6;&#x82E6;&#x627E;&#x6765;&#x627E;&#x53BB;&#xFF0C;&#x627E;&#x4E86;&#x534A;&#x5929;&#x624D;&#x53D1;&#x73B0;&#x7ADF;&#x7136;&#x662F;&#x56E0;&#x4E3A;&#x63D2;&#x4EF6;&#x91CC;&#x9762;&#x7684;&#x4E00;&#x4E2A;&#x6837;&#x5F0F;&#x5F71;&#x54CD;&#x7684;&#xFF01;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102324665-787100296.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h1 id="%E6%89%93%E5%8C%85%E4%B8%8E%E5%8F%91%E5%B8%83"><strong>&#x6253;&#x5305;&#x4E0E;&#x53D1;&#x5E03;</strong></h1><p>&#x6253;&#x5305;&#x7684;&#x8BDD;&#x76F4;&#x63A5;&#x5728;&#x63D2;&#x4EF6;&#x7BA1;&#x7406;&#x9875;&#x6709;&#x4E00;&#x4E2A;&#x6253;&#x5305;&#x6309;&#x94AE;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102349728-1968586800.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><p>&#x7136;&#x540E;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;<code>.crx</code>&#x6587;&#x4EF6;&#xFF0C;&#x8981;&#x53D1;&#x5E03;&#x5230;Google&#x5E94;&#x7528;&#x5546;&#x5E97;&#x7684;&#x8BDD;&#x9700;&#x8981;&#x5148;&#x767B;&#x5F55;&#x4F60;&#x7684;Google&#x8D26;&#x53F7;&#xFF0C;&#x7136;&#x540E;&#x82B1;5&#x4E2A;$&#x6CE8;&#x518C;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#xFF0C;&#x672C;&#x4EBA;&#x592A;&#x7A77;&#xFF0C;&#x5C31;&#x61D2;&#x5F97;&#x4EB2;&#x81EA;&#x9A8C;&#x8BC1;&#x4E86;&#xFF0C;&#x6709;&#x53D1;&#x5E03;&#x9700;&#x6C42;&#x7684;&#x81EA;&#x5DF1;&#x53BB;&#x6574;&#x5427;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://images2015.cnblogs.com/blog/352797/201707/352797-20170711102401665-879882813.png" class="kg-image" alt="&#x3010;&#x5E72;&#x8D27;&#x3011;Chrome&#x63D2;&#x4EF6;(&#x6269;&#x5C55;)&#x5F00;&#x53D1;&#x5168;&#x653B;&#x7565;" loading="lazy"></figure><h1 id="%E5%8F%82%E8%80%83"><strong>&#x53C2;&#x8003;</strong></h1><h2 id="111-%E5%AE%98%E6%96%B9%E8%B5%84%E6%96%99"><strong>11.1. &#x5B98;&#x65B9;&#x8D44;&#x6599;</strong></h2><p>&#x63A8;&#x8350;&#x67E5;&#x770B;&#x5B98;&#x65B9;&#x6587;&#x6863;&#xFF0C;&#x867D;&#x7136;&#x662F;&#x82F1;&#x6587;&#xFF0C;&#x4F46;&#x662F;&#x5168;&#x4E14;&#x65B0;&#xFF0C;&#x56FD;&#x5185;&#x7684;&#x4E2D;&#x6587;&#x8D44;&#x6599;&#x90FD;&#x6BD4;&#x8F83;&#x65E7;&#xFF08;&#x6CE8;&#x610F;&#x4EE5;&#x4E0B;&#x5168;&#x90E8;&#x9700;&#x8981;FQ&#xFF09;&#xFF1A;</p><ul><li><a href="https://developer.chrome.com/extensions">Chrome&#x63D2;&#x4EF6;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x4E3B;&#x9875;</a></li><li><a href="https://developer.chrome.com/extensions/samples">Chrome&#x63D2;&#x4EF6;&#x5B98;&#x65B9;&#x793A;&#x4F8B;</a></li><li><a href="https://developer.chrome.com/extensions/manifest">manifest&#x6E05;&#x5355;&#x6587;&#x4EF6;</a></li><li><a href="https://developer.chrome.com/extensions/permissions">permissions&#x6743;&#x9650;</a></li><li><a href="https://developer.chrome.com/extensions/api_index">chrome.xxx.api&#x6587;&#x6863;</a></li><li><a href="https://developer.chrome.com/extensions/match_patterns">&#x6A21;&#x7CCA;&#x5339;&#x914D;&#x89C4;&#x5219;&#x8BED;&#x6CD5;&#x8BE6;&#x89E3;</a></li></ul><h2 id="112-%E7%AC%AC%E4%B8%89%E6%96%B9%E8%B5%84%E6%96%99"><strong>11.2. &#x7B2C;&#x4E09;&#x65B9;&#x8D44;&#x6599;</strong></h2><p>&#x90E8;&#x5206;&#x4E2D;&#x6587;&#x8D44;&#x6599;&#xFF0C;&#x4E0D;&#x662F;&#x7279;&#x522B;&#x63A8;&#x8350;&#xFF1A;</p><ul><li><a href="http://open.se.360.cn/open/extension_dev/overview.html">360&#x5B89;&#x5168;&#x6D4F;&#x89C8;&#x5668;&#x5F00;&#x53D1;&#x6587;&#x6863;</a></li><li><a href="http://open.chrome.360.cn/extension_dev/overview.html">360&#x6781;&#x901F;&#x6D4F;&#x89C8;&#x5668;Chrome&#x6269;&#x5C55;&#x5F00;&#x53D1;&#x6587;&#x6863;</a></li><li><a href="http://www.cnblogs.com/champagne/p/">Chrome&#x6269;&#x5C55;&#x5F00;&#x53D1;&#x6781;&#x5BA2;&#x7CFB;&#x5217;&#x535A;&#x5BA2;</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Docker 入门教程]]></title><description><![CDATA[2013年发布至今， Docker 一直广受瞩目，被认为可能会改变软件行业。
但是，许多人并不清楚 Docker 到底是什么，要解决什么问题，好处又在哪里？本文就来详细解释，帮助大家理解它，还带有简单易懂的实例，教你如何将它用于日常开发。]]></description><link>http://blog.zhoushoujian.com/docker/</link><guid isPermaLink="false">618fd6d9b518235c786017ce</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:44 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/creating-a-custom-theme.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/creating-a-custom-theme.png" alt="Docker &#x5165;&#x95E8;&#x6559;&#x7A0B;"><p>2013&#x5E74;&#x53D1;&#x5E03;&#x81F3;&#x4ECA;&#xFF0C; <a href="https://www.docker.com/">Docker</a> &#x4E00;&#x76F4;&#x5E7F;&#x53D7;&#x77A9;&#x76EE;&#xFF0C;&#x88AB;&#x8BA4;&#x4E3A;&#x53EF;&#x80FD;&#x4F1A;&#x6539;&#x53D8;&#x8F6F;&#x4EF6;&#x884C;&#x4E1A;&#x3002;</p><p>&#x4F46;&#x662F;&#xFF0C;&#x8BB8;&#x591A;&#x4EBA;&#x5E76;&#x4E0D;&#x6E05;&#x695A; Docker &#x5230;&#x5E95;&#x662F;&#x4EC0;&#x4E48;&#xFF0C;&#x8981;&#x89E3;&#x51B3;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#xFF0C;&#x597D;&#x5904;&#x53C8;&#x5728;&#x54EA;&#x91CC;&#xFF1F;&#x672C;&#x6587;&#x5C31;&#x6765;&#x8BE6;&#x7EC6;&#x89E3;&#x91CA;&#xFF0C;&#x5E2E;&#x52A9;&#x5927;&#x5BB6;&#x7406;&#x89E3;&#x5B83;&#xFF0C;&#x8FD8;&#x5E26;&#x6709;&#x7B80;&#x5355;&#x6613;&#x61C2;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x6559;&#x4F60;&#x5982;&#x4F55;&#x5C06;&#x5B83;&#x7528;&#x4E8E;&#x65E5;&#x5E38;&#x5F00;&#x53D1;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://www.ruanyifeng.com/blogimg/asset/2018/bg2018020901.png" class="kg-image" alt="Docker &#x5165;&#x95E8;&#x6559;&#x7A0B;" loading="lazy"></figure><h2 id="%E4%B8%80%E3%80%81%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E7%9A%84%E9%9A%BE%E9%A2%98">&#x4E00;&#x3001;&#x73AF;&#x5883;&#x914D;&#x7F6E;&#x7684;&#x96BE;&#x9898;</h2><p>&#x8F6F;&#x4EF6;&#x5F00;&#x53D1;&#x6700;&#x5927;&#x7684;&#x9EBB;&#x70E6;&#x4E8B;&#x4E4B;&#x4E00;&#xFF0C;&#x5C31;&#x662F;&#x73AF;&#x5883;&#x914D;&#x7F6E;&#x3002;&#x7528;&#x6237;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x73AF;&#x5883;&#x90FD;&#x4E0D;&#x76F8;&#x540C;&#xFF0C;&#x4F60;&#x600E;&#x4E48;&#x77E5;&#x9053;&#x81EA;&#x5BB6;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x80FD;&#x5728;&#x90A3;&#x4E9B;&#x673A;&#x5668;&#x8DD1;&#x8D77;&#x6765;&#xFF1F;</p><p>&#x7528;&#x6237;&#x5FC5;&#x987B;&#x4FDD;&#x8BC1;&#x4E24;&#x4EF6;&#x4E8B;&#xFF1A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x7F6E;&#xFF0C;&#x5404;&#x79CD;&#x5E93;&#x548C;&#x7EC4;&#x4EF6;&#x7684;&#x5B89;&#x88C5;&#x3002;&#x53EA;&#x6709;&#x5B83;&#x4EEC;&#x90FD;&#x6B63;&#x786E;&#xFF0C;&#x8F6F;&#x4EF6;&#x624D;&#x80FD;&#x8FD0;&#x884C;&#x3002;&#x4E3E;&#x4F8B;&#x6765;&#x8BF4;&#xFF0C;&#x5B89;&#x88C5;&#x4E00;&#x4E2A; Python &#x5E94;&#x7528;&#xFF0C;&#x8BA1;&#x7B97;&#x673A;&#x5FC5;&#x987B;&#x6709; Python &#x5F15;&#x64CE;&#xFF0C;&#x8FD8;&#x5FC5;&#x987B;&#x6709;&#x5404;&#x79CD;&#x4F9D;&#x8D56;&#xFF0C;&#x53EF;&#x80FD;&#x8FD8;&#x8981;&#x914D;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;</p><p>&#x5982;&#x679C;&#x67D0;&#x4E9B;&#x8001;&#x65E7;&#x7684;&#x6A21;&#x5757;&#x4E0E;&#x5F53;&#x524D;&#x73AF;&#x5883;&#x4E0D;&#x517C;&#x5BB9;&#xFF0C;&#x90A3;&#x5C31;&#x9EBB;&#x70E6;&#x4E86;&#x3002;&#x5F00;&#x53D1;&#x8005;&#x5E38;&#x5E38;&#x4F1A;&#x8BF4;&#xFF1A;&quot;&#x5B83;&#x5728;&#x6211;&#x7684;&#x673A;&#x5668;&#x53EF;&#x4EE5;&#x8DD1;&#x4E86;&quot;&#xFF08;It works on my machine&#xFF09;&#xFF0C;&#x8A00;&#x4E0B;&#x4E4B;&#x610F;&#x5C31;&#x662F;&#xFF0C;&#x5176;&#x4ED6;&#x673A;&#x5668;&#x5F88;&#x53EF;&#x80FD;&#x8DD1;&#x4E0D;&#x4E86;&#x3002;</p><p>&#x73AF;&#x5883;&#x914D;&#x7F6E;&#x5982;&#x6B64;&#x9EBB;&#x70E6;&#xFF0C;&#x6362;&#x4E00;&#x53F0;&#x673A;&#x5668;&#xFF0C;&#x5C31;&#x8981;&#x91CD;&#x6765;&#x4E00;&#x6B21;&#xFF0C;&#x65F7;&#x65E5;&#x8D39;&#x65F6;&#x3002;&#x5F88;&#x591A;&#x4EBA;&#x60F3;&#x5230;&#xFF0C;&#x80FD;&#x4E0D;&#x80FD;&#x4ECE;&#x6839;&#x672C;&#x4E0A;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#xFF0C;&#x8F6F;&#x4EF6;&#x53EF;&#x4EE5;&#x5E26;&#x73AF;&#x5883;&#x5B89;&#x88C5;&#xFF1F;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5B89;&#x88C5;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x628A;&#x539F;&#x59CB;&#x73AF;&#x5883;&#x4E00;&#x6A21;&#x4E00;&#x6837;&#x5730;&#x590D;&#x5236;&#x8FC7;&#x6765;&#x3002;</p><h2 id="%E4%BA%8C%E3%80%81%E8%99%9A%E6%8B%9F%E6%9C%BA">&#x4E8C;&#x3001;&#x865A;&#x62DF;&#x673A;</h2><p>&#x865A;&#x62DF;&#x673A;&#xFF08;virtual machine&#xFF09;&#x5C31;&#x662F;&#x5E26;&#x73AF;&#x5883;&#x5B89;&#x88C5;&#x7684;&#x4E00;&#x79CD;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;&#x5B83;&#x53EF;&#x4EE5;&#x5728;&#x4E00;&#x79CD;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x91CC;&#x9762;&#x8FD0;&#x884C;&#x53E6;&#x4E00;&#x79CD;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x6BD4;&#x5982;&#x5728; Windows &#x7CFB;&#x7EDF;&#x91CC;&#x9762;&#x8FD0;&#x884C; Linux &#x7CFB;&#x7EDF;&#x3002;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5BF9;&#x6B64;&#x6BEB;&#x65E0;&#x611F;&#x77E5;&#xFF0C;&#x56E0;&#x4E3A;&#x865A;&#x62DF;&#x673A;&#x770B;&#x4E0A;&#x53BB;&#x8DDF;&#x771F;&#x5B9E;&#x7CFB;&#x7EDF;&#x4E00;&#x6A21;&#x4E00;&#x6837;&#xFF0C;&#x800C;&#x5BF9;&#x4E8E;&#x5E95;&#x5C42;&#x7CFB;&#x7EDF;&#x6765;&#x8BF4;&#xFF0C;&#x865A;&#x62DF;&#x673A;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x6587;&#x4EF6;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x4E86;&#x5C31;&#x5220;&#x6389;&#xFF0C;&#x5BF9;&#x5176;&#x4ED6;&#x90E8;&#x5206;&#x6BEB;&#x65E0;&#x5F71;&#x54CD;&#x3002;</p><p>&#x867D;&#x7136;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x865A;&#x62DF;&#x673A;&#x8FD8;&#x539F;&#x8F6F;&#x4EF6;&#x7684;&#x539F;&#x59CB;&#x73AF;&#x5883;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x8FD9;&#x4E2A;&#x65B9;&#x6848;&#x6709;&#x51E0;&#x4E2A;&#x7F3A;&#x70B9;&#x3002;</p><p><strong>&#xFF08;1&#xFF09;&#x8D44;&#x6E90;&#x5360;&#x7528;&#x591A;</strong></p><p>&#x865A;&#x62DF;&#x673A;&#x4F1A;&#x72EC;&#x5360;&#x4E00;&#x90E8;&#x5206;&#x5185;&#x5B58;&#x548C;&#x786C;&#x76D8;&#x7A7A;&#x95F4;&#x3002;&#x5B83;&#x8FD0;&#x884C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5176;&#x4ED6;&#x7A0B;&#x5E8F;&#x5C31;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x4E86;&#x3002;&#x54EA;&#x6015;&#x865A;&#x62DF;&#x673A;&#x91CC;&#x9762;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x771F;&#x6B63;&#x4F7F;&#x7528;&#x7684;&#x5185;&#x5B58;&#x53EA;&#x6709; 1MB&#xFF0C;&#x865A;&#x62DF;&#x673A;&#x4F9D;&#x7136;&#x9700;&#x8981;&#x51E0;&#x767E; MB &#x7684;&#x5185;&#x5B58;&#x624D;&#x80FD;&#x8FD0;&#x884C;&#x3002;</p><p><strong>&#xFF08;2&#xFF09;&#x5197;&#x4F59;&#x6B65;&#x9AA4;&#x591A;</strong></p><p>&#x865A;&#x62DF;&#x673A;&#x662F;&#x5B8C;&#x6574;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x4E00;&#x4E9B;&#x7CFB;&#x7EDF;&#x7EA7;&#x522B;&#x7684;&#x64CD;&#x4F5C;&#x6B65;&#x9AA4;&#xFF0C;&#x5F80;&#x5F80;&#x65E0;&#x6CD5;&#x8DF3;&#x8FC7;&#xFF0C;&#x6BD4;&#x5982;&#x7528;&#x6237;&#x767B;&#x5F55;&#x3002;</p><p><strong>&#xFF08;3&#xFF09;&#x542F;&#x52A8;&#x6162;</strong></p><p>&#x542F;&#x52A8;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x9700;&#x8981;&#x591A;&#x4E45;&#xFF0C;&#x542F;&#x52A8;&#x865A;&#x62DF;&#x673A;&#x5C31;&#x9700;&#x8981;&#x591A;&#x4E45;&#x3002;&#x53EF;&#x80FD;&#x8981;&#x7B49;&#x51E0;&#x5206;&#x949F;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x624D;&#x80FD;&#x771F;&#x6B63;&#x8FD0;&#x884C;&#x3002;</p><h2 id="%E4%B8%89%E3%80%81linux-%E5%AE%B9%E5%99%A8">&#x4E09;&#x3001;Linux &#x5BB9;&#x5668;</h2><p>&#x7531;&#x4E8E;&#x865A;&#x62DF;&#x673A;&#x5B58;&#x5728;&#x8FD9;&#x4E9B;&#x7F3A;&#x70B9;&#xFF0C;Linux &#x53D1;&#x5C55;&#x51FA;&#x4E86;&#x53E6;&#x4E00;&#x79CD;&#x865A;&#x62DF;&#x5316;&#x6280;&#x672F;&#xFF1A;Linux &#x5BB9;&#x5668;&#xFF08;Linux Containers&#xFF0C;&#x7F29;&#x5199;&#x4E3A; LXC&#xFF09;&#x3002;</p><p><strong>Linux &#x5BB9;&#x5668;&#x4E0D;&#x662F;&#x6A21;&#x62DF;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x800C;&#x662F;&#x5BF9;&#x8FDB;&#x7A0B;&#x8FDB;&#x884C;&#x9694;&#x79BB;&#x3002;</strong>&#x6216;&#x8005;&#x8BF4;&#xFF0C;&#x5728;&#x6B63;&#x5E38;&#x8FDB;&#x7A0B;&#x7684;&#x5916;&#x9762;&#x5957;&#x4E86;&#x4E00;&#x4E2A;<a href="https://opensource.com/article/18/1/history-low-level-container-runtimes">&#x4FDD;&#x62A4;&#x5C42;</a>&#x3002;&#x5BF9;&#x4E8E;&#x5BB9;&#x5668;&#x91CC;&#x9762;&#x7684;&#x8FDB;&#x7A0B;&#x6765;&#x8BF4;&#xFF0C;&#x5B83;&#x63A5;&#x89E6;&#x5230;&#x7684;&#x5404;&#x79CD;&#x8D44;&#x6E90;&#x90FD;&#x662F;&#x865A;&#x62DF;&#x7684;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x4E0E;&#x5E95;&#x5C42;&#x7CFB;&#x7EDF;&#x7684;&#x9694;&#x79BB;&#x3002;</p><p>&#x7531;&#x4E8E;&#x5BB9;&#x5668;&#x662F;&#x8FDB;&#x7A0B;&#x7EA7;&#x522B;&#x7684;&#xFF0C;&#x76F8;&#x6BD4;&#x865A;&#x62DF;&#x673A;&#x6709;&#x5F88;&#x591A;&#x4F18;&#x52BF;&#x3002;</p><p><strong>&#xFF08;1&#xFF09;&#x542F;&#x52A8;&#x5FEB;</strong></p><p>&#x5BB9;&#x5668;&#x91CC;&#x9762;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x76F4;&#x63A5;&#x5C31;&#x662F;&#x5E95;&#x5C42;&#x7CFB;&#x7EDF;&#x7684;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x865A;&#x62DF;&#x673A;&#x5185;&#x90E8;&#x7684;&#x8FDB;&#x7A0B;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x542F;&#x52A8;&#x5BB9;&#x5668;&#x76F8;&#x5F53;&#x4E8E;&#x542F;&#x52A8;&#x672C;&#x673A;&#x7684;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x901F;&#x5EA6;&#x5C31;&#x5FEB;&#x5F88;&#x591A;&#x3002;</p><p><strong>&#xFF08;2&#xFF09;&#x8D44;&#x6E90;&#x5360;&#x7528;&#x5C11;</strong></p><p>&#x5BB9;&#x5668;&#x53EA;&#x5360;&#x7528;&#x9700;&#x8981;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x4E0D;&#x5360;&#x7528;&#x90A3;&#x4E9B;&#x6CA1;&#x6709;&#x7528;&#x5230;&#x7684;&#x8D44;&#x6E90;&#xFF1B;&#x865A;&#x62DF;&#x673A;&#x7531;&#x4E8E;&#x662F;&#x5B8C;&#x6574;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x4E0D;&#x53EF;&#x907F;&#x514D;&#x8981;&#x5360;&#x7528;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x591A;&#x4E2A;&#x5BB9;&#x5668;&#x53EF;&#x4EE5;&#x5171;&#x4EAB;&#x8D44;&#x6E90;&#xFF0C;&#x865A;&#x62DF;&#x673A;&#x90FD;&#x662F;&#x72EC;&#x4EAB;&#x8D44;&#x6E90;&#x3002;</p><p><strong>&#xFF08;3&#xFF09;&#x4F53;&#x79EF;&#x5C0F;</strong></p><p>&#x5BB9;&#x5668;&#x53EA;&#x8981;&#x5305;&#x542B;&#x7528;&#x5230;&#x7684;&#x7EC4;&#x4EF6;&#x5373;&#x53EF;&#xFF0C;&#x800C;&#x865A;&#x62DF;&#x673A;&#x662F;&#x6574;&#x4E2A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x6253;&#x5305;&#xFF0C;&#x6240;&#x4EE5;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x6BD4;&#x865A;&#x62DF;&#x673A;&#x6587;&#x4EF6;&#x8981;&#x5C0F;&#x5F88;&#x591A;&#x3002;</p><p>&#x603B;&#x4E4B;&#xFF0C;&#x5BB9;&#x5668;&#x6709;&#x70B9;&#x50CF;&#x8F7B;&#x91CF;&#x7EA7;&#x7684;&#x865A;&#x62DF;&#x673A;&#xFF0C;&#x80FD;&#x591F;&#x63D0;&#x4F9B;&#x865A;&#x62DF;&#x5316;&#x7684;&#x73AF;&#x5883;&#xFF0C;&#x4F46;&#x662F;&#x6210;&#x672C;&#x5F00;&#x9500;&#x5C0F;&#x5F97;&#x591A;&#x3002;</p><h2 id="%E5%9B%9B%E3%80%81docker-%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">&#x56DB;&#x3001;Docker &#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2><p><strong>Docker &#x5C5E;&#x4E8E; Linux &#x5BB9;&#x5668;&#x7684;&#x4E00;&#x79CD;&#x5C01;&#x88C5;&#xFF0C;&#x63D0;&#x4F9B;&#x7B80;&#x5355;&#x6613;&#x7528;&#x7684;&#x5BB9;&#x5668;&#x4F7F;&#x7528;&#x63A5;&#x53E3;&#x3002;</strong>&#x5B83;&#x662F;&#x76EE;&#x524D;&#x6700;&#x6D41;&#x884C;&#x7684; Linux &#x5BB9;&#x5668;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><p>Docker &#x5C06;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E0E;&#x8BE5;&#x7A0B;&#x5E8F;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x6253;&#x5305;&#x5728;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x91CC;&#x9762;&#x3002;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x5C31;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x865A;&#x62DF;&#x5BB9;&#x5668;&#x3002;&#x7A0B;&#x5E8F;&#x5728;&#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x5BB9;&#x5668;&#x91CC;&#x8FD0;&#x884C;&#xFF0C;&#x5C31;&#x597D;&#x50CF;&#x5728;&#x771F;&#x5B9E;&#x7684;&#x7269;&#x7406;&#x673A;&#x4E0A;&#x8FD0;&#x884C;&#x4E00;&#x6837;&#x3002;&#x6709;&#x4E86; Docker&#xFF0C;&#x5C31;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#x73AF;&#x5883;&#x95EE;&#x9898;&#x3002;</p><p>&#x603B;&#x4F53;&#x6765;&#x8BF4;&#xFF0C;Docker &#x7684;&#x63A5;&#x53E3;&#x76F8;&#x5F53;&#x7B80;&#x5355;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5730;&#x521B;&#x5EFA;&#x548C;&#x4F7F;&#x7528;&#x5BB9;&#x5668;&#xFF0C;&#x628A;&#x81EA;&#x5DF1;&#x7684;&#x5E94;&#x7528;&#x653E;&#x5165;&#x5BB9;&#x5668;&#x3002;&#x5BB9;&#x5668;&#x8FD8;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x7248;&#x672C;&#x7BA1;&#x7406;&#x3001;&#x590D;&#x5236;&#x3001;&#x5206;&#x4EAB;&#x3001;&#x4FEE;&#x6539;&#xFF0C;&#x5C31;&#x50CF;&#x7BA1;&#x7406;&#x666E;&#x901A;&#x7684;&#x4EE3;&#x7801;&#x4E00;&#x6837;&#x3002;</p><h2 id="%E4%BA%94%E3%80%81docker-%E7%9A%84%E7%94%A8%E9%80%94">&#x4E94;&#x3001;Docker &#x7684;&#x7528;&#x9014;</h2><p>Docker &#x7684;&#x4E3B;&#x8981;&#x7528;&#x9014;&#xFF0C;&#x76EE;&#x524D;&#x6709;&#x4E09;&#x5927;&#x7C7B;&#x3002;</p><p><strong>&#xFF08;1&#xFF09;&#x63D0;&#x4F9B;&#x4E00;&#x6B21;&#x6027;&#x7684;&#x73AF;&#x5883;&#x3002;</strong>&#x6BD4;&#x5982;&#xFF0C;&#x672C;&#x5730;&#x6D4B;&#x8BD5;&#x4ED6;&#x4EBA;&#x7684;&#x8F6F;&#x4EF6;&#x3001;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x7684;&#x65F6;&#x5019;&#x63D0;&#x4F9B;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x548C;&#x6784;&#x5EFA;&#x7684;&#x73AF;&#x5883;&#x3002;</p><p><strong>&#xFF08;2&#xFF09;&#x63D0;&#x4F9B;&#x5F39;&#x6027;&#x7684;&#x4E91;&#x670D;&#x52A1;&#x3002;</strong>&#x56E0;&#x4E3A; Docker &#x5BB9;&#x5668;&#x53EF;&#x4EE5;&#x968F;&#x5F00;&#x968F;&#x5173;&#xFF0C;&#x5F88;&#x9002;&#x5408;&#x52A8;&#x6001;&#x6269;&#x5BB9;&#x548C;&#x7F29;&#x5BB9;&#x3002;</p><p><strong>&#xFF08;3&#xFF09;&#x7EC4;&#x5EFA;&#x5FAE;&#x670D;&#x52A1;&#x67B6;&#x6784;&#x3002;</strong>&#x901A;&#x8FC7;&#x591A;&#x4E2A;&#x5BB9;&#x5668;&#xFF0C;&#x4E00;&#x53F0;&#x673A;&#x5668;&#x53EF;&#x4EE5;&#x8DD1;&#x591A;&#x4E2A;&#x670D;&#x52A1;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x672C;&#x673A;&#x5C31;&#x53EF;&#x4EE5;&#x6A21;&#x62DF;&#x51FA;&#x5FAE;&#x670D;&#x52A1;&#x67B6;&#x6784;&#x3002;</p><h2 id="%E5%85%AD%E3%80%81docker-%E7%9A%84%E5%AE%89%E8%A3%85">&#x516D;&#x3001;Docker &#x7684;&#x5B89;&#x88C5;</h2><p>Docker &#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x7684;&#x5546;&#x4E1A;&#x4EA7;&#x54C1;&#xFF0C;&#x6709;&#x4E24;&#x4E2A;&#x7248;&#x672C;&#xFF1A;&#x793E;&#x533A;&#x7248;&#xFF08;Community Edition&#xFF0C;&#x7F29;&#x5199;&#x4E3A; CE&#xFF09;&#x548C;&#x4F01;&#x4E1A;&#x7248;&#xFF08;Enterprise Edition&#xFF0C;&#x7F29;&#x5199;&#x4E3A; EE&#xFF09;&#x3002;&#x4F01;&#x4E1A;&#x7248;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E9B;&#x6536;&#x8D39;&#x670D;&#x52A1;&#xFF0C;&#x4E2A;&#x4EBA;&#x5F00;&#x53D1;&#x8005;&#x4E00;&#x822C;&#x7528;&#x4E0D;&#x5230;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4ECB;&#x7ECD;&#x90FD;&#x9488;&#x5BF9;&#x793E;&#x533A;&#x7248;&#x3002;</p><p>Docker CE &#x7684;&#x5B89;&#x88C5;&#x8BF7;&#x53C2;&#x8003;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x3002;</p><ul><li><a href="https://docs.docker.com/docker-for-mac/install/">Mac</a></li><li><a href="https://docs.docker.com/docker-for-windows/install/">Windows</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/ubuntu/">Ubuntu</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/debian/">Debian</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/centos/">CentOS</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/fedora/">Fedora</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/binaries/">&#x5176;&#x4ED6; Linux &#x53D1;&#x884C;&#x7248;</a></li></ul><p>&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x8FD0;&#x884C;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x9A8C;&#x8BC1;&#x662F;&#x5426;&#x5B89;&#x88C5;&#x6210;&#x529F;&#x3002;</p><pre><code class="language-bash">
$ docker version
# &#x6216;&#x8005;
$ docker info
</code></pre><p>Docker &#x9700;&#x8981;&#x7528;&#x6237;&#x5177;&#x6709; sudo &#x6743;&#x9650;&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x6BCF;&#x6B21;&#x547D;&#x4EE4;&#x90FD;&#x8F93;&#x5165;<code>sudo</code>&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x7528;&#x6237;&#x52A0;&#x5165; Docker &#x7528;&#x6237;&#x7EC4;&#xFF08;<a href="https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user">&#x5B98;&#x65B9;&#x6587;&#x6863;</a>&#xFF09;&#x3002;</p><pre><code class="language-bash">
$ sudo usermod -aG docker $USER
</code></pre><p>Docker &#x662F;&#x670D;&#x52A1;&#x5668;----&#x5BA2;&#x6237;&#x7AEF;&#x67B6;&#x6784;&#x3002;&#x547D;&#x4EE4;&#x884C;&#x8FD0;&#x884C;<code>docker</code>&#x547D;&#x4EE4;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x672C;&#x673A;&#x6709; Docker &#x670D;&#x52A1;&#x3002;&#x5982;&#x679C;&#x8FD9;&#x9879;&#x670D;&#x52A1;&#x6CA1;&#x6709;&#x542F;&#x52A8;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x542F;&#x52A8;&#xFF08;<a href="https://docs.docker.com/config/daemon/systemd/">&#x5B98;&#x65B9;&#x6587;&#x6863;</a>&#xFF09;&#x3002;</p><pre><code class="language-bash">
# service &#x547D;&#x4EE4;&#x7684;&#x7528;&#x6CD5;
$ sudo service docker start

# systemctl &#x547D;&#x4EE4;&#x7684;&#x7528;&#x6CD5;
$ sudo systemctl start docker
</code></pre><h2 id="%E5%85%AD%E3%80%81image-%E6%96%87%E4%BB%B6">&#x516D;&#x3001;image &#x6587;&#x4EF6;</h2><p><strong>Docker &#x628A;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x53CA;&#x5176;&#x4F9D;&#x8D56;&#xFF0C;&#x6253;&#x5305;&#x5728; image &#x6587;&#x4EF6;&#x91CC;&#x9762;&#x3002;</strong>&#x53EA;&#x6709;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x624D;&#x80FD;&#x751F;&#x6210; Docker &#x5BB9;&#x5668;&#x3002;image &#x6587;&#x4EF6;&#x53EF;&#x4EE5;&#x770B;&#x4F5C;&#x662F;&#x5BB9;&#x5668;&#x7684;&#x6A21;&#x677F;&#x3002;Docker &#x6839;&#x636E; image &#x6587;&#x4EF6;&#x751F;&#x6210;&#x5BB9;&#x5668;&#x7684;&#x5B9E;&#x4F8B;&#x3002;&#x540C;&#x4E00;&#x4E2A; image &#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x751F;&#x6210;&#x591A;&#x4E2A;&#x540C;&#x65F6;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#x5B9E;&#x4F8B;&#x3002;</p><p>image &#x662F;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x3002;&#x5B9E;&#x9645;&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x4E00;&#x4E2A; image &#x6587;&#x4EF6;&#x5F80;&#x5F80;&#x901A;&#x8FC7;&#x7EE7;&#x627F;&#x53E6;&#x4E00;&#x4E2A; image &#x6587;&#x4EF6;&#xFF0C;&#x52A0;&#x4E0A;&#x4E00;&#x4E9B;&#x4E2A;&#x6027;&#x5316;&#x8BBE;&#x7F6E;&#x800C;&#x751F;&#x6210;&#x3002;&#x4E3E;&#x4F8B;&#x6765;&#x8BF4;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5728; Ubuntu &#x7684; image &#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x5F80;&#x91CC;&#x9762;&#x52A0;&#x5165; Apache &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5F62;&#x6210;&#x4F60;&#x7684; image&#x3002;</p><pre><code class="language-bash">
# &#x5217;&#x51FA;&#x672C;&#x673A;&#x7684;&#x6240;&#x6709; image &#x6587;&#x4EF6;&#x3002;
$ docker image ls

# &#x5220;&#x9664; image &#x6587;&#x4EF6;
$ docker image rm [imageName]
</code></pre><p>image &#x6587;&#x4EF6;&#x662F;&#x901A;&#x7528;&#x7684;&#xFF0C;&#x4E00;&#x53F0;&#x673A;&#x5668;&#x7684; image &#x6587;&#x4EF6;&#x62F7;&#x8D1D;&#x5230;&#x53E6;&#x4E00;&#x53F0;&#x673A;&#x5668;&#xFF0C;&#x7167;&#x6837;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x4E3A;&#x4E86;&#x8282;&#x7701;&#x65F6;&#x95F4;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x522B;&#x4EBA;&#x5236;&#x4F5C;&#x597D;&#x7684; image &#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x81EA;&#x5DF1;&#x5236;&#x4F5C;&#x3002;&#x5373;&#x4F7F;&#x8981;&#x5B9A;&#x5236;&#xFF0C;&#x4E5F;&#x5E94;&#x8BE5;&#x57FA;&#x4E8E;&#x522B;&#x4EBA;&#x7684; image &#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x52A0;&#x5DE5;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x4ECE;&#x96F6;&#x5F00;&#x59CB;&#x5236;&#x4F5C;&#x3002;</p><p>&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x5171;&#x4EAB;&#xFF0C;image &#x6587;&#x4EF6;&#x5236;&#x4F5C;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0A;&#x4F20;&#x5230;&#x7F51;&#x4E0A;&#x7684;&#x4ED3;&#x5E93;&#x3002;Docker &#x7684;&#x5B98;&#x65B9;&#x4ED3;&#x5E93; <a href="https://hub.docker.com/">Docker Hub</a> &#x662F;&#x6700;&#x91CD;&#x8981;&#x3001;&#x6700;&#x5E38;&#x7528;&#x7684; image &#x4ED3;&#x5E93;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x51FA;&#x552E;&#x81EA;&#x5DF1;&#x5236;&#x4F5C;&#x7684; image &#x6587;&#x4EF6;&#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x7684;&#x3002;</p><h2 id="%E4%B8%83%E3%80%81%E5%AE%9E%E4%BE%8B%EF%BC%9Ahello-world">&#x4E03;&#x3001;&#x5B9E;&#x4F8B;&#xFF1A;hello world</h2><p>&#x4E0B;&#x9762;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x6700;&#x7B80;&#x5355;&#x7684; image &#x6587;&#x4EF6;&quot;<a href="https://hub.docker.com/r/library/hello-world/">hello world&quot;</a>&#xFF0C;&#x611F;&#x53D7;&#x4E00;&#x4E0B; Docker&#x3002;</p><p>&#x9700;&#x8981;&#x8BF4;&#x660E;&#x7684;&#x662F;&#xFF0C;&#x56FD;&#x5185;&#x8FDE;&#x63A5; Docker &#x7684;&#x5B98;&#x65B9;&#x4ED3;&#x5E93;&#x5F88;&#x6162;&#xFF0C;&#x8FD8;&#x4F1A;&#x65AD;&#x7EBF;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x9ED8;&#x8BA4;&#x4ED3;&#x5E93;&#x6539;&#x6210;&#x56FD;&#x5185;&#x7684;&#x955C;&#x50CF;&#x7F51;&#x7AD9;&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x4FEE;&#x6539;&#x65B9;&#x6CD5;&#x5728;<a href="https://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html">&#x4E0B;&#x4E00;&#x7BC7;&#x6587;&#x7AE0;</a>&#x7684;&#x7B2C;&#x4E00;&#x8282;&#x3002;&#x6709;&#x9700;&#x8981;&#x7684;&#x670B;&#x53CB;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x770B;&#x4E00;&#x4E0B;&#x3002;</p><p>&#x9996;&#x5148;&#xFF0C;&#x8FD0;&#x884C;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x5C06; image &#x6587;&#x4EF6;&#x4ECE;&#x4ED3;&#x5E93;&#x6293;&#x53D6;&#x5230;&#x672C;&#x5730;&#x3002;</p><pre><code class="language-bash">
$ docker image pull library/hello-world
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;<code>docker image pull</code>&#x662F;&#x6293;&#x53D6; image &#x6587;&#x4EF6;&#x7684;&#x547D;&#x4EE4;&#x3002;<code>library/hello-world</code>&#x662F; image &#x6587;&#x4EF6;&#x5728;&#x4ED3;&#x5E93;&#x91CC;&#x9762;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x5176;&#x4E2D;<code>library</code>&#x662F; image &#x6587;&#x4EF6;&#x6240;&#x5728;&#x7684;&#x7EC4;&#xFF0C;<code>hello-world</code>&#x662F; image &#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#x3002;</p><p>&#x7531;&#x4E8E; Docker &#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x7684; image &#x6587;&#x4EF6;&#xFF0C;&#x90FD;&#x653E;&#x5728;<a href="https://hub.docker.com/r/library/"><code>library</code></a>&#x7EC4;&#x91CC;&#x9762;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x7684;&#x662F;&#x9ED8;&#x8BA4;&#x7EC4;&#xFF0C;&#x53EF;&#x4EE5;&#x7701;&#x7565;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x5199;&#x6210;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x3002;</p><pre><code class="language-bash">
$ docker image pull hello-world
</code></pre><p>&#x6293;&#x53D6;&#x6210;&#x529F;&#x4EE5;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x672C;&#x673A;&#x770B;&#x5230;&#x8FD9;&#x4E2A; image &#x6587;&#x4EF6;&#x4E86;&#x3002;</p><pre><code class="language-bash">
$ docker image ls
</code></pre><p>&#x73B0;&#x5728;&#xFF0C;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A; image &#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ docker container run hello-world
</code></pre><p><code>docker container run</code>&#x547D;&#x4EE4;&#x4F1A;&#x4ECE; image &#x6587;&#x4EF6;&#xFF0C;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#x5B9E;&#x4F8B;&#x3002;</p><p>&#x6CE8;&#x610F;&#xFF0C;<code>docker container run</code>&#x547D;&#x4EE4;&#x5177;&#x6709;&#x81EA;&#x52A8;&#x6293;&#x53D6; image &#x6587;&#x4EF6;&#x7684;&#x529F;&#x80FD;&#x3002;&#x5982;&#x679C;&#x53D1;&#x73B0;&#x672C;&#x5730;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x7684; image &#x6587;&#x4EF6;&#xFF0C;&#x5C31;&#x4F1A;&#x4ECE;&#x4ED3;&#x5E93;&#x81EA;&#x52A8;&#x6293;&#x53D6;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x524D;&#x9762;&#x7684;<code>docker image pull</code>&#x547D;&#x4EE4;&#x5E76;&#x4E0D;&#x662F;&#x5FC5;&#x9700;&#x7684;&#x6B65;&#x9AA4;&#x3002;</p><p>&#x5982;&#x679C;&#x8FD0;&#x884C;&#x6210;&#x529F;&#xFF0C;&#x4F60;&#x4F1A;&#x5728;&#x5C4F;&#x5E55;&#x4E0A;&#x8BFB;&#x5230;&#x4E0B;&#x9762;&#x7684;&#x8F93;&#x51FA;&#x3002;</p><pre><code class="language-bash">
$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... ...
</code></pre><p>&#x8F93;&#x51FA;&#x8FD9;&#x6BB5;&#x63D0;&#x793A;&#x4EE5;&#x540E;&#xFF0C;<code>hello world</code>&#x5C31;&#x4F1A;&#x505C;&#x6B62;&#x8FD0;&#x884C;&#xFF0C;&#x5BB9;&#x5668;&#x81EA;&#x52A8;&#x7EC8;&#x6B62;&#x3002;</p><p>&#x6709;&#x4E9B;&#x5BB9;&#x5668;&#x4E0D;&#x4F1A;&#x81EA;&#x52A8;&#x7EC8;&#x6B62;&#xFF0C;&#x56E0;&#x4E3A;&#x63D0;&#x4F9B;&#x7684;&#x662F;&#x670D;&#x52A1;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x5B89;&#x88C5;&#x8FD0;&#x884C; Ubuntu &#x7684; image&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4F53;&#x9A8C; Ubuntu &#x7CFB;&#x7EDF;&#x3002;</p><pre><code class="language-bash">
$ docker container run -it ubuntu bash
</code></pre><p>&#x5BF9;&#x4E8E;&#x90A3;&#x4E9B;&#x4E0D;&#x4F1A;&#x81EA;&#x52A8;&#x7EC8;&#x6B62;&#x7684;&#x5BB9;&#x5668;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528;<a href="https://docs.docker.com/engine/reference/commandline/container_kill/"><code>docker container kill</code></a> &#x547D;&#x4EE4;&#x624B;&#x52A8;&#x7EC8;&#x6B62;&#x3002;</p><pre><code class="language-bash">
$ docker container kill [containID]
</code></pre><h2 id="%E5%85%AB%E3%80%81%E5%AE%B9%E5%99%A8%E6%96%87%E4%BB%B6">&#x516B;&#x3001;&#x5BB9;&#x5668;&#x6587;&#x4EF6;</h2><p><strong>image &#x6587;&#x4EF6;&#x751F;&#x6210;&#x7684;&#x5BB9;&#x5668;&#x5B9E;&#x4F8B;&#xFF0C;&#x672C;&#x8EAB;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x79F0;&#x4E3A;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;</strong>&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x4E00;&#x65E6;&#x5BB9;&#x5668;&#x751F;&#x6210;&#xFF0C;&#x5C31;&#x4F1A;&#x540C;&#x65F6;&#x5B58;&#x5728;&#x4E24;&#x4E2A;&#x6587;&#x4EF6;&#xFF1A; image &#x6587;&#x4EF6;&#x548C;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;&#x800C;&#x4E14;&#x5173;&#x95ED;&#x5BB9;&#x5668;&#x5E76;&#x4E0D;&#x4F1A;&#x5220;&#x9664;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#xFF0C;&#x53EA;&#x662F;&#x5BB9;&#x5668;&#x505C;&#x6B62;&#x8FD0;&#x884C;&#x800C;&#x5DF2;&#x3002;</p><pre><code class="language-bash">
# &#x5217;&#x51FA;&#x672C;&#x673A;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;
$ docker container ls

# &#x5217;&#x51FA;&#x672C;&#x673A;&#x6240;&#x6709;&#x5BB9;&#x5668;&#xFF0C;&#x5305;&#x62EC;&#x7EC8;&#x6B62;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;
$ docker container ls --all
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x7684;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x4E4B;&#x4E2D;&#xFF0C;&#x5305;&#x62EC;&#x5BB9;&#x5668;&#x7684; ID&#x3002;&#x5F88;&#x591A;&#x5730;&#x65B9;&#x90FD;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x8FD9;&#x4E2A; ID&#xFF0C;&#x6BD4;&#x5982;&#x4E0A;&#x4E00;&#x8282;&#x7EC8;&#x6B62;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x7684;<code>docker container kill</code>&#x547D;&#x4EE4;&#x3002;</p><p>&#x7EC8;&#x6B62;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#xFF0C;&#x4F9D;&#x7136;&#x4F1A;&#x5360;&#x636E;&#x786C;&#x76D8;&#x7A7A;&#x95F4;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<a href="https://docs.docker.com/engine/reference/commandline/container_rm/"><code>docker container rm</code></a>&#x547D;&#x4EE4;&#x5220;&#x9664;&#x3002;</p><pre><code class="language-bash">
$ docker container rm [containerID]
</code></pre><p>&#x8FD0;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x4E4B;&#x540E;&#xFF0C;&#x518D;&#x4F7F;&#x7528;<code>docker container ls --all</code>&#x547D;&#x4EE4;&#xFF0C;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;&#x88AB;&#x5220;&#x9664;&#x7684;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x5DF2;&#x7ECF;&#x6D88;&#x5931;&#x4E86;&#x3002;</p><h2 id="%E4%B9%9D%E3%80%81dockerfile-%E6%96%87%E4%BB%B6">&#x4E5D;&#x3001;Dockerfile &#x6587;&#x4EF6;</h2><p>&#x5B66;&#x4F1A;&#x4F7F;&#x7528; image &#x6587;&#x4EF6;&#x4EE5;&#x540E;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x95EE;&#x9898;&#x5C31;&#x662F;&#xFF0C;&#x5982;&#x4F55;&#x53EF;&#x4EE5;&#x751F;&#x6210; image &#x6587;&#x4EF6;&#xFF1F;&#x5982;&#x679C;&#x4F60;&#x8981;&#x63A8;&#x5E7F;&#x81EA;&#x5DF1;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x52BF;&#x5FC5;&#x8981;&#x81EA;&#x5DF1;&#x5236;&#x4F5C; image &#x6587;&#x4EF6;&#x3002;</p><p>&#x8FD9;&#x5C31;&#x9700;&#x8981;&#x7528;&#x5230; Dockerfile &#x6587;&#x4EF6;&#x3002;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x7528;&#x6765;&#x914D;&#x7F6E; image&#x3002;Docker &#x6839;&#x636E; &#x8BE5;&#x6587;&#x4EF6;&#x751F;&#x6210;&#x4E8C;&#x8FDB;&#x5236;&#x7684; image &#x6587;&#x4EF6;&#x3002;</p><p>&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#xFF0C;&#x6F14;&#x793A;&#x5982;&#x4F55;&#x7F16;&#x5199; Dockerfile &#x6587;&#x4EF6;&#x3002;</p><h2 id="%E5%8D%81%E3%80%81%E5%AE%9E%E4%BE%8B%EF%BC%9A%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84-docker-%E5%AE%B9%E5%99%A8">&#x5341;&#x3001;&#x5B9E;&#x4F8B;&#xFF1A;&#x5236;&#x4F5C;&#x81EA;&#x5DF1;&#x7684; Docker &#x5BB9;&#x5668;</h2><p>&#x4E0B;&#x9762;&#x6211;&#x4EE5; <a href="https://www.ruanyifeng.com/blog/2017/08/koa.html">koa-demos</a> &#x9879;&#x76EE;&#x4E3A;&#x4F8B;&#xFF0C;&#x4ECB;&#x7ECD;&#x600E;&#x4E48;&#x5199; Dockerfile &#x6587;&#x4EF6;&#xFF0C;&#x5B9E;&#x73B0;&#x8BA9;&#x7528;&#x6237;&#x5728; Docker &#x5BB9;&#x5668;&#x91CC;&#x9762;&#x8FD0;&#x884C; Koa &#x6846;&#x67B6;&#x3002;</p><p>&#x4F5C;&#x4E3A;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#xFF0C;&#x8BF7;&#x5148;<a href="https://github.com/ruanyf/koa-demos/archive/master.zip">&#x4E0B;&#x8F7D;&#x6E90;&#x7801;</a>&#x3002;</p><pre><code class="language-bash">
$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos
</code></pre><h3 id="101-%E7%BC%96%E5%86%99-dockerfile-%E6%96%87%E4%BB%B6">10.1 &#x7F16;&#x5199; Dockerfile &#x6587;&#x4EF6;</h3><p>&#x9996;&#x5148;&#xFF0C;&#x5728;&#x9879;&#x76EE;&#x7684;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x6587;&#x672C;&#x6587;&#x4EF6;<code>.dockerignore</code>&#xFF0C;&#x5199;&#x5165;&#x4E0B;&#x9762;&#x7684;<a href="https://github.com/ruanyf/koa-demos/blob/master/.dockerignore">&#x5185;&#x5BB9;</a>&#x3002;</p><pre><code class="language-bash">
.git
node_modules
npm-debug.log
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x8868;&#x793A;&#xFF0C;&#x8FD9;&#x4E09;&#x4E2A;&#x8DEF;&#x5F84;&#x8981;&#x6392;&#x9664;&#xFF0C;&#x4E0D;&#x8981;&#x6253;&#x5305;&#x8FDB;&#x5165; image &#x6587;&#x4EF6;&#x3002;&#x5982;&#x679C;&#x4F60;&#x6CA1;&#x6709;&#x8DEF;&#x5F84;&#x8981;&#x6392;&#x9664;&#xFF0C;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x53EF;&#x4EE5;&#x4E0D;&#x65B0;&#x5EFA;&#x3002;</p><p>&#x7136;&#x540E;&#xFF0C;&#x5728;&#x9879;&#x76EE;&#x7684;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x6587;&#x672C;&#x6587;&#x4EF6; Dockerfile&#xFF0C;&#x5199;&#x5165;&#x4E0B;&#x9762;&#x7684;<a href="https://github.com/ruanyf/koa-demos/blob/master/Dockerfile">&#x5185;&#x5BB9;</a>&#x3002;</p><pre><code class="language-bash">
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E00;&#x5171;&#x4E94;&#x884C;&#xFF0C;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#x3002;</p><ul><li><code>FROM node:8.4</code>&#xFF1A;&#x8BE5; image &#x6587;&#x4EF6;&#x7EE7;&#x627F;&#x5B98;&#x65B9;&#x7684; node image&#xFF0C;&#x5192;&#x53F7;&#x8868;&#x793A;&#x6807;&#x7B7E;&#xFF0C;&#x8FD9;&#x91CC;&#x6807;&#x7B7E;&#x662F;<code>8.4</code>&#xFF0C;&#x5373;8.4&#x7248;&#x672C;&#x7684; node&#x3002;</li><li><code>COPY . /app</code>&#xFF1A;&#x5C06;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x6587;&#x4EF6;&#xFF08;&#x9664;&#x4E86;<code>.dockerignore</code>&#x6392;&#x9664;&#x7684;&#x8DEF;&#x5F84;&#xFF09;&#xFF0C;&#x90FD;&#x62F7;&#x8D1D;&#x8FDB;&#x5165; image &#x6587;&#x4EF6;&#x7684;<code>/app</code>&#x76EE;&#x5F55;&#x3002;</li><li><code>WORKDIR /app</code>&#xFF1A;&#x6307;&#x5B9A;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5DE5;&#x4F5C;&#x8DEF;&#x5F84;&#x4E3A;<code>/app</code>&#x3002;</li><li><code>RUN npm install</code>&#xFF1A;&#x5728;<code>/app</code>&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x8FD0;&#x884C;<code>npm install</code>&#x547D;&#x4EE4;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x5B89;&#x88C5;&#x540E;&#x6240;&#x6709;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x90FD;&#x5C06;&#x6253;&#x5305;&#x8FDB;&#x5165; image &#x6587;&#x4EF6;&#x3002;</li><li><code>EXPOSE 3000</code>&#xFF1A;&#x5C06;&#x5BB9;&#x5668; 3000 &#x7AEF;&#x53E3;&#x66B4;&#x9732;&#x51FA;&#x6765;&#xFF0C; &#x5141;&#x8BB8;&#x5916;&#x90E8;&#x8FDE;&#x63A5;&#x8FD9;&#x4E2A;&#x7AEF;&#x53E3;&#x3002;</li></ul><h3 id="102-%E5%88%9B%E5%BB%BA-image-%E6%96%87%E4%BB%B6">10.2 &#x521B;&#x5EFA; image &#x6587;&#x4EF6;</h3><p>&#x6709;&#x4E86; Dockerfile &#x6587;&#x4EF6;&#x4EE5;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>docker image build</code>&#x547D;&#x4EE4;&#x521B;&#x5EFA; image &#x6587;&#x4EF6;&#x4E86;&#x3002;</p><pre><code class="language-bash">
$ docker image build -t koa-demo .
# &#x6216;&#x8005;
$ docker image build -t koa-demo:0.0.1 .
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;<code>-t</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x6307;&#x5B9A; image &#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x540E;&#x9762;&#x8FD8;&#x53EF;&#x4EE5;&#x7528;&#x5192;&#x53F7;&#x6307;&#x5B9A;&#x6807;&#x7B7E;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x6307;&#x5B9A;&#xFF0C;&#x9ED8;&#x8BA4;&#x7684;&#x6807;&#x7B7E;&#x5C31;&#x662F;<code>latest</code>&#x3002;&#x6700;&#x540E;&#x7684;&#x90A3;&#x4E2A;&#x70B9;&#x8868;&#x793A; Dockerfile &#x6587;&#x4EF6;&#x6240;&#x5728;&#x7684;&#x8DEF;&#x5F84;&#xFF0C;&#x4E0A;&#x4F8B;&#x662F;&#x5F53;&#x524D;&#x8DEF;&#x5F84;&#xFF0C;&#x6240;&#x4EE5;&#x662F;&#x4E00;&#x4E2A;&#x70B9;&#x3002;</p><p>&#x5982;&#x679C;&#x8FD0;&#x884C;&#x6210;&#x529F;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x65B0;&#x751F;&#x6210;&#x7684; image &#x6587;&#x4EF6;<code>koa-demo</code>&#x4E86;&#x3002;</p><pre><code class="language-bash">
$ docker image ls
</code></pre><h3 id="103-%E7%94%9F%E6%88%90%E5%AE%B9%E5%99%A8">10.3 &#x751F;&#x6210;&#x5BB9;&#x5668;</h3><p><code>docker container run</code>&#x547D;&#x4EE4;&#x4F1A;&#x4ECE; image &#x6587;&#x4EF6;&#x751F;&#x6210;&#x5BB9;&#x5668;&#x3002;</p><pre><code class="language-bash">
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# &#x6216;&#x8005;
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x7684;&#x5404;&#x4E2A;&#x53C2;&#x6570;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p><ul><li><code>-p</code>&#x53C2;&#x6570;&#xFF1A;&#x5BB9;&#x5668;&#x7684; 3000 &#x7AEF;&#x53E3;&#x6620;&#x5C04;&#x5230;&#x672C;&#x673A;&#x7684; 8000 &#x7AEF;&#x53E3;&#x3002;</li><li><code>-it</code>&#x53C2;&#x6570;&#xFF1A;&#x5BB9;&#x5668;&#x7684; Shell &#x6620;&#x5C04;&#x5230;&#x5F53;&#x524D;&#x7684; Shell&#xFF0C;&#x7136;&#x540E;&#x4F60;&#x5728;&#x672C;&#x673A;&#x7A97;&#x53E3;&#x8F93;&#x5165;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x5C31;&#x4F1A;&#x4F20;&#x5165;&#x5BB9;&#x5668;&#x3002;</li><li><code>koa-demo:0.0.1</code>&#xFF1A;image &#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#xFF08;&#x5982;&#x679C;&#x6709;&#x6807;&#x7B7E;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x6807;&#x7B7E;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F; latest &#x6807;&#x7B7E;&#xFF09;&#x3002;</li><li><code>/bin/bash</code>&#xFF1A;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x4EE5;&#x540E;&#xFF0C;&#x5185;&#x90E8;&#x7B2C;&#x4E00;&#x4E2A;&#x6267;&#x884C;&#x7684;&#x547D;&#x4EE4;&#x3002;&#x8FD9;&#x91CC;&#x662F;&#x542F;&#x52A8; Bash&#xFF0C;&#x4FDD;&#x8BC1;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Shell&#x3002;</li></ul><p>&#x5982;&#x679C;&#x4E00;&#x5207;&#x6B63;&#x5E38;&#xFF0C;&#x8FD0;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x4EE5;&#x540E;&#xFF0C;&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x547D;&#x4EE4;&#x884C;&#x63D0;&#x793A;&#x7B26;&#x3002;</p><pre><code class="language-bash">
root@66d80f4aaf1e:/app#
</code></pre><p>&#x8FD9;&#x8868;&#x793A;&#x4F60;&#x5DF2;&#x7ECF;&#x5728;&#x5BB9;&#x5668;&#x91CC;&#x9762;&#x4E86;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x63D0;&#x793A;&#x7B26;&#x5C31;&#x662F;&#x5BB9;&#x5668;&#x5185;&#x90E8;&#x7684; Shell &#x63D0;&#x793A;&#x7B26;&#x3002;&#x6267;&#x884C;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x3002;</p><pre><code class="language-bash">
root@66d80f4aaf1e:/app# node demos/01.js
</code></pre><p>&#x8FD9;&#x65F6;&#xFF0C;Koa &#x6846;&#x67B6;&#x5DF2;&#x7ECF;&#x8FD0;&#x884C;&#x8D77;&#x6765;&#x4E86;&#x3002;&#x6253;&#x5F00;&#x672C;&#x673A;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x8BBF;&#x95EE; http://127.0.0.1:8000&#xFF0C;&#x7F51;&#x9875;&#x663E;&#x793A;&quot;Not Found&quot;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A; <a href="https://github.com/ruanyf/koa-demos/blob/master/demos/01.js">demo</a> &#x6CA1;&#x6709;&#x5199;&#x8DEF;&#x7531;&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;Node &#x8FDB;&#x7A0B;&#x8FD0;&#x884C;&#x5728; Docker &#x5BB9;&#x5668;&#x7684;&#x865A;&#x62DF;&#x73AF;&#x5883;&#x91CC;&#x9762;&#xFF0C;&#x8FDB;&#x7A0B;&#x63A5;&#x89E6;&#x5230;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x548C;&#x7F51;&#x7EDC;&#x63A5;&#x53E3;&#x90FD;&#x662F;&#x865A;&#x62DF;&#x7684;&#xFF0C;&#x4E0E;&#x672C;&#x673A;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x548C;&#x7F51;&#x7EDC;&#x63A5;&#x53E3;&#x662F;&#x9694;&#x79BB;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5B9A;&#x4E49;&#x5BB9;&#x5668;&#x4E0E;&#x7269;&#x7406;&#x673A;&#x7684;&#x7AEF;&#x53E3;&#x6620;&#x5C04;&#xFF08;map&#xFF09;&#x3002;</p><p>&#x73B0;&#x5728;&#xFF0C;&#x5728;&#x5BB9;&#x5668;&#x7684;&#x547D;&#x4EE4;&#x884C;&#xFF0C;&#x6309;&#x4E0B; Ctrl + c &#x505C;&#x6B62; Node &#x8FDB;&#x7A0B;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x4E0B; Ctrl + d &#xFF08;&#x6216;&#x8005;&#x8F93;&#x5165; exit&#xFF09;&#x9000;&#x51FA;&#x5BB9;&#x5668;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;<code>docker container kill</code>&#x7EC8;&#x6B62;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x3002;</p><pre><code class="language-bash">
# &#x5728;&#x672C;&#x673A;&#x7684;&#x53E6;&#x4E00;&#x4E2A;&#x7EC8;&#x7AEF;&#x7A97;&#x53E3;&#xFF0C;&#x67E5;&#x51FA;&#x5BB9;&#x5668;&#x7684; ID
$ docker container ls

# &#x505C;&#x6B62;&#x6307;&#x5B9A;&#x7684;&#x5BB9;&#x5668;&#x8FD0;&#x884C;
$ docker container kill [containerID]
</code></pre><p>&#x5BB9;&#x5668;&#x505C;&#x6B62;&#x8FD0;&#x884C;&#x4E4B;&#x540E;&#xFF0C;&#x5E76;&#x4E0D;&#x4F1A;&#x6D88;&#x5931;&#xFF0C;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x5220;&#x9664;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
# &#x67E5;&#x51FA;&#x5BB9;&#x5668;&#x7684; ID
$ docker container ls --all

# &#x5220;&#x9664;&#x6307;&#x5B9A;&#x7684;&#x5BB9;&#x5668;&#x6587;&#x4EF6;
$ docker container rm [containerID]
</code></pre><p>&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>docker container run</code>&#x547D;&#x4EE4;&#x7684;<code>--rm</code>&#x53C2;&#x6570;&#xFF0C;&#x5728;&#x5BB9;&#x5668;&#x7EC8;&#x6B62;&#x8FD0;&#x884C;&#x540E;&#x81EA;&#x52A8;&#x5220;&#x9664;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash
</code></pre><h3 id="104-cmd-%E5%91%BD%E4%BB%A4">10.4 CMD &#x547D;&#x4EE4;</h3><p>&#x4E0A;&#x4E00;&#x8282;&#x7684;&#x4F8B;&#x5B50;&#x91CC;&#x9762;&#xFF0C;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x4EE5;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x624B;&#x52A8;&#x8F93;&#x5165;&#x547D;&#x4EE4;<code>node demos/01.js</code>&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x5199;&#x5728; Dockerfile &#x91CC;&#x9762;&#xFF0C;&#x8FD9;&#x6837;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x4EE5;&#x540E;&#xFF0C;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x5C31;&#x5DF2;&#x7ECF;&#x6267;&#x884C;&#x4E86;&#xFF0C;&#x4E0D;&#x7528;&#x518D;&#x624B;&#x52A8;&#x8F93;&#x5165;&#x4E86;&#x3002;</p><pre><code class="language-bash">
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
</code></pre><p>&#x4E0A;&#x9762;&#x7684; Dockerfile &#x91CC;&#x9762;&#xFF0C;&#x591A;&#x4E86;&#x6700;&#x540E;&#x4E00;&#x884C;<code>CMD node demos/01.js</code>&#xFF0C;&#x5B83;&#x8868;&#x793A;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x540E;&#x81EA;&#x52A8;&#x6267;&#x884C;<code>node demos/01.js</code>&#x3002;</p><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x95EE;&#xFF0C;<code>RUN</code>&#x547D;&#x4EE4;&#x4E0E;<code>CMD</code>&#x547D;&#x4EE4;&#x7684;&#x533A;&#x522B;&#x5728;&#x54EA;&#x91CC;&#xFF1F;&#x7B80;&#x5355;&#x8BF4;&#xFF0C;<code>RUN</code>&#x547D;&#x4EE4;&#x5728; image &#x6587;&#x4EF6;&#x7684;&#x6784;&#x5EFA;&#x9636;&#x6BB5;&#x6267;&#x884C;&#xFF0C;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x90FD;&#x4F1A;&#x6253;&#x5305;&#x8FDB;&#x5165; image &#x6587;&#x4EF6;&#xFF1B;<code>CMD</code>&#x547D;&#x4EE4;&#x5219;&#x662F;&#x5728;&#x5BB9;&#x5668;&#x542F;&#x52A8;&#x540E;&#x6267;&#x884C;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x4E00;&#x4E2A; Dockerfile &#x53EF;&#x4EE5;&#x5305;&#x542B;&#x591A;&#x4E2A;<code>RUN</code>&#x547D;&#x4EE4;&#xFF0C;&#x4F46;&#x662F;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;<code>CMD</code>&#x547D;&#x4EE4;&#x3002;</p><p>&#x6CE8;&#x610F;&#xFF0C;&#x6307;&#x5B9A;&#x4E86;<code>CMD</code>&#x547D;&#x4EE4;&#x4EE5;&#x540E;&#xFF0C;<code>docker container run</code>&#x547D;&#x4EE4;&#x5C31;&#x4E0D;&#x80FD;&#x9644;&#x52A0;&#x547D;&#x4EE4;&#x4E86;&#xFF08;&#x6BD4;&#x5982;&#x524D;&#x9762;&#x7684;<code>/bin/bash</code>&#xFF09;&#xFF0C;&#x5426;&#x5219;&#x5B83;&#x4F1A;&#x8986;&#x76D6;<code>CMD</code>&#x547D;&#x4EE4;&#x3002;&#x73B0;&#x5728;&#xFF0C;&#x542F;&#x52A8;&#x5BB9;&#x5668;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x3002;</p><pre><code class="language-bash">
$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1
</code></pre><h3 id="105-%E5%8F%91%E5%B8%83-image-%E6%96%87%E4%BB%B6">10.5 &#x53D1;&#x5E03; image &#x6587;&#x4EF6;</h3><p>&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C31;&#x786E;&#x8BA4;&#x4E86; image &#x6587;&#x4EF6;&#x7684;&#x6709;&#x6548;&#x6027;&#x3002;&#x8FD9;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x628A; image &#x6587;&#x4EF6;&#x5206;&#x4EAB;&#x5230;&#x7F51;&#x4E0A;&#xFF0C;&#x8BA9;&#x5176;&#x4ED6;&#x4EBA;&#x4F7F;&#x7528;&#x3002;</p><p>&#x9996;&#x5148;&#xFF0C;&#x53BB; <a href="https://hub.docker.com/">hub.docker.com</a> &#x6216; <a href="https://cloud.docker.com/">cloud.docker.com</a> &#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x8D26;&#x6237;&#x3002;&#x7136;&#x540E;&#xFF0C;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x767B;&#x5F55;&#x3002;</p><pre><code class="language-bash">
$ docker login
</code></pre><p>&#x63A5;&#x7740;&#xFF0C;&#x4E3A;&#x672C;&#x5730;&#x7684; image &#x6807;&#x6CE8;&#x7528;&#x6237;&#x540D;&#x548C;&#x7248;&#x672C;&#x3002;</p><pre><code class="language-bash">
$ docker image tag [imageName] [username]/[repository]:[tag]
# &#x5B9E;&#x4F8B;
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
</code></pre><p>&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x6807;&#x6CE8;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x91CD;&#x65B0;&#x6784;&#x5EFA;&#x4E00;&#x4E0B; image &#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ docker image build -t [username]/[repository]:[tag] .
</code></pre><p>&#x6700;&#x540E;&#xFF0C;&#x53D1;&#x5E03; image &#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ docker image push [username]/[repository]:[tag]
</code></pre><p>&#x53D1;&#x5E03;&#x6210;&#x529F;&#x4EE5;&#x540E;&#xFF0C;&#x767B;&#x5F55; hub.docker.com&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5DF2;&#x7ECF;&#x53D1;&#x5E03;&#x7684; image &#x6587;&#x4EF6;&#x3002;</p><h2 id="%E5%8D%81%E4%B8%80%E3%80%81%E5%85%B6%E4%BB%96%E6%9C%89%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4">&#x5341;&#x4E00;&#x3001;&#x5176;&#x4ED6;&#x6709;&#x7528;&#x7684;&#x547D;&#x4EE4;</h2><p>docker &#x7684;&#x4E3B;&#x8981;&#x7528;&#x6CD5;&#x5C31;&#x662F;&#x4E0A;&#x9762;&#x8FD9;&#x4E9B;&#xFF0C;&#x6B64;&#x5916;&#x8FD8;&#x6709;&#x51E0;&#x4E2A;&#x547D;&#x4EE4;&#xFF0C;&#x4E5F;&#x975E;&#x5E38;&#x6709;&#x7528;&#x3002;</p><p><strong>&#xFF08;1&#xFF09;docker container start</strong></p><p>&#x524D;&#x9762;&#x7684;<code>docker container run</code>&#x547D;&#x4EE4;&#x662F;&#x65B0;&#x5EFA;&#x5BB9;&#x5668;&#xFF0C;&#x6BCF;&#x8FD0;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x5C31;&#x4F1A;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x5BB9;&#x5668;&#x3002;&#x540C;&#x6837;&#x7684;&#x547D;&#x4EE4;&#x8FD0;&#x884C;&#x4E24;&#x6B21;&#xFF0C;&#x5C31;&#x4F1A;&#x751F;&#x6210;&#x4E24;&#x4E2A;&#x4E00;&#x6A21;&#x4E00;&#x6837;&#x7684;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;&#x5982;&#x679C;&#x5E0C;&#x671B;&#x91CD;&#x590D;&#x4F7F;&#x7528;&#x5BB9;&#x5668;&#xFF0C;&#x5C31;&#x8981;&#x4F7F;&#x7528;<code>docker container start</code>&#x547D;&#x4EE4;&#xFF0C;&#x5B83;&#x7528;&#x6765;&#x542F;&#x52A8;&#x5DF2;&#x7ECF;&#x751F;&#x6210;&#x3001;&#x5DF2;&#x7ECF;&#x505C;&#x6B62;&#x8FD0;&#x884C;&#x7684;&#x5BB9;&#x5668;&#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ docker container start [containerID]
</code></pre><p><strong>&#xFF08;2&#xFF09;docker container stop</strong></p><p>&#x524D;&#x9762;&#x7684;<code>docker container kill</code>&#x547D;&#x4EE4;&#x7EC8;&#x6B62;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x5411;&#x5BB9;&#x5668;&#x91CC;&#x9762;&#x7684;&#x4E3B;&#x8FDB;&#x7A0B;&#x53D1;&#x51FA; SIGKILL &#x4FE1;&#x53F7;&#x3002;&#x800C;<code>docker container stop</code>&#x547D;&#x4EE4;&#x4E5F;&#x662F;&#x7528;&#x6765;&#x7EC8;&#x6B62;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x5411;&#x5BB9;&#x5668;&#x91CC;&#x9762;&#x7684;&#x4E3B;&#x8FDB;&#x7A0B;&#x53D1;&#x51FA; SIGTERM &#x4FE1;&#x53F7;&#xFF0C;&#x7136;&#x540E;&#x8FC7;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x518D;&#x53D1;&#x51FA; SIGKILL &#x4FE1;&#x53F7;&#x3002;</p><pre><code class="language-bash">
$ docker container stop [containerID]
</code></pre><p>&#x8FD9;&#x4E24;&#x4E2A;&#x4FE1;&#x53F7;&#x7684;&#x5DEE;&#x522B;&#x662F;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6536;&#x5230; SIGTERM &#x4FE1;&#x53F7;&#x4EE5;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x8FDB;&#x884C;&#x6536;&#x5C3E;&#x6E05;&#x7406;&#x5DE5;&#x4F5C;&#xFF0C;&#x4F46;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x7406;&#x4F1A;&#x8FD9;&#x4E2A;&#x4FE1;&#x53F7;&#x3002;&#x5982;&#x679C;&#x6536;&#x5230; SIGKILL &#x4FE1;&#x53F7;&#xFF0C;&#x5C31;&#x4F1A;&#x5F3A;&#x884C;&#x7ACB;&#x5373;&#x7EC8;&#x6B62;&#xFF0C;&#x90A3;&#x4E9B;&#x6B63;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#x7684;&#x64CD;&#x4F5C;&#x4F1A;&#x5168;&#x90E8;&#x4E22;&#x5931;&#x3002;</p><p><strong>&#xFF08;3&#xFF09;docker container logs</strong></p><p><code>docker container logs</code>&#x547D;&#x4EE4;&#x7528;&#x6765;&#x67E5;&#x770B; docker &#x5BB9;&#x5668;&#x7684;&#x8F93;&#x51FA;&#xFF0C;&#x5373;&#x5BB9;&#x5668;&#x91CC;&#x9762; Shell &#x7684;&#x6807;&#x51C6;&#x8F93;&#x51FA;&#x3002;&#x5982;&#x679C;<code>docker run</code>&#x547D;&#x4EE4;&#x8FD0;&#x884C;&#x5BB9;&#x5668;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6CA1;&#x6709;&#x4F7F;&#x7528;<code>-it</code>&#x53C2;&#x6570;&#xFF0C;&#x5C31;&#x8981;&#x7528;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x67E5;&#x770B;&#x8F93;&#x51FA;&#x3002;</p><pre><code class="language-bash">
$ docker container logs [containerID]
</code></pre><p><strong>&#xFF08;4&#xFF09;docker container exec</strong></p><p><code>docker container exec</code>&#x547D;&#x4EE4;&#x7528;&#x4E8E;&#x8FDB;&#x5165;&#x4E00;&#x4E2A;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684; docker &#x5BB9;&#x5668;&#x3002;&#x5982;&#x679C;<code>docker run</code>&#x547D;&#x4EE4;&#x8FD0;&#x884C;&#x5BB9;&#x5668;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6CA1;&#x6709;&#x4F7F;&#x7528;<code>-it</code>&#x53C2;&#x6570;&#xFF0C;&#x5C31;&#x8981;&#x7528;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x8FDB;&#x5165;&#x5BB9;&#x5668;&#x3002;&#x4E00;&#x65E6;&#x8FDB;&#x5165;&#x4E86;&#x5BB9;&#x5668;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x5BB9;&#x5668;&#x7684; Shell &#x6267;&#x884C;&#x547D;&#x4EE4;&#x4E86;&#x3002;</p><pre><code class="language-bash">
$ docker container exec -it [containerID] /bin/bash
</code></pre><p><strong>&#xFF08;5&#xFF09;docker container cp</strong></p><p><code>docker container cp</code>&#x547D;&#x4EE4;&#x7528;&#x4E8E;&#x4ECE;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684; Docker &#x5BB9;&#x5668;&#x91CC;&#x9762;&#xFF0C;&#x5C06;&#x6587;&#x4EF6;&#x62F7;&#x8D1D;&#x5230;&#x672C;&#x673A;&#x3002;&#x4E0B;&#x9762;&#x662F;&#x62F7;&#x8D1D;&#x5230;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;&#x5199;&#x6CD5;&#x3002;</p><pre><code class="language-bash">
$ docker container cp [containID]:[/path/to/file] .
</code></pre><p>&#x975E;&#x5E38;&#x611F;&#x8C22;&#x4F60;&#x4E00;&#x76F4;&#x8BFB;&#x5230;&#x4E86;&#x8FD9;&#x91CC;&#xFF0C;&#x8FD9;&#x4E2A;&#x7CFB;&#x5217;&#x8FD8;&#x6709;<a href="https://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html">&#x4E0B;&#x4E00;&#x7BC7;</a>&#xFF0C;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4F7F;&#x7528; Docker &#x642D;&#x5EFA;&#x771F;&#x6B63;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x6B22;&#x8FCE;<a href="https://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html">&#x7EE7;&#x7EED;&#x9605;&#x8BFB;</a>&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[curl 的用法指南]]></title><description><![CDATA[简介
curl 是常用的命令行工具，用来请求 Web 服务器。它的名字就是客户端（client）的 URL 工具的意思。
它的功能非常强大，命令行参数多达几十种。如果熟练的话，完全可以取代 Postman 这一类的图形界面工具。]]></description><link>http://blog.zhoushoujian.com/curl/</link><guid isPermaLink="false">618fd6d9b518235c786017cc</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:43 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/organizing-your-content.png" medium="image"/><content:encoded><![CDATA[<h2 id="%E7%AE%80%E4%BB%8B">&#x7B80;&#x4ECB;</h2><img src="http://blog.zhoushoujian.com/content/images/2021/11/organizing-your-content.png" alt="curl &#x7684;&#x7528;&#x6CD5;&#x6307;&#x5357;"><p>curl &#x662F;&#x5E38;&#x7528;&#x7684;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF0C;&#x7528;&#x6765;&#x8BF7;&#x6C42; Web &#x670D;&#x52A1;&#x5668;&#x3002;&#x5B83;&#x7684;&#x540D;&#x5B57;&#x5C31;&#x662F;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;client&#xFF09;&#x7684; URL &#x5DE5;&#x5177;&#x7684;&#x610F;&#x601D;&#x3002;</p><p>&#x5B83;&#x7684;&#x529F;&#x80FD;&#x975E;&#x5E38;&#x5F3A;&#x5927;&#xFF0C;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#x591A;&#x8FBE;&#x51E0;&#x5341;&#x79CD;&#x3002;&#x5982;&#x679C;&#x719F;&#x7EC3;&#x7684;&#x8BDD;&#xFF0C;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x53D6;&#x4EE3; Postman &#x8FD9;&#x4E00;&#x7C7B;&#x7684;&#x56FE;&#x5F62;&#x754C;&#x9762;&#x5DE5;&#x5177;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://www.wangbase.com/blogimg/asset/201909/bg2019090501.jpg" class="kg-image" alt="curl &#x7684;&#x7528;&#x6CD5;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x672C;&#x6587;&#x4ECB;&#x7ECD;&#x5B83;&#x7684;&#x4E3B;&#x8981;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#xFF0C;&#x4F5C;&#x4E3A;&#x65E5;&#x5E38;&#x7684;&#x53C2;&#x8003;&#xFF0C;&#x65B9;&#x4FBF;&#x67E5;&#x9605;&#x3002;&#x5185;&#x5BB9;&#x4E3B;&#x8981;&#x7FFB;&#x8BD1;&#x81EA;<a href="https://catonmat.net/cookbooks/curl">&#x300A;curl cookbook&#x300B;</a>&#x3002;&#x4E3A;&#x4E86;&#x8282;&#x7EA6;&#x7BC7;&#x5E45;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E0D;&#x5305;&#x62EC;&#x8FD0;&#x884C;&#x65F6;&#x7684;&#x8F93;&#x51FA;&#xFF0C;&#x521D;&#x5B66;&#x8005;&#x53EF;&#x4EE5;&#x5148;&#x770B;&#x6211;&#x4EE5;&#x524D;&#x5199;&#x7684;<a href="https://www.ruanyifeng.com/blog/2011/09/curl.html">&#x300A;curl &#x521D;&#x5B66;&#x8005;&#x6559;&#x7A0B;&#x300B;</a>&#x3002;</p><p>&#x4E0D;&#x5E26;&#x6709;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#x65F6;&#xFF0C;curl &#x5C31;&#x662F;&#x53D1;&#x51FA; GET &#x8BF7;&#x6C42;&#x3002;</p><pre><code class="language-bash">
$ curl https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5411;<code>www.example.com</code>&#x53D1;&#x51FA; GET &#x8BF7;&#x6C42;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x7684;&#x5185;&#x5BB9;&#x4F1A;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x8F93;&#x51FA;&#x3002;</p><h2 id="a"><strong>-A</strong></h2><p><code>-A</code>&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x7528;&#x6237;&#x4EE3;&#x7406;&#x6807;&#x5934;&#xFF0C;&#x5373;<code>User-Agent</code>&#x3002;curl &#x7684;&#x9ED8;&#x8BA4;&#x7528;&#x6237;&#x4EE3;&#x7406;&#x5B57;&#x7B26;&#x4E32;&#x662F;<code>curl/[version]</code>&#x3002;</p><pre><code class="language-bash">
$ curl -A &apos;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;<code>User-Agent</code>&#x6539;&#x6210; Chrome &#x6D4F;&#x89C8;&#x5668;&#x3002;</p><pre><code class="language-bash">
$ curl -A &apos;&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4F1A;&#x79FB;&#x9664;<code>User-Agent</code>&#x6807;&#x5934;&#x3002;</p><p>&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<code>-H</code>&#x53C2;&#x6570;&#x76F4;&#x63A5;&#x6307;&#x5B9A;&#x6807;&#x5934;&#xFF0C;&#x66F4;&#x6539;<code>User-Agent</code>&#x3002;</p><pre><code class="language-bash">
$ curl -H &apos;User-Agent: php/1.0&apos; https://google.com
</code></pre><h2 id="b"><strong>-b</strong></h2><p><code>-b</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001; Cookie&#x3002;</p><pre><code class="language-bash">
$ curl -b &apos;foo=bar&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x6807;&#x5934;<code>Cookie: foo=bar</code>&#xFF0C;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;<code>foo</code>&#x3001;&#x503C;&#x4E3A;<code>bar</code>&#x7684; Cookie&#x3002;</p><pre><code class="language-bash">
$ curl -b &apos;foo1=bar;foo2=bar2&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x53D1;&#x9001;&#x4E24;&#x4E2A; Cookie&#x3002;</p><pre><code class="language-bash">
$ curl -b cookies.txt https://www.google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x8BFB;&#x53D6;&#x672C;&#x5730;&#x6587;&#x4EF6;<code>cookies.txt</code>&#xFF0C;&#x91CC;&#x9762;&#x662F;&#x670D;&#x52A1;&#x5668;&#x8BBE;&#x7F6E;&#x7684; Cookie&#xFF08;&#x53C2;&#x89C1;<code>-c</code>&#x53C2;&#x6570;&#xFF09;&#xFF0C;&#x5C06;&#x5176;&#x53D1;&#x9001;&#x5230;&#x670D;&#x52A1;&#x5668;&#x3002;</p><h2 id="c"><strong>-c</strong></h2><p><code>-c</code>&#x53C2;&#x6570;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x8BBE;&#x7F6E;&#x7684; Cookie &#x5199;&#x5165;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ curl -c cookies.txt https://www.google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x7684; HTTP &#x56DE;&#x5E94;&#x6240;&#x8BBE;&#x7F6E; Cookie &#x5199;&#x5165;&#x6587;&#x672C;&#x6587;&#x4EF6;<code>cookies.txt</code>&#x3002;</p><h2 id="d"><strong>-d</strong></h2><p><code>-d</code>&#x53C2;&#x6570;&#x7528;&#x4E8E;&#x53D1;&#x9001; POST &#x8BF7;&#x6C42;&#x7684;&#x6570;&#x636E;&#x4F53;&#x3002;</p><pre><code class="language-bash">
$ curl -d&apos;login=emma&#xFF06;password=123&apos;-X POST https://google.com/login
# &#x6216;&#x8005;
$ curl -d &apos;login=emma&apos; -d &apos;password=123&apos; -X POST  https://google.com/login
</code></pre><p>&#x4F7F;&#x7528;<code>-d</code>&#x53C2;&#x6570;&#x4EE5;&#x540E;&#xFF0C;HTTP &#x8BF7;&#x6C42;&#x4F1A;&#x81EA;&#x52A8;&#x52A0;&#x4E0A;&#x6807;&#x5934;<code>Content-Type : application/x-www-form-urlencoded</code>&#x3002;&#x5E76;&#x4E14;&#x4F1A;&#x81EA;&#x52A8;&#x5C06;&#x8BF7;&#x6C42;&#x8F6C;&#x4E3A; POST &#x65B9;&#x6CD5;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x7701;&#x7565;<code>-X POST</code>&#x3002;</p><p><code>-d</code>&#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x8BFB;&#x53D6;&#x672C;&#x5730;&#x6587;&#x672C;&#x6587;&#x4EF6;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x3002;</p><pre><code class="language-bash">
$ curl -d &apos;@data.txt&apos; https://google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x8BFB;&#x53D6;<code>data.txt</code>&#x6587;&#x4EF6;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x4F5C;&#x4E3A;&#x6570;&#x636E;&#x4F53;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x3002;</p><h2 id="-data-urlencode"><strong>--data-urlencode</strong></h2><p><code>--data-urlencode</code>&#x53C2;&#x6570;&#x7B49;&#x540C;&#x4E8E;<code>-d</code>&#xFF0C;&#x53D1;&#x9001; POST &#x8BF7;&#x6C42;&#x7684;&#x6570;&#x636E;&#x4F53;&#xFF0C;&#x533A;&#x522B;&#x5728;&#x4E8E;&#x4F1A;&#x81EA;&#x52A8;&#x5C06;&#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C; URL &#x7F16;&#x7801;&#x3002;</p><pre><code class="language-bash">
$ curl --data-urlencode &apos;comment=hello world&apos; https://google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#xFF0C;&#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;<code>hello world</code>&#x4E4B;&#x95F4;&#x6709;&#x4E00;&#x4E2A;&#x7A7A;&#x683C;&#xFF0C;&#x9700;&#x8981;&#x8FDB;&#x884C; URL &#x7F16;&#x7801;&#x3002;</p><h2 id="e"><strong>-e</strong></h2><p><code>-e</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x8BBE;&#x7F6E; HTTP &#x7684;&#x6807;&#x5934;<code>Referer</code>&#xFF0C;&#x8868;&#x793A;&#x8BF7;&#x6C42;&#x7684;&#x6765;&#x6E90;&#x3002;</p><pre><code class="language-bash">
curl -e &apos;https://google.com?q=example&apos; https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;<code>Referer</code>&#x6807;&#x5934;&#x8BBE;&#x4E3A;<code>https://google.com?q=example</code>&#x3002;</p><p><code>-H</code>&#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x76F4;&#x63A5;&#x6DFB;&#x52A0;&#x6807;&#x5934;<code>Referer</code>&#xFF0C;&#x8FBE;&#x5230;&#x540C;&#x6837;&#x6548;&#x679C;&#x3002;</p><pre><code class="language-bash">
curl -H &apos;Referer: https://google.com?q=example&apos; https://www.example.com
</code></pre><h2 id="f"><strong>-F</strong></h2><p><code>-F</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x5411;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4F20;&#x4E8C;&#x8FDB;&#x5236;&#x6587;&#x4EF6;&#x3002;</p><pre><code class="language-bash">
$ curl -F &apos;file=@photo.png&apos; https://google.com/profile
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4F1A;&#x7ED9; HTTP &#x8BF7;&#x6C42;&#x52A0;&#x4E0A;&#x6807;&#x5934;<code>Content-Type: multipart/form-data</code>&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x6587;&#x4EF6;<code>photo.png</code>&#x4F5C;&#x4E3A;<code>file</code>&#x5B57;&#x6BB5;&#x4E0A;&#x4F20;&#x3002;</p><p><code>-F</code>&#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x6307;&#x5B9A; MIME &#x7C7B;&#x578B;&#x3002;</p><pre><code class="language-bash">
$ curl -F &apos;file=@photo.png;type=image/png&apos; https://google.com/profile
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6307;&#x5B9A; MIME &#x7C7B;&#x578B;&#x4E3A;<code>image/png</code>&#xFF0C;&#x5426;&#x5219; curl &#x4F1A;&#x628A; MIME &#x7C7B;&#x578B;&#x8BBE;&#x4E3A;<code>application/octet-stream</code>&#x3002;</p><p><code>-F</code>&#x53C2;&#x6570;&#x4E5F;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#x540D;&#x3002;</p><pre><code class="language-bash">
$ curl -F &apos;file=@photo.png;filename=me.png&apos; https://google.com/profile
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4E2D;&#xFF0C;&#x539F;&#x59CB;&#x6587;&#x4EF6;&#x540D;&#x4E3A;<code>photo.png</code>&#xFF0C;&#x4F46;&#x662F;&#x670D;&#x52A1;&#x5668;&#x63A5;&#x6536;&#x5230;&#x7684;&#x6587;&#x4EF6;&#x540D;&#x4E3A;<code>me.png</code>&#x3002;</p><h2 id="g"><strong>-G</strong></h2><p><code>-G</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x6784;&#x9020; URL &#x7684;&#x67E5;&#x8BE2;&#x5B57;&#x7B26;&#x4E32;&#x3002;</p><pre><code class="language-bash">
$ curl -G -d &apos;q=kitties&apos; -d &apos;count=20&apos; https://google.com/search
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4F1A;&#x53D1;&#x51FA;&#x4E00;&#x4E2A; GET &#x8BF7;&#x6C42;&#xFF0C;&#x5B9E;&#x9645;&#x8BF7;&#x6C42;&#x7684; URL &#x4E3A;<code>https://google.com/search?q=kitties&amp;count=20</code>&#x3002;&#x5982;&#x679C;&#x7701;&#x7565;<code>--G</code>&#xFF0C;&#x4F1A;&#x53D1;&#x51FA;&#x4E00;&#x4E2A; POST &#x8BF7;&#x6C42;&#x3002;</p><p>&#x5982;&#x679C;&#x6570;&#x636E;&#x9700;&#x8981; URL &#x7F16;&#x7801;&#xFF0C;&#x53EF;&#x4EE5;&#x7ED3;&#x5408;<code>--data--urlencode</code>&#x53C2;&#x6570;&#x3002;</p><pre><code class="language-bash">
$ curl -G --data-urlencode &apos;comment=hello world&apos; https://www.example.com
</code></pre><h2 id="h"><strong>-H</strong></h2><p><code>-H</code>&#x53C2;&#x6570;&#x6DFB;&#x52A0; HTTP &#x8BF7;&#x6C42;&#x7684;&#x6807;&#x5934;&#x3002;</p><pre><code class="language-bash">
$ curl -H &apos;Accept-Language: en-US&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6DFB;&#x52A0; HTTP &#x6807;&#x5934;<code>Accept-Language: en-US</code>&#x3002;</p><pre><code class="language-bash">
$ curl -H &apos;Accept-Language: en-US&apos; -H &apos;Secret-Message: xyzzy&apos; https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6DFB;&#x52A0;&#x4E24;&#x4E2A; HTTP &#x6807;&#x5934;&#x3002;</p><pre><code class="language-bash">
$ curl -d &apos;{&quot;login&quot;: &quot;emma&quot;, &quot;pass&quot;: &quot;123&quot;}&apos; -H &apos;Content-Type: application/json&apos; https://google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6DFB;&#x52A0; HTTP &#x8BF7;&#x6C42;&#x7684;&#x6807;&#x5934;&#x662F;<code>Content-Type: application/json</code>&#xFF0C;&#x7136;&#x540E;&#x7528;<code>-d</code>&#x53C2;&#x6570;&#x53D1;&#x9001; JSON &#x6570;&#x636E;&#x3002;</p><h2 id="i"><strong>-i</strong></h2><p><code>-i</code>&#x53C2;&#x6570;&#x6253;&#x5370;&#x51FA;&#x670D;&#x52A1;&#x5668;&#x56DE;&#x5E94;&#x7684; HTTP &#x6807;&#x5934;&#x3002;</p><pre><code class="language-bash">
$ curl -i https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6536;&#x5230;&#x670D;&#x52A1;&#x5668;&#x56DE;&#x5E94;&#x540E;&#xFF0C;&#x5148;&#x8F93;&#x51FA;&#x670D;&#x52A1;&#x5668;&#x56DE;&#x5E94;&#x7684;&#x6807;&#x5934;&#xFF0C;&#x7136;&#x540E;&#x7A7A;&#x4E00;&#x884C;&#xFF0C;&#x518D;&#x8F93;&#x51FA;&#x7F51;&#x9875;&#x7684;&#x6E90;&#x7801;&#x3002;</p><h2 id="i-1"><strong>-I</strong></h2><p><code>-I</code>&#x53C2;&#x6570;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x51FA; HEAD &#x8BF7;&#x6C42;&#xFF0C;&#x7136;&#x4F1A;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x7684; HTTP &#x6807;&#x5934;&#x6253;&#x5370;&#x51FA;&#x6765;&#x3002;</p><pre><code class="language-bash">
$ curl -I https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x8F93;&#x51FA;&#x670D;&#x52A1;&#x5668;&#x5BF9; HEAD &#x8BF7;&#x6C42;&#x7684;&#x56DE;&#x5E94;&#x3002;</p><p><code>--head</code>&#x53C2;&#x6570;&#x7B49;&#x540C;&#x4E8E;<code>-I</code>&#x3002;</p><pre><code class="language-bash">
$ curl --head https://www.example.com
</code></pre><h2 id="k"><strong>-k</strong></h2><p><code>-k</code>&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x8DF3;&#x8FC7; SSL &#x68C0;&#x6D4B;&#x3002;</p><pre><code class="language-bash">
$ curl -k https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4E0D;&#x4F1A;&#x68C0;&#x67E5;&#x670D;&#x52A1;&#x5668;&#x7684; SSL &#x8BC1;&#x4E66;&#x662F;&#x5426;&#x6B63;&#x786E;&#x3002;</p><h2 id="l"><strong>-L</strong></h2><p><code>-L</code>&#x53C2;&#x6570;&#x4F1A;&#x8BA9; HTTP &#x8BF7;&#x6C42;&#x8DDF;&#x968F;&#x670D;&#x52A1;&#x5668;&#x7684;&#x91CD;&#x5B9A;&#x5411;&#x3002;curl &#x9ED8;&#x8BA4;&#x4E0D;&#x8DDF;&#x968F;&#x91CD;&#x5B9A;&#x5411;&#x3002;</p><pre><code class="language-bash">
$ curl -L -d &apos;tweet=hi&apos; https://api.twitter.com/tweet
</code></pre><h2 id="-limit-rate"><strong>--limit-rate</strong></h2><p><code>--limit-rate</code>&#x7528;&#x6765;&#x9650;&#x5236; HTTP &#x8BF7;&#x6C42;&#x548C;&#x56DE;&#x5E94;&#x7684;&#x5E26;&#x5BBD;&#xFF0C;&#x6A21;&#x62DF;&#x6162;&#x7F51;&#x901F;&#x7684;&#x73AF;&#x5883;&#x3002;</p><pre><code class="language-bash">
$ curl --limit-rate 200k https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;&#x5E26;&#x5BBD;&#x9650;&#x5236;&#x5728;&#x6BCF;&#x79D2; 200K &#x5B57;&#x8282;&#x3002;</p><h2 id="o"><strong>-o</strong></h2><p><code>-o</code>&#x53C2;&#x6570;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x7684;&#x56DE;&#x5E94;&#x4FDD;&#x5B58;&#x6210;&#x6587;&#x4EF6;&#xFF0C;&#x7B49;&#x540C;&#x4E8E;<code>wget</code>&#x547D;&#x4EE4;&#x3002;</p><pre><code class="language-bash">
$ curl -o example.html https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;<code>www.example.com</code>&#x4FDD;&#x5B58;&#x6210;<code>example.html</code>&#x3002;</p><h2 id="o-1"><strong>-O</strong></h2><p><code>-O</code>&#x53C2;&#x6570;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x56DE;&#x5E94;&#x4FDD;&#x5B58;&#x6210;&#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x5C06; URL &#x7684;&#x6700;&#x540E;&#x90E8;&#x5206;&#x5F53;&#x4F5C;&#x6587;&#x4EF6;&#x540D;&#x3002;</p><pre><code class="language-bash">
$ curl -O https://www.example.com/foo/bar.html
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5C06;&#x670D;&#x52A1;&#x5668;&#x56DE;&#x5E94;&#x4FDD;&#x5B58;&#x6210;&#x6587;&#x4EF6;&#xFF0C;&#x6587;&#x4EF6;&#x540D;&#x4E3A;<code>bar.html</code>&#x3002;</p><h2 id="s"><strong>-s</strong></h2><p><code>-s</code>&#x53C2;&#x6570;&#x5C06;&#x4E0D;&#x8F93;&#x51FA;&#x9519;&#x8BEF;&#x548C;&#x8FDB;&#x5EA6;&#x4FE1;&#x606F;&#x3002;</p><pre><code class="language-bash">
$ curl -s https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4E00;&#x65E6;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#xFF0C;&#x4E0D;&#x4F1A;&#x663E;&#x793A;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;&#x4E0D;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x7684;&#x8BDD;&#xFF0C;&#x4F1A;&#x6B63;&#x5E38;&#x663E;&#x793A;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x3002;</p><p>&#x5982;&#x679C;&#x60F3;&#x8BA9; curl &#x4E0D;&#x4EA7;&#x751F;&#x4EFB;&#x4F55;&#x8F93;&#x51FA;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x3002;</p><pre><code class="language-bash">
$ curl -s -o /dev/null https://google.com
</code></pre><h2 id="s-1"><strong>-S</strong></h2><p><code>-S</code>&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x53EA;&#x8F93;&#x51FA;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x901A;&#x5E38;&#x4E0E;<code>-s</code>&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#x3002;</p><pre><code class="language-bash">
$ curl -s -o /dev/null https://google.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x8F93;&#x51FA;&#xFF0C;&#x9664;&#x975E;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x3002;</p><h2 id="u"><strong>-u</strong></h2><p><code>-u</code>&#x53C2;&#x6570;&#x7528;&#x6765;&#x8BBE;&#x7F6E;&#x670D;&#x52A1;&#x5668;&#x8BA4;&#x8BC1;&#x7684;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x3002;</p><pre><code class="language-bash">
$ curl -u &apos;bob:12345&apos; https://google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x8BBE;&#x7F6E;&#x7528;&#x6237;&#x540D;&#x4E3A;<code>bob</code>&#xFF0C;&#x5BC6;&#x7801;&#x4E3A;<code>12345</code>&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x5176;&#x8F6C;&#x4E3A; HTTP &#x6807;&#x5934;<code>Authorization: Basic Ym9iOjEyMzQ1</code>&#x3002;</p><p>curl &#x80FD;&#x591F;&#x8BC6;&#x522B; URL &#x91CC;&#x9762;&#x7684;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x3002;</p><pre><code class="language-bash">
$ curl https://bob:12345@google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x80FD;&#x591F;&#x8BC6;&#x522B; URL &#x91CC;&#x9762;&#x7684;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#xFF0C;&#x5C06;&#x5176;&#x8F6C;&#x4E3A;&#x4E0A;&#x4E2A;&#x4F8B;&#x5B50;&#x91CC;&#x9762;&#x7684; HTTP &#x6807;&#x5934;&#x3002;</p><pre><code class="language-bash">
$ curl -u &apos;bob&apos; https://google.com/login
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x53EA;&#x8BBE;&#x7F6E;&#x4E86;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x6267;&#x884C;&#x540E;&#xFF0C;curl &#x4F1A;&#x63D0;&#x793A;&#x7528;&#x6237;&#x8F93;&#x5165;&#x5BC6;&#x7801;&#x3002;</p><h2 id="v"><strong>-v</strong></h2><p><code>-v</code>&#x53C2;&#x6570;&#x8F93;&#x51FA;&#x901A;&#x4FE1;&#x7684;&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#xFF0C;&#x7528;&#x4E8E;&#x8C03;&#x8BD5;&#x3002;</p><pre><code class="language-bash">
$ curl -v https://www.example.com
</code></pre><p><code>--trace</code>&#x53C2;&#x6570;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x8C03;&#x8BD5;&#xFF0C;&#x8FD8;&#x4F1A;&#x8F93;&#x51FA;&#x539F;&#x59CB;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x6570;&#x636E;&#x3002;</p><pre><code class="language-bash">
$ curl --trace - https://www.example.com
</code></pre><h2 id="x"><strong>-x</strong></h2><p><code>-x</code>&#x53C2;&#x6570;&#x6307;&#x5B9A; HTTP &#x8BF7;&#x6C42;&#x7684;&#x4EE3;&#x7406;&#x3002;</p><pre><code class="language-bash">
$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x6307;&#x5B9A; HTTP &#x8BF7;&#x6C42;&#x901A;&#x8FC7;<code>myproxy.com:8080</code>&#x7684; socks5 &#x4EE3;&#x7406;&#x53D1;&#x51FA;&#x3002;</p><p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x4EE3;&#x7406;&#x534F;&#x8BAE;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; HTTP&#x3002;</p><pre><code class="language-bash">
$ curl -x james:cats@myproxy.com:8080 https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x4E2D;&#xFF0C;&#x8BF7;&#x6C42;&#x7684;&#x4EE3;&#x7406;&#x4F7F;&#x7528; HTTP &#x534F;&#x8BAE;&#x3002;</p><h2 id="x-1"><strong>-X</strong></h2><p><code>-X</code>&#x53C2;&#x6570;&#x6307;&#x5B9A; HTTP &#x8BF7;&#x6C42;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p><pre><code class="language-bash">
$ curl -X POST https://www.example.com
</code></pre><p>&#x4E0A;&#x9762;&#x547D;&#x4EE4;&#x5BF9;<code>https://www.example.com</code>&#x53D1;&#x51FA; POST &#x8BF7;&#x6C42;&#x3002;</p><h2 id="%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5">&#x53C2;&#x8003;&#x94FE;&#x63A5;</h2><ul><li><a href="https://catonmat.net/cookbooks/curl">Curl Cookbook</a></li></ul><p>&#xFF08;&#x5B8C;&#xFF09;</p>]]></content:encoded></item><item><title><![CDATA[useEffect 完整指南]]></title><description><![CDATA[你用Hooks写了一些组件，甚或写了一个小型应用。你可能很满意，使用它的API很舒服并且在这个过程中获得了一些小技巧。你甚至可能写了一些 custom Hooks去抽离重复的逻辑（精简掉了300行代码），并且得意地展示给你的同事看，“干得漂亮”，他们如是说。]]></description><link>http://blog.zhoushoujian.com/useeffect/</link><guid isPermaLink="false">618fd6d9b518235c786017ca</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:42 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/publishing-options.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/publishing-options.png" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;"><p>&#x4F60;&#x7528;<a href="https://reactjs.org/docs/hooks-intro.html" rel="nofollow noopener noreferrer">Hooks</a>&#x5199;&#x4E86;&#x4E00;&#x4E9B;&#x7EC4;&#x4EF6;&#xFF0C;&#x751A;&#x6216;&#x5199;&#x4E86;&#x4E00;&#x4E2A;&#x5C0F;&#x578B;&#x5E94;&#x7528;&#x3002;&#x4F60;&#x53EF;&#x80FD;&#x5F88;&#x6EE1;&#x610F;&#xFF0C;&#x4F7F;&#x7528;&#x5B83;&#x7684;API&#x5F88;&#x8212;&#x670D;&#x5E76;&#x4E14;&#x5728;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E2D;&#x83B7;&#x5F97;&#x4E86;&#x4E00;&#x4E9B;&#x5C0F;&#x6280;&#x5DE7;&#x3002;&#x4F60;&#x751A;&#x81F3;&#x53EF;&#x80FD;&#x5199;&#x4E86;&#x4E00;&#x4E9B; <a href="https://reactjs.org/docs/hooks-custom.html" rel="nofollow noopener noreferrer">custom Hooks</a>&#x53BB;&#x62BD;&#x79BB;&#x91CD;&#x590D;&#x7684;&#x903B;&#x8F91;&#xFF08;&#x7CBE;&#x7B80;&#x6389;&#x4E86;300&#x884C;&#x4EE3;&#x7801;&#xFF09;&#xFF0C;&#x5E76;&#x4E14;&#x5F97;&#x610F;&#x5730;&#x5C55;&#x793A;&#x7ED9;&#x4F60;&#x7684;&#x540C;&#x4E8B;&#x770B;&#xFF0C;&#x201C;&#x5E72;&#x5F97;&#x6F02;&#x4EAE;&#x201D;&#xFF0C;&#x4ED6;&#x4EEC;&#x5982;&#x662F;&#x8BF4;&#x3002;</p><p>&#x4F46;&#x6709;&#x65F6;&#x5019;&#x5F53;&#x4F60;&#x4F7F;&#x7528;<code>useEffect</code>&#x4F60;&#x603B;&#x89C9;&#x5F97;&#x54EA;&#x513F;&#x6709;&#x70B9;&#x4E0D;&#x5BF9;&#x52B2;&#x3002;&#x4F60;&#x4F1A;&#x5600;&#x5495;&#x4F60;&#x53EF;&#x80FD;&#x9057;&#x6F0F;&#x4E86;&#x4EC0;&#x4E48;&#x3002;&#x5B83;&#x770B;&#x8D77;&#x6765;&#x50CF;class&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x2026;&#x4F46;&#x771F;&#x7684;&#x662F;&#x8FD9;&#x6837;&#x5417;&#xFF1F;&#x4F60;&#x53D1;&#x89C9;&#x81EA;&#x5DF1;&#x5728;&#x95EE;&#x7C7B;&#x4F3C;&#x4E0B;&#x9762;&#x7684;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#xFF1A;</p><ul><li>&#x1F914; &#x5982;&#x4F55;&#x7528;<code>useEffect</code>&#x6A21;&#x62DF;<code>componentDidMount</code>&#x751F;&#x547D;&#x5468;&#x671F;&#xFF1F;</li><li>&#x1F914; &#x5982;&#x4F55;&#x6B63;&#x786E;&#x5730;&#x5728;<code>useEffect</code>&#x91CC;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#xFF1F;<code>[]</code>&#x53C8;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</li><li>&#x1F914; &#x6211;&#x5E94;&#x8BE5;&#x628A;&#x51FD;&#x6570;&#x5F53;&#x505A;effect&#x7684;&#x4F9D;&#x8D56;&#x5417;&#xFF1F;</li><li>&#x1F914; &#x4E3A;&#x4EC0;&#x4E48;&#x6709;&#x65F6;&#x5019;&#x4F1A;&#x51FA;&#x73B0;&#x65E0;&#x9650;&#x91CD;&#x590D;&#x8BF7;&#x6C42;&#x7684;&#x95EE;&#x9898;&#xFF1F;</li><li>&#x1F914; &#x4E3A;&#x4EC0;&#x4E48;&#x6709;&#x65F6;&#x5019;&#x5728;effect&#x91CC;&#x62FF;&#x5230;&#x7684;&#x662F;&#x65E7;&#x7684;state&#x6216;prop&#xFF1F;</li></ul><p>&#x5F53;&#x6211;&#x521A;&#x5F00;&#x59CB;&#x4F7F;&#x7528;Hooks&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4E5F;&#x540C;&#x6837;&#x88AB;&#x4E0A;&#x9762;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x6240;&#x56F0;&#x6270;&#x3002;&#x751A;&#x81F3;&#x5F53;&#x6211;&#x5199;&#x6700;&#x521D;&#x7684;&#x6587;&#x6863;&#x65F6;&#xFF0C;&#x6211;&#x4E5F;&#x5E76;&#x6CA1;&#x6709;&#x624E;&#x5B9E;&#x5730;&#x638C;&#x63E1;&#x67D0;&#x4E9B;&#x7EC6;&#x8282;&#x3002;&#x6211;&#x7ECF;&#x5386;&#x4E86;&#x4E00;&#x4E9B;&#x201C;&#x554A;&#x54C8;&#x201D;&#x7684;&#x5F00;&#x7A8D;&#x65F6;&#x523B;&#xFF0C;&#x6211;&#x60F3;&#x628A;&#x8FD9;&#x4E9B;&#x5206;&#x4EAB;&#x7ED9;&#x4F60;&#x3002;<strong><strong>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F1A;&#x6DF1;&#x5165;&#x8BB2;&#x89E3;&#x5E2E;&#x4F60;&#x660E;&#x767D;&#x4E0A;&#x9762;&#x95EE;&#x9898;&#x7684;&#x7B54;&#x6848;&#x3002;</strong></strong></p><p>&#x5728;&#x770B;&#x7B54;&#x6848;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5148;&#x5F80;&#x540E;&#x9000;&#x4E00;&#x6B65;&#x3002;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x76EE;&#x7684;&#x4E0D;&#x662F;&#x7ED9;&#x4F60;&#x4E00;&#x4E2A;&#x8981;&#x70B9;&#x6E05;&#x5355;&#xFF0C;&#x800C;&#x662F;&#x60F3;&#x5E2E;&#x4F60;&#x771F;&#x6B63;&#x5730;&#x9886;&#x4F1A;<code>useEffect</code>&#x3002;&#x5176;&#x5B9E;&#x6211;&#x4EEC;&#x5E76;&#x6CA1;&#x6709;&#x592A;&#x591A;&#x9700;&#x8981;&#x5B66;&#x4E60;&#x7684;&#xFF0C;&#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x82B1;&#x5F88;&#x591A;&#x65F6;&#x95F4;&#x8BD5;&#x56FE;&#x5FD8;&#x8BB0;&#x67D0;&#x4E9B;&#x5DF2;&#x7ECF;&#x4E60;&#x5F97;&#x7684;&#x6982;&#x5FF5;&#xFF08;unlearning&#xFF09;&#x3002;</p><p><strong><strong>&#x5F53;&#x6211;&#x4E0D;&#x518D;&#x900F;&#x8FC7;&#x719F;&#x6089;&#x7684;class&#x751F;&#x547D;&#x5468;&#x671F;&#x65B9;&#x6CD5;&#x53BB;&#x7AA5;&#x89C6;<code>useEffect</code> &#x8FD9;&#x4E2A;Hook&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x624D;&#x5F97;&#x4EE5;&#x878D;&#x4F1A;&#x8D2F;&#x901A;&#x3002;</strong></strong></p><blockquote>&#x201C;&#x5FD8;&#x8BB0;&#x4F60;&#x5DF2;&#x7ECF;&#x5B66;&#x5230;&#x7684;&#x3002;&#x201D; &#x2014; Yoda</blockquote><figure class="kg-card kg-image-card"><img src="https://overreacted.io/static/6203a1f1f2c771816a5ba0969baccd12/fce5f/yoda.jpg" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><hr><p><strong><strong>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F1A;&#x5047;&#x8BBE;&#x4F60;&#x5BF9;<a href="https://reactjs.org/docs/hooks-effect.html" rel="nofollow noopener noreferrer"><code>useEffect</code></a> API&#x6709;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x7684;&#x4E86;&#x89E3;&#x3002;</strong></strong></p><p><strong><strong>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x771F;&#x7684;&#x5F88;&#x957F;&#x3002;&#x5B83;&#x66F4;&#x50CF;&#x4E00;&#x672C;mini&#x4E66;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x6211;&#x66F4;&#x559C;&#x6B22;&#x7684;&#x5F62;&#x5F0F;&#x3002;&#x5982;&#x679C;&#x4F60;&#x5F88;&#x5306;&#x5FD9;&#x6216;&#x8005;&#x5E76;&#x4E0D;&#x662F;&#x592A;&#x5173;&#x5FC3;&#x672C;&#x6587;&#x4E3B;&#x9898;&#x7684;&#x8BDD;&#xFF0C;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x770B;&#x4E0B;&#x9762;&#x7684;&#x6458;&#x8981;&#x3002;</strong></strong></p><p><strong><strong>&#x5982;&#x679C;&#x4F60;&#x5BF9;&#x4E8E;&#x6DF1;&#x5165;&#x7814;&#x7A76;&#x611F;&#x89C9;&#x4E0D;&#x662F;&#x5F88;&#x9002;&#x5E94;&#x7684;&#x8BDD;&#xFF0C;&#x4F60;&#x6216;&#x8BB8;&#x53EF;&#x4EE5;&#x7B49;&#x4E0B;&#x9762;&#x8FD9;&#x4E9B;&#x89E3;&#x91CA;&#x51FA;&#x73B0;&#x5728;&#x5176;&#x4ED6;&#x6587;&#x7AE0;&#x4E2D;&#x518D;&#x53BB;&#x4E86;&#x89E3;&#x4E5F;&#x884C;&#x3002;&#x5C31;&#x50CF;2013&#x5E74;React&#x521A;&#x51FA;&#x4E16;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5927;&#x5BB6;&#x9700;&#x8981;&#x65F6;&#x95F4;&#x53BB;&#x7406;&#x89E3;&#x6D88;&#x5316;&#x4E00;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x3002;&#x77E5;&#x8BC6;&#x4E5F;&#x9700;&#x8981;&#x65F6;&#x95F4;&#x53BB;&#x666E;&#x53CA;&#x3002;</strong></strong></p><hr><h2 id="%E6%91%98%E8%A6%81">&#x6458;&#x8981;</h2><p>&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x60F3;&#x9605;&#x8BFB;&#x6574;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x6D4F;&#x89C8;&#x8FD9;&#x4EFD;&#x6458;&#x8981;&#x3002;&#x8981;&#x662F;&#x67D0;&#x4E9B;&#x90E8;&#x5206;&#x4E0D;&#x5BB9;&#x6613;&#x7406;&#x89E3;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5F80;&#x4E0B;&#x6EDA;&#x52A8;&#x5BFB;&#x627E;&#x76F8;&#x5173;&#x7684;&#x5185;&#x5BB9;&#x53BB;&#x9605;&#x8BFB;&#x3002;</p><p>&#x5982;&#x679C;&#x4F60;&#x6253;&#x7B97;&#x9605;&#x8BFB;&#x6574;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x4F60;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x8DF3;&#x8FC7;&#x8FD9;&#x90E8;&#x5206;&#x3002;&#x6211;&#x4F1A;&#x5728;&#x6587;&#x7AE0;&#x672B;&#x5C3E;&#x5E26;&#x4E0A;&#x6458;&#x8981;&#x7684;&#x94FE;&#x63A5;&#x3002;</p><p><strong><strong>&#x1F914; Question: &#x5982;&#x4F55;&#x7528;<code>useEffect</code>&#x6A21;&#x62DF;<code>componentDidMount</code>&#x751F;&#x547D;&#x5468;&#x671F;&#xFF1F;</strong></strong></p><p>&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>useEffect(fn, [])</code>&#xFF0C;&#x4F46;&#x5B83;&#x4EEC;&#x5E76;&#x4E0D;&#x5B8C;&#x5168;&#x76F8;&#x7B49;&#x3002;&#x548C;<code>componentDidMount</code>&#x4E0D;&#x4E00;&#x6837;&#xFF0C;<code>useEffect</code>&#x4F1A;<em>&#x6355;&#x83B7;</em> props&#x548C;state&#x3002;&#x6240;&#x4EE5;&#x5373;&#x4FBF;&#x5728;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x91CC;&#xFF0C;&#x4F60;&#x62FF;&#x5230;&#x7684;&#x8FD8;&#x662F;&#x521D;&#x59CB;&#x7684;props&#x548C;state&#x3002;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x5F97;&#x5230;&#x201C;&#x6700;&#x65B0;&#x201D;&#x7684;&#x503C;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;ref&#x3002;&#x4E0D;&#x8FC7;&#xFF0C;&#x901A;&#x5E38;&#x4F1A;&#x6709;&#x66F4;&#x7B80;&#x5355;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x6240;&#x4EE5;&#x4F60;&#x5E76;&#x4E0D;&#x4E00;&#x5B9A;&#x8981;&#x7528;ref&#x3002;&#x8BB0;&#x4F4F;&#xFF0C;effects&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x548C;<code>componentDidMount</code>&#x4EE5;&#x53CA;&#x5176;&#x4ED6;&#x751F;&#x547D;&#x5468;&#x671F;&#x662F;&#x4E0D;&#x540C;&#x7684;&#xFF0C;&#x8BD5;&#x56FE;&#x627E;&#x5230;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x5B8C;&#x5168;&#x4E00;&#x81F4;&#x7684;&#x8868;&#x8FBE;&#x53CD;&#x800C;&#x66F4;&#x5BB9;&#x6613;&#x4F7F;&#x4F60;&#x6DF7;&#x6DC6;&#x3002;&#x60F3;&#x8981;&#x66F4;&#x6709;&#x6548;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x201C;think in effects&#x201D;&#xFF0C;&#x5B83;&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x66F4;&#x63A5;&#x8FD1;&#x4E8E;&#x5B9E;&#x73B0;&#x72B6;&#x6001;&#x540C;&#x6B65;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x54CD;&#x5E94;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E8B;&#x4EF6;&#x3002;</p><p><strong><strong>&#x1F914; Question: &#x5982;&#x4F55;&#x6B63;&#x786E;&#x5730;&#x5728;<code>useEffect</code>&#x91CC;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#xFF1F;<code>[]</code>&#x53C8;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</strong></strong></p><p><a href="https://www.robinwieruch.de/react-hooks-fetch-data/" rel="nofollow noopener noreferrer">&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;</a> &#x662F;&#x5F88;&#x597D;&#x7684;&#x5165;&#x95E8;&#xFF0C;&#x4ECB;&#x7ECD;&#x4E86;&#x5982;&#x4F55;&#x5728;<code>useEffect</code>&#x91CC;&#x505A;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x3002;&#x8BF7;&#x52A1;&#x5FC5;&#x8BFB;&#x5B8C;&#x5B83;&#xFF01;&#x5B83;&#x6CA1;&#x6709;&#x6211;&#x7684;&#x8FD9;&#x7BC7;&#x8FD9;&#x4E48;&#x957F;&#x3002;<code>[]</code>&#x8868;&#x793A;effect&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x4EFB;&#x4F55;React&#x6570;&#x636E;&#x6D41;&#x91CC;&#x7684;&#x503C;&#xFF0C;&#x56E0;&#x6B64;&#x8BE5;effect&#x4EC5;&#x88AB;&#x8C03;&#x7528;&#x4E00;&#x6B21;&#x662F;&#x5B89;&#x5168;&#x7684;&#x3002;<code>[]</code>&#x540C;&#x6837;&#x4E5F;&#x662F;&#x4E00;&#x7C7B;&#x5E38;&#x89C1;&#x95EE;&#x9898;&#x7684;&#x6765;&#x6E90;&#xFF0C;&#x4E5F;&#x5373;&#x4F60;&#x4EE5;&#x4E3A;&#x6CA1;&#x4F7F;&#x7528;&#x6570;&#x636E;&#x6D41;&#x91CC;&#x7684;&#x503C;&#x4F46;&#x5176;&#x5B9E;&#x4F7F;&#x7528;&#x4E86;&#x3002;&#x4F60;&#x9700;&#x8981;&#x5B66;&#x4E60;&#x4E00;&#x4E9B;&#x7B56;&#x7565;&#xFF08;&#x4E3B;&#x8981;&#x662F;<code>useReducer</code> &#x548C; <code>useCallback</code>&#xFF09;&#x6765;&#x79FB;&#x9664;&#x8FD9;&#x4E9B;effect&#x4F9D;&#x8D56;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x9519;&#x8BEF;&#x5730;&#x5FFD;&#x7565;&#x5B83;&#x4EEC;&#x3002;</p><p><strong><strong>&#x1F914; Question: &#x6211;&#x5E94;&#x8BE5;&#x628A;&#x51FD;&#x6570;&#x5F53;&#x505A;effect&#x7684;&#x4F9D;&#x8D56;&#x5417;&#xFF1F;</strong></strong></p><p>&#x4E00;&#x822C;&#x5EFA;&#x8BAE;&#x628A;&#x4E0D;&#x4F9D;&#x8D56;props&#x548C;state&#x7684;&#x51FD;&#x6570;&#x63D0;&#x5230;&#x4F60;&#x7684;&#x7EC4;&#x4EF6;&#x5916;&#x9762;&#xFF0C;&#x5E76;&#x4E14;&#x628A;&#x90A3;&#x4E9B;&#x4EC5;&#x88AB;effect&#x4F7F;&#x7528;&#x7684;&#x51FD;&#x6570;&#x653E;&#x5230;effect&#x91CC;&#x9762;&#x3002;&#x5982;&#x679C;&#x8FD9;&#x6837;&#x505A;&#x4E86;&#x4EE5;&#x540E;&#xFF0C;&#x4F60;&#x7684;effect&#x8FD8;&#x662F;&#x9700;&#x8981;&#x7528;&#x5230;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x51FD;&#x6570;&#xFF08;&#x5305;&#x62EC;&#x901A;&#x8FC7;props&#x4F20;&#x8FDB;&#x6765;&#x7684;&#x51FD;&#x6570;&#xFF09;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x5B9A;&#x4E49;&#x5B83;&#x4EEC;&#x7684;&#x5730;&#x65B9;&#x7528;<code>useCallback</code>&#x5305;&#x4E00;&#x5C42;&#x3002;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x8FD9;&#x6837;&#x505A;&#x5462;&#xFF1F;&#x56E0;&#x4E3A;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x5230;props&#x548C;state&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x4EEC;&#x4F1A;&#x53C2;&#x4E0E;&#x5230;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x3002;&#x6211;&#x4EEC;&#x5B98;&#x7F51;&#x7684;FAQ&#x6709;<a href="https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies" rel="nofollow noopener noreferrer">&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x7B54;&#x6848;</a>&#x3002;</p><p><strong><strong>&#x1F914; Question: &#x4E3A;&#x4EC0;&#x4E48;&#x6709;&#x65F6;&#x5019;&#x4F1A;&#x51FA;&#x73B0;&#x65E0;&#x9650;&#x91CD;&#x590D;&#x8BF7;&#x6C42;&#x7684;&#x95EE;&#x9898;&#xFF1F;</strong></strong></p><p>&#x8FD9;&#x4E2A;&#x901A;&#x5E38;&#x53D1;&#x751F;&#x4E8E;&#x4F60;&#x5728;effect&#x91CC;&#x505A;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x5E76;&#x4E14;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;effect&#x4F9D;&#x8D56;&#x53C2;&#x6570;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;&#x4F9D;&#x8D56;&#xFF0C;effect&#x4F1A;&#x5728;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x540E;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x7136;&#x540E;&#x5728;effect&#x4E2D;&#x66F4;&#x65B0;&#x4E86;&#x72B6;&#x6001;&#x5F15;&#x8D77;&#x6E32;&#x67D3;&#x5E76;&#x518D;&#x6B21;&#x89E6;&#x53D1;effect&#x3002;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x7684;&#x53D1;&#x751F;&#x4E5F;&#x53EF;&#x80FD;&#x662F;&#x56E0;&#x4E3A;&#x4F60;&#x8BBE;&#x7F6E;&#x7684;&#x4F9D;&#x8D56;&#x603B;&#x662F;&#x4F1A;&#x6539;&#x53D8;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x79FB;&#x9664;&#x7684;&#x65B9;&#x5F0F;&#x6392;&#x67E5;&#x51FA;&#x54EA;&#x4E2A;&#x4F9D;&#x8D56;&#x5BFC;&#x81F4;&#x4E86;&#x95EE;&#x9898;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x79FB;&#x9664;&#x4F60;&#x4F7F;&#x7528;&#x7684;&#x4F9D;&#x8D56;&#xFF08;&#x6216;&#x8005;&#x76F2;&#x76EE;&#x5730;&#x4F7F;&#x7528;<code>[]</code>&#xFF09;&#x901A;&#x5E38;&#x662F;&#x4E00;&#x79CD;&#x9519;&#x8BEF;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x5F0F;&#x3002;&#x4F60;&#x5E94;&#x8BE5;&#x505A;&#x7684;&#x662F;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x6839;&#x6E90;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x51FD;&#x6570;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x4EEC;&#x653E;&#x5230;effect&#x91CC;&#xFF0C;&#x6216;&#x8005;&#x63D0;&#x5230;&#x7EC4;&#x4EF6;&#x5916;&#x9762;&#xFF0C;&#x6216;&#x8005;&#x7528;<code>useCallback</code>&#x5305;&#x4E00;&#x5C42;&#x3002;<code>useMemo</code> &#x53EF;&#x4EE5;&#x505A;&#x7C7B;&#x4F3C;&#x7684;&#x4E8B;&#x60C5;&#x4EE5;&#x907F;&#x514D;&#x91CD;&#x590D;&#x751F;&#x6210;&#x5BF9;&#x8C61;&#x3002;</p><p><strong><strong>&#x1F914; &#x4E3A;&#x4EC0;&#x4E48;&#x6709;&#x65F6;&#x5019;&#x5728;effect&#x91CC;&#x62FF;&#x5230;&#x7684;&#x662F;&#x65E7;&#x7684;state&#x6216;prop&#x5462;&#xFF1F;</strong></strong></p><p>Effect&#x62FF;&#x5230;&#x7684;&#x603B;&#x662F;&#x5B9A;&#x4E49;&#x5B83;&#x7684;&#x90A3;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;props&#x548C;state&#x3002;&#x8FD9;&#x80FD;&#x591F;<a href="https://overreacted.io/zh-hans/how-are-function-components-different-from-classes/">&#x907F;&#x514D;&#x4E00;&#x4E9B;bugs</a>&#xFF0C;&#x4F46;&#x5728;&#x4E00;&#x4E9B;&#x573A;&#x666F;&#x4E2D;&#x53C8;&#x4F1A;&#x6709;&#x4E9B;&#x8BA8;&#x4EBA;&#x5ACC;&#x3002;&#x5BF9;&#x4E8E;&#x8FD9;&#x4E9B;&#x573A;&#x666F;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x660E;&#x786E;&#x5730;&#x4F7F;&#x7528;&#x53EF;&#x53D8;&#x7684;ref&#x4FDD;&#x5B58;&#x4E00;&#x4E9B;&#x503C;&#xFF08;&#x4E0A;&#x9762;&#x6587;&#x7AE0;&#x7684;&#x672B;&#x5C3E;&#x89E3;&#x91CA;&#x4E86;&#x8FD9;&#x4E00;&#x70B9;&#xFF09;&#x3002;&#x5982;&#x679C;&#x4F60;&#x89C9;&#x5F97;&#x5728;&#x6E32;&#x67D3;&#x4E2D;&#x62FF;&#x5230;&#x4E86;&#x4E00;&#x4E9B;&#x65E7;&#x7684;props&#x548C;state&#xFF0C;&#x4E14;&#x4E0D;&#x662F;&#x4F60;&#x60F3;&#x8981;&#x7684;&#xFF0C;&#x4F60;&#x5F88;&#x53EF;&#x80FD;&#x9057;&#x6F0F;&#x4E86;&#x4E00;&#x4E9B;&#x4F9D;&#x8D56;&#x3002;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;<a href="https://github.com/facebook/react/issues/14920" rel="nofollow noopener noreferrer">lint &#x89C4;&#x5219;</a>&#x6765;&#x8BAD;&#x7EC3;&#x4F60;&#x53D1;&#x73B0;&#x8FD9;&#x4E9B;&#x4F9D;&#x8D56;&#x3002;&#x53EF;&#x80FD;&#x6CA1;&#x8FC7;&#x51E0;&#x5929;&#xFF0C;&#x8FD9;&#x79CD;&#x80FD;&#x529B;&#x4F1A;&#x53D8;&#x5F97;&#x50CF;&#x662F;&#x4F60;&#x7684;&#x7B2C;&#x4E8C;&#x5929;&#x6027;&#x3002;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x770B;&#x6211;&#x4EEC;&#x5B98;&#x7F51;FAQ&#x4E2D;&#x7684;<a href="https://reactjs.org/docs/hooks-faq.html#why-am-i-seeing-stale-props-or-state-inside-my-function" rel="nofollow noopener noreferrer">&#x8FD9;&#x4E2A;&#x56DE;&#x7B54;&#x3002;</a></p><hr><p>&#x6211;&#x5E0C;&#x671B;&#x8FD9;&#x4E2A;&#x6458;&#x8981;&#x5BF9;&#x4F60;&#x6709;&#x6240;&#x5E2E;&#x52A9;&#xFF01;&#x8981;&#x4E0D;&#xFF0C;&#x6211;&#x4EEC;&#x5F00;&#x59CB;&#x6B63;&#x6587;&#x3002;</p><hr><h2 id="%E6%AF%8F%E4%B8%80%E6%AC%A1%E6%B8%B2%E6%9F%93%E9%83%BD%E6%9C%89%E5%AE%83%E8%87%AA%E5%B7%B1%E7%9A%84-props-and-state">&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x6709;&#x5B83;&#x81EA;&#x5DF1;&#x7684; Props and State</h2><p>&#x5728;&#x6211;&#x4EEC;&#x8BA8;&#x8BBA;effects&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5148;&#x8BA8;&#x8BBA;&#x4E00;&#x4E0B;&#x6E32;&#x67D3;&#xFF08;rendering&#xFF09;&#x3002;</p><p>&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x5668;&#x7EC4;&#x4EF6;Counter&#xFF0C;&#x6CE8;&#x610F;&#x9AD8;&#x4EAE;&#x7684;&#x90A3;&#x4E00;&#x884C;&#xFF1A;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}</code></pre><p>&#x9AD8;&#x4EAE;&#x7684;&#x4EE3;&#x7801;&#x7A76;&#x7ADF;&#x662F;&#x4EC0;&#x4E48;&#x610F;&#x601D;&#x5462;&#xFF1F;<code>count</code> &#x4F1A;&#x201C;&#x76D1;&#x542C;&#x201D;&#x72B6;&#x6001;&#x7684;&#x53D8;&#x5316;&#x5E76;&#x81EA;&#x52A8;&#x66F4;&#x65B0;&#x5417;&#xFF1F;&#x8FD9;&#x4E48;&#x60F3;&#x53EF;&#x80FD;&#x662F;&#x5B66;&#x4E60;React&#x7684;&#x65F6;&#x5019;&#x6709;&#x7528;&#x7684;&#x7B2C;&#x4E00;&#x76F4;&#x89C9;&#xFF0C;&#x4F46;&#x5B83;&#x5E76;&#x4E0D;&#x662F;<a href="https://overreacted.io/react-as-a-ui-runtime/" rel="nofollow noopener noreferrer">&#x7CBE;&#x786E;&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;</a>&#x3002;</p><p><strong><strong>&#x4E0A;&#x9762;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;<code>count</code>&#x4EC5;&#x662F;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x800C;&#x5DF2;&#x3002;</strong></strong>&#x5B83;&#x4E0D;&#x662F;&#x795E;&#x5947;&#x7684;&#x201C;data binding&#x201D;, &#x201C;watcher&#x201D;, &#x201C;proxy&#x201D;&#xFF0C;&#x6216;&#x8005;&#x5176;&#x4ED6;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#x3002;&#x5B83;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x6570;&#x5B57;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4E00;&#x6837;&#xFF1A;</p><pre><code class="language-jsx">const count = 42;
// ...
&lt;p&gt;You clicked {count} times&lt;/p&gt;
// ...</code></pre><p>&#x6211;&#x4EEC;&#x7684;&#x7EC4;&#x4EF6;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4ECE;<code>useState()</code>&#x62FF;&#x5230;<code>count</code>&#x7684;&#x521D;&#x59CB;&#x503C;<code>0</code>&#x3002;&#x5F53;&#x6211;&#x4EEC;&#x8C03;&#x7528;<code>setCount(1)</code>&#xFF0C;React&#x4F1A;&#x518D;&#x6B21;&#x6E32;&#x67D3;&#x7EC4;&#x4EF6;&#xFF0C;&#x8FD9;&#x4E00;&#x6B21;<code>count</code>&#x662F;<code>1</code>&#x3002;&#x5982;&#x6B64;&#x7B49;&#x7B49;&#xFF1A;</p><pre><code class="language-jsx">// During first render
function Counter() {
  const count = 0; // Returned by useState()  // ...
  &lt;p&gt;You clicked {count} times&lt;/p&gt;
  // ...
}

// After a click, our function is called again
function Counter() {
  const count = 1; // Returned by useState()  // ...
  &lt;p&gt;You clicked {count} times&lt;/p&gt;
  // ...
}

// After another click, our function is called again
function Counter() {
  const count = 2; // Returned by useState()  // ...
  &lt;p&gt;You clicked {count} times&lt;/p&gt;
  // ...
}</code></pre><p><strong><strong>&#x5F53;&#x6211;&#x4EEC;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#x7684;&#x65F6;&#x5019;&#xFF0C;React&#x4F1A;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x7EC4;&#x4EF6;&#x3002;&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x80FD;&#x62FF;&#x5230;&#x72EC;&#x7ACB;&#x7684;<code>count</code> &#x72B6;&#x6001;&#xFF0C;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x503C;&#x662F;&#x51FD;&#x6570;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x5E38;&#x91CF;&#x3002;</strong></strong></p><p>&#x6240;&#x4EE5;&#x4E0B;&#x9762;&#x7684;&#x8FD9;&#x884C;&#x4EE3;&#x7801;&#x6CA1;&#x6709;&#x505A;&#x4EFB;&#x4F55;&#x7279;&#x6B8A;&#x7684;&#x6570;&#x636E;&#x7ED1;&#x5B9A;&#xFF1A;</p><pre><code class="language-jsx">&lt;p&gt;You clicked {count} times&lt;/p&gt;</code></pre><p><strong><strong>&#x5B83;&#x4EC5;&#x4EC5;&#x53EA;&#x662F;&#x5728;&#x6E32;&#x67D3;&#x8F93;&#x51FA;&#x4E2D;&#x63D2;&#x5165;&#x4E86;count&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#x3002;</strong></strong>&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#x7531;React&#x63D0;&#x4F9B;&#x3002;&#x5F53;<code>setCount</code>&#x7684;&#x65F6;&#x5019;&#xFF0C;React&#x4F1A;&#x5E26;&#x7740;&#x4E00;&#x4E2A;&#x4E0D;&#x540C;&#x7684;<code>count</code>&#x503C;&#x518D;&#x6B21;&#x8C03;&#x7528;&#x7EC4;&#x4EF6;&#x3002;&#x7136;&#x540E;&#xFF0C;React&#x4F1A;&#x66F4;&#x65B0;DOM&#x4EE5;&#x4FDD;&#x6301;&#x548C;&#x6E32;&#x67D3;&#x8F93;&#x51FA;&#x4E00;&#x81F4;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x5173;&#x952E;&#x7684;&#x70B9;&#x5728;&#x4E8E;&#x4EFB;&#x610F;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;<code>count</code>&#x5E38;&#x91CF;&#x90FD;&#x4E0D;&#x4F1A;&#x968F;&#x7740;&#x65F6;&#x95F4;&#x6539;&#x53D8;&#x3002;&#x6E32;&#x67D3;&#x8F93;&#x51FA;&#x4F1A;&#x53D8;&#x662F;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x7EC4;&#x4EF6;&#x88AB;&#x4E00;&#x6B21;&#x6B21;&#x8C03;&#x7528;&#xFF0C;&#x800C;&#x6BCF;&#x4E00;&#x6B21;&#x8C03;&#x7528;&#x5F15;&#x8D77;&#x7684;&#x6E32;&#x67D3;&#x4E2D;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x7684;<code>count</code>&#x503C;&#x72EC;&#x7ACB;&#x4E8E;&#x5176;&#x4ED6;&#x6E32;&#x67D3;&#x3002;</p><p><em>&#xFF08;&#x5173;&#x4E8E;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x66F4;&#x6DF1;&#x5165;&#x7684;&#x63A2;&#x8BA8;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x6211;&#x7684;&#x53E6;&#x4E00;&#x7BC7;&#x6587;&#x7AE0; <a href="https://overreacted.io/react-as-a-ui-runtime/" rel="nofollow noopener noreferrer">React as a UI Runtime</a>&#x3002;&#xFF09;</em></p><h2 id="%E6%AF%8F%E4%B8%80%E6%AC%A1%E6%B8%B2%E6%9F%93%E9%83%BD%E6%9C%89%E5%AE%83%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0">&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x6709;&#x5B83;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;</h2><p>&#x5230;&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#x4E00;&#x5207;&#x90FD;&#x8FD8;&#x597D;&#x3002;&#x90A3;&#x4E48;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x5462;&#xFF1F;</p><p>&#x770B;&#x4E0B;&#x9762;&#x7684;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x3002;&#x5B83;&#x5728;&#x4E09;&#x79D2;&#x540E;&#x4F1A;alert&#x70B9;&#x51FB;&#x6B21;&#x6570;<code>count</code>&#xFF1A;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  function handleAlertClick() {    setTimeout(() =&gt; {      alert(&apos;You clicked on: &apos; + count);    }, 3000);  }
  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
      &lt;button onClick={handleAlertClick}&gt;        Show alert      &lt;/button&gt;    &lt;/div&gt;
  );
}</code></pre><p>&#x5982;&#x679C;&#x6211;&#x6309;&#x7167;&#x4E0B;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#x53BB;&#x64CD;&#x4F5C;&#xFF1A;</p><ul><li><strong><strong>&#x70B9;&#x51FB;&#x589E;&#x52A0;</strong></strong>counter&#x5230;3</li><li><strong><strong>&#x70B9;&#x51FB;&#x4E00;&#x4E0B;</strong></strong> &#x201C;Show alert&#x201D;</li><li><strong><strong>&#x70B9;&#x51FB;&#x589E;&#x52A0;</strong></strong> counter&#x5230;5&#x5E76;&#x4E14;&#x5728;&#x5B9A;&#x65F6;&#x5668;&#x56DE;&#x8C03;&#x89E6;&#x53D1;&#x524D;&#x5B8C;&#x6210;</li></ul><figure class="kg-card kg-image-card"><img src="https://overreacted.io/46c55d5f1f749462b7a173f1e748e41e/counter.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x4F60;&#x731C;alert&#x4F1A;&#x5F39;&#x51FA;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;&#x4F1A;&#x662F;5&#x5417;&#xFF1F;&#x2014; &#x8FD9;&#x4E2A;&#x503C;&#x662F;alert&#x7684;&#x65F6;&#x5019;counter&#x7684;&#x5B9E;&#x65F6;&#x72B6;&#x6001;&#x3002;&#x6216;&#x8005;&#x4F1A;&#x662F;3&#x5417;&#xFF1F;&#x2014; &#x8FD9;&#x4E2A;&#x503C;&#x662F;&#x6211;&#x70B9;&#x51FB;&#x65F6;&#x5019;&#x7684;&#x72B6;&#x6001;&#x3002;</p><hr><p><em>&#x5267;&#x900F;&#x9884;&#x8B66;</em></p><hr><p>&#x6765;&#x81EA;&#x5DF1; <a href="https://codesandbox.io/s/w2wxl3yo0l" rel="nofollow noopener noreferrer">&#x8BD5;&#x8BD5;&#x5427;&#xFF01;</a></p><p>&#x5982;&#x679C;&#x7ED3;&#x679C;&#x548C;&#x4F60;&#x9884;&#x6599;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x60F3;&#x8C61;&#x4E00;&#x4E2A;&#x66F4;&#x5B9E;&#x9645;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;&#x4E00;&#x4E2A;&#x804A;&#x5929;&#x5E94;&#x7528;&#x5728;state&#x4E2D;&#x4FDD;&#x5B58;&#x4E86;&#x5F53;&#x524D;&#x63A5;&#x6536;&#x8005;&#x7684;ID&#xFF0C;&#x4EE5;&#x53CA;&#x4E00;&#x4E2A;&#x53D1;&#x9001;&#x6309;&#x94AE;&#x3002; <a href="https://overreacted.io/how-are-function-components-different-from-classes" rel="nofollow noopener noreferrer">&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;</a>&#x6DF1;&#x5165;&#x63A2;&#x7D22;&#x4E86;&#x4E2A;&#x4E2D;&#x7F18;&#x7531;&#x3002;&#x6B63;&#x786E;&#x7684;&#x7B54;&#x6848;&#x5C31;&#x662F;3&#x3002;</p><p>alert&#x4F1A;&#x201C;&#x6355;&#x83B7;&#x201D;&#x6211;&#x70B9;&#x51FB;&#x6309;&#x94AE;&#x65F6;&#x5019;&#x7684;&#x72B6;&#x6001;&#x3002;</p><p><em>&#xFF08;&#x867D;&#x7136;&#x6709;&#x5176;&#x4ED6;&#x529E;&#x6CD5;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x4E0D;&#x540C;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x4F46;&#x73B0;&#x5728;&#x6211;&#x4F1A;&#x4E13;&#x6CE8;&#x4E8E;&#x8FD9;&#x4E2A;&#x9ED8;&#x8BA4;&#x7684;&#x573A;&#x666F;&#x3002;&#x5F53;&#x6211;&#x4EEC;&#x5728;&#x6784;&#x5EFA;&#x4E00;&#x79CD;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5728;&#x53EF;&#x9009;&#x7684;&#x7B56;&#x7565;&#x4E2D;&#x5206;&#x8FA8;&#x51FA;&#x201C;&#x6700;&#x5C0F;&#x963B;&#x529B;&#x8DEF;&#x5F84;&#x201D;&#x662F;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x3002;&#xFF09;</em></p><hr><p>&#x4F46;&#x5B83;&#x7A76;&#x7ADF;&#x662F;&#x5982;&#x4F55;&#x5DE5;&#x4F5C;&#x7684;&#x5462;&#xFF1F;</p><p>&#x6211;&#x4EEC;&#x53D1;&#x73B0;<code>count</code>&#x5728;&#x6BCF;&#x4E00;&#x6B21;&#x51FD;&#x6570;&#x8C03;&#x7528;&#x4E2D;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5E38;&#x91CF;&#x503C;&#x3002;&#x503C;&#x5F97;&#x5F3A;&#x8C03;&#x7684;&#x662F; &#x2014; <strong><strong>&#x6211;&#x4EEC;&#x7684;&#x7EC4;&#x4EF6;&#x51FD;&#x6570;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x4F1A;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x4F46;&#x662F;&#x6BCF;&#x4E00;&#x6B21;&#x8C03;&#x7528;&#x4E2D;<code>count</code>&#x503C;&#x90FD;&#x662F;&#x5E38;&#x91CF;&#xFF0C;&#x5E76;&#x4E14;&#x5B83;&#x88AB;&#x8D4B;&#x4E88;&#x4E86;&#x5F53;&#x524D;&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x72B6;&#x6001;&#x503C;&#x3002;</strong></strong></p><p>&#x8FD9;&#x5E76;&#x4E0D;&#x662F;React&#x7279;&#x6709;&#x7684;&#xFF0C;&#x666E;&#x901A;&#x7684;&#x51FD;&#x6570;&#x4E5F;&#x6709;&#x7C7B;&#x4F3C;&#x7684;&#x884C;&#x4E3A;&#xFF1A;</p><pre><code class="language-jsx">function sayHi(person) {
  const name = person.name;  setTimeout(() =&gt; {
    alert(&apos;Hello, &apos; + name);
  }, 3000);
}

let someone = {name: &apos;Dan&apos;};
sayHi(someone);

someone = {name: &apos;Yuzhi&apos;};
sayHi(someone);

someone = {name: &apos;Dominic&apos;};
sayHi(someone);</code></pre><p>&#x5728; <a href="https://codesandbox.io/s/mm6ww11lk8" rel="nofollow noopener noreferrer">&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;</a>&#x4E2D;, &#x5916;&#x5C42;&#x7684;<code>someone</code>&#x4F1A;&#x88AB;&#x8D4B;&#x503C;&#x5F88;&#x591A;&#x6B21;&#xFF08;&#x5C31;&#x50CF;&#x5728;React&#x4E2D;&#xFF0C;<em>&#x5F53;&#x524D;</em>&#x7684;&#x7EC4;&#x4EF6;&#x72B6;&#x6001;&#x4F1A;&#x6539;&#x53D8;&#x4E00;&#x6837;&#xFF09;&#x3002;<strong><strong>&#x7136;&#x540E;&#xFF0C;&#x5728;<code>sayHi</code>&#x51FD;&#x6570;&#x4E2D;&#xFF0C;&#x5C40;&#x90E8;&#x5E38;&#x91CF;<code>name</code>&#x4F1A;&#x548C;&#x67D0;&#x6B21;&#x8C03;&#x7528;&#x4E2D;&#x7684;<code>person</code>&#x5173;&#x8054;&#x3002;</strong></strong>&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#x5E38;&#x91CF;&#x662F;&#x5C40;&#x90E8;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6BCF;&#x4E00;&#x6B21;&#x8C03;&#x7528;&#x90FD;&#x662F;&#x76F8;&#x4E92;&#x72EC;&#x7ACB;&#x7684;&#x3002;&#x7ED3;&#x679C;&#x5C31;&#x662F;&#xFF0C;&#x5F53;&#x5B9A;&#x65F6;&#x5668;&#x56DE;&#x8C03;&#x89E6;&#x53D1;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;alert&#x90FD;&#x4F1A;&#x5F39;&#x51FA;&#x5B83;&#x62E5;&#x6709;&#x7684;<code>name</code>&#x3002;</p><p>&#x8FD9;&#x5C31;&#x89E3;&#x91CA;&#x4E86;&#x6211;&#x4EEC;&#x7684;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x5982;&#x4F55;&#x6355;&#x83B7;&#x4E86;&#x70B9;&#x51FB;&#x65F6;&#x5019;&#x7684;<code>count</code>&#x503C;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5E94;&#x7528;&#x76F8;&#x540C;&#x7684;&#x66FF;&#x6362;&#x539F;&#x7406;&#xFF0C;&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;&#x662F;&#x5B83;&#x81EA;&#x5DF1;&#x7684;<code>count</code>&#xFF1A;</p><pre><code class="language-jsx">// During first render
function Counter() {
  const count = 0; // Returned by useState()  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + count);
    }, 3000);
  }
  // ...
}

// After a click, our function is called again
function Counter() {
  const count = 1; // Returned by useState()  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + count);
    }, 3000);
  }
  // ...
}

// After another click, our function is called again
function Counter() {
  const count = 2; // Returned by useState()  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + count);
    }, 3000);
  }
  // ...
}</code></pre><p>&#x6240;&#x4EE5;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x201C;&#x65B0;&#x7248;&#x672C;&#x201D;&#x7684;<code>handleAlertClick</code>&#x3002;&#x6BCF;&#x4E00;&#x4E2A;&#x7248;&#x672C;&#x7684;<code>handleAlertClick</code>&#x201C;&#x8BB0;&#x4F4F;&#x201D; &#x4E86;&#x5B83;&#x81EA;&#x5DF1;&#x7684; <code>count</code>&#xFF1A;</p><pre><code class="language-jsx">// During first render
function Counter() {
  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + 0);    }, 3000);
  }
  // ...
  &lt;button onClick={handleAlertClick} /&gt; // The one with 0 inside  // ...
}

// After a click, our function is called again
function Counter() {
  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + 1);    }, 3000);
  }
  // ...
  &lt;button onClick={handleAlertClick} /&gt; // The one with 1 inside  // ...
}

// After another click, our function is called again
function Counter() {
  // ...
  function handleAlertClick() {
    setTimeout(() =&gt; {
      alert(&apos;You clicked on: &apos; + 2);    }, 3000);
  }
  // ...
  &lt;button onClick={handleAlertClick} /&gt; // The one with 2 inside  // ...
}</code></pre><p>&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;<a href="https://codesandbox.io/s/w2wxl3yo0l" rel="nofollow noopener noreferrer">&#x5728;&#x8FD9;&#x4E2A;demo&#x4E2D;</a>&#x4E2D;&#xFF0C;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x201C;&#x5C5E;&#x4E8E;&#x201D;&#x67D0;&#x4E00;&#x6B21;&#x7279;&#x5B9A;&#x7684;&#x6E32;&#x67D3;&#xFF0C;&#x5F53;&#x4F60;&#x70B9;&#x51FB;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5B83;&#x4F1A;&#x4F7F;&#x7528;&#x90A3;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;<code>counter</code>&#x7684;&#x72B6;&#x6001;&#x503C;&#x3002;</p><p><strong><strong>&#x5728;&#x4EFB;&#x610F;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#xFF0C;props&#x548C;state&#x662F;&#x59CB;&#x7EC8;&#x4FDD;&#x6301;&#x4E0D;&#x53D8;&#x7684;&#x3002;</strong></strong>&#x5982;&#x679C;props&#x548C;state&#x5728;&#x4E0D;&#x540C;&#x7684;&#x6E32;&#x67D3;&#x4E2D;&#x662F;&#x76F8;&#x4E92;&#x72EC;&#x7ACB;&#x7684;&#xFF0C;&#x90A3;&#x4E48;&#x4F7F;&#x7528;&#x5230;&#x5B83;&#x4EEC;&#x7684;&#x4EFB;&#x4F55;&#x503C;&#x4E5F;&#x662F;&#x72EC;&#x7ACB;&#x7684;&#xFF08;&#x5305;&#x62EC;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF09;&#x3002;&#x5B83;&#x4EEC;&#x90FD;&#x201C;&#x5C5E;&#x4E8E;&#x201D;&#x4E00;&#x6B21;&#x7279;&#x5B9A;&#x7684;&#x6E32;&#x67D3;&#x3002;&#x5373;&#x4FBF;&#x662F;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x4E2D;&#x7684;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#x8C03;&#x7528;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;&#x4E5F;&#x662F;&#x8FD9;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;<code>count</code>&#x503C;&#x3002;</p><p><em>&#x5907;&#x6CE8;&#xFF1A;&#x4E0A;&#x9762;&#x6211;&#x5C06;&#x5177;&#x4F53;&#x7684;<code>count</code>&#x503C;&#x76F4;&#x63A5;&#x5185;&#x8054;&#x5230;&#x4E86;<code>handleAlertClick</code>&#x51FD;&#x6570;&#x4E2D;&#x3002;&#x8FD9;&#x79CD;&#x5FC3;&#x667A;&#x4E0A;&#x7684;&#x66FF;&#x6362;&#x662F;&#x5B89;&#x5168;&#x7684;&#x56E0;&#x4E3A;<code>count</code> &#x503C;&#x5728;&#x67D0;&#x6B21;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x4E2D;&#x4E0D;&#x53EF;&#x80FD;&#x88AB;&#x6539;&#x53D8;&#x3002;&#x5B83;&#x88AB;&#x58F0;&#x660E;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x5E38;&#x91CF;&#x5E76;&#x4E14;&#x662F;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x3002;&#x8FD9;&#x6837;&#x53BB;&#x601D;&#x8003;&#x5176;&#x4ED6;&#x7C7B;&#x578B;&#x7684;&#x503C;&#x6BD4;&#x5982;&#x5BF9;&#x8C61;&#x4E5F;&#x540C;&#x6837;&#x662F;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x5F53;&#x7136;&#x9700;&#x8981;&#x5728;&#x6211;&#x4EEC;&#x90FD;&#x540C;&#x610F;&#x5E94;&#x8BE5;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x4FEE;&#x6539;state&#x8FD9;&#x4E2A;&#x524D;&#x63D0;&#x4E0B;&#x3002;&#x901A;&#x8FC7;&#x8C03;&#x7528;<code>setSomething(newObj)</code>&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5BF9;&#x8C61;&#x800C;&#x4E0D;&#x662F;&#x76F4;&#x63A5;&#x4FEE;&#x6539;&#x5B83;&#x662F;&#x66F4;&#x597D;&#x7684;&#x9009;&#x62E9;&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x6837;&#x80FD;&#x4FDD;&#x8BC1;&#x4E4B;&#x524D;&#x6E32;&#x67D3;&#x4E2D;&#x7684;state&#x4E0D;&#x4F1A;&#x88AB;&#x6C61;&#x67D3;&#x3002;</em></p><h2 id="%E6%AF%8F%E6%AC%A1%E6%B8%B2%E6%9F%93%E9%83%BD%E6%9C%89%E5%AE%83%E8%87%AA%E5%B7%B1%E7%9A%84effects">&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x6709;&#x5B83;&#x81EA;&#x5DF1;&#x7684;Effects</h2><p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x662F;&#x5173;&#x4E8E;effects&#x7684;&#xFF0C;&#x4F46;&#x76EE;&#x524D;&#x6211;&#x4EEC;&#x5C45;&#x7136;&#x8FD8;&#x6CA1;&#x6709;&#x8BA8;&#x8BBA;effects&#xFF01; &#x8A00;&#x5F52;&#x6B63;&#x4F20;&#xFF0C;&#x7531;&#x4E0A;&#x9762;&#x7684;&#x5206;&#x6790;&#x5F97;&#x51FA;&#x4E00;&#x4E2A;&#x7ED3;&#x679C;&#xFF0C;effects&#x5176;&#x5B9E;&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x4E24;&#x6837;&#x3002;</p><p>&#x8BA9;&#x6211;&#x4EEC;&#x56DE;&#x5230;<a href="https://reactjs.org/docs/hooks-effect.html" rel="nofollow noopener noreferrer">&#x5B98;&#x7F51;&#x6587;&#x6863;</a>&#x4E2D;&#x7684;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {    document.title = `You clicked ${count} times`;  });
  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}</code></pre><p><strong><strong>&#x629B;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x7ED9;&#x4F60;&#xFF1A;effect&#x662F;&#x5982;&#x4F55;&#x8BFB;&#x53D6;&#x5230;&#x6700;&#x65B0;&#x7684;<code>count</code> &#x72B6;&#x6001;&#x503C;&#x7684;&#x5462;&#xFF1F;</strong></strong></p><p>&#x4E5F;&#x8BB8;&#xFF0C;&#x662F;&#x67D0;&#x79CD;&#x201C;data binding&#x201D;&#x6216;&#x201C;watching&#x201D;&#x673A;&#x5236;&#x4F7F;&#x5F97;<code>count</code>&#x80FD;&#x591F;&#x5728;effect&#x51FD;&#x6570;&#x5185;&#x66F4;&#x65B0;&#xFF1F;&#x4E5F;&#x6216;&#x8BB8;<code>count</code>&#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x53D8;&#x7684;&#x503C;&#xFF0C;React&#x4F1A;&#x5728;&#x6211;&#x4EEC;&#x7EC4;&#x4EF6;&#x5185;&#x90E8;&#x4FEE;&#x6539;&#x5B83;&#x4EE5;&#x4F7F;&#x6211;&#x4EEC;&#x7684;effect&#x51FD;&#x6570;&#x603B;&#x80FD;&#x62FF;&#x5230;&#x6700;&#x65B0;&#x7684;&#x503C;&#xFF1F;</p><p>&#x90FD;&#x4E0D;&#x662F;&#x3002;</p><p>&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;<code>count</code>&#x662F;&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x5E38;&#x91CF;&#x3002;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;&#x662F;&#x5C5E;&#x4E8E;&#x5B83;&#x90A3;&#x6B21;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x4E2D;&#x7684;<code>count</code>&#x72B6;&#x6001;&#x503C;&#x3002;&#x5BF9;&#x4E8E;effects&#x4E5F;&#x540C;&#x6837;&#x5982;&#x6B64;&#xFF1A;</p><p><strong><strong>&#x5E76;&#x4E0D;&#x662F;<code>count</code>&#x7684;&#x503C;&#x5728;&#x201C;&#x4E0D;&#x53D8;&#x201D;&#x7684;effect&#x4E2D;&#x53D1;&#x751F;&#x4E86;&#x6539;&#x53D8;&#xFF0C;&#x800C;&#x662F;<em>effect &#x51FD;&#x6570;&#x672C;&#x8EAB;</em>&#x5728;&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x90FD;&#x4E0D;&#x76F8;&#x540C;&#x3002;</strong></strong></p><p>&#x6BCF;&#x4E00;&#x4E2A;effect&#x7248;&#x672C;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;<code>count</code>&#x503C;&#x90FD;&#x6765;&#x81EA;&#x4E8E;&#x5B83;&#x5C5E;&#x4E8E;&#x7684;&#x90A3;&#x6B21;&#x6E32;&#x67D3;&#xFF1A;</p><pre><code class="language-jsx">// During first render
function Counter() {
  // ...
  useEffect(
    // Effect function from first render    () =&gt; {      document.title = `You clicked ${0} times`;    }  );
  // ...
}

// After a click, our function is called again
function Counter() {
  // ...
  useEffect(
    // Effect function from second render    () =&gt; {      document.title = `You clicked ${1} times`;    }  );
  // ...
}

// After another click, our function is called again
function Counter() {
  // ...
  useEffect(
    // Effect function from third render    () =&gt; {      document.title = `You clicked ${2} times`;    }  );
  // ..
}</code></pre><p>React&#x4F1A;&#x8BB0;&#x4F4F;&#x4F60;&#x63D0;&#x4F9B;&#x7684;effect&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x4E14;&#x4F1A;&#x5728;&#x6BCF;&#x6B21;&#x66F4;&#x6539;&#x4F5C;&#x7528;&#x4E8E;DOM&#x5E76;&#x8BA9;&#x6D4F;&#x89C8;&#x5668;&#x7ED8;&#x5236;&#x5C4F;&#x5E55;&#x540E;&#x53BB;&#x8C03;&#x7528;&#x5B83;&#x3002;</p><p>&#x6240;&#x4EE5;&#x867D;&#x7136;&#x6211;&#x4EEC;&#x8BF4;&#x7684;&#x662F;&#x4E00;&#x4E2A; <em>effect</em>&#xFF08;&#x8FD9;&#x91CC;&#x6307;&#x66F4;&#x65B0;document&#x7684;title&#xFF09;&#xFF0C;&#x4F46;&#x5176;&#x5B9E;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x662F;&#x4E00;&#x4E2A;<em>&#x4E0D;&#x540C;&#x7684;&#x51FD;&#x6570;</em> &#x2014; &#x5E76;&#x4E14;&#x6BCF;&#x4E2A;effect&#x51FD;&#x6570;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;props&#x548C;state&#x90FD;&#x6765;&#x81EA;&#x4E8E;&#x5B83;&#x5C5E;&#x4E8E;&#x7684;&#x90A3;&#x6B21;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x3002;</p><p><strong><strong>&#x6982;&#x5FF5;&#x4E0A;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x60F3;&#x8C61;effects&#x662F;&#x6E32;&#x67D3;&#x7ED3;&#x679C;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x3002;</strong></strong></p><p>&#x4E25;&#x683C;&#x5730;&#x8BF4;&#xFF0C;&#x5B83;&#x4EEC;&#x5E76;&#x4E0D;&#x662F;&#xFF08;&#x4E3A;&#x4E86;<a href="https://overreacted.io/why-do-hooks-rely-on-call-order/" rel="nofollow noopener noreferrer">&#x5141;&#x8BB8;Hook&#x7684;&#x7EC4;&#x5408;</a>&#x5E76;&#x4E14;&#x4E0D;&#x5F15;&#x5165;&#x7B28;&#x62D9;&#x7684;&#x8BED;&#x6CD5;&#x6216;&#x8005;&#x8FD0;&#x884C;&#x65F6;&#xFF09;&#x3002;&#x4F46;&#x662F;&#x5728;&#x6211;&#x4EEC;&#x6784;&#x5EFA;&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x4E0A;&#xFF0C;effect&#x51FD;&#x6570;<em>&#x5C5E;&#x4E8E;</em>&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x6E32;&#x67D3;&#xFF0C;&#x5C31;&#x50CF;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#x4E00;&#x6837;&#x3002;</p><hr><p>&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x624E;&#x5B9E;&#x7684;&#x7406;&#x89E3;&#xFF0C;&#x6211;&#x4EEC;&#x518D;&#x56DE;&#x987E;&#x4E00;&#x4E0B;&#x7B2C;&#x4E00;&#x6B21;&#x7684;&#x6E32;&#x67D3;&#x8FC7;&#x7A0B;&#xFF1A;</p><ul><li><strong><strong>React:</strong></strong> &#x7ED9;&#x6211;&#x72B6;&#x6001;&#x4E3A; <code>0</code>&#x65F6;&#x5019;&#x7684;UI&#x3002;</li></ul><p><strong><strong>&#x4F60;&#x7684;&#x7EC4;&#x4EF6;:</strong></strong></p><ul><li>&#x7ED9;&#x4F60;&#x9700;&#x8981;&#x6E32;&#x67D3;&#x7684;&#x5185;&#x5BB9;: <code>&lt;p&gt;You clicked 0 times&lt;/p&gt;</code>&#x3002;</li><li>&#x8BB0;&#x5F97;&#x5728;&#x6E32;&#x67D3;&#x5B8C;&#x4E86;&#x4E4B;&#x540E;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;effect: <code>() =&gt; { document.title = &apos;You clicked 0 times&apos; }</code>&#x3002;</li><li><strong><strong>React:</strong></strong> &#x6CA1;&#x95EE;&#x9898;&#x3002;&#x5F00;&#x59CB;&#x66F4;&#x65B0;UI&#xFF0C;&#x5582;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x6211;&#x8981;&#x7ED9;DOM&#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x4E1C;&#x897F;&#x3002;</li><li><strong><strong>&#x6D4F;&#x89C8;&#x5668;:</strong></strong> &#x9177;&#xFF0C;&#x6211;&#x5DF2;&#x7ECF;&#x628A;&#x5B83;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x4E86;&#x3002;</li></ul><p><strong><strong>React:</strong></strong> &#x597D;&#x7684;&#xFF0C; &#x6211;&#x73B0;&#x5728;&#x5F00;&#x59CB;&#x8FD0;&#x884C;&#x7ED9;&#x6211;&#x7684;effect</p><ul><li>&#x8FD0;&#x884C; <code>() =&gt; { document.title = &apos;You clicked 0 times&apos; }</code>&#x3002;</li></ul><hr><p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x56DE;&#x987E;&#x4E00;&#x4E0B;&#x6211;&#x4EEC;&#x70B9;&#x51FB;&#x4E4B;&#x540E;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;&#xFF1A;</p><ul><li><strong><strong>&#x4F60;&#x7684;&#x7EC4;&#x4EF6;:</strong></strong> &#x5582; React, &#x628A;&#x6211;&#x7684;&#x72B6;&#x6001;&#x8BBE;&#x7F6E;&#x4E3A;<code>1</code>&#x3002;</li><li><strong><strong>React:</strong></strong> &#x7ED9;&#x6211;&#x72B6;&#x6001;&#x4E3A; <code>1</code>&#x65F6;&#x5019;&#x7684;UI&#x3002;</li></ul><p><strong><strong>&#x4F60;&#x7684;&#x7EC4;&#x4EF6;:</strong></strong></p><ul><li>&#x7ED9;&#x4F60;&#x9700;&#x8981;&#x6E32;&#x67D3;&#x7684;&#x5185;&#x5BB9;: <code>&lt;p&gt;You clicked 1 times&lt;/p&gt;</code>&#x3002;</li><li>&#x8BB0;&#x5F97;&#x5728;&#x6E32;&#x67D3;&#x5B8C;&#x4E86;&#x4E4B;&#x540E;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;effect&#xFF1A; <code>() =&gt; { document.title = &apos;You clicked 1 times&apos; }</code>&#x3002;</li><li><strong><strong>React:</strong></strong> &#x6CA1;&#x95EE;&#x9898;&#x3002;&#x5F00;&#x59CB;&#x66F4;&#x65B0;UI&#xFF0C;&#x5582;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x6211;&#x4FEE;&#x6539;&#x4E86;DOM&#x3002;</li><li><strong><strong>Browser:</strong></strong> &#x9177;&#xFF0C;&#x6211;&#x5DF2;&#x7ECF;&#x5C06;&#x66F4;&#x6539;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x4E86;&#x3002;</li></ul><p><strong><strong>React:</strong></strong> &#x597D;&#x7684;&#xFF0C; &#x6211;&#x73B0;&#x5728;&#x5F00;&#x59CB;&#x8FD0;&#x884C;&#x5C5E;&#x4E8E;&#x8FD9;&#x6B21;&#x6E32;&#x67D3;&#x7684;effect</p><ul><li>&#x8FD0;&#x884C; <code>() =&gt; { document.title = &apos;You clicked 1 times&apos; }</code>&#x3002;</li></ul><hr><h2 id="%E6%AF%8F%E4%B8%80%E6%AC%A1%E6%B8%B2%E6%9F%93%E9%83%BD%E6%9C%89%E5%AE%83%E8%87%AA%E5%B7%B1%E7%9A%84%E2%80%A6%E6%89%80%E6%9C%89">&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x6709;&#x5B83;&#x81EA;&#x5DF1;&#x7684;&#x2026;&#x6240;&#x6709;</h2><p><strong><strong>&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x77E5;&#x9053;effects&#x4F1A;&#x5728;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x540E;&#x8FD0;&#x884C;&#xFF0C;&#x5E76;&#x4E14;&#x6982;&#x5FF5;&#x4E0A;&#x5B83;&#x662F;&#x7EC4;&#x4EF6;&#x8F93;&#x51FA;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x53EF;&#x4EE5;&#x201C;&#x770B;&#x5230;&#x201D;&#x5C5E;&#x4E8E;&#x67D0;&#x6B21;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x7684;props&#x548C;state&#x3002;</strong></strong></p><p>&#x6211;&#x4EEC;&#x6765;&#x505A;&#x4E00;&#x4E2A;&#x601D;&#x60F3;&#x5B9E;&#x9A8C;&#xFF0C;&#x601D;&#x8003;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {    setTimeout(() =&gt; {      console.log(`You clicked ${count} times`);    }, 3000);  });
  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}</code></pre><p>&#x5982;&#x679C;&#x6211;&#x70B9;&#x51FB;&#x4E86;&#x5F88;&#x591A;&#x6B21;&#x5E76;&#x4E14;&#x5728;effect&#x91CC;&#x8BBE;&#x7F6E;&#x4E86;&#x5EF6;&#x65F6;&#xFF0C;&#x6253;&#x5370;&#x51FA;&#x6765;&#x7684;&#x7ED3;&#x679C;&#x4F1A;&#x662F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;</p><hr><p><em>&#x5267;&#x900F;&#x9884;&#x8B66;</em></p><hr><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x8BA4;&#x4E3A;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x7ED5;&#x7684;&#x9898;&#x5E76;&#x4E14;&#x7ED3;&#x679C;&#x662F;&#x53CD;&#x76F4;&#x89C9;&#x7684;&#x3002;&#x5B8C;&#x5168;&#x9519;&#x4E86;&#xFF01;&#x6211;&#x4EEC;&#x770B;&#x5230;&#x7684;&#x5C31;&#x662F;&#x987A;&#x5E8F;&#x7684;&#x6253;&#x5370;&#x8F93;&#x51FA; &#x2014; &#x6BCF;&#x4E00;&#x4E2A;&#x90FD;&#x5C5E;&#x4E8E;&#x67D0;&#x6B21;&#x7279;&#x5B9A;&#x7684;&#x6E32;&#x67D3;&#xFF0C;&#x56E0;&#x6B64;&#x6709;&#x5B83;&#x8BE5;&#x6709;&#x7684;<code>count</code>&#x503C;&#x3002;&#x4F60;&#x53EF;&#x4EE5;<a href="https://codesandbox.io/s/lyx20m1ol" rel="nofollow noopener noreferrer">&#x81EA;&#x5DF1;&#x8BD5;&#x4E00;&#x8BD5;</a>&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/a5727d333c270e05942f508707265378/timeout_counter.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x60F3;&#xFF1A;&#x201C;&#x5B83;&#x5F53;&#x7136;&#x5E94;&#x8BE5;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x3002;&#x5426;&#x5219;&#x8FD8;&#x4F1A;&#x600E;&#x4E48;&#x6837;&#x5462;&#xFF1F;&#x201D;</p><p>&#x4E0D;&#x8FC7;&#xFF0C;class&#x4E2D;&#x7684;<code>this.state</code>&#x5E76;&#x4E0D;&#x662F;&#x8FD9;&#x6837;&#x8FD0;&#x4F5C;&#x7684;&#x3002;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x60F3;&#x5F53;&#x7136;&#x4EE5;&#x4E3A;&#x4E0B;&#x9762;&#x7684;<a href="https://codesandbox.io/s/kkymzwjqz3" rel="nofollow noopener noreferrer">class &#x5B9E;&#x73B0;</a>&#x548C;&#x4E0A;&#x9762;&#x662F;&#x76F8;&#x7B49;&#x7684;&#xFF1A;</p><pre><code class="language-jsx">  componentDidUpdate() {
    setTimeout(() =&gt; {
      console.log(`You clicked ${this.state.count} times`);
    }, 3000);
  }</code></pre><p>&#x7136;&#x800C;&#xFF0C;<code>this.state.count</code>&#x603B;&#x662F;&#x6307;&#x5411;<em>&#x6700;&#x65B0;</em>&#x7684;count&#x503C;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x5C5E;&#x4E8E;&#x67D0;&#x6B21;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x7684;&#x503C;&#x3002;&#x6240;&#x4EE5;&#x4F60;&#x4F1A;&#x770B;&#x5230;&#x6BCF;&#x6B21;&#x6253;&#x5370;&#x8F93;&#x51FA;&#x90FD;&#x662F;<code>5</code>&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/264b329edc111a1973003bdf2bcacd65/timeout_counter_class.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x6211;&#x89C9;&#x5F97;Hooks&#x8FD9;&#x4E48;&#x4F9D;&#x8D56;Javascript&#x95ED;&#x5305;&#x662F;&#x633A;&#x8BBD;&#x523A;&#x7684;&#x4E00;&#x4EF6;&#x4E8B;&#x3002;&#x6709;&#x65F6;&#x5019;&#x7EC4;&#x4EF6;&#x7684;class&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#x4F1A;&#x53D7;&#x95ED;&#x5305;&#x76F8;&#x5173;&#x7684;&#x82E6;&#xFF08;<a href="https://wsvincent.com/javascript-closure-settimeout-for-loop/" rel="nofollow noopener noreferrer">the canonical wrong-value-in-a-timeout confusion</a>&#xFF09;&#xFF0C;&#x4F46;&#x5176;&#x5B9E;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x771F;&#x6B63;&#x7684;&#x6DF7;&#x4E71;&#x6765;&#x6E90;&#x662F;&#x53EF;&#x53D8;&#x6570;&#x636E;&#xFF08;React &#x4FEE;&#x6539;&#x4E86;class&#x4E2D;&#x7684;<code>this.state</code>&#x4F7F;&#x5176;&#x6307;&#x5411;&#x6700;&#x65B0;&#x72B6;&#x6001;&#xFF09;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x95ED;&#x5305;&#x672C;&#x8EAB;&#x7684;&#x9519;&#x3002;</p><p><strong><strong>&#x5F53;&#x5C01;&#x95ED;&#x7684;&#x503C;&#x59CB;&#x7EC8;&#x4E0D;&#x4F1A;&#x53D8;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x95ED;&#x5305;&#x662F;&#x975E;&#x5E38;&#x68D2;&#x7684;&#x3002;&#x8FD9;&#x4F7F;&#x5B83;&#x4EEC;&#x975E;&#x5E38;&#x5BB9;&#x6613;&#x601D;&#x8003;&#x56E0;&#x4E3A;&#x4F60;&#x672C;&#x8D28;&#x4E0A;&#x5728;&#x5F15;&#x7528;&#x5E38;&#x91CF;&#x3002;</strong></strong>&#x6B63;&#x5982;&#x6211;&#x4EEC;&#x6240;&#x8BA8;&#x8BBA;&#x7684;&#xFF0C;props&#x548C;state&#x5728;&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x6E32;&#x67D3;&#x4E2D;&#x662F;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x7684;&#x3002;&#x987A;&#x4FBF;&#x8BF4;&#x4E00;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;<a href="https://codesandbox.io/s/w7vjo07055" rel="nofollow noopener noreferrer">&#x4F7F;&#x7528;&#x95ED;&#x5305;</a>&#x4FEE;&#x590D;&#x4E0A;&#x9762;&#x7684;class&#x7248;&#x672C;&#x2026;</p><h2 id="%E9%80%86%E6%BD%AE%E8%80%8C%E5%8A%A8">&#x9006;&#x6F6E;&#x800C;&#x52A8;</h2><p>&#x5230;&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x660E;&#x786E;&#x5730;&#x558A;&#x51FA;&#x4E0B;&#x9762;&#x91CD;&#x8981;&#x7684;&#x4E8B;&#x5B9E;&#xFF1A;<strong><strong>&#x6BCF;&#x4E00;&#x4E2A;</strong></strong>&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x51FD;&#x6570;&#xFF08;&#x5305;&#x62EC;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF0C;effects&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x6216;&#x8005;API&#x8C03;&#x7528;&#x7B49;&#x7B49;&#xFF09;&#x4F1A;&#x6355;&#x83B7;&#x67D0;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;props&#x548C;state&#x3002;</p><p>&#x6240;&#x4EE5;&#x4E0B;&#x9762;&#x7684;&#x4E24;&#x4E2A;&#x4F8B;&#x5B50;&#x662F;&#x76F8;&#x7B49;&#x7684;&#xFF1A;</p><pre><code class="language-jsx">function Example(props) {
  useEffect(() =&gt; {
    setTimeout(() =&gt; {
      console.log(props.counter);    }, 1000);
  });
  // ...
}</code></pre><pre><code class="language-jsx">function Example(props) {
  const counter = props.counter;  useEffect(() =&gt; {
    setTimeout(() =&gt; {
      console.log(counter);    }, 1000);
  });
  // ...
}</code></pre><p><strong><strong>&#x5728;&#x7EC4;&#x4EF6;&#x5185;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x53BB;&#x8BFB;&#x53D6;props&#x6216;&#x8005;state&#x662F;&#x65E0;&#x5173;&#x7D27;&#x8981;&#x7684;&#x3002;</strong></strong>&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x3002;&#x5728;&#x5355;&#x6B21;&#x6E32;&#x67D3;&#x7684;&#x8303;&#x56F4;&#x5185;&#xFF0C;props&#x548C;state&#x59CB;&#x7EC8;&#x4FDD;&#x6301;&#x4E0D;&#x53D8;&#x3002;&#xFF08;&#x89E3;&#x6784;&#x8D4B;&#x503C;&#x7684;props&#x4F7F;&#x5F97;&#x8FD9;&#x4E00;&#x70B9;&#x66F4;&#x660E;&#x663E;&#x3002;&#xFF09;</p><p>&#x5F53;&#x7136;&#xFF0C;&#x6709;&#x65F6;&#x5019;&#x4F60;&#x53EF;&#x80FD;<em>&#x60F3;</em>&#x5728;effect&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x91CC;&#x8BFB;&#x53D6;&#x6700;&#x65B0;&#x7684;&#x503C;&#x800C;&#x4E0D;&#x662F;&#x6355;&#x83B7;&#x7684;&#x503C;&#x3002;&#x6700;&#x7B80;&#x5355;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528;refs&#xFF0C;<a href="https://overreacted.io/how-are-function-components-different-from-classes/" rel="nofollow noopener noreferrer">&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;</a>&#x7684;&#x6700;&#x540E;&#x4E00;&#x90E8;&#x5206;&#x4ECB;&#x7ECD;&#x4E86;&#x76F8;&#x5173;&#x5185;&#x5BB9;&#x3002;</p><p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#x5F53;&#x4F60;&#x60F3;&#x8981;&#x4ECE;<em>&#x8FC7;&#x53BB;</em>&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x51FD;&#x6570;&#x91CC;&#x8BFB;&#x53D6;<em>&#x672A;&#x6765;</em>&#x7684;props&#x548C;state&#xFF0C;&#x4F60;&#x662F;&#x5728;&#x9006;&#x6F6E;&#x800C;&#x52A8;&#x3002;&#x867D;&#x7136;&#x5B83;&#x5E76;&#x6CA1;&#x6709;<em>&#x9519;</em>&#xFF08;&#x6709;&#x65F6;&#x5019;&#x53EF;&#x80FD;&#x4E5F;&#x9700;&#x8981;&#x8FD9;&#x6837;&#x505A;&#xFF09;&#xFF0C;&#x4F46;&#x5B83;&#x56E0;&#x4E3A;&#x6253;&#x7834;&#x4E86;&#x9ED8;&#x8BA4;&#x8303;&#x5F0F;&#x4F1A;&#x4F7F;&#x4EE3;&#x7801;&#x663E;&#x5F97;&#x4E0D;&#x591F;&#x201C;&#x5E72;&#x51C0;&#x201D;&#x3002;&#x8FD9;&#x662F;&#x6211;&#x4EEC;&#x6709;&#x610F;&#x4E3A;&#x4E4B;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x80FD;&#x5E2E;&#x52A9;&#x7A81;&#x51FA;&#x54EA;&#x4E9B;&#x4EE3;&#x7801;&#x662F;&#x8106;&#x5F31;&#x7684;&#xFF0C;&#x662F;&#x9700;&#x8981;&#x4F9D;&#x8D56;&#x65F6;&#x95F4;&#x6B21;&#x5E8F;&#x7684;&#x3002;&#x5728;class&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x53D1;&#x751F;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5C31;&#x6CA1;&#x90A3;&#x4E48;&#x663E;&#x800C;&#x6613;&#x89C1;&#x4E86;&#x3002;</p><p>&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;<a href="https://codesandbox.io/s/rm7z22qnlp" rel="nofollow noopener noreferrer">&#x8BA1;&#x6570;&#x5668;&#x7248;&#x672C;</a> &#x6A21;&#x62DF;&#x4E86;class&#x4E2D;&#x7684;&#x884C;&#x4E3A;&#xFF1A;</p><pre><code class="language-jsx">function Example() {
  const [count, setCount] = useState(0);
  const latestCount = useRef(count);
  useEffect(() =&gt; {
    // Set the mutable latest value    latestCount.current = count;    setTimeout(() =&gt; {
      // Read the mutable latest value      console.log(`You clicked ${latestCount.current} times`);    }, 3000);
  });
  // ...</code></pre><figure class="kg-card kg-image-card"><img src="https://overreacted.io/78f7948263dd13b023498b23cb99f4fc/timeout_counter_refs.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x5728;React&#x4E2D;&#x53BB;&#x76F4;&#x63A5;&#x4FEE;&#x6539;&#x503C;&#x770B;&#x4E0A;&#x53BB;&#x6709;&#x70B9;&#x602A;&#x5F02;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x5728;class&#x7EC4;&#x4EF6;&#x4E2D;React&#x6B63;&#x662F;&#x8FD9;&#x6837;&#x53BB;&#x4FEE;&#x6539;<code>this.state</code>&#x7684;&#x3002;&#x4E0D;&#x50CF;&#x6355;&#x83B7;&#x7684;props&#x548C;state&#xFF0C;&#x4F60;&#x6CA1;&#x6CD5;&#x4FDD;&#x8BC1;&#x5728;&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x8BFB;&#x53D6;&#x7684;<code>latestCount.current</code>&#x662F;&#x4E0D;&#x53D8;&#x7684;&#x3002;&#x6839;&#x636E;&#x5B9A;&#x4E49;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x968F;&#x65F6;&#x4FEE;&#x6539;&#x5B83;&#x3002;&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x5B83;&#x4E0D;&#x662F;&#x9ED8;&#x8BA4;&#x884C;&#x4E3A;&#xFF0C;&#x800C;&#x662F;&#x9700;&#x8981;&#x4F60;&#x4E3B;&#x52A8;&#x9009;&#x62E9;&#x8FD9;&#x6837;&#x505A;&#x3002;</p><h2 id="%E9%82%A3effect%E4%B8%AD%E7%9A%84%E6%B8%85%E7%90%86%E5%8F%88%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%91%A2%EF%BC%9F">&#x90A3;Effect&#x4E2D;&#x7684;&#x6E05;&#x7406;&#x53C8;&#x662F;&#x600E;&#x6837;&#x7684;&#x5462;&#xFF1F;</h2><p>&#x50CF; <a href="https://reactjs.org/docs/hooks-effect.html#effects-with-cleanup" rel="nofollow noopener noreferrer">&#x6587;&#x6863;&#x4E2D;&#x89E3;&#x91CA;&#x7684;</a>, &#x6709;&#x4E9B; effects &#x53EF;&#x80FD;&#x9700;&#x8981;&#x6709;&#x4E00;&#x4E2A;&#x6E05;&#x7406;&#x6B65;&#x9AA4;&#x3002;&#x672C;&#x8D28;&#x4E0A;&#xFF0C;&#x5B83;&#x7684;&#x76EE;&#x7684;&#x662F;&#x6D88;&#x9664;&#x526F;&#x4F5C;&#x7528;&#xFF08;effect)&#xFF0C;&#x6BD4;&#x5982;&#x53D6;&#x6D88;&#x8BA2;&#x9605;&#x3002;</p><p>&#x601D;&#x8003;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;:</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    ChatAPI.subscribeToFriendStatus(props.id, handleStatusChange);
    return () =&gt; {
      ChatAPI.unsubscribeFromFriendStatus(props.id, handleStatusChange);
    };
  });</code></pre><p>&#x5047;&#x8BBE;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x7684;&#x65F6;&#x5019;<code>props</code>&#x662F;<code>{id: 10}</code>&#xFF0C;&#x7B2C;&#x4E8C;&#x6B21;&#x6E32;&#x67D3;&#x7684;&#x65F6;&#x5019;&#x662F;<code>{id: 20}</code>&#x3002;&#x4F60;<em>&#x53EF;&#x80FD;</em>&#x4F1A;&#x8BA4;&#x4E3A;&#x53D1;&#x751F;&#x4E86;&#x4E0B;&#x9762;&#x7684;&#x8FD9;&#x4E9B;&#x4E8B;&#xFF1A;</p><ul><li>React &#x6E05;&#x9664;&#x4E86; <code>{id: 10}</code>&#x7684;effect&#x3002;</li><li>React &#x6E32;&#x67D3;<code>{id: 20}</code>&#x7684;UI&#x3002;</li><li>React &#x8FD0;&#x884C;<code>{id: 20}</code>&#x7684;effect&#x3002;</li></ul><p>(&#x4E8B;&#x5B9E;&#x5E76;&#x4E0D;&#x662F;&#x8FD9;&#x6837;&#x3002;)</p><p>&#x5982;&#x679C;&#x4F9D;&#x8D56;&#x8FD9;&#x79CD;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x8BA4;&#x4E3A;&#x6E05;&#x9664;&#x8FC7;&#x7A0B;&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;&#x662F;&#x65E7;&#x7684;props&#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x5728;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x4E4B;&#x524D;&#x8FD0;&#x884C;&#x7684;&#xFF0C;&#x65B0;&#x7684;effect&#x201C;&#x770B;&#x5230;&#x201D;&#x7684;&#x662F;&#x65B0;&#x7684;props&#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x5728;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x4E4B;&#x540E;&#x8FD0;&#x884C;&#x7684;&#x3002;&#x8FD9;&#x79CD;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x76F4;&#x63A5;&#x6765;&#x6E90;&#x4E8E;class&#x7EC4;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x4E0D;&#x8FC7;<strong><strong>&#x5B83;&#x5E76;&#x4E0D;&#x7CBE;&#x786E;</strong></strong>&#x3002;&#x8BA9;&#x6211;&#x4EEC;&#x6765;&#x4E00;&#x63A2;&#x7A76;&#x7ADF;&#x3002;</p><p>React&#x53EA;&#x4F1A;&#x5728;<a href="https://medium.com/@dan_abramov/this-benchmark-is-indeed-flawed-c3d6b5b6f97f" rel="nofollow noopener noreferrer">&#x6D4F;&#x89C8;&#x5668;&#x7ED8;&#x5236;</a>&#x540E;&#x8FD0;&#x884C;effects&#x3002;&#x8FD9;&#x4F7F;&#x5F97;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x66F4;&#x6D41;&#x7545;&#x56E0;&#x4E3A;&#x5927;&#x591A;&#x6570;effects&#x5E76;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#x5C4F;&#x5E55;&#x7684;&#x66F4;&#x65B0;&#x3002;Effect&#x7684;&#x6E05;&#x9664;&#x540C;&#x6837;&#x88AB;&#x5EF6;&#x8FDF;&#x4E86;&#x3002;<strong><strong>&#x4E0A;&#x4E00;&#x6B21;&#x7684;effect&#x4F1A;&#x5728;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x540E;&#x88AB;&#x6E05;&#x9664;&#xFF1A;</strong></strong></p><ul><li><strong><strong>React &#x6E32;&#x67D3;<code>{id: 20}</code>&#x7684;UI&#x3002;</strong></strong></li><li>&#x6D4F;&#x89C8;&#x5668;&#x7ED8;&#x5236;&#x3002;&#x6211;&#x4EEC;&#x5728;&#x5C4F;&#x5E55;&#x4E0A;&#x770B;&#x5230;<code>{id: 20}</code>&#x7684;UI&#x3002;</li><li><strong><strong>React &#x6E05;&#x9664;<code>{id: 10}</code>&#x7684;effect&#x3002;</strong></strong></li><li>React &#x8FD0;&#x884C;<code>{id: 20}</code>&#x7684;effect&#x3002;</li></ul><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x597D;&#x5947;&#xFF1A;&#x5982;&#x679C;&#x6E05;&#x9664;&#x4E0A;&#x4E00;&#x6B21;&#x7684;effect&#x53D1;&#x751F;&#x5728;props&#x53D8;&#x6210;<code>{id: 20}</code>&#x4E4B;&#x540E;&#xFF0C;&#x90A3;&#x5B83;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD8;&#x80FD;&#x201C;&#x770B;&#x5230;&#x201D;&#x65E7;&#x7684;<code>{id: 10}</code>&#xFF1F;</p><p>&#x4F60;&#x66FE;&#x7ECF;&#x6765;&#x8FC7;&#x8FD9;&#x91CC;&#x2026; &#x1F914;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/5fe238cf03a21dfa32af624124fcdcff/deja_vu.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x5F15;&#x7528;&#x4E0A;&#x534A;&#x90E8;&#x5206;&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x8BBA;:</p><blockquote>&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF08;&#x5305;&#x62EC;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF0C;effects&#xFF0C;&#x5B9A;&#x65F6;&#x5668;&#x6216;&#x8005;API&#x8C03;&#x7528;&#x7B49;&#x7B49;&#xFF09;&#x4F1A;&#x6355;&#x83B7;&#x5B9A;&#x4E49;&#x5B83;&#x4EEC;&#x7684;&#x90A3;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;props&#x548C;state&#x3002;</blockquote><p>&#x73B0;&#x5728;&#x7B54;&#x6848;&#x663E;&#x800C;&#x6613;&#x89C1;&#x3002;effect&#x7684;&#x6E05;&#x9664;&#x5E76;&#x4E0D;&#x4F1A;&#x8BFB;&#x53D6;&#x201C;&#x6700;&#x65B0;&#x201D;&#x7684;props&#x3002;&#x5B83;&#x53EA;&#x80FD;&#x8BFB;&#x53D6;&#x5230;&#x5B9A;&#x4E49;&#x5B83;&#x7684;&#x90A3;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;props&#x503C;&#xFF1A;</p><pre><code class="language-jsx">// First render, props are {id: 10}
function Example() {
  // ...
  useEffect(
    // Effect from first render
    () =&gt; {
      ChatAPI.subscribeToFriendStatus(10, handleStatusChange);
      // Cleanup for effect from first render      return () =&gt; {        ChatAPI.unsubscribeFromFriendStatus(10, handleStatusChange);      };    }
  );
  // ...
}

// Next render, props are {id: 20}
function Example() {
  // ...
  useEffect(
    // Effect from second render
    () =&gt; {
      ChatAPI.subscribeToFriendStatus(20, handleStatusChange);
      // Cleanup for effect from second render
      return () =&gt; {
        ChatAPI.unsubscribeFromFriendStatus(20, handleStatusChange);
      };
    }
  );
  // ...
}</code></pre><p>&#x738B;&#x56FD;&#x4F1A;&#x5D1B;&#x8D77;&#x8F6C;&#x800C;&#x590D;&#x5F52;&#x5C18;&#x571F;&#xFF0C;&#x592A;&#x9633;&#x4F1A;&#x8131;&#x843D;&#x5916;&#x5C42;&#x53D8;&#x4E3A;&#x767D;&#x77EE;&#x661F;&#xFF0C;&#x6700;&#x540E;&#x7684;&#x6587;&#x660E;&#x4E5F;&#x8FDF;&#x65E9;&#x4F1A;&#x7ED3;&#x675F;&#x3002;&#x4F46;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;effect&#x7684;&#x6E05;&#x9664;&#x51FD;&#x6570;&#x53EA;&#x80FD;&#x770B;&#x5230;<code>{id: 10}</code>&#x8FD9;&#x4E2A;props&#x3002;</p><p>&#x8FD9;&#x6B63;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;React&#x80FD;&#x505A;&#x5230;&#x5728;&#x7ED8;&#x5236;&#x540E;&#x7ACB;&#x5373;&#x5904;&#x7406;effects &#x2014; &#x5E76;&#x4E14;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x4F7F;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x8FD0;&#x884C;&#x66F4;&#x6D41;&#x7545;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x9700;&#x8981;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x5230;&#x8001;&#x7684;props&#x3002;</p><h2 id="%E5%90%8C%E6%AD%A5%EF%BC%8C-%E8%80%8C%E9%9D%9E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F">&#x540C;&#x6B65;&#xFF0C; &#x800C;&#x975E;&#x751F;&#x547D;&#x5468;&#x671F;</h2><p>&#x6211;&#x6700;&#x559C;&#x6B22;React&#x7684;&#x4E00;&#x70B9;&#x662F;&#x5B83;&#x7EDF;&#x4E00;&#x63CF;&#x8FF0;&#x4E86;&#x521D;&#x59CB;&#x6E32;&#x67D3;&#x548C;&#x4E4B;&#x540E;&#x7684;&#x66F4;&#x65B0;&#x3002;&#x8FD9;&#x964D;&#x4F4E;&#x4E86;&#x4F60;&#x7A0B;&#x5E8F;&#x7684;<a href="https://overreacted.io/the-bug-o-notation/" rel="nofollow noopener noreferrer">&#x71B5;</a>&#x3002;</p><p>&#x6BD4;&#x5982;&#x6211;&#x6709;&#x4E2A;&#x7EC4;&#x4EF6;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#xFF1A;</p><pre><code class="language-jsx">function Greeting({ name }) {
  return (
    &lt;h1 className=&quot;Greeting&quot;&gt;
      Hello, {name}
    &lt;/h1&gt;
  );
}</code></pre><p>&#x6211;&#x5148;&#x6E32;&#x67D3;<code>&lt;Greeting name=&quot;Dan&quot; /&gt;</code>&#x7136;&#x540E;&#x6E32;&#x67D3;<code>&lt;Greeting name=&quot;Yuzhi&quot; /&gt;</code>&#xFF0C;&#x548C;&#x6211;&#x76F4;&#x63A5;&#x6E32;&#x67D3;<code>&lt;Greeting name=&quot;Yuzhi&quot; /&gt;</code>&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#x3002;&#x5728;&#x8FD9;&#x4E24;&#x79CD;&#x60C5;&#x51B5;&#x4E2D;&#xFF0C;&#x6211;&#x6700;&#x540E;&#x770B;&#x5230;&#x7684;&#x90FD;&#x662F;&#x201C;Hello, Yuzhi&#x201D;&#x3002;</p><p>&#x4EBA;&#x4EEC;&#x603B;&#x662F;&#x8BF4;&#xFF1A;&#x201C;&#x91CD;&#x8981;&#x7684;&#x662F;&#x65C5;&#x884C;&#x8FC7;&#x7A0B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x76EE;&#x7684;&#x5730;&#x201D;&#x3002;&#x5728;React&#x4E16;&#x754C;&#x4E2D;&#xFF0C;&#x6070;&#x597D;&#x76F8;&#x53CD;&#x3002;<strong><strong>&#x91CD;&#x8981;&#x7684;&#x662F;&#x76EE;&#x7684;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x8FC7;&#x7A0B;&#x3002;</strong></strong>&#x8FD9;&#x5C31;&#x662F;JQuery&#x4EE3;&#x7801;&#x4E2D; <code>$.addClass</code> &#x6216; <code>$.removeClass</code>&#x8FD9;&#x6837;&#x7684;&#x8C03;&#x7528;&#xFF08;&#x8FC7;&#x7A0B;&#xFF09;&#x548C;React&#x4EE3;&#x7801;&#x4E2D;&#x58F0;&#x660E;CSS&#x7C7B;&#x540D;<em>&#x5E94;&#x8BE5;&#x662F;&#x4EC0;&#x4E48;</em>&#xFF08;&#x76EE;&#x7684;&#xFF09;&#x4E4B;&#x95F4;&#x7684;&#x533A;&#x522B;&#x3002;</p><p><strong><strong>React&#x4F1A;&#x6839;&#x636E;&#x6211;&#x4EEC;&#x5F53;&#x524D;&#x7684;props&#x548C;state&#x540C;&#x6B65;&#x5230;DOM&#x3002;</strong></strong>&#x201C;mount&#x201D;&#x548C;&#x201C;update&#x201D;&#x4E4B;&#x4E8E;&#x6E32;&#x67D3;&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#x3002;</p><p>&#x4F60;&#x5E94;&#x8BE5;&#x4EE5;&#x76F8;&#x540C;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x601D;&#x8003;effects&#x3002;<strong><strong><code>useEffect</code>&#x4F7F;&#x4F60;&#x80FD;&#x591F;&#x6839;&#x636E;props&#x548C;state<em>&#x540C;&#x6B65;</em>React tree&#x4E4B;&#x5916;&#x7684;&#x4E1C;&#x897F;&#x3002;</strong></strong></p><pre><code class="language-jsx">function Greeting({ name }) {
  useEffect(() =&gt; {    document.title = &apos;Hello, &apos; + name;  });  return (
    &lt;h1 className=&quot;Greeting&quot;&gt;
      Hello, {name}
    &lt;/h1&gt;
  );
}</code></pre><p>&#x8FD9;&#x5C31;&#x662F;&#x548C;&#x5927;&#x5BB6;&#x719F;&#x77E5;&#x7684;<em>mount/update/unmount</em>&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x4E4B;&#x95F4;&#x7EC6;&#x5FAE;&#x7684;&#x533A;&#x522B;&#x3002;&#x7406;&#x89E3;&#x548C;&#x5185;&#x5316;&#x8FD9;&#x79CD;&#x533A;&#x522B;&#x662F;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x3002;<strong><strong>&#x5982;&#x679C;&#x4F60;&#x8BD5;&#x56FE;&#x5199;&#x4E00;&#x4E2A;effect&#x4F1A;&#x6839;&#x636E;&#x662F;&#x5426;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x800C;&#x8868;&#x73B0;&#x4E0D;&#x4E00;&#x81F4;&#xFF0C;&#x4F60;&#x6B63;&#x5728;&#x9006;&#x6F6E;&#x800C;&#x52A8;&#x3002;</strong></strong>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x7684;&#x7ED3;&#x679C;&#x4F9D;&#x8D56;&#x4E8E;&#x8FC7;&#x7A0B;&#x800C;&#x4E0D;&#x662F;&#x76EE;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x5728;&#x540C;&#x6B65;&#x4E2D;&#x72AF;&#x9519;&#x3002;</p><p>&#x5148;&#x6E32;&#x67D3;&#x5C5E;&#x6027;A&#xFF0C;B&#x518D;&#x6E32;&#x67D3;C&#xFF0C;&#x548C;&#x7ACB;&#x5373;&#x6E32;&#x67D3;C&#x5E76;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#x3002;&#x867D;&#x7136;&#x4ED6;&#x4EEC;&#x53EF;&#x80FD;&#x77ED;&#x6682;&#x5730;&#x4F1A;&#x6709;&#x70B9;&#x4E0D;&#x540C;&#xFF08;&#x6BD4;&#x5982;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x65F6;&#xFF09;&#xFF0C;&#x4F46;&#x6700;&#x7EC8;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p><p>&#x4E0D;&#x8FC7;&#x8BDD;&#x8BF4;&#x56DE;&#x6765;&#xFF0C;&#x5728;<em>&#x6BCF;&#x4E00;&#x6B21;</em>&#x6E32;&#x67D3;&#x540E;&#x90FD;&#x53BB;&#x8FD0;&#x884C;&#x6240;&#x6709;&#x7684;effects&#x53EF;&#x80FD;&#x5E76;&#x4E0D;&#x9AD8;&#x6548;&#x3002;&#xFF08;&#x5E76;&#x4E14;&#x5728;&#x67D0;&#x4E9B;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x5B83;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x3002;&#xFF09;</p><p>&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x8BE5;&#x600E;&#x4E48;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF1F;</p><h2 id="%E5%91%8A%E8%AF%89react%E5%8E%BB%E6%AF%94%E5%AF%B9%E4%BD%A0%E7%9A%84effects">&#x544A;&#x8BC9;React&#x53BB;&#x6BD4;&#x5BF9;&#x4F60;&#x7684;Effects</h2><p>&#x5176;&#x5B9E;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x4ECE;React&#x5904;&#x7406;DOM&#x7684;&#x65B9;&#x5F0F;&#x4E2D;&#x5B66;&#x4E60;&#x5230;&#x4E86;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x3002;React&#x53EA;&#x4F1A;&#x66F4;&#x65B0;DOM&#x771F;&#x6B63;&#x53D1;&#x751F;&#x6539;&#x53D8;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x5927;&#x52A8;&#x5E72;&#x6208;&#x3002;</p><p>&#x5F53;&#x4F60;&#x628A;</p><pre><code class="language-jsx">&lt;h1 className=&quot;Greeting&quot;&gt;
  Hello, Dan
&lt;/h1&gt;</code></pre><p>&#x66F4;&#x65B0;&#x5230;</p><pre><code class="language-jsx">&lt;h1 className=&quot;Greeting&quot;&gt;
  Hello, Yuzhi
&lt;/h1&gt;</code></pre><p>React &#x80FD;&#x591F;&#x770B;&#x5230;&#x4E24;&#x4E2A;&#x5BF9;&#x8C61;:</p><pre><code class="language-jsx">const oldProps = {className: &apos;Greeting&apos;, children: &apos;Hello, Dan&apos;};
const newProps = {className: &apos;Greeting&apos;, children: &apos;Hello, Yuzhi&apos;};</code></pre><p>&#x5B83;&#x4F1A;&#x68C0;&#x6D4B;&#x6BCF;&#x4E00;&#x4E2A;props&#xFF0C;&#x5E76;&#x4E14;&#x53D1;&#x73B0;<code>children</code>&#x53D1;&#x751F;&#x6539;&#x53D8;&#x9700;&#x8981;&#x66F4;&#x65B0;DOM&#xFF0C;&#x4F46;<code>className</code>&#x5E76;&#x6CA1;&#x6709;&#x3002;&#x6240;&#x4EE5;&#x5B83;&#x53EA;&#x9700;&#x8981;&#x8FD9;&#x6837;&#x505A;&#xFF1A;</p><pre><code class="language-jsx">domNode.innerText = &apos;Hello, Yuzhi&apos;;
// No need to touch domNode.className</code></pre><p><strong><strong>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x7C7B;&#x4F3C;&#x7684;&#x65B9;&#x5F0F;&#x5904;&#x7406;effects&#x5417;&#xFF1F;&#x5982;&#x679C;&#x80FD;&#x591F;&#x5728;&#x4E0D;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x907F;&#x514D;&#x8C03;&#x7528;effect&#x5C31;&#x592A;&#x597D;&#x4E86;&#x3002;</strong></strong></p><p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x7EC4;&#x4EF6;&#x53EF;&#x80FD;&#x56E0;&#x4E3A;&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x800C;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#xFF1A;</p><pre><code class="language-jsx">function Greeting({ name }) {
  const [counter, setCounter] = useState(0);

  useEffect(() =&gt; {
    document.title = &apos;Hello, &apos; + name;
  });

  return (
    &lt;h1 className=&quot;Greeting&quot;&gt;
      Hello, {name}
      &lt;button onClick={() =&gt; setCounter(counter + 1)}&gt;        Increment      &lt;/button&gt;    &lt;/h1&gt;
  );
}</code></pre><p>&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x7684;effect&#x5E76;&#x6CA1;&#x6709;&#x4F7F;&#x7528;<code>counter</code>&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x3002;<strong><strong>&#x6211;&#x4EEC;&#x7684;effect&#x53EA;&#x4F1A;&#x540C;&#x6B65;<code>name</code>&#x5C5E;&#x6027;&#x7ED9;<code>document.title</code>&#xFF0C;&#x4F46;<code>name</code>&#x5E76;&#x6CA1;&#x6709;&#x53D8;&#x3002;</strong></strong>&#x5728;&#x6BCF;&#x4E00;&#x6B21;counter&#x6539;&#x53D8;&#x540E;&#x91CD;&#x65B0;&#x7ED9;<code>document.title</code>&#x8D4B;&#x503C;&#x5E76;&#x4E0D;&#x662F;&#x7406;&#x60F3;&#x7684;&#x505A;&#x6CD5;&#x3002;</p><p>&#x597D;&#x4E86;&#xFF0C;&#x90A3;React&#x53EF;&#x4EE5;&#x2026;&#x533A;&#x5206;effects&#x7684;&#x4E0D;&#x540C;&#x5417;&#xFF1F;</p><pre><code class="language-jsx">let oldEffect = () =&gt; { document.title = &apos;Hello, Dan&apos;; };
let newEffect = () =&gt; { document.title = &apos;Hello, Dan&apos;; };
// Can React see these functions do the same thing?</code></pre><p>&#x5E76;&#x4E0D;&#x80FD;&#x3002;React&#x5E76;&#x4E0D;&#x80FD;&#x731C;&#x6D4B;&#x5230;&#x51FD;&#x6570;&#x505A;&#x4E86;&#x4EC0;&#x4E48;&#x5982;&#x679C;&#x4E0D;&#x5148;&#x8C03;&#x7528;&#x7684;&#x8BDD;&#x3002;&#xFF08;&#x6E90;&#x7801;&#x4E2D;&#x5E76;&#x6CA1;&#x6709;&#x5305;&#x542B;&#x7279;&#x6B8A;&#x7684;&#x503C;&#xFF0C;&#x5B83;&#x4EC5;&#x4EC5;&#x662F;&#x5F15;&#x7528;&#x4E86;<code>name</code>&#x5C5E;&#x6027;&#x3002;&#xFF09;</p><p>&#x8FD9;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x4F60;&#x5982;&#x679C;&#x60F3;&#x8981;&#x907F;&#x514D;effects&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x91CD;&#x590D;&#x8C03;&#x7528;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x7ED9;<code>useEffect</code>&#x4E00;&#x4E2A;&#x4F9D;&#x8D56;&#x6570;&#x7EC4;&#x53C2;&#x6570;(deps)&#xFF1A;</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = &apos;Hello, &apos; + name;
  }, [name]); // Our deps</code></pre><p><strong><strong>&#x8FD9;&#x597D;&#x6BD4;&#x4F60;&#x544A;&#x8BC9;React&#xFF1A;&#x201C;Hey&#xFF0C;&#x6211;&#x77E5;&#x9053;&#x4F60;&#x770B;&#x4E0D;&#x5230;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x91CC;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x4F46;&#x6211;&#x53EF;&#x4EE5;&#x4FDD;&#x8BC1;&#x53EA;&#x4F7F;&#x7528;&#x4E86;&#x6E32;&#x67D3;&#x4E2D;&#x7684;<code>name</code>&#xFF0C;&#x522B;&#x65E0;&#x5176;&#x4ED6;&#x3002;&#x201D;</strong></strong></p><p>&#x5982;&#x679C;&#x5F53;&#x524D;&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x8FD9;&#x4E9B;&#x4F9D;&#x8D56;&#x9879;&#x548C;&#x4E0A;&#x4E00;&#x6B21;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A;effect&#x7684;&#x65F6;&#x5019;&#x503C;&#x4E00;&#x6837;&#xFF0C;&#x56E0;&#x4E3A;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x540C;&#x6B65;React&#x4F1A;&#x81EA;&#x52A8;&#x8DF3;&#x8FC7;&#x8FD9;&#x6B21;effect&#xFF1A;</p><pre><code class="language-jsx">const oldEffect = () =&gt; { document.title = &apos;Hello, Dan&apos;; };
const oldDeps = [&apos;Dan&apos;];

const newEffect = () =&gt; { document.title = &apos;Hello, Dan&apos;; };
const newDeps = [&apos;Dan&apos;];

// React can&apos;t peek inside of functions, but it can compare deps.
// Since all deps are the same, it doesn&#x2019;t need to run the new effect.</code></pre><p>&#x5373;&#x4F7F;&#x4F9D;&#x8D56;&#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x503C;&#x5728;&#x4E24;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x4E0D;&#x80FD;&#x8DF3;&#x8FC7;effect&#x7684;&#x8FD0;&#x884C;&#x3002;&#x8981;&#x540C;&#x6B65;&#x6240;&#x6709;&#xFF01;</p><h2 id="%E5%85%B3%E4%BA%8E%E4%BE%9D%E8%B5%96%E9%A1%B9%E4%B8%8D%E8%A6%81%E5%AF%B9react%E6%92%92%E8%B0%8E">&#x5173;&#x4E8E;&#x4F9D;&#x8D56;&#x9879;&#x4E0D;&#x8981;&#x5BF9;React&#x6492;&#x8C0E;</h2><p>&#x5173;&#x4E8E;&#x4F9D;&#x8D56;&#x9879;&#x5BF9;React&#x6492;&#x8C0E;&#x4F1A;&#x6709;&#x4E0D;&#x597D;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x76F4;&#x89C9;&#x4E0A;&#xFF0C;&#x8FD9;&#x5F88;&#x597D;&#x7406;&#x89E3;&#xFF0C;&#x4F46;&#x6211;&#x66FE;&#x770B;&#x5230;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x4F9D;&#x8D56;class&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x4F7F;&#x7528;<code>useEffect</code>&#x7684;&#x4EBA;&#x90FD;&#x8BD5;&#x56FE;&#x8FDD;&#x53CD;&#x8FD9;&#x4E2A;&#x89C4;&#x5219;&#x3002;&#xFF08;&#x6211;&#x521A;&#x5F00;&#x59CB;&#x4E5F;&#x8FD9;&#x4E48;&#x5E72;&#x4E86;&#xFF01;&#xFF09;</p><pre><code class="language-jsx">function SearchResults() {
  async function fetchData() {
    // ...
  }

  useEffect(() =&gt; {
    fetchData();
  }, []); // Is this okay? Not always -- and there&apos;s a better way to write it.

  // ...
}</code></pre><p><em>(&#x5B98;&#x7F51;&#x7684; <a href="https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies" rel="nofollow noopener noreferrer">Hooks FAQ</a> &#x89E3;&#x91CA;&#x4E86;&#x5E94;&#x8BE5;&#x600E;&#x4E48;&#x505A;&#x3002; &#x6211;&#x4EEC;&#x5728;<a href="https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/#moving-functions-inside-effects">&#x4E0B;&#x9762;</a>&#x4F1A;&#x91CD;&#x65B0;&#x56DE;&#x987E;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x3002;)</em></p><p>&#x201C;&#x4F46;&#x6211;&#x53EA;&#x662F;&#x60F3;&#x5728;&#x6302;&#x8F7D;&#x7684;&#x65F6;&#x5019;&#x8FD0;&#x884C;&#x5B83;&#xFF01;&#x201D;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x8BF4;&#x3002;&#x73B0;&#x5728;&#x53EA;&#x9700;&#x8981;&#x8BB0;&#x4F4F;&#xFF1A;&#x5982;&#x679C;&#x4F60;&#x8BBE;&#x7F6E;&#x4E86;&#x4F9D;&#x8D56;&#x9879;&#xFF0C;<strong><strong>effect&#x4E2D;&#x7528;&#x5230;&#x7684;&#x6240;&#x6709;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x503C;&#x90FD;&#x8981;&#x5305;&#x542B;&#x5728;&#x4F9D;&#x8D56;&#x4E2D;&#x3002;</strong></strong>&#x8FD9;&#x5305;&#x62EC;props&#xFF0C;state&#xFF0C;&#x51FD;&#x6570; &#x2014; &#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#x3002;</p><p>&#x6709;&#x65F6;&#x5019;&#x4F60;&#x662F;&#x8FD9;&#x6837;&#x505A;&#x4E86;&#xFF0C;&#x4F46;&#x53EF;&#x80FD;&#x4F1A;&#x5F15;&#x8D77;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x9047;&#x5230;&#x65E0;&#x9650;&#x8BF7;&#x6C42;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6216;&#x8005;socket&#x88AB;&#x9891;&#x7E41;&#x521B;&#x5EFA;&#x7684;&#x95EE;&#x9898;&#x3002;<strong><strong>&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x65B9;&#x6CD5;&#x4E0D;&#x662F;&#x79FB;&#x9664;&#x4F9D;&#x8D56;&#x9879;&#x3002;</strong></strong>&#x6211;&#x4EEC;&#x4F1A;&#x5F88;&#x5FEB;&#x4E86;&#x89E3;&#x5177;&#x4F53;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p><p>&#x4E0D;&#x8FC7;&#x5728;&#x6211;&#x4EEC;&#x6DF1;&#x5165;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x5C1D;&#x8BD5;&#x66F4;&#x597D;&#x5730;&#x7406;&#x89E3;&#x95EE;&#x9898;&#x3002;</p><h2 id="%E5%A6%82%E6%9E%9C%E8%AE%BE%E7%BD%AE%E4%BA%86%E9%94%99%E8%AF%AF%E7%9A%84%E4%BE%9D%E8%B5%96%E4%BC%9A%E6%80%8E%E4%B9%88%E6%A0%B7%E5%91%A2%EF%BC%9F">&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E86;&#x9519;&#x8BEF;&#x7684;&#x4F9D;&#x8D56;&#x4F1A;&#x600E;&#x4E48;&#x6837;&#x5462;&#xFF1F;</h2><p>&#x5982;&#x679C;&#x4F9D;&#x8D56;&#x9879;&#x5305;&#x542B;&#x4E86;&#x6240;&#x6709;effect&#x4E2D;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x503C;&#xFF0C;React&#x5C31;&#x80FD;&#x77E5;&#x9053;&#x4F55;&#x65F6;&#x9700;&#x8981;&#x8FD0;&#x884C;&#x5B83;&#xFF1A;</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = &apos;Hello, &apos; + name;
  }, [name]);</code></pre><figure class="kg-card kg-image-card"><img src="https://overreacted.io/fae247cd068eedbd4b62ba50592d2b3d/deps-compare-correct.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p><em>(&#x4F9D;&#x8D56;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x66F4;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x91CD;&#x65B0;&#x8FD0;&#x884C;effect&#x3002;)</em></p><p>&#x4F46;&#x662F;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5C06;<code>[]</code>&#x8BBE;&#x4E3A;effect&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x65B0;&#x7684;effect&#x51FD;&#x6570;&#x4E0D;&#x4F1A;&#x8FD0;&#x884C;&#xFF1A;</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    document.title = &apos;Hello, &apos; + name;
  }, []); // Wrong: name is missing in deps</code></pre><figure class="kg-card kg-image-card"><img src="https://overreacted.io/25f75db3f9f57ffe1426912093577445/deps-compare-wrong.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p><em>(&#x4F9D;&#x8D56;&#x6CA1;&#x6709;&#x53D8;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x8FD0;&#x884C;effect&#x3002;)</em></p><p>&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x95EE;&#x9898;&#x770B;&#x8D77;&#x6765;&#x663E;&#x800C;&#x6613;&#x89C1;&#x3002;&#x4F46;&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#x5982;&#x679C;&#x4F60;&#x8111;&#x5B50;&#x91CC;&#x201C;&#x8DF3;&#x51FA;&#x201D;class&#x7EC4;&#x4EF6;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#xFF0C;&#x4F60;&#x7684;&#x76F4;&#x89C9;&#x5F88;&#x53EF;&#x80FD;&#x4F1A;&#x6B3A;&#x9A97;&#x4F60;&#x3002;</p><p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x6211;&#x4EEC;&#x6765;&#x5199;&#x4E00;&#x4E2A;&#x6BCF;&#x79D2;&#x9012;&#x589E;&#x7684;&#x8BA1;&#x6570;&#x5668;&#x3002;&#x5728;Class&#x7EC4;&#x4EF6;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x76F4;&#x89C9;&#x662F;&#xFF1A;&#x201C;&#x5F00;&#x542F;&#x4E00;&#x6B21;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x6E05;&#x9664;&#x4E5F;&#x662F;&#x4E00;&#x6B21;&#x201D;&#x3002;&#x8FD9;&#x91CC;&#x6709;&#x4E00;&#x4E2A;<a href="https://codesandbox.io/s/n5mjzjy9kl" rel="nofollow noopener noreferrer">&#x4F8B;&#x5B50;</a>&#x8BF4;&#x660E;&#x600E;&#x4E48;&#x5B9E;&#x73B0;&#x5B83;&#x3002;&#x5F53;&#x6211;&#x4EEC;&#x7406;&#x6240;&#x5F53;&#x7136;&#x5730;&#x628A;&#x5B83;&#x7528;<code>useEffect</code>&#x7684;&#x65B9;&#x5F0F;&#x7FFB;&#x8BD1;&#xFF0C;&#x76F4;&#x89C9;&#x4E0A;&#x6211;&#x4EEC;&#x4F1A;&#x8BBE;&#x7F6E;&#x4F9D;&#x8D56;&#x4E3A;<code>[]</code>&#x3002;&#x201C;&#x6211;&#x53EA;&#x60F3;&#x8FD0;&#x884C;&#x4E00;&#x6B21;effect&#x201D;&#xFF0C;&#x5BF9;&#x5417;&#xFF1F;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      setCount(count + 1);
    }, 1000);
    return () =&gt; clearInterval(id);
  }, []);
  return &lt;h1&gt;{count}&lt;/h1&gt;;
}</code></pre><p>&#x7136;&#x800C;&#xFF0C;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;<a href="https://codesandbox.io/s/91n5z8jo7r" rel="nofollow noopener noreferrer">&#x53EA;&#x4F1A;&#x9012;&#x589E;&#x4E00;&#x6B21;</a>&#x3002;<em>&#x5929;&#x4E86;&#x565C;&#x3002;</em></p><p>&#x5982;&#x679C;&#x4F60;&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x662F;&#x201C;&#x53EA;&#x6709;&#x5F53;&#x6211;&#x60F3;&#x91CD;&#x65B0;&#x89E6;&#x53D1;effect&#x7684;&#x65F6;&#x5019;&#x624D;&#x9700;&#x8981;&#x53BB;&#x8BBE;&#x7F6E;&#x4F9D;&#x8D56;&#x201D;&#xFF0C;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x53EF;&#x80FD;&#x4F1A;&#x8BA9;&#x4F60;&#x4EA7;&#x751F;&#x5B58;&#x5728;&#x5371;&#x673A;&#x3002;&#x4F60;&#x60F3;&#x8981;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x5B9A;&#x65F6;&#x5668; &#x2014; &#x4F46;&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x6709;&#x95EE;&#x9898;&#xFF1F;</p><p>&#x5982;&#x679C;&#x4F60;&#x77E5;&#x9053;&#x4F9D;&#x8D56;&#x662F;&#x6211;&#x4EEC;&#x7ED9;React&#x7684;&#x6697;&#x793A;&#xFF0C;&#x544A;&#x8BC9;&#x5B83;effect&#x6240;&#x6709;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x7684;&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x503C;&#xFF0C;&#x4F60;&#x5C31;&#x4E0D;&#x4F1A;&#x5403;&#x60CA;&#x4E86;&#x3002;effect&#x4E2D;&#x4F7F;&#x7528;&#x4E86;<code>count</code>&#x4F46;&#x6211;&#x4EEC;&#x6492;&#x8C0E;&#x8BF4;&#x5B83;&#x6CA1;&#x6709;&#x4F9D;&#x8D56;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x8FD9;&#x6837;&#x505A;&#x8FDF;&#x65E9;&#x4F1A;&#x51FA;&#x5E7A;&#x86FE;&#x5B50;&#x3002;</p><p>&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#xFF0C;<code>count</code>&#x662F;<code>0</code>&#x3002;&#x56E0;&#x6B64;&#xFF0C;<code>setCount(count + 1)</code>&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7B49;&#x4EF7;&#x4E8E;<code>setCount(0 + 1)</code>&#x3002;<strong><strong>&#x65E2;&#x7136;&#x6211;&#x4EEC;&#x8BBE;&#x7F6E;&#x4E86;<code>[]</code>&#x4F9D;&#x8D56;&#xFF0C;effect&#x4E0D;&#x4F1A;&#x518D;&#x91CD;&#x65B0;&#x8FD0;&#x884C;&#xFF0C;&#x5B83;&#x540E;&#x9762;&#x6BCF;&#x4E00;&#x79D2;&#x90FD;&#x4F1A;&#x8C03;&#x7528;<code>setCount(0 + 1)</code> &#xFF1A;</strong></strong></p><pre><code class="language-jsx">// First render, state is 0
function Counter() {
  // ...
  useEffect(
    // Effect from first render
    () =&gt; {
      const id = setInterval(() =&gt; {
        setCount(0 + 1); // Always setCount(1)      }, 1000);
      return () =&gt; clearInterval(id);
    },
    [] // Never re-runs  );
  // ...
}

// Every next render, state is 1
function Counter() {
  // ...
  useEffect(
    // This effect is always ignored because    // we lied to React about empty deps.    () =&gt; {
      const id = setInterval(() =&gt; {
        setCount(1 + 1);
      }, 1000);
      return () =&gt; clearInterval(id);
    },
    []
  );
  // ...
}</code></pre><p>&#x6211;&#x4EEC;&#x5BF9;React&#x6492;&#x8C0E;&#x8BF4;&#x6211;&#x4EEC;&#x7684;effect&#x4E0D;&#x4F9D;&#x8D56;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x4EFB;&#x4F55;&#x503C;&#xFF0C;&#x53EF;&#x5B9E;&#x9645;&#x4E0A;&#x6211;&#x4EEC;&#x7684;effect&#x6709;&#x4F9D;&#x8D56;&#xFF01;</p><p>&#x6211;&#x4EEC;&#x7684;effect&#x4F9D;&#x8D56;<code>count</code> - &#x5B83;&#x662F;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x503C;&#xFF08;&#x4E0D;&#x8FC7;&#x5728;effect&#x5916;&#x9762;&#x5B9A;&#x4E49;&#xFF09;&#xFF1A;</p><pre><code class="language-jsx">  const count = // ...
  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      setCount(count + 1);    }, 1000);
    return () =&gt; clearInterval(id);
  }, []);</code></pre><p>&#x56E0;&#x6B64;&#xFF0C;&#x8BBE;&#x7F6E;<code>[]</code>&#x4E3A;&#x4F9D;&#x8D56;&#x4F1A;&#x5F15;&#x5165;&#x4E00;&#x4E2A;bug&#x3002;React&#x4F1A;&#x5BF9;&#x6BD4;&#x4F9D;&#x8D56;&#xFF0C;&#x5E76;&#x4E14;&#x8DF3;&#x8FC7;&#x540E;&#x9762;&#x7684;effect&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/29e53bd0c9b7d2ac70d3cd924886b030/interval-wrong.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p><em>(&#x4F9D;&#x8D56;&#x6CA1;&#x6709;&#x53D8;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x8FD0;&#x884C;effect&#x3002;)</em></p><p>&#x7C7B;&#x4F3C;&#x4E8E;&#x8FD9;&#x6837;&#x7684;&#x95EE;&#x9898;&#x662F;&#x5F88;&#x96BE;&#x88AB;&#x60F3;&#x5230;&#x7684;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x9F13;&#x52B1;&#x4F60;&#x5C06;&#x8BDA;&#x5B9E;&#x5730;&#x544A;&#x77E5;effect&#x4F9D;&#x8D56;&#x4F5C;&#x4E3A;&#x4E00;&#x6761;&#x786C;&#x6027;&#x89C4;&#x5219;&#xFF0C;&#x5E76;&#x4E14;&#x8981;&#x5217;&#x51FA;&#x6240;&#x4EE5;&#x4F9D;&#x8D56;&#x3002;&#xFF08;&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;<a href="https://github.com/facebook/react/issues/14920" rel="nofollow noopener noreferrer">lint&#x89C4;&#x5219;</a>&#x5982;&#x679C;&#x4F60;&#x60F3;&#x5728;&#x4F60;&#x7684;&#x56E2;&#x961F;&#x5185;&#x505A;&#x786C;&#x6027;&#x89C4;&#x5B9A;&#x3002;&#xFF09;</p><h2 id="%E4%B8%A4%E7%A7%8D%E8%AF%9A%E5%AE%9E%E5%91%8A%E7%9F%A5%E4%BE%9D%E8%B5%96%E7%9A%84%E6%96%B9%E6%B3%95">&#x4E24;&#x79CD;&#x8BDA;&#x5B9E;&#x544A;&#x77E5;&#x4F9D;&#x8D56;&#x7684;&#x65B9;&#x6CD5;</h2><p>&#x6709;&#x4E24;&#x79CD;&#x8BDA;&#x5B9E;&#x544A;&#x77E5;&#x4F9D;&#x8D56;&#x7684;&#x7B56;&#x7565;&#x3002;&#x4F60;&#x5E94;&#x8BE5;&#x4ECE;&#x7B2C;&#x4E00;&#x79CD;&#x5F00;&#x59CB;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x5E94;&#x7528;&#x7B2C;&#x4E8C;&#x79CD;&#x3002;</p><p><strong><strong>&#x7B2C;&#x4E00;&#x79CD;&#x7B56;&#x7565;&#x662F;&#x5728;&#x4F9D;&#x8D56;&#x4E2D;&#x5305;&#x542B;&#x6240;&#x6709;effect&#x4E2D;&#x7528;&#x5230;&#x7684;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x503C;&#x3002;</strong></strong>&#x8BA9;&#x6211;&#x4EEC;&#x5728;&#x4F9D;&#x8D56;&#x4E2D;&#x5305;&#x542B;<code>count</code>&#xFF1A;</p><pre><code class="language-jsx">useEffect(() =&gt; {
  const id = setInterval(() =&gt; {
    setCount(count + 1);  }, 1000);
  return () =&gt; clearInterval(id);
}, [count]);</code></pre><p>&#x73B0;&#x5728;&#x4F9D;&#x8D56;&#x6570;&#x7EC4;&#x6B63;&#x786E;&#x4E86;&#x3002;&#x867D;&#x7136;&#x5B83;&#x53EF;&#x80FD;&#x4E0D;&#x662F;<em>&#x592A;&#x7406;&#x60F3;</em>&#x4F46;&#x786E;&#x5B9E;&#x89E3;&#x51B3;&#x4E86;&#x4E0A;&#x9762;&#x7684;&#x95EE;&#x9898;&#x3002;&#x73B0;&#x5728;&#xFF0C;&#x6BCF;&#x6B21;<code>count</code>&#x4FEE;&#x6539;&#x90FD;&#x4F1A;&#x91CD;&#x65B0;&#x8FD0;&#x884C;effect&#xFF0C;&#x5E76;&#x4E14;&#x5B9A;&#x65F6;&#x5668;&#x4E2D;&#x7684;<code>setCount(count + 1)</code>&#x4F1A;&#x6B63;&#x786E;&#x5F15;&#x7528;&#x67D0;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684; <code>count</code>&#x503C;&#xFF1A;</p><pre><code class="language-jsx">// First render, state is 0
function Counter() {
  // ...
  useEffect(
    // Effect from first render
    () =&gt; {
      const id = setInterval(() =&gt; {
        setCount(0 + 1); // setCount(count + 1)      }, 1000);
      return () =&gt; clearInterval(id);
    },
    [0] // [count]  );
  // ...
}

// Second render, state is 1
function Counter() {
  // ...
  useEffect(
    // Effect from second render
    () =&gt; {
      const id = setInterval(() =&gt; {
        setCount(1 + 1); // setCount(count + 1)      }, 1000);
      return () =&gt; clearInterval(id);
    },
    [1] // [count]  );
  // ...
}</code></pre><p>&#x8FD9;&#x80FD;<a href="https://codesandbox.io/s/0x0mnlyq8l" rel="nofollow noopener noreferrer">&#x89E3;&#x51B3;&#x95EE;&#x9898;</a>&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x4F1A;&#x5728;&#x6BCF;&#x4E00;&#x6B21;<code>count</code>&#x6539;&#x53D8;&#x540E;&#x6E05;&#x9664;&#x548C;&#x91CD;&#x65B0;&#x8BBE;&#x5B9A;&#x3002;&#x8FD9;&#x5E94;&#x8BE5;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x7684;&#x7ED3;&#x679C;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/5734271ddfa94d2d65ac6160515e0069/interval-rightish.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p><em>(&#x4F9D;&#x8D56;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x66F4;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x91CD;&#x65B0;&#x8FD0;&#x884C;effect&#x3002;)</em></p><hr><p><strong><strong>&#x7B2C;&#x4E8C;&#x79CD;&#x7B56;&#x7565;&#x662F;&#x4FEE;&#x6539;effect&#x5185;&#x90E8;&#x7684;&#x4EE3;&#x7801;&#x4EE5;&#x786E;&#x4FDD;&#x5B83;&#x5305;&#x542B;&#x7684;&#x503C;&#x53EA;&#x4F1A;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x751F;&#x53D8;&#x66F4;&#x3002;</strong></strong>&#x6211;&#x4EEC;&#x4E0D;&#x60F3;&#x544A;&#x77E5;&#x9519;&#x8BEF;&#x7684;&#x4F9D;&#x8D56; - &#x6211;&#x4EEC;&#x53EA;&#x662F;&#x4FEE;&#x6539;effect&#x4F7F;&#x5F97;&#x4F9D;&#x8D56;&#x66F4;&#x5C11;&#x3002;</p><p>&#x8BA9;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E00;&#x4E9B;&#x79FB;&#x9664;&#x4F9D;&#x8D56;&#x7684;&#x5E38;&#x7528;&#x6280;&#x5DE7;&#x3002;</p><hr><h2 id="%E8%AE%A9effects%E8%87%AA%E7%BB%99%E8%87%AA%E8%B6%B3">&#x8BA9;Effects&#x81EA;&#x7ED9;&#x81EA;&#x8DB3;</h2><p>&#x6211;&#x4EEC;&#x60F3;&#x53BB;&#x6389;effect&#x7684;<code>count</code>&#x4F9D;&#x8D56;&#x3002;</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      setCount(count + 1);    }, 1000);
    return () =&gt; clearInterval(id);
  }, [count]);</code></pre><p>&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x76EE;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x95EE;&#x81EA;&#x5DF1;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;<strong><strong>&#x6211;&#x4EEC;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x7528;<code>count</code>&#xFF1F;</strong></strong>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6211;&#x4EEC;&#x53EA;&#x5728;<code>setCount</code>&#x8C03;&#x7528;&#x4E2D;&#x7528;&#x5230;&#x4E86;<code>count</code>&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5176;&#x5B9E;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x5728;effect&#x4E2D;&#x4F7F;&#x7528;<code>count</code>&#x3002;&#x5F53;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x6839;&#x636E;&#x524D;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>setState</code>&#x7684;<a href="https://reactjs.org/docs/hooks-reference.html#functional-updates" rel="nofollow noopener noreferrer">&#x51FD;&#x6570;&#x5F62;&#x5F0F;</a>&#xFF1A;</p><pre><code class="language-jsx">  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      setCount(c =&gt; c + 1);    }, 1000);
    return () =&gt; clearInterval(id);
  }, []);</code></pre><p>&#x6211;&#x559C;&#x6B22;&#x628A;&#x7C7B;&#x4F3C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x79F0;&#x4E3A;&#x201C;&#x9519;&#x8BEF;&#x7684;&#x4F9D;&#x8D56;&#x201D;&#x3002;&#x662F;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x5728;effect&#x4E2D;&#x5199;&#x4E86;<code>setCount(count + 1)</code>&#x6240;&#x4EE5;<code>count</code>&#x662F;&#x4E00;&#x4E2A;&#x5FC5;&#x9700;&#x7684;&#x4F9D;&#x8D56;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x6211;&#x4EEC;&#x771F;&#x6B63;&#x60F3;&#x8981;&#x7684;&#x662F;&#x628A;<code>count</code>&#x8F6C;&#x6362;&#x4E3A;<code>count+1</code>&#xFF0C;&#x7136;&#x540E;&#x8FD4;&#x56DE;&#x7ED9;React&#x3002;&#x53EF;&#x662F;React&#x5176;&#x5B9E;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x5F53;&#x524D;&#x7684;<code>count</code>&#x3002;<strong><strong>&#x6211;&#x4EEC;&#x9700;&#x8981;&#x544A;&#x77E5;React&#x7684;&#x4EC5;&#x4EC5;&#x662F;&#x53BB;&#x9012;&#x589E;&#x72B6;&#x6001; - &#x4E0D;&#x7BA1;&#x5B83;&#x73B0;&#x5728;&#x5177;&#x4F53;&#x662F;&#x4EC0;&#x4E48;&#x503C;&#x3002;</strong></strong></p><p>&#x8FD9;&#x6B63;&#x662F;<code>setCount(c =&gt; c + 1)</code>&#x505A;&#x7684;&#x4E8B;&#x60C5;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x5B83;&#x662F;&#x5728;&#x7ED9;React&#x201C;&#x53D1;&#x9001;&#x6307;&#x4EE4;&#x201D;&#x544A;&#x77E5;&#x5982;&#x4F55;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#x3002;&#x8FD9;&#x79CD;&#x201C;&#x66F4;&#x65B0;&#x5F62;&#x5F0F;&#x201D;&#x5728;&#x5176;&#x4ED6;&#x60C5;&#x51B5;&#x4E0B;&#x4E5F;&#x6709;&#x5E2E;&#x52A9;&#xFF0C;&#x6BD4;&#x5982;&#x4F60;&#x9700;&#x8981;<a href="https://overreacted.io/react-as-a-ui-runtime/#batching">&#x6279;&#x91CF;&#x66F4;&#x65B0;</a>&#x3002;</p><p><strong><strong>&#x6CE8;&#x610F;&#x6211;&#x4EEC;&#x505A;&#x5230;&#x4E86;&#x79FB;&#x9664;&#x4F9D;&#x8D56;&#xFF0C;&#x5E76;&#x4E14;&#x6CA1;&#x6709;&#x6492;&#x8C0E;&#x3002;&#x6211;&#x4EEC;&#x7684;effect&#x4E0D;&#x518D;&#x8BFB;&#x53D6;&#x6E32;&#x67D3;&#x4E2D;&#x7684;<code>count</code>&#x503C;&#x3002;</strong></strong></p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/f128ad20c28317ed27a3cb68197fc906/interval-right.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p><em>(&#x4F9D;&#x8D56;&#x6CA1;&#x6709;&#x53D8;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x4F1A;&#x518D;&#x6B21;&#x8FD0;&#x884C;effect&#x3002;)</em></p><p>&#x4F60;&#x53EF;&#x4EE5;&#x81EA;&#x5DF1; <a href="https://codesandbox.io/s/q3181xz1pj" rel="nofollow noopener noreferrer">&#x8BD5;&#x8BD5;</a>&#x3002;</p><p>&#x5C3D;&#x7BA1;effect&#x53EA;&#x8FD0;&#x884C;&#x4E86;&#x4E00;&#x6B21;&#xFF0C;&#x7B2C;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5B8C;&#x7F8E;&#x5730;&#x5728;&#x6BCF;&#x6B21;&#x89E6;&#x53D1;&#x7684;&#x65F6;&#x5019;&#x7ED9;React&#x53D1;&#x9001;<code>c =&gt; c + 1</code>&#x66F4;&#x65B0;&#x6307;&#x4EE4;&#x3002;&#x5B83;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x77E5;&#x9053;&#x5F53;&#x524D;&#x7684;<code>count</code>&#x503C;&#x3002;&#x56E0;&#x4E3A;React&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#x4E86;&#x3002;</p><h2 id="%E5%87%BD%E6%95%B0%E5%BC%8F%E6%9B%B4%E6%96%B0-%E5%92%8C-google-docs">&#x51FD;&#x6570;&#x5F0F;&#x66F4;&#x65B0; &#x548C; Google Docs</h2><p>&#x8FD8;&#x8BB0;&#x5F97;&#x6211;&#x4EEC;&#x8BF4;&#x8FC7;&#x540C;&#x6B65;&#x624D;&#x662F;&#x7406;&#x89E3;effects&#x7684;&#x5FC3;&#x667A;&#x6A21;&#x578B;&#x5417;&#xFF1F;&#x540C;&#x6B65;&#x7684;&#x4E00;&#x4E2A;&#x6709;&#x8DA3;&#x5730;&#x65B9;&#x5728;&#x4E8E;&#x4F60;&#x901A;&#x5E38;&#x60F3;&#x8981;&#x628A;&#x540C;&#x6B65;&#x7684;&#x201C;&#x4FE1;&#x606F;&#x201D;&#x548C;&#x72B6;&#x6001;&#x89E3;&#x8026;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x5F53;&#x4F60;&#x5728;Google Docs&#x7F16;&#x8F91;&#x6587;&#x6863;&#x7684;&#x65F6;&#x5019;&#xFF0C;Google&#x5E76;&#x4E0D;&#x4F1A;&#x628A;&#x6574;&#x7BC7;&#x6587;&#x7AE0;&#x53D1;&#x9001;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#x3002;&#x90A3;&#x6837;&#x505A;&#x4F1A;&#x975E;&#x5E38;&#x4F4E;&#x6548;&#x3002;&#x76F8;&#x53CD;&#x7684;&#xFF0C;&#x5B83;&#x53EA;&#x662F;&#x628A;&#x4F60;&#x7684;&#x4FEE;&#x6539;&#x4EE5;&#x4E00;&#x79CD;&#x5F62;&#x5F0F;&#x53D1;&#x9001;&#x7ED9;&#x670D;&#x52A1;&#x7AEF;&#x3002;</p><p>&#x867D;&#x7136;&#x6211;&#x4EEC;effect&#x7684;&#x60C5;&#x51B5;&#x4E0D;&#x5C3D;&#x76F8;&#x540C;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x5E94;&#x7528;&#x7C7B;&#x4F3C;&#x7684;&#x601D;&#x60F3;&#x3002;<strong><strong>&#x53EA;&#x5728;effects&#x4E2D;&#x4F20;&#x9012;&#x6700;&#x5C0F;&#x7684;&#x4FE1;&#x606F;&#x4F1A;&#x5F88;&#x6709;&#x5E2E;&#x52A9;&#x3002;</strong></strong>&#x7C7B;&#x4F3C;&#x4E8E;<code>setCount(c =&gt; c + 1)</code>&#x8FD9;&#x6837;&#x7684;&#x66F4;&#x65B0;&#x5F62;&#x5F0F;&#x6BD4;<code>setCount(count + 1)</code>&#x4F20;&#x9012;&#x4E86;&#x66F4;&#x5C11;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4E0D;&#x518D;&#x88AB;&#x5F53;&#x524D;&#x7684;count&#x503C;&#x201C;&#x6C61;&#x67D3;&#x201D;&#x3002;&#x5B83;&#x53EA;&#x662F;&#x8868;&#x8FBE;&#x4E86;&#x4E00;&#x79CD;&#x884C;&#x4E3A;&#xFF08;&#x201C;&#x9012;&#x589E;&#x201D;&#xFF09;&#x3002;&#x201C;Thinking in React&#x201D;&#x4E5F;&#x8BA8;&#x8BBA;&#x4E86;<a href="https://reactjs.org/docs/thinking-in-react.html#step-3-identify-the-minimal-but-complete-representation-of-ui-state" rel="nofollow noopener noreferrer">&#x5982;&#x4F55;&#x627E;&#x5230;&#x6700;&#x5C0F;&#x72B6;&#x6001;</a>&#x3002;&#x539F;&#x5219;&#x662F;&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x73B0;&#x5728;&#x5173;&#x6CE8;&#x7684;&#x662F;&#x5982;&#x4F55;&#x66F4;&#x65B0;&#x3002;</p><p>&#x8868;&#x8FBE;<em>&#x610F;&#x56FE;</em>&#xFF08;&#x800C;&#x4E0D;&#x662F;&#x7ED3;&#x679C;&#xFF09;&#x548C;Google Docs<a href="https://medium.com/@srijancse/how-real-time-collaborative-editing-work-operational-transformation-ac4902d75682" rel="nofollow noopener noreferrer">&#x5982;&#x4F55;&#x5904;&#x7406;</a>&#x5171;&#x540C;&#x7F16;&#x8F91;&#x5F02;&#x66F2;&#x540C;&#x5DE5;&#x3002;&#x867D;&#x7136;&#x8FD9;&#x4E2A;&#x7C7B;&#x6BD4;&#x7565;&#x5FAE;&#x5EF6;&#x4F38;&#x4E86;&#x4E00;&#x70B9;&#xFF0C;&#x51FD;&#x6570;&#x5F0F;&#x66F4;&#x65B0;&#x5728;React&#x4E2D;&#x626E;&#x6F14;&#x4E86;&#x7C7B;&#x4F3C;&#x7684;&#x89D2;&#x8272;&#x3002;&#x5B83;&#x4EEC;&#x786E;&#x4FDD;&#x80FD;&#x4EE5;&#x6279;&#x91CF;&#x5730;&#x548C;&#x53EF;&#x9884;&#x6D4B;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5904;&#x7406;&#x5404;&#x79CD;&#x6E90;&#x5934;&#xFF08;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF0C;effect&#x4E2D;&#x7684;&#x8BA2;&#x9605;&#xFF0C;&#x7B49;&#x7B49;&#xFF09;&#x7684;&#x72B6;&#x6001;&#x66F4;&#x65B0;&#x3002;</p><p><strong><strong>&#x7136;&#x800C;&#xFF0C;&#x5373;&#x4F7F;&#x662F;<code>setCount(c =&gt; c + 1)</code>&#x4E5F;&#x5E76;&#x4E0D;&#x5B8C;&#x7F8E;&#x3002;</strong></strong>&#x5B83;&#x770B;&#x8D77;&#x6765;&#x6709;&#x70B9;&#x602A;&#xFF0C;&#x5E76;&#x4E14;&#x975E;&#x5E38;&#x53D7;&#x9650;&#x4E8E;&#x5B83;&#x80FD;&#x505A;&#x7684;&#x4E8B;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x6709;&#x4E24;&#x4E2A;&#x4E92;&#x76F8;&#x4F9D;&#x8D56;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x6216;&#x8005;&#x6211;&#x4EEC;&#x60F3;&#x57FA;&#x4E8E;&#x4E00;&#x4E2A;prop&#x6765;&#x8BA1;&#x7B97;&#x4E0B;&#x4E00;&#x6B21;&#x7684;state&#xFF0C;&#x5B83;&#x5E76;&#x4E0D;&#x80FD;&#x505A;&#x5230;&#x3002;&#x5E78;&#x8FD0;&#x7684;&#x662F;&#xFF0C; <code>setCount(c =&gt; c + 1)</code>&#x6709;&#x4E00;&#x4E2A;&#x66F4;&#x5F3A;&#x5927;&#x7684;&#x59D0;&#x59B9;&#x6A21;&#x5F0F;&#xFF0C;&#x5B83;&#x7684;&#x540D;&#x5B57;&#x53EB;<code>useReducer</code>&#x3002;</p><h2 id="%E8%A7%A3%E8%80%A6%E6%9D%A5%E8%87%AAactions%E7%9A%84%E6%9B%B4%E6%96%B0">&#x89E3;&#x8026;&#x6765;&#x81EA;Actions&#x7684;&#x66F4;&#x65B0;</h2><p>&#x6211;&#x4EEC;&#x6765;&#x4FEE;&#x6539;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x8BA9;&#x5B83;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x72B6;&#x6001;&#xFF1A;<code>count</code> &#x548C; <code>step</code>&#x3002;&#x6211;&#x4EEC;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x4F1A;&#x6BCF;&#x6B21;&#x5728;count&#x4E0A;&#x589E;&#x52A0;&#x4E00;&#x4E2A;<code>step</code>&#x503C;&#xFF1A;</p><pre><code class="language-jsx">function Counter() {
  const [count, setCount] = useState(0);
  const [step, setStep] = useState(1);

  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      setCount(c =&gt; c + step);    }, 1000);
    return () =&gt; clearInterval(id);
  }, [step]);
  return (
    &lt;&gt;
      &lt;h1&gt;{count}&lt;/h1&gt;
      &lt;input value={step} onChange={e =&gt; setStep(Number(e.target.value))} /&gt;
    &lt;/&gt;
  );
}</code></pre><p>(&#x8FD9;&#x91CC;&#x662F;<a href="https://codesandbox.io/s/zxn70rnkx" rel="nofollow noopener noreferrer">demo</a>.)</p><p>&#x6CE8;&#x610F;<strong><strong>&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x6492;&#x8C0E;</strong></strong>&#x3002;&#x65E2;&#x7136;&#x6211;&#x4EEC;&#x5728;effect&#x91CC;&#x4F7F;&#x7528;&#x4E86;<code>step</code>&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x628A;&#x5B83;&#x52A0;&#x5230;&#x4F9D;&#x8D56;&#x91CC;&#x3002;&#x6240;&#x4EE5;&#x8FD9;&#x4E5F;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x4EE3;&#x7801;&#x80FD;&#x8FD0;&#x884C;&#x6B63;&#x786E;&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x76EE;&#x524D;&#x7684;&#x884C;&#x4E3A;&#x662F;&#x4FEE;&#x6539;<code>step</code>&#x4F1A;&#x91CD;&#x542F;&#x5B9A;&#x65F6;&#x5668; - &#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x4F9D;&#x8D56;&#x9879;&#x4E4B;&#x4E00;&#x3002;&#x5728;&#x5927;&#x591A;&#x6570;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x8FD9;&#x6B63;&#x662F;&#x4F60;&#x6240;&#x9700;&#x8981;&#x7684;&#x3002;&#x6E05;&#x9664;&#x4E0A;&#x4E00;&#x6B21;&#x7684;effect&#x7136;&#x540E;&#x91CD;&#x65B0;&#x8FD0;&#x884C;&#x65B0;&#x7684;effect&#x5E76;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x9519;&#x3002;&#x9664;&#x975E;&#x6211;&#x4EEC;&#x6709;&#x5F88;&#x597D;&#x7684;&#x7406;&#x7531;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x5E94;&#x8BE5;&#x6539;&#x53D8;&#x8FD9;&#x4E2A;&#x9ED8;&#x8BA4;&#x884C;&#x4E3A;&#x3002;</p><p>&#x4E0D;&#x8FC7;&#xFF0C;&#x5047;&#x5982;&#x6211;&#x4EEC;&#x4E0D;&#x60F3;&#x5728;<code>step</code>&#x6539;&#x53D8;&#x540E;&#x91CD;&#x542F;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x6211;&#x4EEC;&#x8BE5;&#x5982;&#x4F55;&#x4ECE;effect&#x4E2D;&#x79FB;&#x9664;&#x5BF9;<code>step</code>&#x7684;&#x4F9D;&#x8D56;&#x5462;&#xFF1F;</p><p><strong><strong>&#x5F53;&#x4F60;&#x60F3;&#x66F4;&#x65B0;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#xFF0C;&#x5E76;&#x4E14;&#x8FD9;&#x4E2A;&#x72B6;&#x6001;&#x66F4;&#x65B0;&#x4F9D;&#x8D56;&#x4E8E;&#x53E6;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x7684;&#x503C;&#x65F6;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x7528;<code>useReducer</code>&#x53BB;&#x66FF;&#x6362;&#x5B83;&#x4EEC;&#x3002;</strong></strong></p><p>&#x5F53;&#x4F60;&#x5199;&#x7C7B;&#x4F3C;<code>setSomething(something =&gt; ...)</code>&#x8FD9;&#x79CD;&#x4EE3;&#x7801;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4E5F;&#x8BB8;&#x5C31;&#x662F;&#x8003;&#x8651;&#x4F7F;&#x7528;reducer&#x7684;&#x5951;&#x673A;&#x3002;reducer&#x53EF;&#x4EE5;&#x8BA9;&#x4F60;<strong><strong>&#x628A;&#x7EC4;&#x4EF6;&#x5185;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;(actions)&#x548C;&#x72B6;&#x6001;&#x5982;&#x4F55;&#x54CD;&#x5E94;&#x5E76;&#x66F4;&#x65B0;&#x5206;&#x5F00;&#x8868;&#x8FF0;&#x3002;</strong></strong></p><p>&#x6211;&#x4EEC;&#x7528;&#x4E00;&#x4E2A;<code>dispatch</code>&#x4F9D;&#x8D56;&#x53BB;&#x66FF;&#x6362;effect&#x7684;<code>step</code>&#x4F9D;&#x8D56;&#xFF1A;</p><pre><code class="language-jsx">const [state, dispatch] = useReducer(reducer, initialState);const { count, step } = state;

useEffect(() =&gt; {
  const id = setInterval(() =&gt; {
    dispatch({ type: &apos;tick&apos; }); // Instead of setCount(c =&gt; c + step);  }, 1000);
  return () =&gt; clearInterval(id);
}, [dispatch]);</code></pre><p>(&#x67E5;&#x770B; <a href="https://codesandbox.io/s/xzr480k0np" rel="nofollow noopener noreferrer">demo</a>&#x3002;)</p><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x95EE;&#xFF1A;&#x201C;&#x8FD9;&#x600E;&#x4E48;&#x5C31;&#x66F4;&#x597D;&#x4E86;&#xFF1F;&#x201D;&#x7B54;&#x6848;&#x662F;<strong><strong>React&#x4F1A;&#x4FDD;&#x8BC1;<code>dispatch</code>&#x5728;&#x7EC4;&#x4EF6;&#x7684;&#x58F0;&#x660E;&#x5468;&#x671F;&#x5185;&#x4FDD;&#x6301;&#x4E0D;&#x53D8;&#x3002;&#x6240;&#x4EE5;&#x4E0A;&#x9762;&#x4F8B;&#x5B50;&#x4E2D;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x8BA2;&#x9605;&#x5B9A;&#x65F6;&#x5668;&#x3002;</strong></strong></p><p>&#x6211;&#x4EEC;&#x89E3;&#x51B3;&#x4E86;&#x95EE;&#x9898;!</p><p><em>&#xFF08;&#x4F60;&#x53EF;&#x4EE5;&#x4ECE;&#x4F9D;&#x8D56;&#x4E2D;&#x53BB;&#x9664;<code>dispatch</code>, <code>setState</code>, &#x548C;<code>useRef</code>&#x5305;&#x88F9;&#x7684;&#x503C;&#x56E0;&#x4E3A;React&#x4F1A;&#x786E;&#x4FDD;&#x5B83;&#x4EEC;&#x662F;&#x9759;&#x6001;&#x7684;&#x3002;&#x4E0D;&#x8FC7;&#x4F60;&#x8BBE;&#x7F6E;&#x4E86;&#x5B83;&#x4EEC;&#x4F5C;&#x4E3A;&#x4F9D;&#x8D56;&#x4E5F;&#x6CA1;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x3002;&#xFF09;</em></p><p>&#x76F8;&#x6BD4;&#x4E8E;&#x76F4;&#x63A5;&#x5728;effect&#x91CC;&#x9762;&#x8BFB;&#x53D6;&#x72B6;&#x6001;&#xFF0C;&#x5B83;dispatch&#x4E86;&#x4E00;&#x4E2A;<em>action</em>&#x6765;&#x63CF;&#x8FF0;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;&#x3002;&#x8FD9;&#x4F7F;&#x5F97;&#x6211;&#x4EEC;&#x7684;effect&#x548C;<code>step</code>&#x72B6;&#x6001;&#x89E3;&#x8026;&#x3002;&#x6211;&#x4EEC;&#x7684;effect&#x4E0D;&#x518D;&#x5173;&#x5FC3;&#x600E;&#x4E48;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#xFF0C;&#x5B83;&#x53EA;&#x8D1F;&#x8D23;&#x544A;&#x8BC9;&#x6211;&#x4EEC;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;&#x3002;&#x66F4;&#x65B0;&#x7684;&#x903B;&#x8F91;&#x5168;&#x90FD;&#x4EA4;&#x7531;reducer&#x53BB;&#x7EDF;&#x4E00;&#x5904;&#x7406;:</p><pre><code class="language-jsx">const initialState = {
  count: 0,
  step: 1,
};

function reducer(state, action) {
  const { count, step } = state;
  if (action.type === &apos;tick&apos;) {    return { count: count + step, step };  } else if (action.type === &apos;step&apos;) {
    return { count, step: action.step };
  } else {
    throw new Error();
  }
}</code></pre><p>(&#x8FD9;&#x91CC;&#x662F;<a href="https://codesandbox.io/s/xzr480k0np" rel="nofollow noopener noreferrer">demo</a> &#x5982;&#x679C;&#x4F60;&#x4E4B;&#x524D;&#x9519;&#x8FC7;&#x4E86;&#x3002;)</p><h2 id="%E4%B8%BA%E4%BB%80%E4%B9%88usereducer%E6%98%AFhooks%E7%9A%84%E4%BD%9C%E5%BC%8A%E6%A8%A1%E5%BC%8F">&#x4E3A;&#x4EC0;&#x4E48;useReducer&#x662F;Hooks&#x7684;&#x4F5C;&#x5F0A;&#x6A21;&#x5F0F;</h2><p>&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x5B66;&#x4E60;&#x5230;&#x5982;&#x4F55;&#x79FB;&#x9664;effect&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x4E0D;&#x7BA1;&#x72B6;&#x6001;&#x66F4;&#x65B0;&#x662F;&#x4F9D;&#x8D56;&#x4E0A;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x8FD8;&#x662F;&#x4F9D;&#x8D56;&#x53E6;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x3002;<strong><strong>&#x4F46;&#x5047;&#x5982;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F9D;&#x8D56;<em>props</em>&#x53BB;&#x8BA1;&#x7B97;&#x4E0B;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x5462;&#xFF1F;</strong></strong>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x4E5F;&#x8BB8;&#x6211;&#x4EEC;&#x7684;API&#x662F;<code>&lt;Counter step={1} /&gt;</code>&#x3002;&#x786E;&#x5B9A;&#x7684;&#x662F;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x6CA1;&#x6CD5;&#x907F;&#x514D;&#x4F9D;&#x8D56;<code>props.step</code> &#x3002;&#x662F;&#x5417;&#xFF1F;</p><p>&#x5B9E;&#x9645;&#x4E0A;&#xFF0C; &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#xFF01;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x628A;<em>reducer</em>&#x51FD;&#x6570;&#x653E;&#x5230;&#x7EC4;&#x4EF6;&#x5185;&#x53BB;&#x8BFB;&#x53D6;props&#xFF1A;</p><pre><code class="language-jsx">function Counter({ step }) {  const [count, dispatch] = useReducer(reducer, 0);

  function reducer(state, action) {
    if (action.type === &apos;tick&apos;) {
      return state + step;    } else {
      throw new Error();
    }
  }

  useEffect(() =&gt; {
    const id = setInterval(() =&gt; {
      dispatch({ type: &apos;tick&apos; });
    }, 1000);
    return () =&gt; clearInterval(id);
  }, [dispatch]);

  return &lt;h1&gt;{count}&lt;/h1&gt;;
}</code></pre><p>&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4F1A;&#x4F7F;&#x4E00;&#x4E9B;&#x4F18;&#x5316;&#x5931;&#x6548;&#xFF0C;&#x6240;&#x4EE5;&#x4F60;&#x5E94;&#x8BE5;&#x907F;&#x514D;&#x6EE5;&#x7528;&#x5B83;&#xFF0C;&#x4E0D;&#x8FC7;&#x5982;&#x679C;&#x4F60;&#x9700;&#x8981;&#x4F60;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x5728;reducer&#x91CC;&#x9762;&#x8BBF;&#x95EE;props&#x3002;&#xFF08;&#x8FD9;&#x91CC;&#x662F;<a href="https://codesandbox.io/s/7ypm405o8q" rel="nofollow noopener noreferrer">demo</a>&#x3002;&#xFF09;</p><p><strong><strong>&#x5373;&#x4F7F;&#x662F;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;React&#x4E5F;&#x4FDD;&#x8BC1;<code>dispatch</code>&#x5728;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x90FD;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</strong></strong> &#x6240;&#x4EE5;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x4F9D;&#x8D56;&#x4E2D;&#x53BB;&#x6389;&#x5B83;&#x3002;&#x5B83;&#x4E0D;&#x4F1A;&#x5F15;&#x8D77;effect&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x91CD;&#x590D;&#x6267;&#x884C;&#x3002;</p><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x7591;&#x60D1;&#xFF1A;&#x8FD9;&#x600E;&#x4E48;&#x53EF;&#x80FD;&#xFF1F;&#x5728;&#x4E4B;&#x524D;&#x6E32;&#x67D3;&#x4E2D;&#x8C03;&#x7528;&#x7684;reducer&#x600E;&#x4E48;&#x201C;&#x77E5;&#x9053;&#x201D;&#x65B0;&#x7684;props&#xFF1F;&#x7B54;&#x6848;&#x662F;&#x5F53;&#x4F60;<code>dispatch</code>&#x7684;&#x65F6;&#x5019;&#xFF0C;React&#x53EA;&#x662F;&#x8BB0;&#x4F4F;&#x4E86;action - &#x5B83;&#x4F1A;&#x5728;&#x4E0B;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x4E2D;&#x518D;&#x6B21;&#x8C03;&#x7528;reducer&#x3002;&#x5728;&#x90A3;&#x4E2A;&#x65F6;&#x5019;&#xFF0C;&#x65B0;&#x7684;props&#x5C31;&#x53EF;&#x4EE5;&#x88AB;&#x8BBF;&#x95EE;&#x5230;&#xFF0C;&#x800C;&#x4E14;reducer&#x8C03;&#x7528;&#x4E5F;&#x4E0D;&#x662F;&#x5728;effect&#x91CC;&#x3002;</p><p><strong><strong>&#x8FD9;&#x5C31;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x6211;&#x503E;&#x5411;&#x8BA4;&#x4E3A;<code>useReducer</code>&#x662F;Hooks&#x7684;&#x201C;&#x4F5C;&#x5F0A;&#x6A21;&#x5F0F;&#x201D;&#x3002;&#x5B83;&#x53EF;&#x4EE5;&#x628A;&#x66F4;&#x65B0;&#x903B;&#x8F91;&#x548C;&#x63CF;&#x8FF0;&#x53D1;&#x751F;&#x4E86;&#x4EC0;&#x4E48;&#x5206;&#x5F00;&#x3002;&#x7ED3;&#x679C;&#x662F;&#xFF0C;&#x8FD9;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x6211;&#x79FB;&#x9664;&#x4E0D;&#x5FC5;&#x9700;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;effect&#x8C03;&#x7528;&#x3002;</strong></strong></p><h2 id="%E6%8A%8A%E5%87%BD%E6%95%B0%E7%A7%BB%E5%88%B0effects%E9%87%8C">&#x628A;&#x51FD;&#x6570;&#x79FB;&#x5230;Effects&#x91CC;</h2><p>&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x7684;&#x8BEF;&#x89E3;&#x662F;&#x8BA4;&#x4E3A;&#x51FD;&#x6570;&#x4E0D;&#x5E94;&#x8BE5;&#x6210;&#x4E3A;&#x4F9D;&#x8D56;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x770B;&#x4E0A;&#x53BB;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x6B63;&#x5E38;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  const [data, setData] = useState({ hits: [] });

  async function fetchData() {
    const result = await axios(
      &apos;https://hn.algolia.com/api/v1/search?query=react&apos;,
    );
    setData(result.data);
  }

  useEffect(() =&gt; {
    fetchData();
  }, []); // Is this okay?
  // ...</code></pre><p><em>(<a href="https://codesandbox.io/s/8j4ykjyv0" rel="nofollow noopener noreferrer">&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;</a> &#x6539;&#x7F16;&#x81EA;Robin Wieruch&#x8FD9;&#x7BC7;&#x5F88;&#x68D2;&#x7684;&#x6587;&#x7AE0; &#x2014; <a href="https://www.robinwieruch.de/react-hooks-fetch-data/" rel="nofollow noopener noreferrer">&#x70B9;&#x51FB;&#x67E5;&#x770B;</a>&#xFF01;)</em></p><p>&#x9700;&#x8981;&#x660E;&#x786E;&#x7684;&#x662F;&#xFF0C;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002;<strong><strong>&#x4F46;&#x8FD9;&#x6837;&#x505A;&#x5728;&#x7EC4;&#x4EF6;&#x65E5;&#x6E10;&#x590D;&#x6742;&#x7684;&#x8FED;&#x4EE3;&#x8FC7;&#x7A0B;&#x4E2D;&#x6211;&#x4EEC;&#x5F88;&#x96BE;&#x786E;&#x4FDD;&#x5B83;&#x5728;&#x5404;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x8FD8;&#x80FD;&#x6B63;&#x5E38;&#x8FD0;&#x884C;&#x3002;</strong></strong></p><p>&#x60F3;&#x8C61;&#x4E00;&#x4E0B;&#x6211;&#x4EEC;&#x7684;&#x4EE3;&#x7801;&#x505A;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x7684;&#x5206;&#x79BB;&#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x4F53;&#x91CF;&#x662F;&#x73B0;&#x5728;&#x7684;&#x4E94;&#x500D;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  // Imagine this function is long
  function getFetchUrl() {
    return &apos;https://hn.algolia.com/api/v1/search?query=react&apos;;
  }

  // Imagine this function is also long
  async function fetchData() {
    const result = await axios(getFetchUrl());
    setData(result.data);
  }

  useEffect(() =&gt; {
    fetchData();
  }, []);

  // ...
}</code></pre><p>&#x7136;&#x540E;&#x6211;&#x4EEC;&#x5728;&#x67D0;&#x4E9B;&#x51FD;&#x6570;&#x5185;&#x4F7F;&#x7528;&#x4E86;&#x67D0;&#x4E9B;state&#x6216;&#x8005;prop&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  const [query, setQuery] = useState(&apos;react&apos;);

  // Imagine this function is also long
  function getFetchUrl() {
    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;  }

  // Imagine this function is also long
  async function fetchData() {
    const result = await axios(getFetchUrl());
    setData(result.data);
  }

  useEffect(() =&gt; {
    fetchData();
  }, []);

  // ...
}</code></pre><p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5FD8;&#x8BB0;&#x53BB;&#x66F4;&#x65B0;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#xFF08;&#x5F88;&#x53EF;&#x80FD;&#x901A;&#x8FC7;&#x5176;&#x4ED6;&#x51FD;&#x6570;&#x8C03;&#x7528;&#xFF09;&#x7684;effects&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x6211;&#x4EEC;&#x7684;effects&#x5C31;&#x4E0D;&#x4F1A;&#x540C;&#x6B65;props&#x548C;state&#x5E26;&#x6765;&#x7684;&#x53D8;&#x66F4;&#x3002;&#x8FD9;&#x5F53;&#x7136;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x60F3;&#x8981;&#x7684;&#x3002;</p><p>&#x5E78;&#x8FD0;&#x7684;&#x662F;&#xFF0C;&#x5BF9;&#x4E8E;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x6709;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;<strong><strong>&#x5982;&#x679C;&#x67D0;&#x4E9B;&#x51FD;&#x6570;&#x4EC5;&#x5728;effect&#x4E2D;&#x8C03;&#x7528;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x4EEC;&#x7684;&#x5B9A;&#x4E49;&#x79FB;&#x5230;effect&#x4E2D;&#xFF1A;</strong></strong></p><pre><code class="language-jsx">function SearchResults() {
  // ...
  useEffect(() =&gt; {
    // We moved these functions inside!    function getFetchUrl() {      return &apos;https://hn.algolia.com/api/v1/search?query=react&apos;;    }    async function fetchData() {      const result = await axios(getFetchUrl());      setData(result.data);    }
    fetchData();
  }, []); // &#x2705; Deps are OK
  // ...
}</code></pre><p>(<a href="https://codesandbox.io/s/04kp3jwwql" rel="nofollow noopener noreferrer">&#x8FD9;&#x91CC;&#x662F;demo</a>.)</p><p>&#x8FD9;&#x4E48;&#x505A;&#x6709;&#x4EC0;&#x4E48;&#x597D;&#x5904;&#x5462;&#xFF1F;&#x6211;&#x4EEC;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x53BB;&#x8003;&#x8651;&#x8FD9;&#x4E9B;&#x201C;&#x95F4;&#x63A5;&#x4F9D;&#x8D56;&#x201D;&#x3002;&#x6211;&#x4EEC;&#x7684;&#x4F9D;&#x8D56;&#x6570;&#x7EC4;&#x4E5F;&#x4E0D;&#x518D;&#x6492;&#x8C0E;&#xFF1A;<strong><strong>&#x5728;&#x6211;&#x4EEC;&#x7684;effect&#x4E2D;&#x786E;&#x5B9E;&#x6CA1;&#x6709;&#x518D;&#x4F7F;&#x7528;&#x7EC4;&#x4EF6;&#x8303;&#x56F4;&#x5185;&#x7684;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#x3002;</strong></strong></p><p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x540E;&#x9762;&#x4FEE;&#x6539; <code>getFetchUrl</code>&#x53BB;&#x4F7F;&#x7528;<code>query</code>&#x72B6;&#x6001;&#xFF0C;&#x6211;&#x4EEC;&#x66F4;&#x53EF;&#x80FD;&#x4F1A;&#x610F;&#x8BC6;&#x5230;&#x6211;&#x4EEC;&#x6B63;&#x5728;effect&#x91CC;&#x9762;&#x7F16;&#x8F91;&#x5B83; - &#x56E0;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x628A;<code>query</code>&#x6DFB;&#x52A0;&#x5230;effect&#x7684;&#x4F9D;&#x8D56;&#x91CC;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  const [query, setQuery] = useState(&apos;react&apos;);

  useEffect(() =&gt; {
    function getFetchUrl() {
      return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;    }

    async function fetchData() {
      const result = await axios(getFetchUrl());
      setData(result.data);
    }

    fetchData();
  }, [query]); // &#x2705; Deps are OK
  // ...
}</code></pre><p>(&#x8FD9;&#x91CC;&#x662F;<a href="https://codesandbox.io/s/pwm32zx7z7" rel="nofollow noopener noreferrer">demo</a>.)</p><p>&#x6DFB;&#x52A0;&#x8FD9;&#x4E2A;&#x4F9D;&#x8D56;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x4EC5;&#x4EC5;&#x662F;&#x5728;&#x201C;&#x53D6;&#x60A6;React&#x201D;&#x3002;&#x5728;query&#x6539;&#x53D8;&#x540E;&#x53BB;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x662F;&#x5408;&#x7406;&#x7684;&#x3002;<code>useEffect</code>&#x7684;&#x8BBE;&#x8BA1;&#x610F;&#x56FE;&#x5C31;&#x662F;&#x8981;&#x5F3A;&#x8FEB;&#x4F60;&#x5173;&#x6CE8;&#x6570;&#x636E;&#x6D41;&#x7684;&#x6539;&#x53D8;&#xFF0C;&#x7136;&#x540E;&#x51B3;&#x5B9A;&#x6211;&#x4EEC;&#x7684;effects&#x8BE5;&#x5982;&#x4F55;&#x548C;&#x5B83;&#x540C;&#x6B65; - &#x800C;&#x4E0D;&#x662F;&#x5FFD;&#x89C6;&#x5B83;&#x76F4;&#x5230;&#x6211;&#x4EEC;&#x7684;&#x7528;&#x6237;&#x9047;&#x5230;&#x4E86;bug&#x3002;</p><p>&#x611F;&#x8C22;<code>eslint-plugin-react-hooks</code> &#x63D2;&#x4EF6;&#x7684;<code>exhaustive-deps</code>lint&#x89C4;&#x5219;&#xFF0C;&#x5B83;&#x4F1A;&#x5728;&#x4F60;<a href="https://github.com/facebook/react/issues/14920" rel="nofollow noopener noreferrer">&#x7F16;&#x7801;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x5206;&#x6790;effects</a>&#x5E76;&#x4E14;&#x63D0;&#x4F9B;&#x53EF;&#x80FD;&#x9057;&#x6F0F;&#x4F9D;&#x8D56;&#x7684;&#x5EFA;&#x8BAE;&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x673A;&#x5668;&#x4F1A;&#x544A;&#x8BC9;&#x4F60;&#x7EC4;&#x4EF6;&#x4E2D;&#x54EA;&#x4E9B;&#x6570;&#x636E;&#x6D41;&#x53D8;&#x66F4;&#x6CA1;&#x6709;&#x88AB;&#x6B63;&#x786E;&#x5730;&#x5904;&#x7406;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://overreacted.io/04a90dcbacb01105d634964880ebed19/exhaustive-deps.gif" class="kg-image" alt="useEffect &#x5B8C;&#x6574;&#x6307;&#x5357;" loading="lazy"></figure><p>&#x975E;&#x5E38;&#x68D2;&#x3002;</p><h2 id="%E4%BD%86%E6%88%91%E4%B8%8D%E8%83%BD%E6%8A%8A%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E6%94%BE%E5%88%B0effect%E9%87%8C">&#x4F46;&#x6211;&#x4E0D;&#x80FD;&#x628A;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x653E;&#x5230;Effect&#x91CC;</h2><p>&#x6709;&#x65F6;&#x5019;&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x60F3;&#x628A;&#x51FD;&#x6570;&#x79FB;&#x5165;effect&#x91CC;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x7EC4;&#x4EF6;&#x5185;&#x6709;&#x51E0;&#x4E2A;effect&#x4F7F;&#x7528;&#x4E86;&#x76F8;&#x540C;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x4F60;&#x4E0D;&#x60F3;&#x5728;&#x6BCF;&#x4E2A;effect&#x91CC;&#x590D;&#x5236;&#x9ECF;&#x8D34;&#x4E00;&#x904D;&#x8FD9;&#x4E2A;&#x903B;&#x8F91;&#x3002;&#x4E5F;&#x6216;&#x8BB8;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x662F;&#x4E00;&#x4E2A;prop&#x3002;</p><p>&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x4F60;&#x5E94;&#x8BE5;&#x5FFD;&#x7565;&#x5BF9;&#x51FD;&#x6570;&#x7684;&#x4F9D;&#x8D56;&#x5417;&#xFF1F;&#x6211;&#x4E0D;&#x8FD9;&#x4E48;&#x8BA4;&#x4E3A;&#x3002;&#x518D;&#x6B21;&#x5F3A;&#x8C03;&#xFF0C;<strong><strong>effects&#x4E0D;&#x5E94;&#x8BE5;&#x5BF9;&#x5B83;&#x7684;&#x4F9D;&#x8D56;&#x6492;&#x8C0E;&#x3002;</strong></strong>&#x901A;&#x5E38;&#x6211;&#x4EEC;&#x8FD8;&#x6709;&#x66F4;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x3002;&#x4E00;&#x4E2A;&#x5E38;&#x89C1;&#x7684;&#x8BEF;&#x89E3;&#x662F;&#xFF0C;&#x201C;&#x51FD;&#x6570;&#x4ECE;&#x6765;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x201D;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F60;&#x8BFB;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x4F60;&#x77E5;&#x9053;&#x8FD9;&#x663E;&#x7136;&#x4E0D;&#x662F;&#x4E8B;&#x5B9E;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x5728;&#x7EC4;&#x4EF6;&#x5185;&#x5B9A;&#x4E49;&#x7684;&#x51FD;&#x6570;&#x6BCF;&#x4E00;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x5728;&#x53D8;&#x3002;</p><p><strong><strong>&#x51FD;&#x6570;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x4F1A;&#x6539;&#x53D8;&#x8FD9;&#x4E2A;&#x4E8B;&#x5B9E;&#x672C;&#x8EAB;&#x5C31;&#x662F;&#x4E2A;&#x95EE;&#x9898;&#x3002;</strong></strong> &#x6BD4;&#x5982;&#x6709;&#x4E24;&#x4E2A;effects&#x4F1A;&#x8C03;&#x7528; <code>getFetchUrl</code>:</p><pre><code class="language-jsx">function SearchResults() {
  function getFetchUrl(query) {
    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;
  }

  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;react&apos;);
    // ... Fetch data and do something ...
  }, []); // &#x1F534; Missing dep: getFetchUrl

  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;redux&apos;);
    // ... Fetch data and do something ...
  }, []); // &#x1F534; Missing dep: getFetchUrl

  // ...
}</code></pre><p>&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x60F3;&#x628A;<code>getFetchUrl</code> &#x79FB;&#x5230;effects&#x4E2D;&#xFF0C;&#x56E0;&#x4E3A;&#x4F60;&#x60F3;&#x590D;&#x7528;&#x903B;&#x8F91;&#x3002;</p><p>&#x53E6;&#x4E00;&#x65B9;&#x9762;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x5BF9;&#x4F9D;&#x8D56;&#x5F88;&#x201C;&#x8BDA;&#x5B9E;&#x201D;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x6389;&#x5230;&#x9677;&#x9631;&#x91CC;&#x3002;&#x6211;&#x4EEC;&#x7684;&#x4E24;&#x4E2A;effects&#x90FD;&#x4F9D;&#x8D56;<code>getFetchUrl</code>&#xFF0C;<strong><strong>&#x800C;&#x5B83;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x90FD;&#x4E0D;&#x540C;</strong></strong>&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x7684;&#x4F9D;&#x8D56;&#x6570;&#x7EC4;&#x4F1A;&#x53D8;&#x5F97;&#x65E0;&#x7528;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  // &#x1F534; Re-triggers all effects on every render  function getFetchUrl(query) {    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;  }
  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;react&apos;);
    // ... Fetch data and do something ...
  }, [getFetchUrl]); // &#x1F6A7; Deps are correct but they change too often

  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;redux&apos;);
    // ... Fetch data and do something ...
  }, [getFetchUrl]); // &#x1F6A7; Deps are correct but they change too often

  // ...
}</code></pre><p>&#x4E00;&#x4E2A;&#x53EF;&#x80FD;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x662F;&#x628A;<code>getFetchUrl</code>&#x4ECE;&#x4F9D;&#x8D56;&#x4E2D;&#x53BB;&#x6389;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x6211;&#x4E0D;&#x8BA4;&#x4E3A;&#x8FD9;&#x662F;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x5F0F;&#x3002;&#x8FD9;&#x4F1A;&#x4F7F;&#x6211;&#x4EEC;&#x540E;&#x9762;&#x5BF9;&#x6570;&#x636E;&#x6D41;&#x7684;&#x6539;&#x53D8;&#x5F88;&#x96BE;&#x88AB;&#x53D1;&#x73B0;&#x4ECE;&#x800C;&#x5FD8;&#x8BB0;&#x53BB;&#x5904;&#x7406;&#x3002;&#x8FD9;&#x4F1A;&#x5BFC;&#x81F4;&#x7C7B;&#x4F3C;&#x4E8E;&#x4E0A;&#x9762;&#x201C;&#x5B9A;&#x65F6;&#x5668;&#x4E0D;&#x66F4;&#x65B0;&#x503C;&#x201D;&#x7684;&#x95EE;&#x9898;&#x3002;</p><p>&#x76F8;&#x53CD;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x4E24;&#x4E2A;&#x66F4;&#x7B80;&#x5355;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x3002;</p><p><strong><strong>&#x7B2C;&#x4E00;&#x4E2A;&#xFF0C; &#x5982;&#x679C;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x7EC4;&#x4EF6;&#x5185;&#x7684;&#x4EFB;&#x4F55;&#x503C;&#xFF0C;&#x4F60;&#x5E94;&#x8BE5;&#x628A;&#x5B83;&#x63D0;&#x5230;&#x7EC4;&#x4EF6;&#x5916;&#x9762;&#x53BB;&#x5B9A;&#x4E49;&#xFF0C;&#x7136;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x81EA;&#x7531;&#x5730;&#x5728;effects&#x4E2D;&#x4F7F;&#x7528;&#xFF1A;</strong></strong></p><pre><code class="language-jsx">// &#x2705; Not affected by the data flowfunction getFetchUrl(query) {  return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;}
function SearchResults() {
  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;react&apos;);
    // ... Fetch data and do something ...
  }, []); // &#x2705; Deps are OK

  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;redux&apos;);
    // ... Fetch data and do something ...
  }, []); // &#x2705; Deps are OK

  // ...
}</code></pre><p>&#x4F60;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x628A;&#x5B83;&#x8BBE;&#x4E3A;&#x4F9D;&#x8D56;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x4E0D;&#x5728;&#x6E32;&#x67D3;&#x8303;&#x56F4;&#x5185;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x4F1A;&#x88AB;&#x6570;&#x636E;&#x6D41;&#x5F71;&#x54CD;&#x3002;&#x5B83;&#x4E0D;&#x53EF;&#x80FD;&#x7A81;&#x7136;&#x610F;&#x5916;&#x5730;&#x4F9D;&#x8D56;&#x4E8E;props&#x6216;state&#x3002;</p><p>&#x6216;&#x8005;&#xFF0C; &#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x5305;&#x88C5;&#x6210; <a href="https://reactjs.org/docs/hooks-reference.html#usecallback" rel="nofollow noopener noreferrer"><code>useCallback</code> Hook</a>:</p><pre><code class="language-jsx">function SearchResults() {
  // &#x2705; Preserves identity when its own deps are the same  const getFetchUrl = useCallback((query) =&gt; {    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;  }, []);  // &#x2705; Callback deps are OK
  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;react&apos;);
    // ... Fetch data and do something ...
  }, [getFetchUrl]); // &#x2705; Effect deps are OK

  useEffect(() =&gt; {
    const url = getFetchUrl(&apos;redux&apos;);
    // ... Fetch data and do something ...
  }, [getFetchUrl]); // &#x2705; Effect deps are OK

  // ...
}</code></pre><p><code>useCallback</code>&#x672C;&#x8D28;&#x4E0A;&#x662F;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x5C42;&#x4F9D;&#x8D56;&#x68C0;&#x67E5;&#x3002;&#x5B83;&#x4EE5;&#x53E6;&#x4E00;&#x79CD;&#x65B9;&#x5F0F;&#x89E3;&#x51B3;&#x4E86;&#x95EE;&#x9898; - <strong><strong>&#x6211;&#x4EEC;&#x4F7F;&#x51FD;&#x6570;&#x672C;&#x8EAB;&#x53EA;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x624D;&#x6539;&#x53D8;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x53BB;&#x6389;&#x5BF9;&#x51FD;&#x6570;&#x7684;&#x4F9D;&#x8D56;&#x3002;</strong></strong></p><p>&#x6211;&#x4EEC;&#x6765;&#x770B;&#x770B;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x6709;&#x7528;&#x7684;&#x3002;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#x5C55;&#x793A;&#x4E86;&#x4E24;&#x79CD;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#xFF08;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#x5206;&#x522B;&#x4E3A;<code>&apos;react&apos;</code>&#x548C;<code>&apos;redux&apos;</code>&#xFF09;&#x3002;&#x4F46;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x60F3;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x8F93;&#x5165;&#x6846;&#x5141;&#x8BB8;&#x4F60;&#x8F93;&#x5165;&#x4EFB;&#x610F;&#x7684;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;(<code>query</code>)&#x3002;&#x4E0D;&#x540C;&#x4E8E;&#x4F20;&#x9012;<code>query</code>&#x53C2;&#x6570;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x73B0;&#x5728;<code>getFetchUrl</code>&#x4F1A;&#x4ECE;&#x72B6;&#x6001;&#x4E2D;&#x8BFB;&#x53D6;&#x3002;</p><p>&#x6211;&#x4EEC;&#x5F88;&#x5FEB;&#x53D1;&#x73B0;&#x5B83;&#x9057;&#x6F0F;&#x4E86;<code>query</code>&#x4F9D;&#x8D56;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  const [query, setQuery] = useState(&apos;react&apos;);
  const getFetchUrl = useCallback(() =&gt; { // No query argument
    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;
  }, []); // &#x1F534; Missing dep: query  // ...
}</code></pre><p>&#x5982;&#x679C;&#x6211;&#x628A;<code>query</code>&#x6DFB;&#x52A0;&#x5230;<code>useCallback</code> &#x7684;&#x4F9D;&#x8D56;&#x4E2D;&#xFF0C;&#x4EFB;&#x4F55;&#x8C03;&#x7528;&#x4E86;<code>getFetchUrl</code>&#x7684;effect&#x5728;<code>query</code>&#x6539;&#x53D8;&#x540E;&#x90FD;&#x4F1A;&#x91CD;&#x65B0;&#x8FD0;&#x884C;&#xFF1A;</p><pre><code class="language-jsx">function SearchResults() {
  const [query, setQuery] = useState(&apos;react&apos;);

  // &#x2705; Preserves identity until query changes  const getFetchUrl = useCallback(() =&gt; {    return &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;  }, [query]);  // &#x2705; Callback deps are OK
  useEffect(() =&gt; {
    const url = getFetchUrl();
    // ... Fetch data and do something ...
  }, [getFetchUrl]); // &#x2705; Effect deps are OK

  // ...
}</code></pre><p>&#x6211;&#x4EEC;&#x8981;&#x611F;&#x8C22;<code>useCallback</code>&#xFF0C;&#x56E0;&#x4E3A;&#x5982;&#x679C;<code>query</code> &#x4FDD;&#x6301;&#x4E0D;&#x53D8;&#xFF0C;<code>getFetchUrl</code>&#x4E5F;&#x4F1A;&#x4FDD;&#x6301;&#x4E0D;&#x53D8;&#xFF0C;&#x6211;&#x4EEC;&#x7684;effect&#x4E5F;&#x4E0D;&#x4F1A;&#x91CD;&#x65B0;&#x8FD0;&#x884C;&#x3002;&#x4F46;&#x662F;&#x5982;&#x679C;<code>query</code>&#x4FEE;&#x6539;&#x4E86;&#xFF0C;<code>getFetchUrl</code>&#x4E5F;&#x4F1A;&#x968F;&#x4E4B;&#x6539;&#x53D8;&#xFF0C;&#x56E0;&#x6B64;&#x4F1A;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x3002;&#x8FD9;&#x5C31;&#x50CF;&#x4F60;&#x5728;Excel&#x91CC;&#x4FEE;&#x6539;&#x4E86;&#x4E00;&#x4E2A;&#x5355;&#x5143;&#x683C;&#x7684;&#x503C;&#xFF0C;&#x53E6;&#x4E00;&#x4E2A;&#x4F7F;&#x7528;&#x5B83;&#x7684;&#x5355;&#x5143;&#x683C;&#x4F1A;&#x81EA;&#x52A8;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#x4E00;&#x6837;&#x3002;</p><p>&#x8FD9;&#x6B63;&#x662F;&#x62E5;&#x62B1;&#x6570;&#x636E;&#x6D41;&#x548C;&#x540C;&#x6B65;&#x601D;&#x7EF4;&#x7684;&#x7ED3;&#x679C;&#x3002;<strong><strong>&#x5BF9;&#x4E8E;&#x901A;&#x8FC7;&#x5C5E;&#x6027;&#x4ECE;&#x7236;&#x7EC4;&#x4EF6;&#x4F20;&#x5165;&#x7684;&#x51FD;&#x6570;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x4E5F;&#x9002;&#x7528;&#xFF1A;</strong></strong></p><pre><code class="language-jsx">function Parent() {
  const [query, setQuery] = useState(&apos;react&apos;);

  // &#x2705; Preserves identity until query changes  const fetchData = useCallback(() =&gt; {    const url = &apos;https://hn.algolia.com/api/v1/search?query=&apos; + query;    // ... Fetch data and return it ...  }, [query]);  // &#x2705; Callback deps are OK
  return &lt;Child fetchData={fetchData} /&gt;
}

function Child({ fetchData }) {
  let [data, setData] = useState(null);

  useEffect(() =&gt; {
    fetchData().then(setData);
  }, [fetchData]); // &#x2705; Effect deps are OK

  // ...
}</code></pre><p>&#x56E0;&#x4E3A;<code>fetchData</code>&#x53EA;&#x6709;&#x5728;<code>Parent</code>&#x7684;<code>query</code>&#x72B6;&#x6001;&#x53D8;&#x66F4;&#x65F6;&#x624D;&#x4F1A;&#x6539;&#x53D8;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x7684;<code>Child</code>&#x53EA;&#x4F1A;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x624D;&#x53BB;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x3002;</p><h2 id="%E5%87%BD%E6%95%B0%E6%98%AF%E6%95%B0%E6%8D%AE%E6%B5%81%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%E5%90%97%EF%BC%9F">&#x51FD;&#x6570;&#x662F;&#x6570;&#x636E;&#x6D41;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x5417;&#xFF1F;</h2><p>&#x6709;&#x8DA3;&#x7684;&#x662F;&#xFF0C;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x5728;class&#x7EC4;&#x4EF6;&#x4E2D;&#x884C;&#x4E0D;&#x901A;&#xFF0C;&#x5E76;&#x4E14;&#x8FD9;&#x79CD;&#x884C;&#x4E0D;&#x901A;&#x6070;&#x5230;&#x597D;&#x5904;&#x5730;&#x63ED;&#x793A;&#x4E86;effect&#x548C;&#x751F;&#x547D;&#x5468;&#x671F;&#x8303;&#x5F0F;&#x4E4B;&#x95F4;&#x7684;&#x533A;&#x522B;&#x3002;&#x8003;&#x8651;&#x4E0B;&#x9762;&#x7684;&#x8F6C;&#x6362;&#xFF1A;</p><pre><code class="language-jsx">class Parent extends Component {
  state = {
    query: &apos;react&apos;
  };
  fetchData = () =&gt; {    const url = &apos;https://hn.algolia.com/api/v1/search?query=&apos; + this.state.query;    // ... Fetch data and do something ...  };  render() {
    return &lt;Child fetchData={this.fetchData} /&gt;;
  }
}

class Child extends Component {
  state = {
    data: null
  };
  componentDidMount() {    this.props.fetchData();  }  render() {
    // ...
  }
}</code></pre><p>&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x60F3;&#xFF1A;&#x201C;&#x5C11;&#x6765;&#x4E86;Dan&#xFF0C;&#x6211;&#x4EEC;&#x90FD;&#x77E5;&#x9053;<code>useEffect</code> &#x5C31;&#x50CF;<code>componentDidMount</code> &#x548C; <code>componentDidUpdate</code>&#x7684;&#x7ED3;&#x5408;&#xFF0C;&#x4F60;&#x4E0D;&#x80FD;&#x8001;&#x662F;&#x7834;&#x574F;&#x8FD9;&#x4E00;&#x6761;&#xFF01;&#x201D;<strong><strong>&#x597D;&#x5427;&#xFF0C;&#x5C31;&#x7B97;&#x52A0;&#x4E86;<code>componentDidUpdate</code>&#x7167;&#x6837;&#x65E0;&#x7528;&#xFF1A;</strong></strong></p><pre><code class="language-jsx">class Child extends Component {
  state = {
    data: null
  };
  componentDidMount() {
    this.props.fetchData();
  }
  componentDidUpdate(prevProps) {    // &#x1F534; This condition will never be true    if (this.props.fetchData !== prevProps.fetchData) {      this.props.fetchData();    }  }  render() {
    // ...
  }
}</code></pre><p>&#x5F53;&#x7136;&#x5982;&#x6B64;&#xFF0C;<code>fetchData</code>&#x662F;&#x4E00;&#x4E2A;class&#x65B9;&#x6CD5;&#xFF01;&#xFF08;&#x6216;&#x8005;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x8BF4;&#x662F;class&#x5C5E;&#x6027; - &#x4F46;&#x8FD9;&#x4E0D;&#x80FD;&#x6539;&#x53D8;&#x4EC0;&#x4E48;&#x3002;&#xFF09;&#x5B83;&#x4E0D;&#x4F1A;&#x56E0;&#x4E3A;&#x72B6;&#x6001;&#x7684;&#x6539;&#x53D8;&#x800C;&#x4E0D;&#x540C;&#xFF0C;&#x6240;&#x4EE5;<code>this.props.fetchData</code>&#x548C; <code>prevProps.fetchData</code>&#x59CB;&#x7EC8;&#x76F8;&#x7B49;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x4F1A;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#x3002;&#x90A3;&#x6211;&#x4EEC;&#x5220;&#x6389;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#x600E;&#x4E48;&#x6837;&#xFF1F;</p><pre><code class="language-jsx">  componentDidUpdate(prevProps) {
    this.props.fetchData();
  }</code></pre><p>&#x7B49;&#x7B49;&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x5728;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x540E;&#x90FD;&#x53BB;&#x8BF7;&#x6C42;&#x3002;(&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x52A0;&#x8F7D;&#x52A8;&#x753B;&#x53EF;&#x80FD;&#x662F;&#x4E00;&#x79CD;&#x6709;&#x8DA3;&#x7684;&#x53D1;&#x73B0;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x7684;&#x65B9;&#x5F0F;&#x3002;)&#x4E5F;&#x8BB8;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7ED1;&#x5B9A;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x7684;query?</p><pre><code class="language-jsx">  render() {
    return &lt;Child fetchData={this.fetchData.bind(this, this.state.query)} /&gt;;
  }</code></pre><p>&#x4F46;&#x8FD9;&#x6837;&#x4E00;&#x6765;&#xFF0C;<code>this.props.fetchData !== prevProps.fetchData</code> &#x8868;&#x8FBE;&#x5F0F;&#x6C38;&#x8FDC;&#x662F;<code>true</code>&#xFF0C;&#x5373;&#x4F7F;<code>query</code>&#x5E76;&#x672A;&#x6539;&#x53D8;&#x3002;&#x8FD9;&#x4F1A;&#x5BFC;&#x81F4;&#x6211;&#x4EEC;&#x603B;&#x662F;&#x53BB;&#x8BF7;&#x6C42;&#x3002;</p><p>&#x60F3;&#x8981;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;class&#x7EC4;&#x4EF6;&#x4E2D;&#x7684;&#x96BE;&#x9898;&#xFF0C;&#x552F;&#x4E00;&#x73B0;&#x5B9E;&#x53EF;&#x884C;&#x7684;&#x529E;&#x6CD5;&#x662F;&#x786C;&#x7740;&#x5934;&#x76AE;&#x628A;<code>query</code>&#x672C;&#x8EAB;&#x4F20;&#x5165; <code>Child</code> &#x7EC4;&#x4EF6;&#x3002; <code>Child</code> &#x867D;&#x7136;&#x5B9E;&#x9645;&#x5E76;&#x6CA1;&#x6709;&#x76F4;&#x63A5;<em>&#x4F7F;&#x7528;</em>&#x8FD9;&#x4E2A;<code>query</code>&#x7684;&#x503C;&#xFF0C;&#x4F46;&#x80FD;&#x5728;&#x5B83;&#x6539;&#x53D8;&#x7684;&#x65F6;&#x5019;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#x91CD;&#x65B0;&#x8BF7;&#x6C42;&#xFF1A;</p><pre><code class="language-jsx">class Parent extends Component {
  state = {
    query: &apos;react&apos;
  };
  fetchData = () =&gt; {
    const url = &apos;https://hn.algolia.com/api/v1/search?query=&apos; + this.state.query;
    // ... Fetch data and do something ...
  };
  render() {
    return &lt;Child fetchData={this.fetchData} query={this.state.query} /&gt;;  }
}

class Child extends Component {
  state = {
    data: null
  };
  componentDidMount() {
    this.props.fetchData();
  }
  componentDidUpdate(prevProps) {
    if (this.props.query !== prevProps.query) {      this.props.fetchData();    }  }
  render() {
    // ...
  }
}</code></pre><p>&#x5728;&#x4F7F;&#x7528;React&#x7684;class&#x7EC4;&#x4EF6;&#x8FD9;&#x4E48;&#x591A;&#x5E74;&#x540E;&#xFF0C;&#x6211;&#x5DF2;&#x7ECF;&#x5982;&#x6B64;&#x4E60;&#x60EF;&#x4E8E;&#x628A;&#x4E0D;&#x5FC5;&#x8981;&#x7684;props&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#x5E76;&#x4E14;&#x7834;&#x574F;&#x7236;&#x7EC4;&#x4EF6;&#x7684;&#x5C01;&#x88C5;&#x4EE5;&#x81F3;&#x4E8E;&#x6211;&#x5728;&#x4E00;&#x5468;&#x4E4B;&#x524D;&#x624D;&#x610F;&#x8BC6;&#x5230;&#x6211;&#x4E3A;&#x4EC0;&#x4E48;&#x4E00;&#x5B9A;&#x8981;&#x8FD9;&#x6837;&#x505A;&#x3002;</p><p><strong><strong>&#x5728;class&#x7EC4;&#x4EF6;&#x4E2D;&#xFF0C;&#x51FD;&#x6570;&#x5C5E;&#x6027;&#x672C;&#x8EAB;&#x5E76;&#x4E0D;&#x662F;&#x6570;&#x636E;&#x6D41;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x3002;</strong></strong>&#x7EC4;&#x4EF6;&#x7684;&#x65B9;&#x6CD5;&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x53EF;&#x53D8;&#x7684;<code>this</code>&#x53D8;&#x91CF;&#x5BFC;&#x81F4;&#x6211;&#x4EEC;&#x4E0D;&#x80FD;&#x786E;&#x5B9A;&#x65E0;&#x7591;&#x5730;&#x8BA4;&#x4E3A;&#x5B83;&#x662F;&#x4E0D;&#x53D8;&#x7684;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5373;&#x4F7F;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x5FC5;&#x987B;&#x628A;&#x4E00;&#x5806;&#x6570;&#x636E;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#x4EC5;&#x4EC5;&#x662F;&#x4E3A;&#x4E86;&#x505A;&#x201C;diff&#x201D;&#x3002;&#x6211;&#x4EEC;&#x65E0;&#x6CD5;&#x77E5;&#x9053;&#x4F20;&#x5165;&#x7684;<code>this.props.fetchData</code> &#x662F;&#x5426;&#x4F9D;&#x8D56;&#x72B6;&#x6001;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x77E5;&#x9053;&#x5B83;&#x4F9D;&#x8D56;&#x7684;&#x72B6;&#x6001;&#x662F;&#x5426;&#x6539;&#x53D8;&#x4E86;&#x3002;</p><p><strong><strong>&#x4F7F;&#x7528;<code>useCallback</code>&#xFF0C;&#x51FD;&#x6570;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x53C2;&#x4E0E;&#x5230;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x3002;</strong></strong>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8BF4;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x8F93;&#x5165;&#x6539;&#x53D8;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x5C31;&#x6539;&#x53D8;&#x4E86;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x51FD;&#x6570;&#x4E5F;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x3002;&#x611F;&#x8C22;&#x5468;&#x5230;&#x7684;<code>useCallback</code>&#xFF0C;&#x5C5E;&#x6027;&#x6BD4;&#x5982;<code>props.fetchData</code>&#x7684;&#x6539;&#x53D8;&#x4E5F;&#x4F1A;&#x81EA;&#x52A8;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#x3002;</p><p>&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;<a href="https://reactjs.org/docs/hooks-reference.html#usememo" rel="nofollow noopener noreferrer"><code>useMemo</code></a>&#x53EF;&#x4EE5;&#x8BA9;&#x6211;&#x4EEC;&#x5BF9;&#x590D;&#x6742;&#x5BF9;&#x8C61;&#x505A;&#x7C7B;&#x4F3C;&#x7684;&#x4E8B;&#x60C5;&#x3002;</p><pre><code class="language-jsx">function ColorPicker() {
  // Doesn&apos;t break Child&apos;s shallow equality prop check
  // unless the color actually changes.
  const [color, setColor] = useState(&apos;pink&apos;);
  const style = useMemo(() =&gt; ({ color }), [color]);
  return &lt;Child style={style} /&gt;;
}</code></pre><p><strong><strong>&#x6211;&#x60F3;&#x5F3A;&#x8C03;&#x7684;&#x662F;&#xFF0C;&#x5230;&#x5904;&#x4F7F;&#x7528;<code>useCallback</code>&#x662F;&#x4EF6;&#x633A;&#x7B28;&#x62D9;&#x7684;&#x4E8B;&#x3002;</strong></strong>&#x5F53;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5C06;&#x51FD;&#x6570;&#x4F20;&#x9012;&#x4E0B;&#x53BB;&#x5E76;&#x4E14;&#x51FD;&#x6570;&#x4F1A;&#x5728;&#x5B50;&#x7EC4;&#x4EF6;&#x7684;effect&#x4E2D;&#x88AB;&#x8C03;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;<code>useCallback</code> &#x662F;&#x5F88;&#x597D;&#x7684;&#x6280;&#x5DE7;&#x4E14;&#x975E;&#x5E38;&#x6709;&#x7528;&#x3002;&#x6216;&#x8005;&#x4F60;&#x60F3;&#x8BD5;&#x56FE;&#x51CF;&#x5C11;&#x5BF9;&#x5B50;&#x7EC4;&#x4EF6;&#x7684;&#x8BB0;&#x5FC6;&#x8D1F;&#x62C5;&#xFF0C;&#x4E5F;&#x4E0D;&#x59A8;&#x4E00;&#x8BD5;&#x3002;&#x4F46;&#x603B;&#x7684;&#x6765;&#x8BF4;Hooks&#x672C;&#x8EAB;&#x80FD;&#x66F4;&#x597D;&#x5730;<a href="https://reactjs.org/docs/hooks-faq.html#how-to-avoid-passing-callbacks-down" rel="nofollow noopener noreferrer">&#x907F;&#x514D;&#x4F20;&#x9012;&#x56DE;&#x8C03;&#x51FD;&#x6570;</a>&#x3002;</p><p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x6211;&#x66F4;&#x503E;&#x5411;&#x4E8E;&#x628A;<code>fetchData</code>&#x653E;&#x5728;&#x6211;&#x7684;effect&#x91CC;&#xFF08;&#x5B83;&#x53EF;&#x4EE5;&#x62BD;&#x79BB;&#x6210;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;Hook&#xFF09;&#x6216;&#x8005;&#x662F;&#x4ECE;&#x9876;&#x5C42;&#x5F15;&#x5165;&#x3002;&#x6211;&#x60F3;&#x8BA9;effects&#x4FDD;&#x6301;&#x7B80;&#x5355;&#xFF0C;&#x800C;&#x5728;&#x91CC;&#x9762;&#x8C03;&#x7528;&#x56DE;&#x8C03;&#x4F1A;&#x8BA9;&#x4E8B;&#x60C5;&#x53D8;&#x5F97;&#x590D;&#x6742;&#x3002;&#xFF08;&#x201C;&#x5982;&#x679C;&#x67D0;&#x4E2A;<code>props.onComplete</code>&#x56DE;&#x8C03;&#x6539;&#x53D8;&#x4E86;&#x800C;&#x8BF7;&#x6C42;&#x8FD8;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#x4F1A;&#x600E;&#x4E48;&#x6837;&#xFF1F;&#x201D;&#xFF09;&#x4F60;&#x53EF;&#x4EE5;<a href="https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/#swimming-against-the-tide">&#x6A21;&#x62DF;class&#x7684;&#x884C;&#x4E3A;</a>&#x4F46;&#x90A3;&#x6837;&#x5E76;&#x4E0D;&#x80FD;&#x89E3;&#x51B3;&#x7ADE;&#x6001;&#x7684;&#x95EE;&#x9898;&#x3002;</p><h2 id="%E8%AF%B4%E8%AF%B4%E7%AB%9E%E6%80%81">&#x8BF4;&#x8BF4;&#x7ADE;&#x6001;</h2><p>&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x7684;&#x5728;class&#x7EC4;&#x4EF6;&#x91CC;&#x53D1;&#x8BF7;&#x6C42;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p><pre><code class="language-jsx">class Article extends Component {
  state = {
    article: null
  };
  componentDidMount() {
    this.fetchData(this.props.id);
  }
  async fetchData(id) {
    const article = await API.fetchArticle(id);
    this.setState({ article });
  }
  // ...
}</code></pre><p>&#x4F60;&#x5F88;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x77E5;&#x9053;&#xFF0C;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x57CB;&#x4F0F;&#x4E86;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#x3002;&#x5B83;&#x5E76;&#x6CA1;&#x6709;&#x5904;&#x7406;&#x66F4;&#x65B0;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x6240;&#x4EE5;&#x7B2C;&#x4E8C;&#x4E2A;&#x4F60;&#x80FD;&#x591F;&#x5728;&#x7F51;&#x4E0A;&#x627E;&#x5230;&#x7684;&#x7ECF;&#x5178;&#x4F8B;&#x5B50;&#x662F;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x7684;&#xFF1A;</p><pre><code class="language-jsx">class Article extends Component {
  state = {
    article: null
  };
  componentDidMount() {
    this.fetchData(this.props.id);
  }
  componentDidUpdate(prevProps) {    if (prevProps.id !== this.props.id) {      this.fetchData(this.props.id);    }  }  async fetchData(id) {
    const article = await API.fetchArticle(id);
    this.setState({ article });
  }
  // ...
}</code></pre><p>&#x8FD9;&#x663E;&#x7136;&#x597D;&#x591A;&#x4E86;&#xFF01;&#x4F46;&#x4F9D;&#x65E7;&#x6709;&#x95EE;&#x9898;&#x3002;&#x6709;&#x95EE;&#x9898;&#x7684;&#x539F;&#x56E0;&#x662F;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7684;&#x987A;&#x5E8F;&#x4E0D;&#x80FD;&#x4FDD;&#x8BC1;&#x4E00;&#x81F4;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x5148;&#x8BF7;&#x6C42; <code>{id: 10}</code>&#xFF0C;&#x7136;&#x540E;&#x66F4;&#x65B0;&#x5230;<code>{id: 20}</code>&#xFF0C;&#x4F46;<code>{id: 20}</code>&#x7684;&#x8BF7;&#x6C42;&#x66F4;&#x5148;&#x8FD4;&#x56DE;&#x3002;&#x8BF7;&#x6C42;&#x66F4;&#x65E9;&#x4F46;&#x8FD4;&#x56DE;&#x66F4;&#x665A;&#x7684;&#x60C5;&#x51B5;&#x4F1A;&#x9519;&#x8BEF;&#x5730;&#x8986;&#x76D6;&#x72B6;&#x6001;&#x503C;&#x3002;</p><p>&#x8FD9;&#x88AB;&#x53EB;&#x505A;&#x7ADE;&#x6001;&#xFF0C;&#x8FD9;&#x5728;&#x6DF7;&#x5408;&#x4E86;<code>async</code> / <code>await</code>&#xFF08;&#x5047;&#x8BBE;&#x5728;&#x7B49;&#x5F85;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#xFF09;&#x548C;&#x81EA;&#x9876;&#x5411;&#x4E0B;&#x6570;&#x636E;&#x6D41;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#x975E;&#x5E38;&#x5178;&#x578B;&#xFF08;props&#x548C;state&#x53EF;&#x80FD;&#x4F1A;&#x5728;async&#x51FD;&#x6570;&#x8C03;&#x7528;&#x8FC7;&#x7A0B;&#x4E2D;&#x53D1;&#x751F;&#x6539;&#x53D8;&#xFF09;&#x3002;</p><p>Effects&#x5E76;&#x6CA1;&#x6709;&#x795E;&#x5947;&#x5730;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5C3D;&#x7BA1;&#x5B83;&#x4F1A;&#x8B66;&#x544A;&#x4F60;&#x5982;&#x679C;&#x4F60;&#x76F4;&#x63A5;&#x4F20;&#x4E86;&#x4E00;&#x4E2A;<code>async</code> &#x51FD;&#x6570;&#x7ED9;effect&#x3002;&#xFF08;&#x6211;&#x4EEC;&#x4F1A;&#x6539;&#x5584;&#x8FD9;&#x4E2A;&#x8B66;&#x544A;&#x6765;&#x66F4;&#x597D;&#x5730;&#x89E3;&#x91CA;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x9047;&#x5230;&#x7684;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x3002;&#xFF09;</p><p>&#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;&#x7684;&#x5F02;&#x6B65;&#x65B9;&#x5F0F;&#x652F;&#x6301;&#x53D6;&#x6D88;&#xFF0C;&#x90A3;&#x592A;&#x68D2;&#x4E86;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728;&#x6E05;&#x9664;&#x51FD;&#x6570;&#x4E2D;&#x53D6;&#x6D88;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x3002;</p><p>&#x6216;&#x8005;&#xFF0C;&#x6700;&#x7B80;&#x5355;&#x7684;&#x6743;&#x5B9C;&#x4E4B;&#x8BA1;&#x662F;&#x7528;&#x4E00;&#x4E2A;&#x5E03;&#x5C14;&#x503C;&#x6765;&#x8DDF;&#x8E2A;&#x5B83;&#xFF1A;</p><pre><code class="language-jsx">function Article({ id }) {
  const [article, setArticle] = useState(null);

  useEffect(() =&gt; {
    let didCancel = false;
    async function fetchData() {
      const article = await API.fetchArticle(id);
      if (!didCancel) {        setArticle(article);
      }
    }

    fetchData();

    return () =&gt; {      didCancel = true;    };  }, [id]);

  // ...
}</code></pre><p><a href="https://www.robinwieruch.de/react-hooks-fetch-data/" rel="nofollow noopener noreferrer">&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;</a>&#x8BA8;&#x8BBA;&#x4E86;&#x66F4;&#x591A;&#x5173;&#x4E8E;&#x5982;&#x4F55;&#x5904;&#x7406;&#x9519;&#x8BEF;&#x548C;&#x52A0;&#x8F7D;&#x72B6;&#x6001;&#xFF0C;&#x4EE5;&#x53CA;&#x62BD;&#x79BB;&#x903B;&#x8F91;&#x5230;&#x81EA;&#x5B9A;&#x4E49;&#x7684;Hook&#x3002;&#x6211;&#x63A8;&#x8350;&#x4F60;&#x8BA4;&#x771F;&#x9605;&#x8BFB;&#x4E00;&#x4E0B;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x5B66;&#x4E60;&#x66F4;&#x591A;&#x5173;&#x4E8E;&#x5982;&#x4F55;&#x5728;Hooks&#x91CC;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x7684;&#x5185;&#x5BB9;&#x3002;</p><h2 id="%E6%8F%90%E9%AB%98%E6%B0%B4%E5%87%86">&#x63D0;&#x9AD8;&#x6C34;&#x51C6;</h2><p>&#x5728;class&#x7EC4;&#x4EF6;&#x751F;&#x547D;&#x5468;&#x671F;&#x7684;&#x601D;&#x7EF4;&#x6A21;&#x578B;&#x4E2D;&#xFF0C;&#x526F;&#x4F5C;&#x7528;&#x7684;&#x884C;&#x4E3A;&#x548C;&#x6E32;&#x67D3;&#x8F93;&#x51FA;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x3002;UI&#x6E32;&#x67D3;&#x662F;&#x88AB;props&#x548C;state&#x9A71;&#x52A8;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x80FD;&#x786E;&#x4FDD;&#x6B65;&#x8C03;&#x4E00;&#x81F4;&#xFF0C;&#x4F46;&#x526F;&#x4F5C;&#x7528;&#x5E76;&#x4E0D;&#x662F;&#x8FD9;&#x6837;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x7C7B;&#x5E38;&#x89C1;&#x95EE;&#x9898;&#x7684;&#x6765;&#x6E90;&#x3002;</p><p>&#x800C;&#x5728;<code>useEffect</code>&#x7684;&#x601D;&#x7EF4;&#x6A21;&#x578B;&#x4E2D;&#xFF0C;&#x9ED8;&#x8BA4;&#x90FD;&#x662F;&#x540C;&#x6B65;&#x7684;&#x3002;&#x526F;&#x4F5C;&#x7528;&#x53D8;&#x6210;&#x4E86;React&#x6570;&#x636E;&#x6D41;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x3002;&#x5BF9;&#x4E8E;&#x6BCF;&#x4E00;&#x4E2A;<code>useEffect</code>&#x8C03;&#x7528;&#xFF0C;&#x4E00;&#x65E6;&#x4F60;&#x5904;&#x7406;&#x6B63;&#x786E;&#xFF0C;&#x4F60;&#x7684;&#x7EC4;&#x4EF6;&#x80FD;&#x591F;&#x66F4;&#x597D;&#x5730;&#x5904;&#x7406;&#x8FB9;&#x7F18;&#x60C5;&#x51B5;&#x3002;</p><p>&#x7136;&#x800C;&#xFF0C;&#x7528;&#x597D;<code>useEffect</code>&#x7684;&#x524D;&#x671F;&#x5B66;&#x4E60;&#x6210;&#x672C;&#x66F4;&#x9AD8;&#x3002;&#x8FD9;&#x53EF;&#x80FD;&#x8BA9;&#x4EBA;&#x6C14;&#x607C;&#x3002;&#x7528;&#x540C;&#x6B65;&#x7684;&#x4EE3;&#x7801;&#x53BB;&#x5904;&#x7406;&#x8FB9;&#x7F18;&#x60C5;&#x51B5;&#x5929;&#x7136;&#x5C31;&#x6BD4;&#x89E6;&#x53D1;&#x4E00;&#x6B21;&#x4E0D;&#x7528;&#x548C;&#x6E32;&#x67D3;&#x7ED3;&#x679C;&#x6B65;&#x8C03;&#x4E00;&#x81F4;&#x7684;&#x526F;&#x4F5C;&#x7528;&#x66F4;&#x96BE;&#x3002;</p><p>&#x8FD9;&#x96BE;&#x514D;&#x8BA9;&#x4EBA;&#x62C5;&#x5FE7;&#x5982;&#x679C;<code>useEffect</code>&#x662F;&#x4F60;&#x73B0;&#x5728;&#x4F7F;&#x7528;&#x6700;&#x591A;&#x7684;&#x5DE5;&#x5177;&#x3002;&#x4E0D;&#x8FC7;&#xFF0C;&#x76EE;&#x524D;&#x5927;&#x62B5;&#x8FD8;&#x5904;&#x7406;&#x4F4E;&#x6C34;&#x5E73;&#x4F7F;&#x7528;&#x9636;&#x6BB5;&#x3002;&#x56E0;&#x4E3A;Hooks&#x592A;&#x65B0;&#x4E86;&#x6240;&#x4EE5;&#x5927;&#x5BB6;&#x90FD;&#x8FD8;&#x5728;&#x4F4E;&#x6C34;&#x5E73;&#x5730;&#x4F7F;&#x7528;&#x5B83;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x4E00;&#x4E9B;&#x6559;&#x7A0B;&#x793A;&#x4F8B;&#x4E2D;&#x3002;&#x4F46;&#x5728;&#x5B9E;&#x8DF5;&#x4E2D;&#xFF0C;&#x793E;&#x533A;&#x5F88;&#x53EF;&#x80FD;&#x5373;&#x5C06;&#x5F00;&#x59CB;&#x9AD8;&#x6C34;&#x5E73;&#x5730;&#x4F7F;&#x7528;Hooks&#xFF0C;&#x56E0;&#x4E3A;&#x597D;&#x7684;API&#x4F1A;&#x6709;&#x66F4;&#x597D;&#x7684;&#x52A8;&#x91CF;&#x548C;&#x51B2;&#x52B2;&#x3002;</p><p>&#x6211;&#x770B;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x5E94;&#x7528;&#x5728;&#x521B;&#x9020;&#x4ED6;&#x4EEC;&#x81EA;&#x5DF1;&#x7684;Hooks&#xFF0C;&#x6BD4;&#x5982;&#x5C01;&#x88C5;&#x4E86;&#x5E94;&#x7528;&#x9274;&#x6743;&#x903B;&#x8F91;&#x7684;<code>useFetch</code>&#x6216;&#x8005;&#x4F7F;&#x7528;theme context&#x7684;<code>useTheme</code> &#x3002;&#x4F60;&#x4E00;&#x65E6;&#x6709;&#x4E86;&#x5305;&#x542B;&#x8FD9;&#x4E9B;&#x7684;&#x5DE5;&#x5177;&#x7BB1;&#xFF0C;&#x4F60;&#x5C31;&#x4E0D;&#x4F1A;&#x90A3;&#x4E48;&#x9891;&#x7E41;&#x5730;&#x76F4;&#x63A5;&#x4F7F;&#x7528;<code>useEffect</code>&#x3002;&#x4F46;&#x6BCF;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E;&#x5B83;&#x7684;Hook&#x90FD;&#x80FD;&#x4ECE;&#x5B83;&#x7684;&#x9002;&#x5E94;&#x80FD;&#x529B;&#x4E2D;&#x5F97;&#x5230;&#x76CA;&#x5904;&#x3002;</p><p>&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#xFF0C;<code>useEffect</code>&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x3002;&#x4F46;&#x662F;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x51C6;&#x786E;&#x8BF4;&#x5E76;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x540C;&#x6B65;&#x95EE;&#x9898;&#x3002;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x4F9D;&#x8D56;&#x7ECF;&#x5E38;&#x662F;<code>[]</code>&#x6240;&#x4EE5;&#x8FD9;&#x4E00;&#x70B9;&#x5C24;&#x5176;&#x660E;&#x663E;&#x3002;&#x90A3;&#x6211;&#x4EEC;&#x7A76;&#x7ADF;&#x5728;&#x540C;&#x6B65;&#x4EC0;&#x4E48;&#xFF1F;</p><p>&#x957F;&#x8FDC;&#x6765;&#x770B;&#xFF0C; <a href="https://reactjs.org/blog/2018/11/27/react-16-roadmap.html#react-16x-mid-2019-the-one-with-suspense-for-data-fetching" rel="nofollow noopener noreferrer">Suspense&#x7528;&#x4E8E;&#x6570;&#x636E;&#x8BF7;&#x6C42;</a> &#x4F1A;&#x5141;&#x8BB8;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x901A;&#x8FC7;&#x7B2C;&#x4E00;&#x7B49;&#x7684;&#x9014;&#x5F84;&#x544A;&#x8BC9;React&#x6682;&#x505C;&#x6E32;&#x67D3;&#x76F4;&#x5230;&#x67D0;&#x4E9B;&#x5F02;&#x6B65;&#x4E8B;&#x7269;&#xFF08;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#xFF1A;&#x4EE3;&#x7801;&#xFF0C;&#x6570;&#x636E;&#xFF0C;&#x56FE;&#x7247;&#xFF09;&#x5DF2;&#x7ECF;&#x51C6;&#x5907;&#x5C31;&#x7EEA;&#x3002;</p><p>&#x5F53;Suspense&#x9010;&#x6E10;&#x5730;&#x8986;&#x76D6;&#x5230;&#x66F4;&#x591A;&#x7684;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF0C;&#x6211;&#x9884;&#x6599;<code>useEffect</code> &#x4F1A;&#x9000;&#x5C45;&#x5E55;&#x540E;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x5F3A;&#x5927;&#x7684;&#x5DE5;&#x5177;&#xFF0C;&#x7528;&#x4E8E;&#x540C;&#x6B65;props&#x548C;state&#x5230;&#x67D0;&#x4E9B;&#x526F;&#x4F5C;&#x7528;&#x3002;&#x4E0D;&#x50CF;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x5730;&#x5904;&#x7406;&#x8FD9;&#x4E9B;&#x573A;&#x666F;&#x56E0;&#x4E3A;&#x5B83;&#x5C31;&#x662F;&#x4E3A;&#x6B64;&#x800C;&#x8BBE;&#x8BA1;&#x7684;&#x3002;&#x4E0D;&#x8FC7;&#x5728;&#x90A3;&#x4E4B;&#x524D;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;&#x7684;Hooks&#x6BD4;&#x5982;<a href="https://www.robinwieruch.de/react-hooks-fetch-data/" rel="nofollow noopener noreferrer">&#x8FD9;&#x513F;&#x63D0;&#x5230;&#x7684;</a>&#x662F;&#x590D;&#x7528;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x903B;&#x8F91;&#x5F88;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x3002;</p><h2 id="%E5%9C%A8%E7%BB%93%E6%9D%9F%E5%89%8D">&#x5728;&#x7ED3;&#x675F;&#x524D;</h2><p>&#x73B0;&#x5728;&#x4F60;&#x5DEE;&#x4E0D;&#x591A;&#x77E5;&#x9053;&#x4E86;&#x6211;&#x5173;&#x4E8E;&#x5982;&#x4F55;&#x4F7F;&#x7528;effects&#x7684;&#x6240;&#x6709;&#x77E5;&#x8BC6;&#xFF0C;&#x53EF;&#x4EE5;&#x68C0;&#x67E5;&#x4E00;&#x4E0B;&#x5F00;&#x5934;&#x7684;<a href="https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/#tldr">TLDR</a>&#x3002;&#x4F60;&#x73B0;&#x5728;&#x89C9;&#x5F97;&#x5B83;&#x8BF4;&#x5F97;&#x6709;&#x9053;&#x7406;&#x5417;&#xFF1F;&#x6211;&#x6709;&#x9057;&#x6F0F;&#x4EC0;&#x4E48;&#x5417;&#xFF1F;&#xFF08;&#x6211;&#x7684;&#x7EB8;&#x8FD8;&#x6CA1;&#x6709;&#x5199;&#x5B8C;&#xFF01;&#xFF09;</p>]]></content:encoded></item><item><title><![CDATA[带你深度解锁Webpack系列(优化篇)]]></title><description><![CDATA[随着项目越来越大，构建速度可能会越来越慢，构建出来的js的体积也越来越大，此时就需要对 Webpack 的配置进行优化。]]></description><link>http://blog.zhoushoujian.com/webpack/</link><guid isPermaLink="false">618fd6d9b518235c786017c8</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Blog of shoujian]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:16:41 GMT</pubDate><media:content url="http://blog.zhoushoujian.com/content/images/2021/11/writing-posts-with-ghost.png" medium="image"/><content:encoded><![CDATA[<img src="http://blog.zhoushoujian.com/content/images/2021/11/writing-posts-with-ghost.png" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)"><p>&#x968F;&#x7740;&#x9879;&#x76EE;&#x8D8A;&#x6765;&#x8D8A;&#x5927;&#xFF0C;&#x6784;&#x5EFA;&#x901F;&#x5EA6;&#x53EF;&#x80FD;&#x4F1A;&#x8D8A;&#x6765;&#x8D8A;&#x6162;&#xFF0C;&#x6784;&#x5EFA;&#x51FA;&#x6765;&#x7684;js&#x7684;&#x4F53;&#x79EF;&#x4E5F;&#x8D8A;&#x6765;&#x8D8A;&#x5927;&#xFF0C;&#x6B64;&#x65F6;&#x5C31;&#x9700;&#x8981;&#x5BF9; Webpack &#x7684;&#x914D;&#x7F6E;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3002;</p><p>&#x672C;&#x6587;&#x7F57;&#x5217;&#x51FA;&#x4E86;&#x5341;&#x591A;&#x79CD;&#x4F18;&#x5316;&#x65B9;&#x5F0F;&#xFF0C;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x7ED3;&#x5408;&#x81EA;&#x5DF1;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x9009;&#x62E9;&#x9002;&#x5F53;&#x7684;&#x65B9;&#x5F0F;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3002;&#x8FD9;&#x4E9B; Webpack &#x63D2;&#x4EF6;&#x7684;&#x6E90;&#x7801;&#x6211;&#x5927;&#x591A;&#x4E5F;&#x6CA1;&#x6709;&#x770B;&#x8FC7;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x7ED3;&#x5408; Webpack &#x5B98;&#x65B9;&#x6587;&#x6863;&#x4EE5;&#x53CA;&#x9879;&#x76EE;&#x5B9E;&#x8DF5;&#xFF0C;&#x5E76;&#x4E14;&#x82B1;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x65F6;&#x95F4;&#x9A8C;&#x8BC1;&#x540E;&#x8F93;&#x51FA;&#x4E86;&#x672C;&#x6587;&#xFF0C;&#x5982;&#x679C;&#x6587;&#x4E2D;&#x6709;&#x9519;&#x8BEF;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x6B22;&#x8FCE;&#x5728;&#x8BC4;&#x8BBA;&#x533A;&#x6307;&#x6B63;&#x3002;</p><p>&#x9274;&#x4E8E;&#x524D;&#x7AEF;&#x6280;&#x672F;&#x53D8;&#x66F4;&#x8FC5;&#x901F;&#xFF0C;&#x796D;&#x51FA;&#x672C;&#x7BC7;&#x6587;&#x7AE0;&#x57FA;&#x4E8E; Webpack &#x7684;&#x7248;&#x672C;&#x53F7;:</p><pre><code>&#x251C;&#x2500;&#x2500;&#xA0;webpack@4.41.5&#xA0;
&#x2514;&#x2500;&#x2500;&#xA0;webpack-cli@3.3.10&#xA0;</code></pre><p>&#x672C;&#x6587;&#x5BF9;&#x5E94;&#x7684;&#x9879;&#x76EE;&#x5730;&#x5740;(&#x7F16;&#x5199;&#x672C;&#x6587;&#x65F6;&#x4F7F;&#x7528;)&#x4F9B;&#x53C2;&#x8003;&#xFF1A;<br>https://github.com/YvetteLau/webpack/tree/master/webpack-optimize</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/64ed9d6f4d3745be8ffa4c050c671156?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><h3 id="%E9%87%8F%E5%8C%96"><strong>&#x91CF;&#x5316;</strong></h3><p>&#x6709;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x4EE5;&#x4E3A;&#x7684;&#x4F18;&#x5316;&#x662F;&#x8D1F;&#x4F18;&#x5316;&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4E00;&#x4E2A;&#x91CF;&#x5316;&#x7684;&#x6307;&#x6807;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x524D;&#x540E;&#x5BF9;&#x6BD4;&#xFF0C;&#x90A3;&#x5C06;&#x4F1A;&#x662F;&#x518D;&#x597D;&#x4E0D;&#x8FC7;&#x7684;&#x4E00;&#x4EF6;&#x4E8B;&#x3002;</p><p><br>speed-measure-webpack-plugin &#x63D2;&#x4EF6;&#x53EF;&#x4EE5;&#x6D4B;&#x91CF;&#x5404;&#x4E2A;&#x63D2;&#x4EF6;&#x548C;loader&#x6240;&#x82B1;&#x8D39;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x4F7F;&#x7528;&#x4E4B;&#x540E;&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#xFF0C;&#x4F1A;&#x5F97;&#x5230;&#x7C7B;&#x4F3C;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x7684;&#x4FE1;&#x606F;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/41a521a93e7248ea99f351c4f176f5cb?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>&#x5BF9;&#x6BD4;&#x524D;&#x540E;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6765;&#x786E;&#x5B9A;&#x4F18;&#x5316;&#x7684;&#x6548;&#x679C;&#x3002;</p><p><br>speed-measure-webpack-plugin &#x7684;&#x4F7F;&#x7528;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x7528;&#x5176;&#x6765;&#x5305;&#x88F9; Webpack &#x7684;&#x914D;&#x7F6E;:</p><pre><code>//webpack.config.js
const&#xA0;SpeedMeasurePlugin&#xA0;=&#xA0;require(&quot;speed-measure-webpack-plugin&quot;);
const&#xA0;smp&#xA0;=&#xA0;new&#xA0;SpeedMeasurePlugin();

const&#xA0;config&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...webpack&#x914D;&#x7F6E;
}

module.exports&#xA0;=&#xA0;smp.wrap(config);</code></pre><h3 id="1excludeinclude"><strong>1.exclude/include</strong></h3><p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; exclude&#x3001;include &#x914D;&#x7F6E;&#x6765;&#x786E;&#x4FDD;&#x8F6C;&#x8BD1;&#x5C3D;&#x53EF;&#x80FD;&#x5C11;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;exclude &#x6307;&#x5B9A;&#x8981;&#x6392;&#x9664;&#x7684;&#x6587;&#x4EF6;&#xFF0C;include &#x6307;&#x5B9A;&#x8981;&#x5305;&#x542B;&#x7684;&#x6587;&#x4EF6;&#x3002;</p><p>exclude &#x7684;&#x4F18;&#x5148;&#x7EA7;&#x9AD8;&#x4E8E; include&#xFF0C;&#x5728; include &#x548C; exclude &#x4E2D;&#x4F7F;&#x7528;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;&#x6570;&#x7EC4;&#xFF0C;&#x5C3D;&#x91CF;&#x907F;&#x514D; exclude&#xFF0C;&#x66F4;&#x503E;&#x5411;&#x4E8E;&#x4F7F;&#x7528; include&#x3002;</p><pre><code>//webpack.config.js
const&#xA0;path&#xA0;=&#xA0;require(&apos;path&apos;);
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;module:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;rules:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/\.js[x]?$/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;[&apos;babel-loader&apos;],
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;include:&#xA0;[path.resolve(__dirname,&#xA0;&apos;src&apos;)]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;},
}</code></pre><p>&#x4E0B;&#x56FE;&#x662F;&#x6211;&#x672A;&#x914D;&#x7F6E; include &#x548C;&#x914D;&#x7F6E;&#x4E86; include &#x7684;&#x6784;&#x5EFA;&#x7ED3;&#x679C;&#x5BF9;&#x6BD4;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/751f90dda9ba4ab7851f3f9fb9a646a3?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><h3 id="2-cache-loader"><strong>2. cache-loader</strong></h3><p>&#x5728;&#x4E00;&#x4E9B;&#x6027;&#x80FD;&#x5F00;&#x9500;&#x8F83;&#x5927;&#x7684; loader &#x4E4B;&#x524D;&#x6DFB;&#x52A0; cache-loader&#xFF0C;&#x5C06;&#x7ED3;&#x679C;&#x7F13;&#x5B58;&#x4E2D;&#x78C1;&#x76D8;&#x4E2D;&#x3002;&#x9ED8;&#x8BA4;&#x4FDD;&#x5B58;&#x5728;<br>node_modueles/.cache/cache-loader &#x76EE;&#x5F55;&#x4E0B;&#x3002;</p><p>&#x9996;&#x5148;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#xFF1A;</p><pre><code>npm&#xA0;install&#xA0;cache-loader&#xA0;-D</code></pre><p>cache-loader &#x7684;&#x914D;&#x7F6E;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x653E;&#x5728;&#x5176;&#x4ED6; loader &#x4E4B;&#x524D;&#x5373;&#x53EF;&#x3002;&#x4FEE;&#x6539;Webpack &#x7684;&#x914D;&#x7F6E;&#x5982;&#x4E0B;:</p><pre><code>module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...

&#xA0;&#xA0;&#xA0;&#xA0;module:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x6211;&#x7684;&#x9879;&#x76EE;&#x4E2D;,babel-loader&#x8017;&#x65F6;&#x6BD4;&#x8F83;&#x957F;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x7ED9;&#x5B83;&#x914D;&#x7F6E;&#x4E86;`cache-loader`
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;rules:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/\.jsx?$/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;[&apos;cache-loader&apos;,&apos;babel-loader&apos;]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>&#x5982;&#x679C;&#x4F60;&#x8DDF;&#x6211;&#x4E00;&#x6837;&#xFF0C;&#x53EA;&#x6253;&#x7B97;&#x7ED9; babel-loader &#x914D;&#x7F6E; cache &#x7684;&#x8BDD;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x4F7F;&#x7528; cache-loader&#xFF0C;&#x7ED9; babel-loader &#x589E;&#x52A0;&#x9009;&#x9879; cacheDirectory&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/4304d57af6824598ad03947e577fa4e0?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>cacheDirectory&#xFF1A;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; false&#x3002;&#x5F53;&#x6709;&#x8BBE;&#x7F6E;&#x65F6;&#xFF0C;&#x6307;&#x5B9A;&#x7684;&#x76EE;&#x5F55;&#x5C06;&#x7528;&#x6765;&#x7F13;&#x5B58; loader &#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x3002;&#x4E4B;&#x540E;&#x7684; Webpack &#x6784;&#x5EFA;&#xFF0C;&#x5C06;&#x4F1A;&#x5C1D;&#x8BD5;&#x8BFB;&#x53D6;&#x7F13;&#x5B58;&#xFF0C;&#x6765;&#x907F;&#x514D;&#x5728;&#x6BCF;&#x6B21;&#x6267;&#x884C;&#x65F6;&#xFF0C;&#x53EF;&#x80FD;&#x4EA7;&#x751F;&#x7684;&#x3001;&#x9AD8;&#x6027;&#x80FD;&#x6D88;&#x8017;&#x7684; Babel &#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x8FC7;&#x7A0B;&#x3002;&#x8BBE;&#x7F6E;&#x7A7A;&#x503C;&#x6216;&#x8005; true &#x7684;&#x8BDD;&#xFF0C;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x7F13;&#x5B58;&#x76EE;&#x5F55;&#xFF1A;<br>node_modules/.cache/babel-loader&#x3002;&#x5F00;&#x542F; babel-loader&#x7684;&#x7F13;&#x5B58;&#x548C;&#x914D;&#x7F6E; cache-loader&#xFF0C;&#x6211;&#x6BD4;&#x5BF9;&#x4E86;&#x4E0B;&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#x95F4;&#x5F88;&#x63A5;&#x8FD1;&#x3002;</p><h3 id="3happypack"><strong>3.happypack</strong></h3><p>&#x7531;&#x4E8E;&#x6709;&#x5927;&#x91CF;&#x6587;&#x4EF6;&#x9700;&#x8981;&#x89E3;&#x6790;&#x548C;&#x5904;&#x7406;&#xFF0C;&#x6784;&#x5EFA;&#x662F;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x548C;&#x8BA1;&#x7B97;&#x5BC6;&#x96C6;&#x578B;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5F53;&#x6587;&#x4EF6;&#x6570;&#x91CF;&#x53D8;&#x591A;&#x540E;&#xFF0C;Webpack &#x6784;&#x5EFA;&#x6162;&#x7684;&#x95EE;&#x9898;&#x4F1A;&#x663E;&#x5F97;&#x4E25;&#x91CD;&#x3002;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x548C;&#x8BA1;&#x7B97;&#x64CD;&#x4F5C;&#x662F;&#x65E0;&#x6CD5;&#x907F;&#x514D;&#x7684;&#xFF0C;&#x90A3;&#x80FD;&#x4E0D;&#x80FD;&#x8BA9; Webpack &#x540C;&#x4E00;&#x65F6;&#x523B;&#x5904;&#x7406;&#x591A;&#x4E2A;&#x4EFB;&#x52A1;&#xFF0C;&#x53D1;&#x6325;&#x591A;&#x6838; CPU &#x7535;&#x8111;&#x7684;&#x5A01;&#x529B;&#xFF0C;&#x4EE5;&#x63D0;&#x5347;&#x6784;&#x5EFA;&#x901F;&#x5EA6;&#x5462;&#xFF1F;</p><p>HappyPack &#x5C31;&#x80FD;&#x8BA9; Webpack &#x505A;&#x5230;&#x8FD9;&#x70B9;&#xFF0C;&#x5B83;&#x628A;&#x4EFB;&#x52A1;&#x5206;&#x89E3;&#x7ED9;&#x591A;&#x4E2A;&#x5B50;&#x8FDB;&#x7A0B;&#x53BB;&#x5E76;&#x53D1;&#x7684;&#x6267;&#x884C;&#xFF0C;&#x5B50;&#x8FDB;&#x7A0B;&#x5904;&#x7406;&#x5B8C;&#x540E;&#x518D;&#x628A;&#x7ED3;&#x679C;&#x53D1;&#x9001;&#x7ED9;&#x4E3B;&#x8FDB;&#x7A0B;&#x3002;</p><p>&#x9996;&#x5148;&#x9700;&#x8981;&#x5B89;&#x88C5; happypack:</p><pre><code>npm&#xA0;install&#xA0;happypack&#xA0;-D</code></pre><p>&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x6587;&#x4EF6;:</p><pre><code>const&#xA0;Happypack&#xA0;=&#xA0;require(&apos;happypack&apos;);
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;module:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;rules:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/\.js[x]?$/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;&apos;Happypack/loader?id=js&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;include:&#xA0;[path.resolve(__dirname,&#xA0;&apos;src&apos;)]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/\.css$/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;&apos;Happypack/loader?id=css&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;include:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;path.resolve(__dirname,&#xA0;&apos;src&apos;),
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;path.resolve(__dirname,&#xA0;&apos;node_modules&apos;,&#xA0;&apos;bootstrap&apos;,&#xA0;&apos;dist&apos;)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;Happypack({
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;id:&#xA0;&apos;js&apos;,&#xA0;//&#x548C;rule&#x4E2D;&#x7684;id=js&#x5BF9;&#x5E94;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x5C06;&#x4E4B;&#x524D;&#xA0;rule&#xA0;&#x4E2D;&#x7684;&#xA0;loader&#xA0;&#x5728;&#x6B64;&#x914D;&#x7F6E;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;[&apos;babel-loader&apos;]&#xA0;//&#x5FC5;&#x987B;&#x662F;&#x6570;&#x7EC4;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}),
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;Happypack({
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;id:&#xA0;&apos;css&apos;,//&#x548C;rule&#x4E2D;&#x7684;id=css&#x5BF9;&#x5E94;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;[&apos;style-loader&apos;,&#xA0;&apos;css-loader&apos;,&apos;postcss-loader&apos;],
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;})
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>happypack &#x9ED8;&#x8BA4;&#x5F00;&#x542F; CPU&#x6838;&#x6570; - 1 &#x4E2A;&#x8FDB;&#x7A0B;&#xFF0C;&#x5F53;&#x7136;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F20;&#x9012; threads &#x7ED9; Happypack&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/aee471f21c78432980de441534075255?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>&#x8BF4;&#x660E;&#xFF1A;&#x5F53; postcss-loader &#x914D;&#x7F6E;&#x5728; Happypack &#x4E2D;&#xFF0C;&#x5FC5;&#x987B;&#x8981;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x521B;&#x5EFA; postcss.config.js&#x3002;</p><pre><code>//postcss.config.js
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;require(&apos;autoprefixer&apos;)()
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>&#x5426;&#x5219;&#xFF0C;&#x4F1A;&#x629B;&#x51FA;&#x9519;&#x8BEF;: Error: No PostCSS Config found</p><p>&#x53E6;&#x5916;&#xFF0C;&#x5F53;&#x4F60;&#x7684;&#x9879;&#x76EE;&#x4E0D;&#x662F;&#x5F88;&#x590D;&#x6742;&#x65F6;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x914D;&#x7F6E; happypack&#xFF0C;&#x56E0;&#x4E3A;&#x8FDB;&#x7A0B;&#x7684;&#x5206;&#x914D;&#x548C;&#x7BA1;&#x7406;&#x4E5F;&#x9700;&#x8981;&#x65F6;&#x95F4;&#xFF0C;&#x5E76;&#x4E0D;&#x80FD;&#x6709;&#x6548;&#x63D0;&#x5347;&#x6784;&#x5EFA;&#x901F;&#x5EA6;&#xFF0C;&#x751A;&#x81F3;&#x4F1A;&#x53D8;&#x6162;&#x3002;</p><h3 id="4thread-loader"><strong>4.thread-loader</strong></h3><p>&#x9664;&#x4E86;&#x4F7F;&#x7528; Happypack &#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; thread-loader &#xFF0C;&#x628A; thread-loader &#x653E;&#x7F6E;&#x5728;&#x5176;&#x5B83; loader &#x4E4B;&#x524D;&#xFF0C;&#x90A3;&#x4E48;&#x653E;&#x7F6E;&#x5728;&#x8FD9;&#x4E2A; loader &#x4E4B;&#x540E;&#x7684; loader &#x5C31;&#x4F1A;&#x5728;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684; worker &#x6C60;&#x4E2D;&#x8FD0;&#x884C;&#x3002;</p><p>&#x5728; worker &#x6C60;(worker pool)&#x4E2D;&#x8FD0;&#x884C;&#x7684; loader &#x662F;&#x53D7;&#x5230;&#x9650;&#x5236;&#x7684;&#x3002;&#x4F8B;&#x5982;&#xFF1A;</p><ul><li>&#x8FD9;&#x4E9B; loader &#x4E0D;&#x80FD;&#x4EA7;&#x751F;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x3002;</li><li>&#x8FD9;&#x4E9B; loader &#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x5B9A;&#x5236;&#x7684; loader API&#xFF08;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x901A;&#x8FC7;&#x63D2;&#x4EF6;&#xFF09;&#x3002;</li><li>&#x8FD9;&#x4E9B; loader &#x65E0;&#x6CD5;&#x83B7;&#x53D6; webpack &#x7684;&#x9009;&#x9879;&#x8BBE;&#x7F6E;&#x3002;</li></ul><p>&#x9996;&#x5148;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#xFF1A;</p><pre><code>npm&#xA0;install&#xA0;thread-loader&#xA0;-D</code></pre><p>&#x4FEE;&#x6539;&#x914D;&#x7F6E;:</p><pre><code>module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;module:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x6211;&#x7684;&#x9879;&#x76EE;&#x4E2D;,babel-loader&#x8017;&#x65F6;&#x6BD4;&#x8F83;&#x957F;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x7ED9;&#x5B83;&#x914D;&#x7F6E;&#xA0;thread-loader
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;rules:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/\.jsx?$/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;use:&#xA0;[&apos;thread-loader&apos;,&#xA0;&apos;cache-loader&apos;,&#xA0;&apos;babel-loader&apos;]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>thread-loader &#x548C; Happypack &#x6211;&#x5BF9;&#x6BD4;&#x4E86;&#x4E00;&#x4E0B;&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#x95F4;&#x57FA;&#x672C;&#x6CA1;&#x4EC0;&#x4E48;&#x5DEE;&#x522B;&#x3002;&#x4E0D;&#x8FC7; thread-loader &#x914D;&#x7F6E;&#x8D77;&#x6765;&#x4E3A;&#x7B80;&#x5355;&#x3002;</p><h3 id="5%E5%BC%80%E5%90%AF-js-%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%8E%8B%E7%BC%A9"><strong>5.&#x5F00;&#x542F; JS &#x591A;&#x8FDB;&#x7A0B;&#x538B;&#x7F29;</strong></h3><p>&#x867D;&#x7136;&#x5F88;&#x591A; webpack &#x4F18;&#x5316;&#x7684;&#x6587;&#x7AE0;&#x4E0A;&#x4F1A;&#x63D0;&#x53CA;&#x591A;&#x8FDB;&#x7A0B;&#x538B;&#x7F29;&#x7684;&#x4F18;&#x5316;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;<br>webpack-parallel-uglify-plugin &#x6216;&#x8005;&#x662F; uglifyjs-webpack-plugin &#x914D;&#x7F6E; parallel&#x3002;&#x4E0D;&#x8FC7;&#x8FD9;&#x91CC;&#x6211;&#x8981;&#x8BF4;&#x4E00;&#x53E5;&#xFF0C;&#x6CA1;&#x5FC5;&#x8981;&#x5355;&#x72EC;&#x5B89;&#x88C5;&#x8FD9;&#x4E9B;&#x63D2;&#x4EF6;&#xFF0C;&#x5B83;&#x4EEC;&#x5E76;&#x4E0D;&#x4F1A;&#x8BA9;&#x4F60;&#x7684; Webpack &#x6784;&#x5EFA;&#x901F;&#x5EA6;&#x63D0;&#x5347;&#x3002;</p><p>&#x5F53;&#x524D; Webpack &#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x7684;&#x662F; TerserWebpackPlugin&#xFF0C;&#x9ED8;&#x8BA4;&#x5C31;&#x5F00;&#x542F;&#x4E86;&#x591A;&#x8FDB;&#x7A0B;&#x548C;&#x7F13;&#x5B58;&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#xFF0C;&#x4F60;&#x7684;&#x9879;&#x76EE;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x5230; terser &#x7684;&#x7F13;&#x5B58;&#x6587;&#x4EF6;<br>node_modules/.cache/terser-webpack-plugin&#x3002;</p><h3 id="6hardsourcewebpackplugin"><strong>6.HardSourceWebpackPlugin</strong></h3><p>HardSourceWebpackPlugin &#x4E3A;&#x6A21;&#x5757;&#x63D0;&#x4F9B;&#x4E2D;&#x95F4;&#x7F13;&#x5B58;&#xFF0C;&#x7F13;&#x5B58;&#x9ED8;&#x8BA4;&#x7684;&#x5B58;&#x653E;&#x8DEF;&#x5F84;&#x662F;:<br>node_modules/.cache/hard-source&#x3002;</p><p>&#x914D;&#x7F6E;<br>hard-source-webpack-plugin&#xFF0C;&#x9996;&#x6B21;&#x6784;&#x5EFA;&#x65F6;&#x95F4;&#x6CA1;&#x6709;&#x592A;&#x5927;&#x53D8;&#x5316;&#xFF0C;&#x4F46;&#x662F;&#x7B2C;&#x4E8C;&#x6B21;&#x5F00;&#x59CB;&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#x95F4;&#x5927;&#x7EA6;&#x53EF;&#x4EE5;&#x8282;&#x7EA6; 80%&#x3002;</p><p>&#x9996;&#x5148;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;:</p><pre><code>npm&#xA0;install&#xA0;hard-source-webpack-plugin&#xA0;-D</code></pre><p>&#x4FEE;&#x6539; webpack &#x7684;&#x914D;&#x7F6E;&#xFF1A;</p><pre><code>//webpack.config.js
var&#xA0;HardSourceWebpackPlugin&#xA0;=&#xA0;require(&apos;hard-source-webpack-plugin&apos;);
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;HardSourceWebpackPlugin()
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/a0f16ad785ea47eb8b5ea98f4b2e7f73?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>&#x7528;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#x9879;&#x76EE;&#x6D4B;&#x8BD5;&#x4E86;&#x4E0B;&#xFF0C;&#x914D;&#x7F6E;&#x4E86; HardSourceWebpackPlugin&#xFF0C;&#x6784;&#x5EFA;&#x65F6;&#x95F4;&#x4ECE; 8S &#x5DE6;&#x53F3;&#x964D;&#x5230;&#x4E86; 2S &#x5DE6;&#x53F3;&#x3002;</p><p>HardSourceWebpackPlugin&#x6587;&#x6863;&#x4E2D; &#x5217;&#x51FA;&#x4E86;&#x4E00;&#x4E9B;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x9047;&#x5230;&#x7684;&#x95EE;&#x9898;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x89E3;&#x51B3;&#xFF0C;&#x4F8B;&#x5982;&#x70ED;&#x66F4;&#x65B0;&#x5931;&#x6548;&#xFF0C;&#x6216;&#x8005;&#x67D0;&#x4E9B;&#x914D;&#x7F6E;&#x4E0D;&#x751F;&#x6548;&#x7B49;&#x3002;</p><h3 id="7noparse"><strong>7.noParse</strong></h3><p>&#x5982;&#x679C;&#x4E00;&#x4E9B;&#x7B2C;&#x4E09;&#x65B9;&#x6A21;&#x5757;&#x6CA1;&#x6709;AMD/CommonJS&#x89C4;&#x8303;&#x7248;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; noParse &#x6765;&#x6807;&#x8BC6;&#x8FD9;&#x4E2A;&#x6A21;&#x5757;&#xFF0C;&#x8FD9;&#x6837; Webpack &#x4F1A;&#x5F15;&#x5165;&#x8FD9;&#x4E9B;&#x6A21;&#x5757;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x8FDB;&#x884C;&#x8F6C;&#x5316;&#x548C;&#x89E3;&#x6790;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x5347; Webpack &#x7684;&#x6784;&#x5EFA;&#x6027;&#x80FD; &#xFF0C;&#x4F8B;&#x5982;&#xFF1A;jquery &#x3001;lodash&#x3002;</p><p>noParse &#x5C5E;&#x6027;&#x7684;&#x503C;&#x662F;&#x4E00;&#x4E2A;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x6216;&#x8005;&#x662F;&#x4E00;&#x4E2A; function&#x3002;</p><pre><code>//webpack.config.js
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;module:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;noParse:&#xA0;/jquery|lodash/
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>&#x6211;&#x5F53;&#x524D;&#x7684; webpack-optimize &#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x6CA1;&#x6709;&#x4F7F;&#x7528; jquery &#x6216;&#x8005;&#x662F; lodash&#x3002;</p><p>&#x56E0;&#x6B64;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x9879;&#x76EE;&#x6D4B;&#x8BD5;&#xFF0C;&#x53EA;&#x5F15;&#x5165; jquery &#x548C; loadsh&#xFF0C;&#x7136;&#x540E;&#x914D;&#x7F6E; noParse &#x548C;&#x4E0D;&#x914D;&#x7F6E; noParse&#xFF0C;&#x5206;&#x522B;&#x6784;&#x5EFA;&#x6BD4;&#x5BF9;&#x65F6;&#x95F4;&#x3002;</p><p>&#x914D;&#x7F6E;noParse &#x524D;&#xFF0C;&#x6784;&#x5EFA;&#x9700;&#x8981; 2392ms&#x3002;&#x914D;&#x7F6E;&#x4E86; noParse &#x4E4B;&#x540E;&#xFF0C;&#x6784;&#x5EFA;&#x9700;&#x8981; 1613ms&#x3002;&#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;&#x5230;&#x4E86;&#x4E0D;&#x9700;&#x8981;&#x89E3;&#x6790;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x4F9D;&#x8D56;&#xFF0C;&#x90A3;&#x4E48;&#x914D;&#x7F6E; noParse &#x5F88;&#x663E;&#x7136;&#x662F;&#x4E00;&#x5B9A;&#x4F1A;&#x8D77;&#x5230;&#x4F18;&#x5316;&#x4F5C;&#x7528;&#x7684;&#x3002;</p><h3 id="8resolve"><strong>8.resolve</strong></h3><p>resolve &#x914D;&#x7F6E; webpack &#x5982;&#x4F55;&#x5BFB;&#x627E;&#x6A21;&#x5757;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x786E;&#x5B9A;&#x6A21;&#x5757;&#x90FD;&#x4ECE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x7684; node_modules &#x4E2D;&#x67E5;&#x627E;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x914D;&#x7F6E;:</p><pre><code>//webpack.config.js
const&#xA0;path&#xA0;=&#xA0;require(&apos;path&apos;);
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;resolve:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;modules:&#xA0;[path.resolve(__dirname,&#xA0;&apos;node_modules&apos;)],
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>&#x9700;&#x8981;&#x8BB0;&#x4F4F;&#x7684;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x914D;&#x7F6E;&#x4E86;&#x4E0A;&#x8FF0;&#x7684; resolve.moudles &#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x4F60;&#x7684;&#x4F9D;&#x8D56;&#x4E2D;&#x8FD8;&#x5B58;&#x5728; node_modules &#x76EE;&#x5F55;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#xFF0C;&#x5BF9;&#x5E94;&#x7684;&#x6587;&#x4EF6;&#x660E;&#x660E;&#x5728;&#xFF0C;&#x4F46;&#x662F;&#x5374;&#x63D0;&#x793A;&#x627E;&#x4E0D;&#x5230;&#x3002;&#x56E0;&#x6B64;&#x5462;&#xFF0C;&#x4E2A;&#x4EBA;&#x4E0D;&#x63A8;&#x8350;&#x914D;&#x7F6E;&#x8FD9;&#x4E2A;&#x3002;&#x5982;&#x679C;&#x5176;&#x4ED6;&#x540C;&#x4E8B;&#x4E0D;&#x719F;&#x6089;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#xFF0C;&#x9047;&#x5230;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x65F6;&#xFF0C;&#x4F1A;&#x6478;&#x4E0D;&#x7740;&#x5934;&#x8111;&#x3002;</p><p>&#x53E6;&#x5916;&#xFF0C;resolve &#x7684; extensions &#x914D;&#x7F6E;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F; [&apos;.js&apos;, &apos;.json&apos;]&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x8981;&#x5BF9;&#x5B83;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#xFF0C;&#x8BB0;&#x4F4F;&#x5C06;&#x9891;&#x7387;&#x6700;&#x9AD8;&#x7684;&#x540E;&#x7F00;&#x653E;&#x5728;&#x7B2C;&#x4E00;&#x4F4D;&#xFF0C;&#x5E76;&#x4E14;&#x63A7;&#x5236;&#x5217;&#x8868;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x4EE5;&#x51CF;&#x5C11;&#x5C1D;&#x8BD5;&#x6B21;&#x6570;&#x3002;</p><p>&#x672C;&#x9879;&#x76EE;&#x8F83;&#x5C0F;&#xFF0C;&#x56E0;&#x6B64;&#x6D4B;&#x8BD5;&#x65F6;&#xFF0C;&#x6B64;&#x5904;&#x4F18;&#x5316;&#x6548;&#x679C;&#x4E0D;&#x660E;&#x663E;&#x3002;</p><h3 id="9ignoreplugin"><strong>9.IgnorePlugin</strong></h3><p>webpack &#x7684;&#x5185;&#x7F6E;&#x63D2;&#x4EF6;&#xFF0C;&#x4F5C;&#x7528;&#x662F;&#x5FFD;&#x7565;&#x7B2C;&#x4E09;&#x65B9;&#x5305;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#x3002;</p><p>&#x4F8B;&#x5982;: moment (2.24.0&#x7248;&#x672C;) &#x4F1A;&#x5C06;&#x6240;&#x6709;&#x672C;&#x5730;&#x5316;&#x5185;&#x5BB9;&#x548C;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x4E00;&#x8D77;&#x6253;&#x5305;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; IgnorePlugin &#x5728;&#x6253;&#x5305;&#x65F6;&#x5FFD;&#x7565;&#x672C;&#x5730;&#x5316;&#x5185;&#x5BB9;&#x3002;</p><pre><code>//webpack.config.js
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x5FFD;&#x7565;&#xA0;moment&#xA0;&#x4E0B;&#x7684;&#xA0;./locale&#xA0;&#x76EE;&#x5F55;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;webpack.IgnorePlugin(/^\.\/locale$/,&#xA0;/moment$/)
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>&#x5728;&#x4F7F;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x8BED;&#x8A00;&#xFF0C;&#x90A3;&#x4E48;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x624B;&#x52A8;&#x7684;&#x53BB;&#x5F15;&#x5165;&#x8BED;&#x8A00;&#x5305;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x5F15;&#x5165;&#x4E2D;&#x6587;&#x8BED;&#x8A00;&#x5305;:</p><pre><code>import&#xA0;moment&#xA0;from&#xA0;&apos;moment&apos;;
import&#xA0;&apos;moment/locale/zh-cn&apos;;//&#xA0;&#x624B;&#x52A8;&#x5F15;&#x5165;</code></pre><p>index.js &#x4E2D;&#x53EA;&#x5F15;&#x5165; moment&#xFF0C;&#x6253;&#x5305;&#x51FA;&#x6765;&#x7684; bundle.js &#x5927;&#x5C0F;&#x4E3A; 263KB&#xFF0C;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x4E86; IgnorePlugin&#xFF0C;&#x5355;&#x72EC;&#x5F15;&#x5165; moment/locale/zh-cn&#xFF0C;&#x6784;&#x5EFA;&#x51FA;&#x6765;&#x7684;&#x5305;&#x5927;&#x5C0F;&#x4E3A; 55KB&#x3002;</p><h3 id="10externals"><strong>10.externals</strong></h3><p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;JS&#x6587;&#x4EF6;&#x5B58;&#x50A8;&#x5728; CDN &#x4E0A;(&#x51CF;&#x5C11; Webpack&#x6253;&#x5305;&#x51FA;&#x6765;&#x7684; js &#x4F53;&#x79EF;)&#xFF0C;&#x5728; index.html &#x4E2D;&#x901A;&#x8FC7; &lt;script&gt; &#x6807;&#x7B7E;&#x5F15;&#x5165;&#xFF0C;&#x5982;:</p><pre><code>&lt;!DOCTYPE&#xA0;html&gt;
&lt;html&#xA0;lang=&quot;en&quot;&gt;
&lt;head&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;meta&#xA0;charset=&quot;UTF-8&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;meta&#xA0;name=&quot;viewport&quot;&#xA0;content=&quot;width=device-width,&#xA0;initial-scale=1.0&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;meta&#xA0;http-equiv=&quot;X-UA-Compatible&quot;&#xA0;content=&quot;ie=edge&quot;&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;div&#xA0;id=&quot;root&quot;&gt;root&lt;/div&gt;
&#xA0;&#xA0;&#xA0;&#xA0;&lt;script&#xA0;src=&quot;http://libs.baidu.com/jquery/2.0.0/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#xFF0C;&#x4ECD;&#x7136;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; import &#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x5F15;&#x7528;(&#x5982; import $ from &apos;jquery&apos;)&#xFF0C;&#x5E76;&#x4E14;&#x5E0C;&#x671B; webpack &#x4E0D;&#x4F1A;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x6253;&#x5305;&#xFF0C;&#x6B64;&#x65F6;&#x5C31;&#x53EF;&#x4EE5;&#x914D;&#x7F6E; externals&#x3002;</p><pre><code>//webpack.config.js
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;externals:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//jquery&#x901A;&#x8FC7;script&#x5F15;&#x5165;&#x4E4B;&#x540E;&#xFF0C;&#x5168;&#x5C40;&#x4E2D;&#x5373;&#x6709;&#x4E86;&#xA0;jQuery&#xA0;&#x53D8;&#x91CF;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&apos;jquery&apos;:&#xA0;&apos;jQuery&apos;
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><h3 id="11dllplugin"><strong>11.DllPlugin</strong></h3><p>&#x6709;&#x4E9B;&#x65F6;&#x5019;&#xFF0C;&#x5982;&#x679C;&#x6240;&#x6709;&#x7684;JS&#x6587;&#x4EF6;&#x90FD;&#x6253;&#x6210;&#x4E00;&#x4E2A;JS&#x6587;&#x4EF6;&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x6700;&#x7EC8;&#x751F;&#x6210;&#x7684;JS&#x6587;&#x4EF6;&#x5F88;&#x5927;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x8981;&#x8003;&#x8651;&#x62C6;&#x5206; bundles&#x3002;</p><p>DllPlugin &#x548C; DLLReferencePlugin &#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x62C6;&#x5206; bundles&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x5927;&#x5927;&#x63D0;&#x5347;&#x6784;&#x5EFA;&#x901F;&#x5EA6;&#xFF0C;DllPlugin &#x548C; DLLReferencePlugin &#x90FD;&#x662F; webpack &#x7684;&#x5185;&#x7F6E;&#x6A21;&#x5757;&#x3002;</p><p>&#x6211;&#x4EEC;&#x4F7F;&#x7528; DllPlugin &#x5C06;&#x4E0D;&#x4F1A;&#x9891;&#x7E41;&#x66F4;&#x65B0;&#x7684;&#x5E93;&#x8FDB;&#x884C;&#x7F16;&#x8BD1;&#xFF0C;&#x5F53;&#x8FD9;&#x4E9B;&#x4F9D;&#x8D56;&#x7684;&#x7248;&#x672C;&#x6CA1;&#x6709;&#x53D8;&#x5316;&#x65F6;&#xFF0C;&#x5C31;&#x4E0D;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x3002;&#x6211;&#x4EEC;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; webpack &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x6765;&#x4E13;&#x95E8;&#x7528;&#x4E8E;&#x7F16;&#x8BD1;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#xFF0C;&#x4F8B;&#x5982;&#x540D;&#x4E3A;: webpack.config.dll.js&#xFF0C;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x5C06; react &#x548C; react-dom &#x5355;&#x72EC;&#x6253;&#x5305;&#x6210;&#x4E00;&#x4E2A;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#x3002;</p><pre><code>//webpack.config.dll.js
const&#xA0;webpack&#xA0;=&#xA0;require(&apos;webpack&apos;);
const&#xA0;path&#xA0;=&#xA0;require(&apos;path&apos;);

module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;entry:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;react:&#xA0;[&apos;react&apos;,&#xA0;&apos;react-dom&apos;]
&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;mode:&#xA0;&apos;production&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;output:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;filename:&#xA0;&apos;[name].dll.[hash:6].js&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;path:&#xA0;path.resolve(__dirname,&#xA0;&apos;dist&apos;,&#xA0;&apos;dll&apos;),
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;library:&#xA0;&apos;[name]_dll&apos;&#xA0;//&#x66B4;&#x9732;&#x7ED9;&#x5916;&#x90E8;&#x4F7F;&#x7528;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//libraryTarget&#xA0;&#x6307;&#x5B9A;&#x5982;&#x4F55;&#x66B4;&#x9732;&#x5185;&#x5BB9;&#xFF0C;&#x7F3A;&#x7701;&#x65F6;&#x5C31;&#x662F;&#xA0;var
&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;webpack.DllPlugin({
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//name&#x548C;library&#x4E00;&#x81F4;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&apos;[name]_dll&apos;,&#xA0;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;path:&#xA0;path.resolve(__dirname,&#xA0;&apos;dist&apos;,&#xA0;&apos;dll&apos;,&#xA0;&apos;manifest.json&apos;)&#xA0;//manifest.json&#x7684;&#x751F;&#x6210;&#x8DEF;&#x5F84;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;})
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>&#x5728; package.json &#x7684; scripts &#x4E2D;&#x589E;&#x52A0;:</p><pre><code>{
&#xA0;&#xA0;&#xA0;&#xA0;&quot;scripts&quot;:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&quot;dev&quot;:&#xA0;&quot;NODE_ENV=development&#xA0;webpack-dev-server&quot;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&quot;build&quot;:&#xA0;&quot;NODE_ENV=production&#xA0;webpack&quot;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&quot;build:dll&quot;:&#xA0;&quot;webpack&#xA0;--config&#xA0;webpack.config.dll.js&quot;
&#xA0;&#xA0;&#xA0;&#xA0;},
}</code></pre><p>&#x6267;&#x884C; npm run build:all&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230; dist &#x76EE;&#x5F55;&#x5982;&#x4E0B;&#xFF0C;&#x4E4B;&#x6240;&#x4EE5;&#x5C06;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#x5355;&#x72EC;&#x653E;&#x5728; dll &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4E3A;&#x4E86;&#x4F7F;&#x7528; CleanWebpackPlugin &#x66F4;&#x4E3A;&#x65B9;&#x4FBF;&#x7684;&#x8FC7;&#x6EE4;&#x6389;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#x3002;</p><pre><code>dist
&#x2514;&#x2500;&#x2500;&#xA0;dll
&#xA0;&#xA0;&#xA0;&#xA0;&#x251C;&#x2500;&#x2500;&#xA0;manifest.json
&#xA0;&#xA0;&#xA0;&#xA0;&#x2514;&#x2500;&#x2500;&#xA0;react.dll.9dcd9d.js</code></pre><p>manifest.json &#x7528;&#x4E8E;&#x8BA9; DLLReferencePlugin &#x6620;&#x5C04;&#x5230;&#x76F8;&#x5173;&#x4F9D;&#x8D56;&#x4E0A;&#x3002;</p><p>&#x4FEE;&#x6539; webpack &#x7684;&#x4E3B;&#x914D;&#x7F6E;&#x6587;&#x4EF6;: webpack.config.js &#x7684;&#x914D;&#x7F6E;&#xFF1A;</p><pre><code>//webpack.config.js
const&#xA0;webpack&#xA0;=&#xA0;require(&apos;webpack&apos;);
const&#xA0;path&#xA0;=&#xA0;require(&apos;path&apos;);
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;devServer:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;contentBase:&#xA0;path.resolve(__dirname,&#xA0;&apos;dist&apos;)
&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;webpack.DllReferencePlugin({
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;manifest:&#xA0;path.resolve(__dirname,&#xA0;&apos;dist&apos;,&#xA0;&apos;dll&apos;,&#xA0;&apos;manifest.json&apos;)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}),
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;CleanWebpackPlugin({
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;cleanOnceBeforeBuildPatterns:&#xA0;[&apos;**/*&apos;,&#xA0;&apos;!dll&apos;,&#xA0;&apos;!dll/**&apos;]&#xA0;//&#x4E0D;&#x5220;&#x9664;dll&#x76EE;&#x5F55;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}),
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>&#x4F7F;&#x7528; npm run build &#x6784;&#x5EFA;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230; bundle.js &#x7684;&#x4F53;&#x79EF;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x3002;</p><p>&#x4FEE;&#x6539; public/index.html &#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x5176;&#x4E2D;&#x5F15;&#x5165; react.dll.js</p><pre><code>&lt;script&#xA0;src=&quot;/dll/react.dll.9dcd9d.js&quot;&gt;&lt;/script&gt;</code></pre><blockquote>&#x6784;&#x5EFA;&#x901F;&#x5EA6;</blockquote><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/4d994f8d3a864cceb201891f067efcba?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><blockquote>&#x5305;&#x4F53;&#x79EF;</blockquote><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/9bd20526d8294c4191ecf4190c16fe21?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>dll-size.jpeg</p><h3 id="12%E6%8A%BD%E7%A6%BB%E5%85%AC%E5%85%B1%E4%BB%A3%E7%A0%81"><strong>12.&#x62BD;&#x79BB;&#x516C;&#x5171;&#x4EE3;&#x7801;</strong></h3><p>&#x62BD;&#x79BB;&#x516C;&#x5171;&#x4EE3;&#x7801;&#x662F;&#x5BF9;&#x4E8E;&#x591A;&#x9875;&#x5E94;&#x7528;&#x6765;&#x8BF4;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x591A;&#x4E2A;&#x9875;&#x9762;&#x5F15;&#x5165;&#x4E86;&#x4E00;&#x4E9B;&#x516C;&#x5171;&#x6A21;&#x5757;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x4E9B;&#x516C;&#x5171;&#x7684;&#x6A21;&#x5757;&#x62BD;&#x79BB;&#x51FA;&#x6765;&#xFF0C;&#x5355;&#x72EC;&#x6253;&#x5305;&#x3002;&#x516C;&#x5171;&#x4EE3;&#x7801;&#x53EA;&#x9700;&#x8981;&#x4E0B;&#x8F7D;&#x4E00;&#x6B21;&#x5C31;&#x7F13;&#x5B58;&#x8D77;&#x6765;&#x4E86;&#xFF0C;&#x907F;&#x514D;&#x4E86;&#x91CD;&#x590D;&#x4E0B;&#x8F7D;&#x3002;</p><p>&#x62BD;&#x79BB;&#x516C;&#x5171;&#x4EE3;&#x7801;&#x5BF9;&#x4E8E;&#x5355;&#x9875;&#x5E94;&#x7528;&#x548C;&#x591A;&#x9875;&#x5E94;&#x8BE5;&#x5728;&#x914D;&#x7F6E;&#x4E0A;&#x6CA1;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#xFF0C;&#x90FD;&#x662F;&#x914D;&#x7F6E;&#x5728; optimization.splitChunks &#x4E2D;&#x3002;</p><pre><code>//webpack.config.js
module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;optimization:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;splitChunks:&#xA0;{//&#x5206;&#x5272;&#x4EE3;&#x7801;&#x5757;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;cacheGroups:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;vendor:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x7B2C;&#x4E09;&#x65B9;&#x4F9D;&#x8D56;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;priority:&#xA0;1,&#xA0;//&#x8BBE;&#x7F6E;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x9996;&#x5148;&#x62BD;&#x79BB;&#x7B2C;&#x4E09;&#x65B9;&#x6A21;&#x5757;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&apos;vendor&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/node_modules/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;chunks:&#xA0;&apos;initial&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minSize:&#xA0;0,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minChunks:&#xA0;1&#xA0;//&#x6700;&#x5C11;&#x5F15;&#x5165;&#x4E86;1&#x6B21;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x7F13;&#x5B58;&#x7EC4;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;common:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x516C;&#x5171;&#x6A21;&#x5757;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;chunks:&#xA0;&apos;initial&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&apos;common&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minSize:&#xA0;100,&#xA0;//&#x5927;&#x5C0F;&#x8D85;&#x8FC7;100&#x4E2A;&#x5B57;&#x8282;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minChunks:&#xA0;3&#xA0;//&#x6700;&#x5C11;&#x5F15;&#x5165;&#x4E86;3&#x6B21;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>&#x5373;&#x4F7F;&#x662F;&#x5355;&#x9875;&#x5E94;&#x7528;&#xFF0C;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x6253;&#x5305;&#x51FA;&#x6765;&#x7684; bundle.js &#x4F53;&#x79EF;&#x8FC7;&#x5927;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;&#x4F9D;&#x8D56;&#x6253;&#x5305;&#x6210;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5E93;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x5269;&#x4E0B;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x4F9D;&#x8D56;&#x62C6;&#x51FA;&#x6765;&#x3002;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x51CF;&#x5C0F; bundle.js &#x7684;&#x4F53;&#x79EF;&#x5927;&#x5C0F;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x4F60;&#x8FD8;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x63D0;&#x53D6;&#x4E1A;&#x52A1;&#x4EE3;&#x7801;&#x7684;&#x516C;&#x5171;&#x6A21;&#x5757;&#xFF0C;&#x6B64;&#x5904;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x9879;&#x76EE;&#x4E2D;&#x6E90;&#x7801;&#x8F83;&#x5C11;&#xFF0C;&#x6240;&#x4EE5;&#x6CA1;&#x6709;&#x914D;&#x7F6E;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/bb60038a3cc040ff9acc6213f6fa3aa8?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>splitChunks.jpeg</p><blockquote>runtimeChunk</blockquote><p>runtimeChunk &#x7684;&#x4F5C;&#x7528;&#x662F;&#x5C06;&#x5305;&#x542B; chunk &#x6620;&#x5C04;&#x5173;&#x7CFB;&#x7684;&#x5217;&#x8868;&#x4ECE; main.js &#x4E2D;&#x62BD;&#x79BB;&#x51FA;&#x6765;&#xFF0C;&#x5728;&#x914D;&#x7F6E;&#x4E86; splitChunk &#x65F6;&#xFF0C;&#x8BB0;&#x5F97;&#x914D;&#x7F6E; runtimeChunk.</p><pre><code>module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;optimization:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;runtimeChunk:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&apos;manifest&apos;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>&#x6700;&#x7EC8;&#x6784;&#x5EFA;&#x51FA;&#x6765;&#x7684;&#x6587;&#x4EF6;&#x4E2D;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A; manifest.js&#x3002;</p><h4 id="%E5%80%9F%E5%8A%A9-webpack-bundle-analyzer-%E8%BF%9B%E4%B8%80%E6%AD%A5%E4%BC%98%E5%8C%96"><strong>&#x501F;&#x52A9; webpack-bundle-analyzer &#x8FDB;&#x4E00;&#x6B65;&#x4F18;&#x5316;</strong></h4><p>&#x5728;&#x505A; webpack &#x6784;&#x5EFA;&#x4F18;&#x5316;&#x7684;&#x65F6;&#x5019;&#xFF0C;vendor &#x6253;&#x51FA;&#x6765;&#x8D85;&#x8FC7;&#x4E86;1M&#xFF0C;react &#x548C; react-dom &#x5DF2;&#x7ECF;&#x6253;&#x5305;&#x6210;&#x4E86;DLL&#x3002;</p><p>&#x56E0;&#x6B64;&#x9700;&#x8981;&#x501F;&#x52A9; webpack-bundle-analyzer &#x67E5;&#x770B;&#x4E00;&#x4E0B;&#x662F;&#x54EA;&#x4E9B;&#x5305;&#x7684;&#x4F53;&#x79EF;&#x8F83;&#x5927;&#x3002;</p><p>&#x9996;&#x5148;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#xFF1A;</p><pre><code>npm&#xA0;install&#xA0;webpack-bundle-analyzer&#xA0;-D</code></pre><p>&#x4F7F;&#x7528;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x4FEE;&#x6539;&#x4E0B;&#x6211;&#x4EEC;&#x7684;&#x914D;&#x7F6E;&#xFF1A;</p><pre><code>//webpack.config.prod.js
const&#xA0;BundleAnalyzerPlugin&#xA0;=&#xA0;require(&apos;webpack-bundle-analyzer&apos;).BundleAnalyzerPlugin;
const&#xA0;merge&#xA0;=&#xA0;require(&apos;webpack-merge&apos;);
const&#xA0;baseWebpackConfig&#xA0;=&#xA0;require(&apos;./webpack.config.base&apos;);
module.exports&#xA0;=&#xA0;merge(baseWebpackConfig,&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;//....
&#xA0;&#xA0;&#xA0;&#xA0;plugins:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;new&#xA0;BundleAnalyzerPlugin(),
&#xA0;&#xA0;&#xA0;&#xA0;]
})</code></pre><p>npm run build &#x6784;&#x5EFA;&#xFF0C;&#x4F1A;&#x9ED8;&#x8BA4;&#x6253;&#x5F00;&#xFF1A;http://127.0.0.1:8888/&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5404;&#x4E2A;&#x5305;&#x7684;&#x4F53;&#x79EF;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/971d2557029c4133a136ad2d8187dbad?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><p>&#x8FDB;&#x4E00;&#x6B65;&#x5BF9; vendor &#x8FDB;&#x884C;&#x62C6;&#x5206;&#xFF0C;&#x5C06; vendor &#x62C6;&#x5206;&#x6210;&#x4E86;4&#x4E2A;(&#x4F7F;&#x7528; splitChunks &#x8FDB;&#x884C;&#x62C6;&#x5206;&#x5373;&#x53EF;)&#x3002;</p><pre><code>module.exports&#xA0;=&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;optimization:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;concatenateModules:&#xA0;false,
&#xA0;&#xA0;&#xA0;&#xA0;splitChunks:&#xA0;{//&#x5206;&#x5272;&#x4EE3;&#x7801;&#x5757;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;maxInitialRequests:6,&#xA0;//&#x9ED8;&#x8BA4;&#x662F;5
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;cacheGroups:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;vendor:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x7B2C;&#x4E09;&#x65B9;&#x4F9D;&#x8D56;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;priority:&#xA0;1,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&apos;vendor&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/node_modules/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;chunks:&#xA0;&apos;initial&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minSize:&#xA0;100,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minChunks:&#xA0;1&#xA0;//&#x91CD;&#x590D;&#x5F15;&#x5165;&#x4E86;&#x51E0;&#x6B21;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&apos;lottie-web&apos;:&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;name:&#xA0;&quot;lottie-web&quot;,&#xA0;//&#xA0;&#x5355;&#x72EC;&#x5C06;&#xA0;react-lottie&#xA0;&#x62C6;&#x5305;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;priority:&#xA0;5,&#xA0;//&#xA0;&#x6743;&#x91CD;&#x9700;&#x5927;&#x4E8E;`vendor`
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;test:&#xA0;/[\/]node_modules[\/]lottie-web[\/]/,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;chunks:&#xA0;&apos;initial&apos;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minSize:&#xA0;100,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;minChunks:&#xA0;1&#xA0;//&#x91CD;&#x590D;&#x5F15;&#x5165;&#x4E86;&#x51E0;&#x6B21;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//...
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;},
&#xA0;&#xA0;},
}</code></pre><p>&#x91CD;&#x65B0;&#x6784;&#x5EFA;&#xFF0C;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/8e877e2259eb43838d5bad7dada34ba9?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><h3 id="13webpack%E8%87%AA%E8%BA%AB%E7%9A%84%E4%BC%98%E5%8C%96"><strong>13.webpack&#x81EA;&#x8EAB;&#x7684;&#x4F18;&#x5316;</strong></h3><h4 id="tree-shaking"><strong>tree-shaking</strong></h4><p>&#x5982;&#x679C;&#x4F7F;&#x7528;ES6&#x7684;import &#x8BED;&#x6CD5;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x4F1A;&#x81EA;&#x52A8;&#x79FB;&#x9664;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><pre><code>//math.js
const&#xA0;add&#xA0;=&#xA0;(a,&#xA0;b)&#xA0;=&gt;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;console.log(&apos;aaaaaa&apos;)
&#xA0;&#xA0;&#xA0;&#xA0;return&#xA0;a&#xA0;+&#xA0;b;
}

const&#xA0;minus&#xA0;=&#xA0;(a,&#xA0;b)&#xA0;=&gt;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;console.log(&apos;bbbbbb&apos;)
&#xA0;&#xA0;&#xA0;&#xA0;return&#xA0;a&#xA0;-&#xA0;b;
}

export&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;add,
&#xA0;&#xA0;&#xA0;&#xA0;minus
}</code></pre><pre><code>//index.js
import&#xA0;{add,&#xA0;minus}&#xA0;from&#xA0;&apos;./math&apos;;
add(2,3);</code></pre><p>&#x6784;&#x5EFA;&#x7684;&#x6700;&#x7EC8;&#x4EE3;&#x7801;&#x91CC;&#xFF0C;minus &#x51FD;&#x6570;&#x4E0D;&#x4F1A;&#x88AB;&#x6253;&#x5305;&#x8FDB;&#x53BB;&#x3002;</p><h4 id="scope-hosting-%E4%BD%9C%E7%94%A8%E5%9F%9F%E6%8F%90%E5%8D%87"><strong>scope hosting &#x4F5C;&#x7528;&#x57DF;&#x63D0;&#x5347;</strong></h4><p>&#x53D8;&#x91CF;&#x63D0;&#x5347;&#xFF0C;&#x53EF;&#x4EE5;&#x51CF;&#x5C11;&#x4E00;&#x4E9B;&#x53D8;&#x91CF;&#x58F0;&#x660E;&#x3002;&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E0B;&#xFF0C;&#x9ED8;&#x8BA4;&#x5F00;&#x542F;&#x3002;</p><p>&#x53E6;&#x5916;&#xFF0C;&#x5927;&#x5BB6;&#x6D4B;&#x8BD5;&#x7684;&#x65F6;&#x5019;&#x6CE8;&#x610F;&#x4E00;&#x4E0B;&#xFF0C;<br>speed-measure-webpack-plugin &#x548C; HotModuleReplacementPlugin &#x4E0D;&#x80FD;&#x540C;&#x65F6;&#x4F7F;&#x7528;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x62A5;&#x9519;:</p><figure class="kg-card kg-image-card"><img src="https://p3.toutiaoimg.com/origin/pgc-image/f4879ae7f47342528b910065b4d2389b?from=pc" class="kg-image" alt="&#x5E26;&#x4F60;&#x6DF1;&#x5EA6;&#x89E3;&#x9501;Webpack&#x7CFB;&#x5217;(&#x4F18;&#x5316;&#x7BC7;)" loading="lazy"></figure><h4 id="babel-%E9%85%8D%E7%BD%AE%E7%9A%84%E4%BC%98%E5%8C%96"><strong>babel &#x914D;&#x7F6E;&#x7684;&#x4F18;&#x5316;</strong></h4><p>&#x5982;&#x679C;&#x4F60;&#x5BF9; babel &#x8FD8;&#x4E0D;&#x592A;&#x719F;&#x6089;&#x7684;&#x8BDD;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x9605;&#x8BFB;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#xFF1A;&#x4E0D;&#x5BB9;&#x9519;&#x8FC7;&#x7684; Babel7 &#x77E5;&#x8BC6;&#x3002;</p><p>&#x5728;&#x4E0D;&#x914D;&#x7F6E; @<br>babel/plugin-transform-runtime &#x65F6;&#xFF0C;babel &#x4F1A;&#x4F7F;&#x7528;&#x5F88;&#x5C0F;&#x7684;&#x8F85;&#x52A9;&#x51FD;&#x6570;&#x6765;&#x5B9E;&#x73B0;&#x7C7B;&#x4F3C; _createClass &#x7B49;&#x516C;&#x5171;&#x65B9;&#x6CD5;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5B83;&#x5C06;&#x88AB;&#x6CE8;&#x5165;(inject)&#x5230;&#x9700;&#x8981;&#x5B83;&#x7684;&#x6BCF;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x7ED3;&#x679C;&#x5C31;&#x662F;&#x5BFC;&#x81F4;&#x6784;&#x5EFA;&#x51FA;&#x6765;&#x7684;JS&#x4F53;&#x79EF;&#x53D8;&#x5927;&#x3002;</p><p>&#x6211;&#x4EEC;&#x4E5F;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x5728;&#x6BCF;&#x4E2A; js &#x4E2D;&#x6CE8;&#x5165;&#x8F85;&#x52A9;&#x51FD;&#x6570;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; @<br>babel/plugin-transform-runtime&#xFF0C;@babel/plugin-transform-runtime &#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x91CD;&#x590D;&#x4F7F;&#x7528; Babel &#x6CE8;&#x5165;&#x7684;&#x5E2E;&#x52A9;&#x7A0B;&#x5E8F;&#xFF0C;&#x4EE5;&#x8282;&#x7701;&#x4EE3;&#x7801;&#x5927;&#x5C0F;&#x7684;&#x63D2;&#x4EF6;&#x3002;</p><p>&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728; .babelrc &#x4E2D;&#x589E;&#x52A0; @<br>babel/plugin-transform-runtime &#x7684;&#x914D;&#x7F6E;&#x3002;</p><pre><code>{
&#xA0;&#xA0;&#xA0;&#xA0;&quot;presets&quot;:&#xA0;[],
&#xA0;&#xA0;&#xA0;&#xA0;&quot;plugins&quot;:&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;[
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&quot;@babel/plugin-transform-runtime&quot;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;]
&#xA0;&#xA0;&#xA0;&#xA0;]
}</code></pre><p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x6211;&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#x4F7F;&#x7528;&#x5230;&#x7684;&#x4E00;&#x4E9B;&#x4F18;&#x5316;&#xFF0C;&#x611F;&#x8C22;&#x9605;&#x8BFB;&#x3002;</p>]]></content:encoded></item></channel></rss>