<?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[Nash]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://pureo.cn/</link><image><url>https://pureo.cn/favicon.png</url><title>Nash</title><link>https://pureo.cn/</link></image><generator>Ghost 4.32</generator><lastBuildDate>Wed, 22 Oct 2025 06:09:04 GMT</lastBuildDate><atom:link href="https://pureo.cn/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[前端常见问题详解]]></title><description><![CDATA[<p>&#x672C;&#x6587;&#x6863;&#x7CFB;&#x7EDF;&#x5730;&#x6574;&#x7406;&#x4E86;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#x5E38;&#x89C1;&#x7684;&#x591A;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6DB5;&#x76D6;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x3001;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x3001;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x3001;&#x5DE5;&#x7A0B;&#x5316;&#x3001;&#x754C;&#x9762;&#x6548;&#x679C;&#x3001;</p>]]></description><link>https://pureo.cn/qian-duan-chang-jian-wen-ti-xiang-jie/</link><guid isPermaLink="false">67eb5aaea127cb000149ca6e</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Tue, 01 Apr 2025 03:18:07 GMT</pubDate><content:encoded><![CDATA[<p>&#x672C;&#x6587;&#x6863;&#x7CFB;&#x7EDF;&#x5730;&#x6574;&#x7406;&#x4E86;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#x5E38;&#x89C1;&#x7684;&#x591A;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6DB5;&#x76D6;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x3001;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x3001;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x3001;&#x5DE5;&#x7A0B;&#x5316;&#x3001;&#x754C;&#x9762;&#x6548;&#x679C;&#x3001;DOM &#x64CD;&#x4F5C;&#x3001;&#x5FAE;&#x524D;&#x7AEF;&#x3001;&#x65E5;&#x5FD7;&#x57CB;&#x70B9;&#x3001;&#x5B89;&#x5168;&#x3001;&#x56FD;&#x9645;&#x5316;&#x3001;&#x8BA4;&#x8BC1;&#x6388;&#x6743;&#x7B49;&#x5404;&#x4E2A;&#x65B9;&#x9762;&#x3002;&#x6BCF;&#x4E2A;&#x95EE;&#x9898;&#x90FD;&#x9644;&#x6709;&#x7406;&#x8BBA;&#x89E3;&#x91CA;&#x548C;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#xFF0C;&#x4EE5;&#x4FBF;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#x53C2;&#x8003;&#x548C;&#x5B9E;&#x8DF5;&#x3002;</p><hr><h2 id="1-%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E4%B8%8E%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86">1. &#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x4E0E;&#x9519;&#x8BEF;&#x5904;&#x7406;</h2><h3 id="%E6%89%B9%E9%87%8F%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%E5%8F%AA%E5%BC%B9%E4%B8%80%E4%B8%AA-toast">&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x53EA;&#x5F39;&#x4E00;&#x4E2A; toast</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x5F53;&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x540C;&#x65F6;&#x5931;&#x8D25;&#x65F6;&#xFF0C;&#x4E3A;&#x907F;&#x514D;&#x8FDE;&#x7EED;&#x5F39;&#x51FA;&#x591A;&#x4E2A;&#x9519;&#x8BEF;&#x63D0;&#x793A;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5168;&#x5C40;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x51FD;&#x6570;&#x5E76;&#x7ED3;&#x5408;&#x9632;&#x6296;&#xFF08;debounce&#xFF09;&#x6216;&#x8282;&#x6D41;&#xFF08;throttle&#xFF09;&#x673A;&#x5236;&#xFF0C;&#x5B9E;&#x73B0;&#x53EA;&#x5728;&#x4E00;&#x5B9A;&#x65F6;&#x95F4;&#x5185;&#x5F39;&#x51FA;&#x4E00;&#x6B21; toast&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">// &#x9632;&#x6296;&#x51FD;&#x6570;&#x793A;&#x4F8B;
function debounce(fn, delay) {
  let timer;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() =&gt; fn.apply(this, args), delay);
  };
}

// toast &#x5F39;&#x51FA;&#x65B9;&#x6CD5;&#xFF08;&#x5047;&#x8BBE;&#x8C03;&#x7528;&#x7B2C;&#x4E09;&#x65B9; toast &#x7EC4;&#x4EF6;&#xFF09;
function showToast(msg) {
  Toast.show(msg);
}

// &#x5305;&#x88C5;&#x540E;&#x7684;&#x9632;&#x6296;&#x7248;&#x672C;
const showDebouncedToast = debounce(showToast, 300);

// &#x5728;&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7684; catch &#x91CC;&#x8C03;&#x7528;
axios.get(&apos;/api/xxx&apos;).catch(() =&gt; {
  showDebouncedToast(&quot;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x7A0D;&#x540E;&#x91CD;&#x8BD5;&quot;);
});
</code></pre><hr><h3 id="axios-%E5%8F%96%E6%B6%88%E8%AF%B7%E6%B1%82">Axios &#x53D6;&#x6D88;&#x8BF7;&#x6C42;</h3><p><strong>&#x539F;&#x7406;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; Axios &#x5185;&#x7F6E;&#x7684;&#x53D6;&#x6D88;&#x4EE4;&#x724C;&#xFF08;CancelToken&#xFF09;&#x53EF;&#x4EE5;&#x5728;&#x5FC5;&#x8981;&#x65F6;&#x53D6;&#x6D88;&#x8BF7;&#x6C42;&#xFF0C;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x7F51;&#x7EDC;&#x5F00;&#x9500;&#x548C;&#x54CD;&#x5E94;&#x5904;&#x7406;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">const CancelToken = axios.CancelToken;
let cancel;

axios.get(&apos;/api/data&apos;, {
  cancelToken: new CancelToken(function executor(c) {
    cancel = c;
  })
}).catch(thrown =&gt; {
  if (axios.isCancel(thrown)) {
    console.log(&apos;Request canceled&apos;, thrown.message);
  } else {
    // &#x5904;&#x7406;&#x9519;&#x8BEF;
  }
});

// &#x9700;&#x8981;&#x53D6;&#x6D88;&#x65F6;&#x8C03;&#x7528;
cancel(&apos;&#x64CD;&#x4F5C;&#x53D6;&#x6D88;&#x4E86;&#x8BF7;&#x6C42;&apos;);
</code></pre><hr><h3 id="%E8%AF%B7%E6%B1%82%E8%B6%85%E6%97%B6%E4%B8%8E%E9%87%8D%E8%AF%95%E6%9C%BA%E5%88%B6">&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#x4E0E;&#x91CD;&#x8BD5;&#x673A;&#x5236;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x8BBE;&#x7F6E;&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF0C;&#x6355;&#x83B7;&#x8D85;&#x65F6;&#x9519;&#x8BEF;&#x540E;&#x901A;&#x8FC7;&#x91CD;&#x8BD5;&#x673A;&#x5236;&#xFF08;&#x5E26;&#x91CD;&#x8BD5;&#x8BA1;&#x6570;&#xFF09;&#x91CD;&#x65B0;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x9AD8;&#x8BF7;&#x6C42;&#x6210;&#x529F;&#x7387;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">async function requestWithRetry(url, options = {}, retries = 3) {
  try {
    const response = await axios({
      url,
      timeout: 5000, // &#x8BBE;&#x7F6E;&#x8D85;&#x65F6;
      ...options,
    });
    return response;
  } catch (error) {
    if (retries &gt; 0) {
      return requestWithRetry(url, options, retries - 1);
    } else {
      throw error;
    }
  }
}
</code></pre><hr><h3 id="%E8%AF%B7%E6%B1%82%E6%8B%A6%E6%88%AA%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8">&#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x5668;&#x7684;&#x4F7F;&#x7528;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x5229;&#x7528; Axios &#x62E6;&#x622A;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x8BF7;&#x6C42;&#x53D1;&#x51FA;&#x524D;&#x9644;&#x52A0; token&#x3001;&#x8BB0;&#x5F55;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&#x7B49;&#xFF0C;&#x54CD;&#x5E94;&#x5230;&#x8FBE;&#x540E;&#x8BA1;&#x7B97;&#x8017;&#x65F6;&#x3001;&#x7EDF;&#x4E00;&#x5904;&#x7406;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;&#x62E6;&#x622A;&#x5668;&#x4F7F;&#x5F97;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x90FD;&#x7ECF;&#x8FC7;&#x7EDF;&#x4E00;&#x7684;&#x903B;&#x8F91;&#x5904;&#x7406;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">// &#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x5668;
axios.interceptors.request.use(config =&gt; {
  // &#x6BD4;&#x5982;&#x5728;&#x8BF7;&#x6C42;&#x5934;&#x4E2D;&#x6DFB;&#x52A0; token
  config.headers.Authorization = &apos;Bearer &apos; + getToken();
  config.metadata = { startTime: new Date() };
  return config;
}, error =&gt; {
  return Promise.reject(error);
});

// &#x54CD;&#x5E94;&#x62E6;&#x622A;&#x5668;
axios.interceptors.response.use(response =&gt; {
  const duration = new Date() - response.config.metadata.startTime;
  console.log(&apos;Request duration:&apos;, duration);
  return response;
}, error =&gt; {
  // &#x7EDF;&#x4E00;&#x9519;&#x8BEF;&#x5904;&#x7406;
  showDebouncedToast(&quot;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x7A0D;&#x540E;&#x91CD;&#x8BD5;&quot;);
  return Promise.reject(error);
});
</code></pre><hr><h2 id="2-%E5%89%8D%E7%AB%AF%E7%9B%91%E6%8E%A7%E4%B8%8E%E6%97%A5%E5%BF%97%E5%9F%8B%E7%82%B9">2. &#x524D;&#x7AEF;&#x76D1;&#x63A7;&#x4E0E;&#x65E5;&#x5FD7;&#x57CB;&#x70B9;</h2><h3 id="%E5%89%8D%E7%AB%AF%E7%9B%91%E6%8E%A7%E6%96%B9%E6%A1%88">&#x524D;&#x7AEF;&#x76D1;&#x63A7;&#x65B9;&#x6848;</h3><p><strong>&#x5173;&#x952E;&#x70B9;</strong>&#xFF1A;</p><p>&#x6355;&#x83B7;&#x5168;&#x5C40;&#x9519;&#x8BEF;&#xFF08;&#x4F7F;&#x7528; <code>window.onerror</code>&#x3001;<code>window.onunhandledrejection</code>&#xFF09;</p><p>&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#x3001;&#x63A5;&#x53E3;&#x54CD;&#x5E94;&#x5F02;&#x5E38;&#x7684;&#x65E5;&#x5FD7;&#x91C7;&#x96C6;</p><p>&#x6027;&#x80FD;&#x76D1;&#x63A7;&#xFF08;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x3001;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x3001;&#x957F;&#x4EFB;&#x52A1;&#x7EDF;&#x8BA1;&#xFF09;</p><p>&#x7528;&#x6237;&#x884C;&#x4E3A;&#x8FFD;&#x8E2A;&#xFF08;&#x70B9;&#x51FB;&#x3001;&#x9875;&#x9762;&#x505C;&#x7559;&#x65F6;&#x95F4;&#x3001;&#x5173;&#x952E;&#x64CD;&#x4F5C;&#x4E0A;&#x62A5;&#xFF09;</p><p><strong>&#x5E38;&#x89C1;&#x65B9;&#x6848;</strong>&#xFF1A;</p><p>&#x96C6;&#x6210;&#x7B2C;&#x4E09;&#x65B9;&#x670D;&#x52A1;&#x5982; <a href="https://sentry.io/">Sentry</a>&#x3001;<a href="https://logrocket.com/">LogRocket</a></p><p>&#x81EA;&#x5B9A;&#x4E49;&#x57CB;&#x70B9;&#xFF0C;&#x901A;&#x8FC7;&#x62E6;&#x622A;&#x5668;&#x8BB0;&#x5F55;&#x8BF7;&#x6C42;&#x4FE1;&#x606F;&#x3001;&#x9875;&#x9762;&#x9519;&#x8BEF;&#x4E0A;&#x62A5;&#x670D;&#x52A1;&#x5668;</p><p>&#x4F7F;&#x7528; Performance API &#x83B7;&#x53D6;&#x9875;&#x9762;&#x6027;&#x80FD;&#x6570;&#x636E;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF08;&#x4F7F;&#x7528; Sentry &#x4E0A;&#x62A5;&#xFF09;&#xFF1A;</p><pre><code class="language-js">// Sentry &#x521D;&#x59CB;&#x5316;&#x793A;&#x4F8B;
import * as Sentry from &apos;@sentry/browser&apos;;

Sentry.init({
  dsn: &apos;your-dsn-url&apos;,
  release: &apos;your-project@1.0.0&apos;,
});

// &#x5168;&#x5C40;&#x6355;&#x83B7;&#x9519;&#x8BEF;
window.onerror = function(message, source, lineno, colno, error) {
  Sentry.captureException(error);
};
</code></pre><hr><h3 id="%E5%85%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E8%80%97%E6%97%B6%E7%BB%9F%E8%AE%A1">&#x5168;&#x7AD9;&#x8BF7;&#x6C42;&#x8017;&#x65F6;&#x7EDF;&#x8BA1;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x5728; Axios &#x62E6;&#x622A;&#x5668;&#x4E2D;&#x8BB0;&#x5F55;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x5F00;&#x59CB;&#x7684;&#x65F6;&#x95F4;&#x548C;&#x7ED3;&#x675F;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5C06;&#x8017;&#x65F6;&#x6570;&#x636E;&#x4E0A;&#x62A5;&#x81F3;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#xFF0C;&#x4FBF;&#x4E8E;&#x5206;&#x6790;&#x63A5;&#x53E3;&#x54CD;&#x5E94;&#x74F6;&#x9888;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">axios.interceptors.request.use(config =&gt; {
  config.metadata = { startTime: new Date() };
  return config;
});

axios.interceptors.response.use(response =&gt; {
  const duration = new Date() - response.config.metadata.startTime;
  // &#x8BB0;&#x5F55;&#x6216;&#x8005;&#x4E0A;&#x62A5;&#x8BF7;&#x6C42;&#x8017;&#x65F6;&#x6570;&#x636E;
  console.log(`Request to ${response.config.url} took ${duration}ms`);
  return response;
});
</code></pre><hr><h2 id="3-%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E4%B8%8E%E5%B7%A5%E7%A8%8B%E5%8C%96">3. &#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x4E0E;&#x5DE5;&#x7A0B;&#x5316;</h2><h3 id="if-else-%E5%92%8C-babel-runtime-%E7%9A%84%E4%BD%9C%E7%94%A8">if-else &#x548C; babel-runtime &#x7684;&#x4F5C;&#x7528;</h3><p><strong>if-else &#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x5927;&#x91CF; if-else &#x5224;&#x65AD;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x5197;&#x957F;&#x3002;</p><p>&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5C01;&#x88C5;&#x516C;&#x5171;&#x51FD;&#x6570;&#x3001;&#x72B6;&#x6001;&#x673A;&#x3001;&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x7B49;&#x624B;&#x6BB5;&#x6765;&#x4F18;&#x5316;&#x590D;&#x6742;&#x7684;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#xFF0C;&#x4F7F;&#x4EE3;&#x7801;&#x66F4;&#x6613;&#x7EF4;&#x62A4;&#x3002;</p><p><strong>babel-runtime &#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><code>babel-runtime</code> &#x7528;&#x4E8E;&#x62BD;&#x53D6; ES6+ &#x4EE3;&#x7801;&#x8F6C;&#x6362;&#x65F6;&#x7528;&#x5230;&#x7684;&#x8F85;&#x52A9;&#x51FD;&#x6570;&#x53CA; polyfill&#xFF0C;&#x907F;&#x514D;&#x5168;&#x5C40;&#x6C61;&#x67D3;&#xFF0C;&#x540C;&#x65F6;&#x51CF;&#x5C11;&#x91CD;&#x590D;&#x4EE3;&#x7801;&#x5F15;&#x5165;&#x3002;</p><p>&#x5F53;&#x4F60;&#x7684;&#x9879;&#x76EE;&#x4F7F;&#x7528; Babel &#x8F6C;&#x8BD1; ES6+ &#x4EE3;&#x7801;&#x65F6;&#xFF0C;&#x5F15;&#x5165; babel-runtime &#x80FD;&#x4F7F;&#x6700;&#x7EC8;&#x4EE3;&#x7801;&#x4F53;&#x79EF;&#x66F4;&#x5C0F;&#xFF0C;&#x5E76;&#x786E;&#x4FDD;&#x517C;&#x5BB9;&#x6027;&#x3002;</p><hr><h3 id="%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84%E4%B8%8E%E6%B8%85%E7%90%86%E6%9C%AA%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%A0%81">&#x4EE3;&#x7801;&#x91CD;&#x6784;&#x4E0E;&#x6E05;&#x7406;&#x672A;&#x4F7F;&#x7528;&#x4EE3;&#x7801;</h3><p><strong>&#x91CD;&#x6784;&#x7B56;&#x7565;</strong>&#xFF1A;</p><p>&#x6A21;&#x5757;&#x5316;&#xFF1A;&#x5C06;&#x4EE3;&#x7801;&#x62C6;&#x5206;&#x4E3A;&#x66F4;&#x5C0F;&#x7684;&#x6A21;&#x5757;&#xFF0C;&#x4FDD;&#x8BC1;&#x5355;&#x4E00;&#x804C;&#x8D23;</p><p>&#x9759;&#x6001;&#x5206;&#x6790;&#xFF1A;&#x4F7F;&#x7528; ESLint&#x3001;TSLint &#x7B49;&#x5DE5;&#x5177;&#x68C0;&#x6D4B;&#x4EE3;&#x7801;&#x8D28;&#x91CF;</p><p>Tree Shaking&#xFF1A;&#x5229;&#x7528; webpack &#x7684; Tree Shaking &#x7279;&#x6027;&#x6E05;&#x7406;&#x672A;&#x4F7F;&#x7528;&#x4EE3;&#x7801;</p><p>&#x63D2;&#x4EF6;&#x5DE5;&#x5177;&#xFF1A;&#x4F7F;&#x7528; PurifyCSS&#xFF08;&#x9488;&#x5BF9; CSS&#xFF09;&#x548C; unused-webpack-plugin&#xFF08;&#x9488;&#x5BF9; JS/TS&#xFF09;&#x7B49;&#x5DE5;&#x5177;&#x68C0;&#x6D4B;&#x5E76;&#x6E05;&#x7406;&#x65E0;&#x7528;&#x4EE3;&#x7801;</p><hr><h3 id="packagejson-%E4%B8%AD-sideeffects-%E5%B1%9E%E6%80%A7">package.json &#x4E2D; sideEffects &#x5C5E;&#x6027;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><code>sideEffects</code> &#x5C5E;&#x6027;&#x544A;&#x8BC9; webpack &#x54EA;&#x4E9B;&#x6A21;&#x5757;&#x5728;&#x5BFC;&#x5165;&#x65F6;&#x4E0D;&#x4F1A;&#x4EA7;&#x751F;&#x526F;&#x4F5C;&#x7528;&#xFF0C;&#x4ECE;&#x800C;&#x4F7F; Tree Shaking &#x66F4;&#x6709;&#x6548;&#x3002;</p><p>&#x5982;&#x679C;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x6216;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x6A21;&#x5757;&#x88AB;&#x6807;&#x8BB0;&#x4E3A;&#x65E0;&#x526F;&#x4F5C;&#x7528;&#xFF0C;&#x6253;&#x5305;&#x65F6;&#x53EF;&#x4EE5;&#x5C06;&#x672A;&#x4F7F;&#x7528;&#x7684;&#x4EE3;&#x7801;&#x81EA;&#x52A8;&#x5254;&#x9664;&#xFF0C;&#x4ECE;&#x800C;&#x51CF;&#x5C0F;&#x5305;&#x4F53;&#x79EF;&#x3002;</p><hr><h3 id="%E4%BB%8E%E9%9B%B6%E6%90%AD%E5%BB%BA%E5%89%8D%E7%AB%AF%E5%9F%BA%E5%BB%BA">&#x4ECE;&#x96F6;&#x642D;&#x5EFA;&#x524D;&#x7AEF;&#x57FA;&#x5EFA;</h3><p><strong>&#x642D;&#x5EFA;&#x6B65;&#x9AA4;</strong>&#xFF1A;</p><p>&#x9009;&#x62E9;&#x6253;&#x5305;&#x5DE5;&#x5177;&#xFF08;webpack&#x3001;Rollup&#x3001;Vite &#x7B49;&#xFF09;</p><p>&#x914D;&#x7F6E; Babel&#xFF08;&#x6216; TypeScript &#x7F16;&#x8BD1;&#x5668;&#xFF09;&#x6765;&#x652F;&#x6301; ES6+ &#x7279;&#x6027;</p><p>&#x914D;&#x7F6E; ESLint&#x3001;Prettier &#x7B49;&#x4EE3;&#x7801;&#x68C0;&#x67E5;&#x5DE5;&#x5177;</p><p>&#x914D;&#x7F6E;&#x70ED;&#x66F4;&#x65B0;&#x3001;&#x4EE3;&#x7801;&#x62C6;&#x5206;&#x3001;&#x61D2;&#x52A0;&#x8F7D;&#x53CA;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x63D2;&#x4EF6;</p><p>&#x914D;&#x7F6E;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x548C;&#x6301;&#x7EED;&#x96C6;&#x6210;&#x73AF;&#x5883;</p><p>&#x5B9A;&#x4E49;&#x7EDF;&#x4E00;&#x7684;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#x548C;&#x5F00;&#x53D1;&#x89C4;&#x8303;</p><hr><h2 id="4-css-%E4%B8%8E%E7%95%8C%E9%9D%A2%E6%95%88%E6%9E%9C">4. CSS &#x4E0E;&#x754C;&#x9762;&#x6548;&#x679C;</h2><h3 id="px-%E8%BD%AC-rem">px &#x8F6C; rem</h3><p><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><p>&#x4F7F;&#x7528; PostCSS &#x63D2;&#x4EF6; <a href="https://github.com/cuth/postcss-pxtorem">postcss-pxtorem</a> &#x5728;&#x6784;&#x5EFA;&#x8FC7;&#x7A0B;&#x4E2D;&#x81EA;&#x52A8;&#x5C06; px &#x5355;&#x4F4D;&#x8F6C;&#x6362;&#x4E3A; rem</p><p>&#x6216;&#x8005;&#x5728; JS &#x4E2D;&#x6839;&#x636E;&#x8BBE;&#x8BA1;&#x7A3F;&#x5BBD;&#x5EA6;&#x52A8;&#x6001;&#x8BBE;&#x7F6E;&#x6839;&#x5143;&#x7D20; <code>font-size</code></p><p><strong>PostCSS &#x793A;&#x4F8B;</strong>&#xFF08;postcss.config.js&#xFF09;&#xFF1A;</p><pre><code class="language-js">module.exports = {
  plugins: {
    &apos;postcss-pxtorem&apos;: {
      rootValue: 16,
      propList: [&apos;*&apos;],
    },
  },
};
</code></pre><hr><h3 id="%E5%AE%9E%E7%8E%B0%E7%BF%BB%E7%89%8C%E6%95%88%E6%9E%9C">&#x5B9E;&#x73B0;&#x7FFB;&#x724C;&#x6548;&#x679C;</h3><p><strong>&#x539F;&#x7406;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x901A;&#x8FC7; CSS3 &#x7684; <code>transform</code> &#x548C; <code>transition</code> &#x7ED3;&#x5408; <code>perspective</code> &#x5C5E;&#x6027;&#xFF0C;&#x5B9E;&#x73B0; 3D &#x7FFB;&#x8F6C;&#x7684;&#x89C6;&#x89C9;&#x6548;&#x679C;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-css">.flip-card {
  perspective: 1000px;
}
.flip-card-inner {
  transition: transform 0.6s;
  transform-style: preserve-3d;
}
.flip-card:hover .flip-card-inner {
  transform: rotateY(180deg);
}
.flip-card-front, .flip-card-back {
  backface-visibility: hidden;
  position: absolute;
  width: 100%;
  height: 100%;
}
.flip-card-back {
  transform: rotateY(180deg);
}
</code></pre><hr><h3 id="flex1-%E7%9A%84%E5%90%AB%E4%B9%89">flex:1 &#x7684;&#x542B;&#x4E49;</h3><p><strong>&#x89E3;&#x91CA;</strong>&#xFF1A;</p><p>&#x5728; Flex &#x5E03;&#x5C40;&#x4E2D;&#xFF0C;<code>flex: 1</code> &#x8868;&#x793A;&#x5143;&#x7D20;&#x53EF;&#x4F38;&#x7F29;&#x4E14;&#x5E73;&#x5206;&#x5BB9;&#x5668;&#x4E2D;&#x5269;&#x4F59;&#x7A7A;&#x95F4;&#x3002;</p><p>&#x7B49;&#x540C;&#x4E8E; <code>flex-grow: 1; flex-shrink: 1; flex-basis: 0%</code>&#xFF0C;&#x4F7F;&#x5F97;&#x8BE5;&#x5143;&#x7D20;&#x5728;&#x6CA1;&#x6709;&#x56FA;&#x5B9A;&#x5BBD;&#x5EA6;&#x65F6;&#x5C3D;&#x53EF;&#x80FD;&#x6269;&#x5C55;&#x5360;&#x636E;&#x5269;&#x4F59;&#x7A7A;&#x95F4;&#x3002;</p><hr><h3 id="%E5%AE%9E%E7%8E%B0%E6%8A%98%E5%8F%A0%E9%9D%A2%E6%9D%BF%E6%95%88%E6%9E%9C">&#x5B9E;&#x73B0;&#x6298;&#x53E0;&#x9762;&#x677F;&#x6548;&#x679C;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x901A;&#x8FC7;&#x64CD;&#x4F5C; DOM &#x5143;&#x7D20;&#x9AD8;&#x5EA6;&#x3001;&#x8BBE;&#x7F6E; CSS &#x8FC7;&#x6E21;&#x52A8;&#x753B;&#xFF0C;&#x5B9E;&#x73B0;&#x9762;&#x677F;&#x5185;&#x5BB9;&#x7684;&#x5C55;&#x5F00;&#x4E0E;&#x6536;&#x8D77;&#x3002;</p><p>&#x901A;&#x8FC7;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;&#x5207;&#x6362;&#x72B6;&#x6001;&#x5E76;&#x52A8;&#x6001;&#x8C03;&#x6574;&#x5143;&#x7D20;&#x9AD8;&#x5EA6;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-html">&lt;div class=&quot;panel&quot;&gt;
  &lt;div class=&quot;panel-header&quot; onclick=&quot;togglePanel()&quot;&gt;&#x70B9;&#x51FB;&#x5C55;&#x5F00;/&#x6536;&#x8D77;&lt;/div&gt;
  &lt;div class=&quot;panel-body&quot; style=&quot;height: 0; overflow: hidden; transition: height 0.3s;&quot;&gt;
    &#x8FD9;&#x91CC;&#x662F;&#x5185;&#x5BB9;&#x533A;&#x57DF;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
  function togglePanel() {
    const panelBody = document.querySelector(&apos;.panel-body&apos;);
    if (panelBody.style.height === &apos;0px&apos; || panelBody.style.height === &apos;&apos;) {
      panelBody.style.height = panelBody.scrollHeight + &apos;px&apos;;
    } else {
      panelBody.style.height = &apos;0&apos;;
    }
  }
&lt;/script&gt;
</code></pre><hr><h3 id="%E7%BD%91%E9%A1%B5%E5%8A%A0%E8%BD%BD%E8%BF%9B%E5%BA%A6%E6%9D%A1">&#x7F51;&#x9875;&#x52A0;&#x8F7D;&#x8FDB;&#x5EA6;&#x6761;</h3><p><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><p>&#x53EF;&#x91C7;&#x7528; <a href="https://github.com/rstacruz/nprogress">NProgress</a> &#x8FD9;&#x6837;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5FEB;&#x901F;&#x5B9E;&#x73B0;</p><p>&#x6216;&#x8005;&#x81EA;&#x5B9A;&#x4E49;&#x76D1;&#x542C;&#x9875;&#x9762;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x4E8B;&#x4EF6;&#xFF0C;&#x52A8;&#x6001;&#x66F4;&#x65B0;&#x8FDB;&#x5EA6;&#x6761;&#x72B6;&#x6001;</p><p><strong>NProgress &#x793A;&#x4F8B;</strong>&#xFF1A;</p><pre><code class="language-js">// &#x5F15;&#x5165; NProgress
import NProgress from &apos;nprogress&apos;;
import &apos;nprogress/nprogress.css&apos;;

// &#x5728;&#x9875;&#x9762;&#x5F00;&#x59CB;&#x52A0;&#x8F7D;&#x65F6;&#x8C03;&#x7528;
NProgress.start();

// &#x5728;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#x540E;&#x8C03;&#x7528;
window.onload = function() {
  NProgress.done();
};
</code></pre><hr><h3 id="%E5%9B%BE%E7%89%87%E6%87%92%E5%8A%A0%E8%BD%BD">&#x56FE;&#x7247;&#x61D2;&#x52A0;&#x8F7D;</h3><p><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><p>&#x5229;&#x7528; Intersection Observer API &#x76D1;&#x542C;&#x56FE;&#x7247;&#x5143;&#x7D20;&#x662F;&#x5426;&#x8FDB;&#x5165;&#x53EF;&#x89C6;&#x533A;&#x57DF;</p><p>&#x6216;&#x8005;&#x76D1;&#x542C; scroll &#x4E8B;&#x4EF6;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#xFF0C;&#x518D;&#x52A8;&#x6001;&#x8BBE;&#x7F6E;&#x56FE;&#x7247; <code>src</code> &#x5C5E;&#x6027;</p><p><strong>Intersection Observer &#x793A;&#x4F8B;</strong>&#xFF1A;</p><pre><code class="language-js">const lazyImages = document.querySelectorAll(&apos;img.lazy&apos;);

const imageObserver = new IntersectionObserver((entries, observer) =&gt; {
  entries.forEach(entry =&gt; {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.classList.remove(&apos;lazy&apos;);
      observer.unobserve(img);
    }
  });
});

lazyImages.forEach(img =&gt; {
  imageObserver.observe(img);
});
</code></pre><hr><h2 id="5-dom-%E6%93%8D%E4%BD%9C%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%88%A4%E6%96%AD">5. DOM &#x64CD;&#x4F5C;&#x4E0E;&#x6570;&#x636E;&#x5224;&#x65AD;</h2><h3 id="%E5%88%A4%E6%96%AD-dom-%E5%85%B3%E7%B3%BB%EF%BC%9Aa-%E6%98%AF%E5%90%A6%E6%98%AF-b-%E7%9A%84%E5%AD%90%E5%85%83%E7%B4%A0">&#x5224;&#x65AD; DOM &#x5173;&#x7CFB;&#xFF1A;A &#x662F;&#x5426;&#x662F; B &#x7684;&#x5B50;&#x5143;&#x7D20;</h3><p><strong>&#x5B9E;&#x73B0;&#x8BF4;&#x660E;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; DOM &#x5185;&#x7F6E;&#x65B9;&#x6CD5; <code>Node.contains</code> &#x5224;&#x65AD;&#x5143;&#x7D20;&#x5173;&#x7CFB;&#xFF0C;&#x7B80;&#x5355;&#x4E14;&#x6027;&#x80FD;&#x826F;&#x597D;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">if (B.contains(A)) {
  console.log(&quot;A &#x662F; B &#x7684;&#x5B50;&#x5143;&#x7D20;&quot;);
}
</code></pre><hr><h3 id="%E5%88%A4%E6%96%AD%E5%AF%B9%E8%B1%A1%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%EF%BC%88%E5%90%AB%E5%8E%9F%E5%9E%8B%E9%93%BE%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%EF%BC%89">&#x5224;&#x65AD;&#x5BF9;&#x8C61;&#x662F;&#x5426;&#x4E3A;&#x7A7A;&#xFF08;&#x542B;&#x539F;&#x578B;&#x94FE;&#x81EA;&#x5B9A;&#x4E49;&#x5C5E;&#x6027;&#xFF09;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5BF9;&#x8C61;&#x662F;&#x5426;&#x201C;&#x7A7A;&#x201D;&#x9700;&#x8981;&#x68C0;&#x67E5;&#x81EA;&#x8EAB;&#x5C5E;&#x6027;&#x4EE5;&#x53CA;&#x539F;&#x578B;&#x94FE;&#x4E0A;&#x662F;&#x5426;&#x5B58;&#x5728;&#x9664; Object &#x539F;&#x578B;&#x4E2D;&#x9884;&#x5B9A;&#x4E49;&#x5C5E;&#x6027;&#x4EE5;&#x5916;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#x5C5E;&#x6027;&#x3002;</p><p>&#x904D;&#x5386; <code>for...in</code> &#x65F6;&#x4F1A;&#x904D;&#x5386;&#x81EA;&#x8EAB;&#x5C5E;&#x6027;&#x548C;&#x53EF;&#x679A;&#x4E3E;&#x7684;&#x539F;&#x578B;&#x94FE;&#x5C5E;&#x6027;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">function isTrulyEmpty(obj) {
  for (let key in obj) {
    // &#x5982;&#x679C;&#x662F;&#x5BF9;&#x8C61;&#x81EA;&#x6709;&#x5C5E;&#x6027;&#x6216;&#x539F;&#x578B;&#x4E0A;&#x6709;&#x9664;&#x6807;&#x51C6;&#x539F;&#x578B;&#x5916;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x5219;&#x8BA4;&#x4E3A;&#x4E0D;&#x4E3A;&#x7A7A;
    if (obj.hasOwnProperty(key) || Object.getPrototypeOf(obj)[key] !== undefined) {
      return false;
    }
  }
  return true;
}
</code></pre><p><em>&#x6CE8;&#xFF1A;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x4E2D;&#x9700;&#x6839;&#x636E;&#x5177;&#x4F53;&#x9700;&#x6C42;&#x8C03;&#x6574;&#x5224;&#x65AD;&#x903B;&#x8F91;&#x3002;</em></p><hr><h3 id="%E5%A4%A7%E5%AF%B9%E8%B1%A1%E6%B7%B1%E5%BA%A6%E5%AF%B9%E6%AF%94">&#x5927;&#x5BF9;&#x8C61;&#x6DF1;&#x5EA6;&#x5BF9;&#x6BD4;</h3><p><strong>&#x5B9E;&#x73B0;&#x601D;&#x8DEF;</strong>&#xFF1A;</p><p>&#x4F7F;&#x7528;&#x9012;&#x5F52;&#x904D;&#x5386;&#x5BF9;&#x8C61;&#x6240;&#x6709;&#x5C5E;&#x6027;&#xFF0C;&#x6CE8;&#x610F;&#x5904;&#x7406;&#x5FAA;&#x73AF;&#x5F15;&#x7528;&#x7684;&#x95EE;&#x9898;&#x3002;</p><p>&#x53EF;&#x501F;&#x52A9;&#x73B0;&#x6709;&#x5E93;&#x5982; lodash &#x7684; <code>_.isEqual</code> &#x5B9E;&#x73B0;&#x6DF1;&#x5EA6;&#x6BD4;&#x8F83;&#x3002;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF08;&#x7B80;&#x5316;&#x7248;&#xFF09;&#xFF1A;</p><pre><code class="language-js">function deepEqual(obj1, obj2) {
  if (obj1 === obj2) return true;
  if (typeof obj1 !== &apos;object&apos; || typeof obj2 !== &apos;object&apos; || !obj1 || !obj2) {
    return false;
  }
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  if (keys1.length !== keys2.length) return false;
  for (let key of keys1) {
    if (!deepEqual(obj1[key], obj2[key])) return false;
  }
  return true;
}
</code></pre><hr><h2 id="6-%E5%89%8D%E7%AB%AF%E6%9E%B6%E6%9E%84%E4%B8%8E%E5%BE%AE%E5%89%8D%E7%AB%AF">6. &#x524D;&#x7AEF;&#x67B6;&#x6784;&#x4E0E;&#x5FAE;&#x524D;&#x7AEF;</h2><h3 id="%E5%89%8D%E7%AB%AF%E5%9B%BD%E9%99%85%E5%8C%96%E6%96%B9%E6%A1%88">&#x524D;&#x7AEF;&#x56FD;&#x9645;&#x5316;&#x65B9;&#x6848;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x91C7;&#x7528;&#x6210;&#x719F;&#x7684;&#x56FD;&#x9645;&#x5316;&#x5E93;&#xFF0C;&#x5982; <a href="https://www.i18next.com/">i18next</a>&#x3001;<a href="https://kazupon.github.io/vue-i18n/">vue-i18n</a> &#x6216; <a href="https://formatjs.io/react/">react-intl</a></p><p>&#x591A;&#x8BED;&#x8A00;&#x8D44;&#x6E90;&#x901A;&#x5E38;&#x4EE5; JSON &#x6587;&#x4EF6;&#x5F62;&#x5F0F;&#x5B58;&#x50A8;&#xFF0C;&#x901A;&#x8FC7;&#x8BED;&#x8A00;&#x5207;&#x6362;&#x52A8;&#x6001;&#x66F4;&#x65B0;&#x9875;&#x9762;&#x6587;&#x672C;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF08;React + react-intl&#xFF09;&#xFF1A;</p><pre><code class="language-jsx">import { IntlProvider, FormattedMessage } from &apos;react-intl&apos;;
import messages_en from &apos;./locales/en.json&apos;;
import messages_zh from &apos;./locales/zh.json&apos;;

const messages = {
  en: messages_en,
  zh: messages_zh,
};

function App() {
  const locale = &apos;zh&apos;;
  return (
    &lt;IntlProvider locale={locale} messages={messages[locale]}&gt;
      &lt;div&gt;
        &lt;FormattedMessage id=&quot;app.greeting&quot; defaultMessage=&quot;Hello&quot; /&gt;
      &lt;/div&gt;
    &lt;/IntlProvider&gt;
  );
}
</code></pre><hr><h3 id="%E5%BA%94%E7%94%A8%E7%81%B0%E5%BA%A6%E5%8F%91%E5%B8%83%E4%B8%8E%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C%E4%BF%9D%E8%AF%81">&#x5E94;&#x7528;&#x7070;&#x5EA6;&#x53D1;&#x5E03;&#x4E0E;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4FDD;&#x8BC1;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5229;&#x7528;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3001;&#x914D;&#x7F6E;&#x4E2D;&#x5FC3;&#x53CA; API &#x7F51;&#x5173;&#x5B9E;&#x73B0;&#x65B0;&#x529F;&#x80FD;&#x7070;&#x5EA6;&#x53D1;&#x5E03;</p><p>&#x5728;&#x9875;&#x9762;&#x8BF7;&#x6C42;&#x63A5;&#x53E3;&#x65F6;&#x901A;&#x8FC7;&#x9650;&#x6D41;&#x3001;&#x964D;&#x7EA7;&#x7B56;&#x7565;&#x548C;&#x5206;&#x5E03;&#x5F0F;&#x7F13;&#x5B58;&#x786E;&#x4FDD;&#x7A33;&#x5B9A;&#x6027;</p><p>&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x4FDD;&#x8BC1;&#x5305;&#x62EC;&#x5E73;&#x6ED1;&#x5207;&#x6362;&#x3001;&#x53CB;&#x597D;&#x7684;&#x9519;&#x8BEF;&#x63D0;&#x793A;&#x548C;&#x9002;&#x65F6;&#x7684;&#x66F4;&#x65B0;&#x63D0;&#x793A;</p><hr><h3 id="%E5%BE%AE%E5%89%8D%E7%AB%AF%E6%9E%B6%E6%9E%84%E4%B8%8E-javascript-%E9%9A%94%E7%A6%BB">&#x5FAE;&#x524D;&#x7AEF;&#x67B6;&#x6784;&#x4E0E; JavaScript &#x9694;&#x79BB;</h3><p><strong>&#x539F;&#x7406;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5FAE;&#x524D;&#x7AEF;&#x76EE;&#x6807;&#x662F;&#x5C06;&#x591A;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x5B50;&#x5E94;&#x7528;&#x7EC4;&#x5408;&#x5230;&#x4E00;&#x4E2A;&#x6574;&#x4F53;&#x5E94;&#x7528;&#x4E2D;&#x3002;</p><p>&#x4F20;&#x7EDF; iframe &#x65B9;&#x6848;&#x867D;&#x7136;&#x80FD;&#x505A;&#x5230;&#x6837;&#x5F0F;&#x548C; JS &#x9694;&#x79BB;&#xFF0C;&#x4F46;&#x4EA4;&#x4E92;&#x4E0D;&#x4FBF;&#x3001;&#x6027;&#x80FD;&#x635F;&#x8017;&#x8F83;&#x5927;&#x3002;</p><p>&#x73B0;&#x4EE3;&#x65B9;&#x6848;&#x5982; <a href="https://qiankun.umijs.org/">Qiankun</a> &#x91C7;&#x7528;&#x6C99;&#x7BB1;&#xFF08;Sandbox&#xFF09;&#x6280;&#x672F;&#xFF08;&#x4F8B;&#x5982;&#x901A;&#x8FC7; Proxy&#x3001;eval &#x53CA;&#x9694;&#x79BB;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF09;&#x6765;&#x5B9E;&#x73B0;&#x5E94;&#x7528;&#x9694;&#x79BB;&#xFF0C;&#x65E2;&#x4FDD;&#x8BC1;&#x5B50;&#x5E94;&#x7528;&#x7684;&#x72EC;&#x7ACB;&#x6027;&#xFF0C;&#x4E5F;&#x5141;&#x8BB8;&#x9002;&#x5F53;&#x901A;&#x4FE1;&#x3002;</p><hr><h3 id="react-%E6%B8%B2%E6%9F%93%E4%BC%98%E5%8C%96%E5%8F%8A-key-%E7%9A%84%E4%BD%BF%E7%94%A8">React &#x6E32;&#x67D3;&#x4F18;&#x5316;&#x53CA; key &#x7684;&#x4F7F;&#x7528;</h3><p><strong>&#x95EE;&#x9898;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5728;&#x5217;&#x8868;&#x6E32;&#x67D3;&#x4E2D;&#xFF0C;&#x4E0D;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528; index &#x4F5C;&#x4E3A; key&#xFF0C;&#x56E0;&#x4E3A;&#x8FD9;&#x6837;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x7EC4;&#x4EF6;&#x590D;&#x7528;&#x9519;&#x8BEF;&#xFF0C;&#x65E0;&#x6CD5;&#x6B63;&#x786E;&#x8BC6;&#x522B;&#x7EC4;&#x4EF6;&#x72B6;&#x6001;&#x53D8;&#x5316;&#x3002;</p><p>&#x5E94;&#x5C3D;&#x53EF;&#x80FD;&#x4F7F;&#x7528;&#x7A33;&#x5B9A;&#x4E14;&#x552F;&#x4E00;&#x7684;&#x6807;&#x8BC6;&#x4F5C;&#x4E3A; key&#x3002;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;</p><pre><code class="language-jsx">// &#x9519;&#x8BEF;&#x793A;&#x4F8B;&#xFF1A;&#x4F7F;&#x7528; index &#x4F5C;&#x4E3A; key
{items.map((item, index) =&gt; &lt;Item key={index} data={item} /&gt;)}

// &#x6B63;&#x786E;&#x793A;&#x4F8B;&#xFF1A;&#x4F7F;&#x7528;&#x552F;&#x4E00; id
{items.map(item =&gt; &lt;Item key={item.id} data={item} /&gt;)}
</code></pre><hr><h3 id="context-%E4%BD%BF%E7%94%A8%E4%B8%AD%E7%9A%84%E6%B3%A8%E6%84%8F%E7%82%B9">Context &#x4F7F;&#x7528;&#x4E2D;&#x7684;&#x6CE8;&#x610F;&#x70B9;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>React Context &#x63D0;&#x4F9B;&#x8DE8;&#x7EC4;&#x4EF6;&#x6570;&#x636E;&#x4F20;&#x9012;&#xFF0C;&#x4F46;&#x82E5;&#x5927;&#x91CF;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x5728; context &#x4E2D;&#xFF0C;&#x53EF;&#x80FD;&#x5F15;&#x8D77;&#x4E0A;&#x4E0B;&#x6587;&#x8BA2;&#x9605;&#x7EC4;&#x4EF6;&#x7684;&#x9891;&#x7E41;&#x91CD;&#x6E32;&#x67D3;&#x3002;</p><p>&#x5E94;&#x6CE8;&#x610F;&#x5206;&#x79BB;&#x5927;&#x8303;&#x56F4;&#x5171;&#x4EAB;&#x6570;&#x636E;&#x548C;&#x5C40;&#x90E8;&#x72B6;&#x6001;&#xFF0C;&#x6216;&#x4F7F;&#x7528; memoization &#x6765;&#x4F18;&#x5316;&#x3002;</p><hr><h2 id="7-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B8%8E%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86">7. &#x6027;&#x80FD;&#x4F18;&#x5316;&#x4E0E;&#x8D44;&#x6E90;&#x7BA1;&#x7406;</h2><h3 id="%E5%A4%A7%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE%E9%87%8F%E6%B8%B2%E6%9F%93">&#x5927;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x4E0E;&#x5927;&#x6570;&#x636E;&#x91CF;&#x6E32;&#x67D3;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5927;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#xFF1A;&#x91C7;&#x7528;&#x5206;&#x7247;&#x4E0A;&#x4F20;&#x3001;&#x65AD;&#x70B9;&#x7EED;&#x4F20;&#x6280;&#x672F;&#xFF0C;&#x5E38;&#x7528;&#x5DE5;&#x5177;&#x5982; <a href="https://uppy.io/">uppy</a></p><p>&#x5927;&#x6570;&#x636E;&#x6E32;&#x67D3;&#xFF1A;&#x4F7F;&#x7528;&#x865A;&#x62DF;&#x5217;&#x8868;&#xFF08;Virtual List&#xFF09;&#x3001;&#x5206;&#x9875;&#x3001;&#x61D2;&#x52A0;&#x8F7D;&#xFF0C;&#x5E93;&#x5982; <a href="https://github.com/bvaughn/react-virtualized">react-virtualized</a></p><hr><h3 id="qps-%E5%B3%B0%E5%80%BC%E5%A4%84%E7%90%86%E7%AD%96%E7%95%A5">QPS &#x5CF0;&#x503C;&#x5904;&#x7406;&#x7B56;&#x7565;</h3><p><strong>&#x63AA;&#x65BD;</strong>&#xFF1A;</p><p>&#x540E;&#x7AEF;&#x901A;&#x8FC7; API &#x9650;&#x6D41;&#x3001;&#x7F13;&#x5B58;&#x3001;&#x5206;&#x5E03;&#x5F0F;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x5904;&#x7406;&#x9AD8;&#x5E76;&#x53D1;</p><p>&#x524D;&#x7AEF;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x3001;Web Worker &#x5206;&#x62C5;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#xFF0C;&#x5FC5;&#x8981;&#x65F6;&#x663E;&#x793A;&#x964D;&#x7EA7;&#x754C;&#x9762;</p><hr><h3 id="js-%E6%89%A7%E8%A1%8C%E5%A4%A7%E9%87%8F%E4%BB%BB%E5%8A%A1%E4%B8%8D%E5%8D%A1%E9%A1%BF">JS &#x6267;&#x884C;&#x5927;&#x91CF;&#x4EFB;&#x52A1;&#x4E0D;&#x5361;&#x987F;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5C06;&#x5927;&#x91CF;&#x4EFB;&#x52A1;&#x5206;&#x89E3;&#x4E3A;&#x5C0F;&#x5757;&#xFF0C;&#x5229;&#x7528;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x7A7A;&#x9699;&#x6267;&#x884C;&#xFF08;&#x5982;&#x4F7F;&#x7528; <code>requestIdleCallback</code> &#x6216; <code>setTimeout</code>&#xFF09;</p><p>&#x53EF;&#x91C7;&#x7528; Web Worker &#x5C06;&#x8BA1;&#x7B97;&#x4EFB;&#x52A1;&#x79FB;&#x81F3;&#x540E;&#x53F0;&#x7EBF;&#x7A0B;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF08;&#x4F7F;&#x7528; setTimeout &#x5206;&#x6279;&#x6267;&#x884C;&#xFF09;&#xFF1A;</p><pre><code class="language-js">function processTasks(tasks) {
  if (!tasks.length) return;
  const task = tasks.shift();
  // &#x6267;&#x884C;&#x4EFB;&#x52A1;
  doTask(task);
  setTimeout(() =&gt; processTasks(tasks), 0);
}
</code></pre><hr><h3 id="webpack-%E6%89%93%E5%8C%85%E4%BC%98%E5%8C%96">Webpack &#x6253;&#x5305;&#x4F18;&#x5316;</h3><p><strong>&#x5185;&#x5BB9;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><strong>Hash &#x751F;&#x6210;</strong>&#xFF1A;&#x57FA;&#x4E8E;&#x6A21;&#x5757;&#x5185;&#x5BB9;&#x751F;&#x6210; hash&#xFF0C;&#x786E;&#x4FDD;&#x6A21;&#x5757;&#x5185;&#x5BB9;&#x6539;&#x53D8;&#x65F6; hash &#x6539;&#x53D8;</p><p><strong>&#x8FD0;&#x884C;&#x65F6; chunk &#x52A0;&#x8F7D;</strong>&#xFF1A;&#x5C06;&#x8FD0;&#x884C;&#x65F6;&#x4EE3;&#x7801;&#x4E0E;&#x5E94;&#x7528;&#x4EE3;&#x7801;&#x5206;&#x79BB;&#xFF0C;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#xFF0C;&#x51CF;&#x5C11;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;</p><p>&#x914D;&#x7F6E; Tree Shaking&#x3001;&#x61D2;&#x52A0;&#x8F7D;&#x3001;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x3001;&#x7F13;&#x5B58;&#x4F18;&#x5316;&#x7B49;&#x5747;&#x662F;&#x5E38;&#x89C1;&#x624B;&#x6BB5;</p><hr><h3 id="%E8%AF%B7%E6%B1%82%E8%80%97%E6%97%B6%E7%BB%9F%E8%AE%A1">&#x8BF7;&#x6C42;&#x8017;&#x65F6;&#x7EDF;&#x8BA1;</h3><p><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;<br>&#x5728; Axios &#x62E6;&#x622A;&#x5668;&#x4E2D;&#x8BB0;&#x5F55;&#x8BF7;&#x6C42;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&#x4E0E;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#xFF0C;&#x8BA1;&#x7B97;&#x8017;&#x65F6;&#x6570;&#x636E;&#x540E;&#x4E0A;&#x62A5;&#x81F3;&#x65E5;&#x5FD7;&#x7CFB;&#x7EDF;&#x6216;&#x7EDF;&#x8BA1;&#x5E73;&#x53F0;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x53C2;&#x8003;</strong>&#xFF1A;&#x89C1;&#x4E0A;&#x6587; <a href="https://chatgpt.com/c/67eb5769-98b0-8002-b847-a62a635b0c2e#%E8%AF%B7%E6%B1%82%E6%8B%A6%E6%88%AA%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8">&#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x5668;&#x7684;&#x4F7F;&#x7528;</a></p><hr><h2 id="8-%E5%AE%89%E5%85%A8%E3%80%81%E8%B7%A8%E5%9F%9F%E4%B8%8E%E7%BC%93%E5%AD%98">8. &#x5B89;&#x5168;&#x3001;&#x8DE8;&#x57DF;&#x4E0E;&#x7F13;&#x5B58;</h2><h3 id="%E6%B5%8F%E8%A7%88%E5%99%A8%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5%E4%B8%8E-cdn-%E5%8A%A0%E8%BD%BD">&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x4E0E; CDN &#x52A0;&#x8F7D;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x6D4F;&#x89C8;&#x5668;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x9650;&#x5236;&#x8DE8;&#x57DF; DOM &#x64CD;&#x4F5C;&#x3001;Ajax &#x8BF7;&#x6C42;&#x7B49;&#x3002;</p><p>CDN &#x63D0;&#x4F9B;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x670D;&#x52A1;&#xFF0C;&#x52A0;&#x8F7D;&#x65F6;&#x4E0D;&#x6D89;&#x53CA;&#x590D;&#x6742;&#x7684; Cookie&#x3001;LocalStorage &#x8DE8;&#x57DF;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x5927;&#x90E8;&#x5206;&#x60C5;&#x51B5;&#x4E0B;&#x4E0D;&#x4F1A;&#x89E6;&#x53D1;&#x4E25;&#x683C;&#x7684;&#x8DE8;&#x57DF;&#x9650;&#x5236;&#x3002;</p><hr><h3 id="cookie-%E7%9A%84%E8%B7%A8%E5%9F%9F%E5%85%B1%E4%BA%AB">Cookie &#x7684;&#x8DE8;&#x57DF;&#x5171;&#x4EAB;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>Cookie &#x4E0D;&#x80FD;&#x5728;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x7684;&#x4E3B;&#x57DF;&#x95F4;&#x5171;&#x4EAB;&#x3002;</p><p>&#x53EF;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>Domain</code> &#x5C5E;&#x6027;&#x6765;&#x5B9E;&#x73B0;&#x4E8C;&#x7EA7;&#x57DF;&#x540D;&#x4E4B;&#x95F4;&#x5171;&#x4EAB;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x8BBE;&#x7F6E; <code>Domain=.example.com</code> &#x53EF;&#x4F7F; <code>sub1.example.com</code> &#x548C; <code>sub2.example.com</code> &#x5171;&#x4EAB; Cookie&#x3002;</p><hr><h3 id="%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E5%88%AB%E4%BA%BA%E8%B0%83%E8%AF%95%E6%88%96%E7%A7%BB%E9%99%A4%E6%B0%B4%E5%8D%B0">&#x5982;&#x4F55;&#x9632;&#x6B62;&#x522B;&#x4EBA;&#x8C03;&#x8BD5;&#x6216;&#x79FB;&#x9664;&#x6C34;&#x5370;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><strong>&#x4EE3;&#x7801;&#x6DF7;&#x6DC6;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x6253;&#x5305;&#x5DE5;&#x5177;&#xFF08;&#x5982; webpack &#x7684; UglifyJS&#x3001;Terser&#xFF09;&#x6DF7;&#x6DC6;&#x4EE3;&#x7801;</p><p><strong>&#x68C0;&#x6D4B;&#x8C03;&#x8BD5;</strong>&#xFF1A;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x52A0;&#x5165;&#x68C0;&#x6D4B;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x6253;&#x5F00;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x52A8;&#x6001;&#x751F;&#x6210;&#x6C34;&#x5370;</p><p><strong>&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;</strong>&#xFF1A;&#x5173;&#x952E;&#x5185;&#x5BB9;&#x7531;&#x670D;&#x52A1;&#x7AEF;&#x751F;&#x6210;&#xFF0C;&#x964D;&#x4F4E;&#x524D;&#x7AEF;&#x7BE1;&#x6539;&#x98CE;&#x9669;</p><hr><h2 id="9-html%E3%80%81css-%E4%B8%8E%E6%B5%8F%E8%A7%88%E5%99%A8-api">9. HTML&#x3001;CSS &#x4E0E;&#x6D4F;&#x89C8;&#x5668; API</h2><h3 id="html-%E4%B8%AD-data%E5%B1%9E%E6%80%A7">HTML &#x4E2D; data- &#x5C5E;&#x6027;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>HTML &#x5143;&#x7D20;&#x4E0A;&#x4EE5; <code>data-</code> &#x5F00;&#x5934;&#x7684;&#x5C5E;&#x6027;&#x7528;&#x4E8E;&#x5B58;&#x50A8;&#x81EA;&#x5B9A;&#x4E49;&#x6570;&#x636E;&#xFF0C;&#x4E0D;&#x4F1A;&#x5F71;&#x54CD;&#x9875;&#x9762;&#x5C55;&#x793A;</p><p>&#x53EF;&#x901A;&#x8FC7; <code>element.dataset</code> &#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x8BBF;&#x95EE;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;</p><pre><code class="language-html">&lt;div data-user-id=&quot;12345&quot; data-role=&quot;admin&quot;&gt;&lt;/div&gt;
</code></pre><pre><code class="language-js">const div = document.querySelector(&apos;div&apos;);
console.log(div.dataset.userId); // &quot;12345&quot;
</code></pre><hr><h3 id="%E5%88%A4%E6%96%AD-dom-%E6%98%AF%E5%90%A6%E5%9C%A8%E5%8F%AF%E8%A7%86%E5%8C%BA%E5%9F%9F">&#x5224;&#x65AD; DOM &#x662F;&#x5426;&#x5728;&#x53EF;&#x89C6;&#x533A;&#x57DF;</h3><p><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; <code>Element.getBoundingClientRect()</code> &#x83B7;&#x53D6;&#x5143;&#x7D20;&#x4F4D;&#x7F6E;&#xFF0C;&#x518D;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5728; viewport &#x5185;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">function isInViewport(el) {
  const rect = el.getBoundingClientRect();
  return (
    rect.top &gt;= 0 &amp;&amp;
    rect.left &gt;= 0 &amp;&amp;
    rect.bottom &lt;= window.innerHeight &amp;&amp;
    rect.right &lt;= window.innerWidth
  );
}
</code></pre><hr><h3 id="canvas-%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%9A%E7%94%B5%E5%BD%B1%E9%99%A2%E9%80%89%E7%A5%A8%E7%A4%BA%E4%BE%8B">Canvas &#x5E94;&#x7528;&#x573A;&#x666F;&#xFF1A;&#x7535;&#x5F71;&#x9662;&#x9009;&#x7968;&#x793A;&#x4F8B;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x4F7F;&#x7528; HTML5 Canvas &#x7ED8;&#x5236;&#x5EA7;&#x4F4D;&#x56FE;&#xFF0C;&#x5229;&#x7528;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5B9E;&#x73B0;&#x9009;&#x5EA7;&#x903B;&#x8F91;</p><p>&#x6839;&#x636E;&#x9700;&#x8981;&#x7ED8;&#x5236;&#x5EA7;&#x4F4D;&#x72B6;&#x6001;&#xFF08;&#x5DF2;&#x9009;&#x3001;&#x7A7A;&#x95F2;&#x3001;&#x4E0D;&#x53EF;&#x7528;&#xFF09;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-html">&lt;canvas id=&quot;ticketCanvas&quot; width=&quot;600&quot; height=&quot;400&quot;&gt;&lt;/canvas&gt;
&lt;script&gt;
  const canvas = document.getElementById(&apos;ticketCanvas&apos;);
  const ctx = canvas.getContext(&apos;2d&apos;);

  // &#x793A;&#x4F8B;&#xFF1A;&#x7ED8;&#x5236;&#x4E00;&#x4E2A;&#x5EA7;&#x4F4D;
  function drawSeat(x, y, status) {
    ctx.fillStyle = status === &apos;selected&apos; ? &apos;#ff0000&apos; : &apos;#ccc&apos;;
    ctx.fillRect(x, y, 40, 40);
  }
  
  // &#x7ED8;&#x5236;&#x591A;&#x4E2A;&#x5EA7;&#x4F4D;
  for (let i = 0; i &lt; 5; i++) {
    for (let j = 0; j &lt; 5; j++) {
      drawSeat(50 + j * 50, 50 + i * 50, &apos;free&apos;);
    }
  }
  
  // &#x53EF;&#x6269;&#x5C55;&#xFF1A;&#x7ED1;&#x5B9A;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;&#xFF0C;&#x5B9E;&#x73B0;&#x9009;&#x5EA7;&#x903B;&#x8F91;
  canvas.addEventListener(&apos;click&apos;, (e) =&gt; {
    // &#x8BA1;&#x7B97;&#x70B9;&#x51FB;&#x4F4D;&#x7F6E;&#xFF0C;&#x5224;&#x65AD;&#x70B9;&#x51FB;&#x4E86;&#x54EA;&#x4E2A;&#x5EA7;&#x4F4D;
    console.log(e.offsetX, e.offsetY);
  });
&lt;/script&gt;
</code></pre><hr><h3 id="requestidlecallback-%E5%92%8C-documentfragment-%E7%9A%84%E4%BD%BF%E7%94%A8">requestIdleCallback &#x548C; documentFragment &#x7684;&#x4F7F;&#x7528;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><code>requestIdleCallback</code> &#x53EF;&#x7528;&#x4E8E;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x7A7A;&#x95F2;&#x65F6;&#x6267;&#x884C;&#x4F4E;&#x4F18;&#x5148;&#x7EA7;&#x4EFB;&#x52A1;&#xFF0C;&#x907F;&#x514D;&#x4E3B;&#x7EBF;&#x7A0B;&#x963B;&#x585E;&#x3002;</p><p><code>documentFragment</code> &#x662F;&#x5185;&#x5B58;&#x4E2D;&#x6784;&#x5EFA; DOM &#x7684;&#x8F7B;&#x91CF;&#x5BB9;&#x5668;&#xFF0C;&#x63D2;&#x5165;&#x540E;&#x53EF;&#x4EE5;&#x4E00;&#x6B21;&#x6027;&#x89E6;&#x53D1; DOM &#x66F4;&#x65B0;&#xFF0C;&#x51CF;&#x5C11;&#x91CD;&#x6392;&#x548C;&#x91CD;&#x7ED8;&#x3002;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">// &#x4F7F;&#x7528; requestIdleCallback &#x6267;&#x884C;&#x4F4E;&#x4F18;&#x5148;&#x7EA7;&#x4EFB;&#x52A1;
requestIdleCallback(() =&gt; {
  console.log(&quot;&#x6D4F;&#x89C8;&#x5668;&#x7A7A;&#x95F2;&#x65F6;&#x6267;&#x884C;&#x7684;&#x4EFB;&#x52A1;&quot;);
});

// &#x4F7F;&#x7528; documentFragment &#x6784;&#x5EFA; DOM
const fragment = document.createDocumentFragment();
for (let i = 0; i &lt; 100; i++) {
  const li = document.createElement(&apos;li&apos;);
  li.textContent = `Item ${i}`;
  fragment.appendChild(li);
}
document.getElementById(&apos;list&apos;).appendChild(fragment);
</code></pre><hr><h2 id="10-%E5%B7%A5%E5%85%B7%E9%93%BE%E4%B8%8E%E5%89%8D%E7%AB%AF-cli">10. &#x5DE5;&#x5177;&#x94FE;&#x4E0E;&#x524D;&#x7AEF; CLI</h2><h3 id="%E5%A6%82%E4%BD%95%E7%94%A8-webpack-%E6%9E%84%E5%BB%BA-react-%E5%BA%94%E7%94%A8">&#x5982;&#x4F55;&#x7528; webpack &#x6784;&#x5EFA; React &#x5E94;&#x7528;</h3><p><strong>&#x642D;&#x5EFA;&#x6B65;&#x9AA4;</strong>&#xFF1A;</p><p>&#x521D;&#x59CB;&#x5316;&#x9879;&#x76EE;&#xFF0C;&#x5B89;&#x88C5; webpack&#x3001;Babel&#x3001;React &#x53CA;&#x76F8;&#x5173;&#x4F9D;&#x8D56;</p><p>&#x914D;&#x7F6E; webpack &#x7684;&#x5165;&#x53E3;&#xFF08;entry&#xFF09;&#x3001;&#x8F93;&#x51FA;&#xFF08;output&#xFF09;&#x53CA;&#x6A21;&#x5757;&#x89C4;&#x5219;&#xFF08;module.rules&#xFF09;</p><p>&#x914D;&#x7F6E; Babel&#xFF08;.babelrc &#x6216; babel.config.js&#xFF09;&#xFF0C;&#x652F;&#x6301; JSX &#x548C; ES6+</p><p>&#x914D;&#x7F6E;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF08;&#x5982; webpack-dev-server&#xFF09;&#x5B9E;&#x73B0;&#x70ED;&#x66F4;&#x65B0;</p><p>&#x6839;&#x636E;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x3001;&#x61D2;&#x52A0;&#x8F7D;&#x3001;Tree Shaking &#x7B49;&#x4F18;&#x5316;&#x9879;</p><p><strong>&#x793A;&#x4F8B; webpack &#x914D;&#x7F6E;&#xFF08;&#x7B80;&#x5316;&#x7248;&#xFF09;</strong>&#xFF1A;</p><pre><code class="language-js">// webpack.config.js
const path = require(&apos;path&apos;);

module.exports = {
  entry: &apos;./src/index.jsx&apos;,
  output: {
    path: path.resolve(__dirname, &apos;dist&apos;),
    filename: &apos;bundle.[hash].js&apos;,
    publicPath: &apos;/&apos;,
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: [&apos;babel-loader&apos;]
      },
      // &#x5176;&#x4ED6; loader&#xFF08;&#x5982; css-loader&#x3001;file-loader &#x7B49;&#xFF09;
    ]
  },
  devServer: {
    historyApiFallback: true,
    hot: true,
  }
};
</code></pre><hr><h3 id="nodejs-%E5%AE%9E%E7%8E%B0%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%BB%9F%E8%AE%A1%E4%BB%A3%E7%A0%81%E8%A1%8C%E6%95%B0">Node.js &#x5B9E;&#x73B0;&#x547D;&#x4EE4;&#x884C;&#x7EDF;&#x8BA1;&#x4EE3;&#x7801;&#x884C;&#x6570;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5229;&#x7528; Node.js &#x7684; fs &#x6A21;&#x5757;&#x8BFB;&#x53D6;&#x76EE;&#x5F55;&#x4E0B;&#x6240;&#x6709;&#x6587;&#x4EF6;</p><p>&#x8FC7;&#x6EE4;&#x51FA; JS&#x3001;TS&#x3001;CSS &#x6587;&#x4EF6;&#xFF0C;&#x7EDF;&#x8BA1;&#x6587;&#x4EF6;&#x4E2D;&#x975E;&#x7A7A;&#x884C;&#x6570;</p><p>&#x904D;&#x5386;&#x76EE;&#x5F55;&#xFF08;&#x9012;&#x5F52;&#xFF09;&#x7D2F;&#x52A0;&#x884C;&#x6570;</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">const fs = require(&apos;fs&apos;);
const path = require(&apos;path&apos;);

function countLines(filePath) {
  const content = fs.readFileSync(filePath, &apos;utf8&apos;);
  return content.split(&apos;\n&apos;).filter(line =&gt; line.trim() !== &apos;&apos;).length;
}

function traverseDir(dir) {
  let total = 0;
  fs.readdirSync(dir).forEach(item =&gt; {
    const fullPath = path.join(dir, item);
    if (fs.statSync(fullPath).isDirectory()) {
      total += traverseDir(fullPath);
    } else if (/\.(js|ts|css)$/.test(fullPath)) {
      total += countLines(fullPath);
    }
  });
  return total;
}

console.log(&apos;&#x603B;&#x884C;&#x6570;&#xFF1A;&apos;, traverseDir(&apos;./src&apos;));
</code></pre><hr><h3 id="script-%E6%A0%87%E7%AD%BE%E7%9A%84%E5%B1%9E%E6%80%A7%E5%8F%8A-spa-hash-%E8%B7%AF%E7%94%B1">script &#x6807;&#x7B7E;&#x7684;&#x5C5E;&#x6027;&#x53CA; SPA hash &#x8DEF;&#x7531;</h3><p><strong>script &#x6807;&#x7B7E;&#x5E38;&#x89C1;&#x5C5E;&#x6027;</strong>&#xFF1A;</p><p><code>src</code>&#xFF1A;&#x5F15;&#x5165;&#x5916;&#x90E8;&#x811A;&#x672C;</p><p><code>async</code>&#xFF1A;&#x811A;&#x672C;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#xFF0C;&#x6267;&#x884C;&#x987A;&#x5E8F;&#x4E0D;&#x4FDD;&#x8BC1;</p><p><code>defer</code>&#xFF1A;&#x811A;&#x672C;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#xFF0C;&#x9875;&#x9762;&#x89E3;&#x6790;&#x5B8C;&#x6210;&#x540E;&#x6267;&#x884C;</p><p><strong>SPA hash &#x8DEF;&#x7531;&#x597D;&#x5904;</strong>&#xFF1A;</p><p>&#x5229;&#x7528; URL &#x7684; hash &#x90E8;&#x5206;&#x5B9E;&#x73B0;&#x524D;&#x7AEF;&#x8DEF;&#x7531;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x670D;&#x52A1;&#x7AEF;&#x914D;&#x7F6E;</p><p>&#x7528;&#x6237;&#x5237;&#x65B0;&#x9875;&#x9762;&#x65F6;&#x4E0D;&#x4F1A;&#x56E0;&#x8DEF;&#x7531;&#x95EE;&#x9898;&#x5BFC;&#x81F4; 404</p><hr><h2 id="11-%E8%AE%A4%E8%AF%81%E3%80%81%E6%8E%88%E6%9D%83%E4%B8%8E%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95">11. &#x8BA4;&#x8BC1;&#x3001;&#x6388;&#x6743;&#x4E0E;&#x5355;&#x70B9;&#x767B;&#x5F55;</h2><h3 id="oauth20-%E4%B8%8E%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95%EF%BC%88sso%EF%BC%89">OAuth2.0 &#x4E0E;&#x5355;&#x70B9;&#x767B;&#x5F55;&#xFF08;SSO&#xFF09;</h3><p><strong>OAuth2.0 &#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x4E00;&#x79CD;&#x6388;&#x6743;&#x534F;&#x8BAE;&#xFF0C;&#x5141;&#x8BB8;&#x7B2C;&#x4E09;&#x65B9;&#x5E94;&#x7528;&#x8BBF;&#x95EE;&#x7528;&#x6237;&#x53D7;&#x4FDD;&#x62A4;&#x8D44;&#x6E90;</p><p>&#x901A;&#x8FC7;&#x6388;&#x6743;&#x7801;&#x3001;&#x9690;&#x5F0F;&#x6388;&#x6743;&#x7B49;&#x6A21;&#x5F0F;&#x5B9E;&#x73B0;&#x5B89;&#x5168;&#x6388;&#x6743;</p><p><strong>&#x5355;&#x70B9;&#x767B;&#x5F55;&#xFF08;SSO&#xFF09;&#x6D41;&#x7A0B;</strong>&#xFF1A;</p><p>&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x9700;&#x8981;&#x8BA4;&#x8BC1;&#x7684;&#x5E94;&#x7528;</p><p>&#x5E94;&#x7528;&#x5C06;&#x7528;&#x6237;&#x91CD;&#x5B9A;&#x5411;&#x81F3;&#x8BA4;&#x8BC1;&#x4E2D;&#x5FC3;&#x767B;&#x5F55;</p><p>&#x767B;&#x5F55;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x8BA4;&#x8BC1;&#x4E2D;&#x5FC3;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; token &#x6216;&#x6388;&#x6743;&#x7801;</p><p>&#x5E94;&#x7528;&#x5229;&#x7528; token &#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#xFF0C;&#x5E76;&#x521B;&#x5EFA;&#x4F1A;&#x8BDD;</p><hr><h3 id="token-%E9%AA%8C%E8%AF%81%E4%B8%8E%E6%9D%83%E9%99%90%E8%AE%BE%E8%AE%A1">Token &#x9A8C;&#x8BC1;&#x4E0E;&#x6743;&#x9650;&#x8BBE;&#x8BA1;</h3><p><strong>&#x601D;&#x8DEF;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x5E38;&#x7528; JSON Web Token&#xFF08;JWT&#xFF09;&#x5728;&#x524D;&#x540E;&#x7AEF;&#x4E4B;&#x95F4;&#x4F20;&#x9012;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x4FE1;&#x606F;</p><p>&#x524D;&#x7AEF;&#x6839;&#x636E; token &#x5185;&#x7684;&#x4FE1;&#x606F;&#xFF08;&#x5982;&#x7528;&#x6237;&#x89D2;&#x8272;&#x3001;&#x6743;&#x9650;&#x5217;&#x8868;&#xFF09;&#x51B3;&#x5B9A;&#x9875;&#x9762;&#x5C55;&#x793A;&#x548C;&#x529F;&#x80FD;&#x6743;&#x9650;</p><p>&#x7ED3;&#x5408;&#x8DEF;&#x7531;&#x5B88;&#x536B;&#x3001;&#x7EC4;&#x4EF6;&#x7EA7;&#x6743;&#x9650;&#x6821;&#x9A8C;&#x6784;&#x5EFA;&#x5B8C;&#x6574;&#x6743;&#x9650;&#x4F53;&#x7CFB;</p><hr><h2 id="12-%E5%85%B6%E4%BB%96%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">12. &#x5176;&#x4ED6;&#x5E38;&#x89C1;&#x95EE;&#x9898;</h2><h3 id="js-%E6%95%B0%E5%AD%97%E8%B6%85%E5%87%BA-number-%E6%9C%80%E5%A4%A7%E5%80%BC%E7%9A%84%E5%A4%84%E7%90%86">JS &#x6570;&#x5B57;&#x8D85;&#x51FA; Number &#x6700;&#x5927;&#x503C;&#x7684;&#x5904;&#x7406;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>JavaScript &#x4E2D; Number &#x7C7B;&#x578B;&#x5B58;&#x5728;&#x4E0A;&#x9650;&#xFF08;<code>Number.MAX_SAFE_INTEGER</code>&#xFF09;</p><p>&#x5BF9;&#x4E8E;&#x8D85;&#x5927;&#x6574;&#x6570;&#xFF0C;&#x53EF;&#x4F7F;&#x7528; BigInt &#x7C7B;&#x578B;&#xFF08;ES2020 &#x65B0;&#x589E;&#xFF09;&#x6216;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#x5982; big.js</p><p><strong>&#x793A;&#x4F8B;&#x4EE3;&#x7801;</strong>&#xFF1A;</p><pre><code class="language-js">const bigNumber = BigInt(&quot;900719925474099123456789&quot;);
console.log(bigNumber);
</code></pre><hr><h3 id="%E5%89%8D%E7%AB%AF%E9%A1%B5%E9%9D%A2%E7%99%BD%E5%B1%8F%E6%8E%92%E6%9F%A5">&#x524D;&#x7AEF;&#x9875;&#x9762;&#x767D;&#x5C4F;&#x6392;&#x67E5;</h3><p><strong>&#x5E38;&#x89C1;&#x539F;&#x56E0;</strong>&#xFF1A;</p><p>&#x8D44;&#x6E90;&#x52A0;&#x8F7D;&#x5931;&#x8D25;</p><p>JS &#x8BED;&#x6CD5;&#x9519;&#x8BEF;&#x6216;&#x5F02;&#x5E38;</p><p>&#x8DEF;&#x7531;&#x914D;&#x7F6E;&#x9519;&#x8BEF;&#x6216;&#x6253;&#x5305;&#x9519;&#x8BEF;</p><p><strong>&#x6392;&#x67E5;&#x6B65;&#x9AA4;</strong>&#xFF1A;</p><p>&#x68C0;&#x67E5;&#x6D4F;&#x89C8;&#x5668; Console &#x8F93;&#x51FA;&#x9519;&#x8BEF;&#x4FE1;&#x606F;</p><p>&#x68C0;&#x67E5;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x6B63;&#x5E38;&#x52A0;&#x8F7D;&#x6240;&#x6709;&#x8D44;&#x6E90;</p><p>&#x4F7F;&#x7528; sourcemap &#x5B9A;&#x4F4D;&#x9519;&#x8BEF;&#x4EE3;&#x7801;&#x4F4D;&#x7F6E;</p><hr><h3 id="%E8%99%9A%E6%8B%9F%E6%BB%9A%E5%8A%A8%E4%B8%8E%E6%87%92%E5%8A%A0%E8%BD%BD%E5%AE%9E%E7%8E%B0">&#x865A;&#x62DF;&#x6EDA;&#x52A8;&#x4E0E;&#x61D2;&#x52A0;&#x8F7D;&#x5B9E;&#x73B0;</h3><p><strong>&#x7B56;&#x7565;&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p>&#x865A;&#x62DF;&#x6EDA;&#x52A8;&#xFF1A;&#x53EA;&#x6E32;&#x67D3;&#x53EF;&#x89C6;&#x533A;&#x57DF;&#x5185;&#x7684; DOM &#x8282;&#x70B9;&#xFF0C;&#x51CF;&#x5C11;&#x6E32;&#x67D3;&#x5F00;&#x9500;</p><p>&#x56FE;&#x7247;&#x61D2;&#x52A0;&#x8F7D;&#xFF1A;&#x5229;&#x7528; Intersection Observer &#x6216; scroll &#x4E8B;&#x4EF6;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#x56FE;&#x7247;</p><p><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;</p><p>&#x4F7F;&#x7528;&#x5E93; <a href="https://github.com/bvaughn/react-virtualized">react-virtualized</a> &#x5B9E;&#x73B0;&#x865A;&#x62DF;&#x5217;&#x8868;</p><p>&#x53C2;&#x8003;&#x4E0A;&#x6587; <a href="https://chatgpt.com/c/67eb5769-98b0-8002-b847-a62a635b0c2e#%E5%9B%BE%E7%89%87%E6%87%92%E5%8A%A0%E8%BD%BD">&#x56FE;&#x7247;&#x61D2;&#x52A0;&#x8F7D;</a> &#x793A;&#x4F8B;&#x4EE3;&#x7801;</p><hr><h3 id="git-pull-%E4%B8%8E-git-fetch-%E7%9A%84%E5%8C%BA%E5%88%AB">Git Pull &#x4E0E; Git Fetch &#x7684;&#x533A;&#x522B;</h3><p><strong>&#x8BF4;&#x660E;</strong>&#xFF1A;</p><p><code>git fetch</code> &#x4EC5;&#x62C9;&#x53D6;&#x8FDC;&#x7A0B;&#x66F4;&#x65B0;&#xFF0C;&#x4E0D;&#x8FDB;&#x884C;&#x81EA;&#x52A8;&#x5408;&#x5E76;&#xFF1B;</p><p><code>git pull</code> &#x62C9;&#x53D6;&#x540E;&#x81EA;&#x52A8;&#x5C06;&#x8FDC;&#x7A0B;&#x5206;&#x652F;&#x4E0E;&#x5F53;&#x524D;&#x5206;&#x652F;&#x5408;&#x5E76;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[广告归因分析指南]]></title><description><![CDATA[<h3 id="1-%E4%BB%80%E4%B9%88%E6%98%AF%E5%B9%BF%E5%91%8A%E5%BD%92%E5%9B%A0%EF%BC%9F">1. &#x4EC0;&#x4E48;&#x662F;&#x5E7F;&#x544A;&#x5F52;&#x56E0;&#xFF1F;</h3><ul><li><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x6280;&#x672F;&#x624B;&#x6BB5;&#x8BC6;&#x522B;&#x7528;&#x6237;&#x8F6C;&#x5316;&#xFF08;&#x5982;&#x4E0B;&#x8F7D;&#x3001;&#x8D2D;&#x4E70;&#x3001;&#x6CE8;&#x518C;&#xFF09;&#x7684;&#x5E7F;&#x544A;&#x89E6;&#x70B9;&#x8DEF;&#x5F84;&#xFF0C;&#x5E76;&#x5206;&#x914D;&#x4EF7;&#x503C;&#x6743;&#x91CD;</li></ul>]]></description><link>https://pureo.cn/advertising-attribution/</link><guid isPermaLink="false">67e6827fad84660001b56110</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Fri, 28 Mar 2025 11:09:32 GMT</pubDate><content:encoded><![CDATA[<h3 id="1-%E4%BB%80%E4%B9%88%E6%98%AF%E5%B9%BF%E5%91%8A%E5%BD%92%E5%9B%A0%EF%BC%9F">1. &#x4EC0;&#x4E48;&#x662F;&#x5E7F;&#x544A;&#x5F52;&#x56E0;&#xFF1F;</h3><ul><li><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x6280;&#x672F;&#x624B;&#x6BB5;&#x8BC6;&#x522B;&#x7528;&#x6237;&#x8F6C;&#x5316;&#xFF08;&#x5982;&#x4E0B;&#x8F7D;&#x3001;&#x8D2D;&#x4E70;&#x3001;&#x6CE8;&#x518C;&#xFF09;&#x7684;&#x5E7F;&#x544A;&#x89E6;&#x70B9;&#x8DEF;&#x5F84;&#xFF0C;&#x5E76;&#x5206;&#x914D;&#x4EF7;&#x503C;&#x6743;&#x91CD;&#x4EE5;&#x8861;&#x91CF;&#x4E0D;&#x540C;&#x6E20;&#x9053;&#x7684;&#x8D21;&#x732E;&#x3002;</li><li><strong>&#x6838;&#x5FC3;&#x76EE;&#x6807;</strong>&#xFF1A;&#x56DE;&#x7B54;&#x201C;&#x54EA;&#x4E9B;&#x5E7F;&#x544A;&#x6E20;&#x9053;&#x771F;&#x6B63;&#x63A8;&#x52A8;&#x4E86;&#x7528;&#x6237;&#x8F6C;&#x5316;&#xFF1F;&#x201D;</li></ul><h3 id="2-%E5%B8%B8%E8%A7%81%E5%BD%92%E5%9B%A0%E6%A8%A1%E5%9E%8B%E5%8F%8A%E9%80%82%E7%94%A8%E6%80%A7">2. &#x5E38;&#x89C1;&#x5F52;&#x56E0;&#x6A21;&#x578B;&#x53CA;&#x9002;&#x7528;&#x6027;</h3><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>&#x6A21;&#x578B;&#x7C7B;&#x578B;</th>
<th>&#x89C4;&#x5219;&#x63CF;&#x8FF0;</th>
<th>&#x9002;&#x7528;&#x573A;&#x666F;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>&#x6700;&#x7EC8;&#x70B9;&#x51FB;&#x5F52;&#x56E0;</strong></td>
<td>100%&#x529F;&#x52B3;&#x5F52;&#x56E0;&#x4E8E;&#x6700;&#x540E;&#x4E00;&#x6B21;&#x70B9;&#x51FB;&#x7684;&#x6E20;&#x9053;</td>
<td>&#x77ED;&#x51B3;&#x7B56;&#x5468;&#x671F;&#x3001;&#x5F3A;&#x8F6C;&#x5316;&#x5BFC;&#x5411;&#xFF08;&#x5982;&#x7535;&#x5546;&#x4FC3;&#x9500;&#xFF09;</td>
</tr>
<tr>
<td><strong>&#x9996;&#x6B21;&#x70B9;&#x51FB;&#x5F52;&#x56E0;</strong></td>
<td>100%&#x529F;&#x52B3;&#x5F52;&#x56E0;&#x4E8E;&#x9996;&#x6B21;&#x89E6;&#x8FBE;&#x7684;&#x6E20;&#x9053;</td>
<td>&#x54C1;&#x724C;&#x66DD;&#x5149;&#x521D;&#x671F;&#x3001;&#x65B0;&#x54C1;&#x63A8;&#x5E7F;</td>
</tr>
<tr>
<td><strong>&#x7EBF;&#x6027;&#x5F52;&#x56E0;</strong></td>
<td>&#x6240;&#x6709;&#x89E6;&#x70B9;&#x5747;&#x5206;&#x8F6C;&#x5316;&#x529F;&#x52B3;</td>
<td>&#x957F;&#x51B3;&#x7B56;&#x94FE;&#x8DEF;&#xFF08;&#x5982;&#x6559;&#x80B2;&#x8BFE;&#x7A0B;&#x3001;B2B&#x9500;&#x552E;&#xFF09;</td>
</tr>
<tr>
<td><strong>&#x65F6;&#x95F4;&#x8870;&#x51CF;&#x5F52;&#x56E0;</strong></td>
<td>&#x8D8A;&#x63A5;&#x8FD1;&#x8F6C;&#x5316;&#x7684;&#x89E6;&#x70B9;&#x6743;&#x91CD;&#x8D8A;&#x9AD8;</td>
<td>&#x9650;&#x65F6;&#x6D3B;&#x52A8;&#x3001;&#x5B63;&#x8282;&#x6027;&#x8425;&#x9500;</td>
</tr>
<tr>
<td><strong>U&#x578B;&#x5F52;&#x56E0;</strong></td>
<td>&#x9996;&#x6B21;+&#x672B;&#x6B21;&#x89E6;&#x70B9;&#x5404;&#x5360;40%&#xFF0C;&#x4E2D;&#x95F4;&#x5747;&#x5206;20%</td>
<td>&#x5F3A;&#x8C03;&#x201C;&#x53D1;&#x73B0;&#x201D;&#x548C;&#x201C;&#x8F6C;&#x5316;&#x201D;&#x53CC;&#x73AF;&#x8282;&#xFF08;&#x5982;APP&#x4E0B;&#x8F7D;&#xFF09;</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><hr><h2 id="%E4%BA%8C%E3%80%81%E5%B9%BF%E5%91%8A%E5%BD%92%E5%9B%A0%E7%9A%84%E6%A0%B8%E5%BF%83%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF"><strong>&#x4E8C;&#x3001;&#x5E7F;&#x544A;&#x5F52;&#x56E0;&#x7684;&#x6838;&#x5FC3;&#x4F7F;&#x7528;&#x573A;&#x666F;</strong></h2><h3 id="1-%E4%BC%98%E5%8C%96%E5%B9%BF%E5%91%8A%E9%A2%84%E7%AE%97%E5%88%86%E9%85%8D">1. &#x4F18;&#x5316;&#x5E7F;&#x544A;&#x9884;&#x7B97;&#x5206;&#x914D;</h3><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x76F2;&#x76EE;&#x5E73;&#x5747;&#x5206;&#x914D;&#x9884;&#x7B97;&#x5BFC;&#x81F4;&#x9AD8;&#x4EF7;&#x503C;&#x6E20;&#x9053;&#x88AB;&#x4F4E;&#x4F30;&#x3002;</li><li><strong>&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong>&#xFF1A;<br>&#x901A;&#x8FC7;&#x5F52;&#x56E0;&#x6570;&#x636E;&#x8BC6;&#x522B;&#x9AD8;ROI&#x6E20;&#x9053;&#xFF08;&#x5982;&#x53D1;&#x73B0;&#x793E;&#x4EA4;&#x5A92;&#x4F53;&#x7684;&#x201C;&#x79CD;&#x8349;&#x201D;&#x5185;&#x5BB9;&#x4E3A;&#x6700;&#x7EC8;&#x8F6C;&#x5316;&#x7684;&#x6838;&#x5FC3;&#x524D;&#x594F;&#xFF09;&#xFF0C;&#x503E;&#x659C;&#x9884;&#x7B97;&#x81F3;&#x9AD8;&#x6548;&#x89E6;&#x70B9;&#x3002;</li></ul><h3 id="2-%E8%B7%A8%E6%B8%A0%E9%81%93%E5%8D%8F%E5%90%8C%E7%AD%96%E7%95%A5">2. &#x8DE8;&#x6E20;&#x9053;&#x534F;&#x540C;&#x7B56;&#x7565;</h3><ul><li><strong>&#x6848;&#x4F8B;</strong>&#xFF1A;<br>&#x67D0;&#x7F8E;&#x5986;&#x54C1;&#x724C;&#x53D1;&#x73B0;&#x7528;&#x6237;&#x8DEF;&#x5F84;&#x4E3A;&#xFF1A;<br><code>&#x4FE1;&#x606F;&#x6D41;&#x5E7F;&#x544A;&#xFF08;&#x9996;&#x6B21;&#x89E6;&#x8FBE;&#xFF09;&#x2192; KOL&#x6D4B;&#x8BC4;&#xFF08;&#x4E2D;&#x95F4;&#x4E92;&#x52A8;&#xFF09;&#x2192; &#x641C;&#x7D22;&#x5E7F;&#x544A;&#xFF08;&#x6700;&#x7EC8;&#x8F6C;&#x5316;&#xFF09;</code><br>&#x2192; &#x8C03;&#x6574;&#x7B56;&#x7565;&#xFF1A;&#x52A0;&#x5F3A;&#x4FE1;&#x606F;&#x6D41;&#x4E0E;KOL&#x7684;&#x5185;&#x5BB9;&#x8054;&#x52A8;&#xFF0C;&#x4F18;&#x5316;&#x641C;&#x7D22;&#x5173;&#x952E;&#x8BCD;&#x6295;&#x653E;&#x3002;</li></ul><h3 id="3-%E5%BA%94%E5%AF%B9%E2%80%9C%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4%E2%80%9D%E6%8C%91%E6%88%98">3. &#x5E94;&#x5BF9;&#x201C;&#x9690;&#x79C1;&#x4FDD;&#x62A4;&#x201D;&#x6311;&#x6218;</h3><ul><li><strong>&#x73B0;&#x72B6;</strong>&#xFF1A;iOS 14.5+&#x7528;&#x6237;IDFA&#x83B7;&#x53D6;&#x7387;&#x4E0B;&#x964D;&#x81F3;20%&#x4EE5;&#x4E0B;&#x3002;</li><li><strong>&#x5F52;&#x56E0;&#x66FF;&#x4EE3;&#x65B9;&#x6848;</strong>&#xFF1A;<br>&#x91C7;&#x7528;&#x6982;&#x7387;&#x5EFA;&#x6A21;&#xFF08;&#x5982;Facebook Aggregated Event Measurement&#xFF09;&#x6216;&#x52A0;&#x5F3A;&#x7B2C;&#x4E00;&#x65B9;&#x6570;&#x636E;&#x6536;&#x96C6;&#xFF08;&#x5982;&#x4F1A;&#x5458;&#x4F53;&#x7CFB;+&#x57CB;&#x70B9;&#x8FFD;&#x8E2A;&#xFF09;&#x3002;</li></ul><hr><h2 id="%E4%B8%89%E3%80%81%E5%AE%9E%E6%96%BD%E5%B9%BF%E5%91%8A%E5%BD%92%E5%9B%A0%E7%9A%844%E4%B8%AA%E5%85%B3%E9%94%AE%E6%AD%A5%E9%AA%A4"><strong>&#x4E09;&#x3001;&#x5B9E;&#x65BD;&#x5E7F;&#x544A;&#x5F52;&#x56E0;&#x7684;4&#x4E2A;&#x5173;&#x952E;&#x6B65;&#x9AA4;</strong></h2><h3 id="1-%E6%95%B0%E6%8D%AE%E6%94%B6%E9%9B%86%E4%B8%8E%E6%95%B4%E5%90%88">1. <strong>&#x6570;&#x636E;&#x6536;&#x96C6;&#x4E0E;&#x6574;&#x5408;</strong></h3><ul><li><strong>&#x5FC5;&#x9700;&#x6570;&#x636E;</strong>&#xFF1A;</li><li>&#x7528;&#x6237;ID&#xFF08;Cookie/Device ID/&#x767B;&#x5F55;ID&#xFF09;</li><li>&#x5E7F;&#x544A;&#x89E6;&#x70B9;&#x6570;&#x636E;&#xFF08;&#x6E20;&#x9053;&#x3001;&#x65F6;&#x95F4;&#x3001;&#x521B;&#x610F;&#x5185;&#x5BB9;&#xFF09;</li><li>&#x8F6C;&#x5316;&#x4E8B;&#x4EF6;&#x6570;&#x636E;&#xFF08;&#x8D2D;&#x4E70;&#x91D1;&#x989D;&#x3001;&#x6CE8;&#x518C;&#x65F6;&#x95F4;&#x7B49;&#xFF09;</li><li><strong>&#x5DE5;&#x5177;&#x63A8;&#x8350;</strong>&#xFF1A;<br>Google Analytics 4&#xFF08;&#x514D;&#x8D39;&#xFF09;&#x3001;AppsFlyer&#xFF08;&#x79FB;&#x52A8;&#x7AEF;&#xFF09;&#x3001;Adjust&#xFF08;&#x8DE8;&#x5E73;&#x53F0;&#xFF09;&#x3002;</li></ul><h3 id="2-%E6%A8%A1%E5%9E%8B%E9%80%89%E6%8B%A9%E4%B8%8E%E6%B5%8B%E8%AF%95">2. <strong>&#x6A21;&#x578B;&#x9009;&#x62E9;&#x4E0E;&#x6D4B;&#x8BD5;</strong></h3><ul><li><strong>&#x5C0F;&#x6210;&#x672C;&#x9A8C;&#x8BC1;&#x6CD5;</strong>&#xFF1A;<br>&#x9009;&#x62E9;2-3&#x4E2A;&#x6838;&#x5FC3;&#x8F6C;&#x5316;&#x4E8B;&#x4EF6;&#xFF08;&#x5982;&#x201C;&#x52A0;&#x5165;&#x8D2D;&#x7269;&#x8F66;&#x201D;&#x201C;&#x652F;&#x4ED8;&#x6210;&#x529F;&#x201D;&#xFF09;&#xFF0C;&#x5206;&#x522B;&#x7528;&#x6700;&#x7EC8;&#x70B9;&#x51FB;&#x4E0E;&#x7EBF;&#x6027;&#x6A21;&#x578B;&#x5BF9;&#x6BD4;&#x7ED3;&#x679C;&#x5DEE;&#x5F02;&#x3002;</li></ul><p>&#x4E0D;&#x540C;&#x7684;&#x5F52;&#x56E0;&#x6A21;&#x578B;&#x9002;&#x7528;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x8425;&#x9500;&#x573A;&#x666F;&#xFF0C;&#x53D6;&#x51B3;&#x4E8E;&#x5E7F;&#x544A;&#x4E3B;&#x7684;&#x76EE;&#x6807;&#x3001;&#x8425;&#x9500;&#x6E20;&#x9053;&#x3001;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x7279;&#x5F81;&#x7B49;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x4E0D;&#x540C;&#x60C5;&#x51B5;&#x4E0B;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x5F52;&#x56E0;&#x6A21;&#x578B;&#x7684;&#x5EFA;&#x8BAE;&#xFF1A;</p><h3 id="3-%E5%BD%92%E5%9B%A0%E7%B1%BB%E5%9E%8B%E8%AE%B2%E8%A7%A3">3. &#x5F52;&#x56E0;&#x7C7B;&#x578B;&#x8BB2;&#x89E3;</h3><p><strong>1. &#x6700;&#x540E;&#x70B9;&#x51FB;&#x5F52;&#x56E0;&#xFF08;Last Click Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x76F4;&#x63A5;&#x8F6C;&#x5316;&#x76EE;&#x6807;</strong>&#xFF1A;&#x5F53;&#x5E7F;&#x544A;&#x4E3B;&#x4E3B;&#x8981;&#x5173;&#x6CE8;&#x7684;&#x662F;<strong>&#x76F4;&#x63A5;&#x63A8;&#x52A8;&#x8F6C;&#x5316;</strong>&#xFF08;&#x4F8B;&#x5982;&#x8D2D;&#x4E70;&#x3001;&#x6CE8;&#x518C;&#x7B49;&#xFF09;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x8DEF;&#x5F84;&#x8F83;&#x77ED;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x3002;</p><p><strong>&#x660E;&#x786E;&#x7684;&#x8F6C;&#x5316;&#x8DEF;&#x5F84;</strong>&#xFF1A;&#x5F53;&#x7528;&#x6237;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x6D41;&#x7A0B;&#xFF08;&#x4F8B;&#x5982;&#x76F4;&#x63A5;&#x641C;&#x7D22;&#x5E76;&#x70B9;&#x51FB;&#x5E7F;&#x544A;&#xFF09;&#x5B8C;&#x6210;&#x8D2D;&#x4E70;&#x6216;&#x76EE;&#x6807;&#x884C;&#x4E3A;&#x65F6;&#xFF0C;&#x6700;&#x540E;&#x70B9;&#x51FB;&#x5F52;&#x56E0;&#x6A21;&#x578B;&#x9002;&#x7528;&#x3002;</p><p><strong>&#x5FEB;&#x901F;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x7528;&#x6237;&#x8D2D;&#x4E70;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;&#x8F83;&#x4E3A;&#x7B80;&#x5355;&#x3001;&#x5FEB;&#x901F;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x65E5;&#x5E38;&#x6D88;&#x8D39;&#x54C1;&#x3001;&#x5FEB;&#x9500;&#x54C1;&#x7B49;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x7B80;&#x5355;&#xFF0C;&#x6613;&#x4E8E;&#x5B9E;&#x65BD;&#x548C;&#x7406;&#x89E3;&#xFF0C;&#x80FD;&#x591F;&#x76F4;&#x63A5;&#x53CD;&#x6620;&#x6700;&#x540E;&#x4E00;&#x6B65;&#x7684;&#x6548;&#x679C;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x5FFD;&#x7565;&#x4E86;&#x7528;&#x6237;&#x5728;&#x6574;&#x4E2A;&#x8F6C;&#x5316;&#x8DEF;&#x5F84;&#x4E2D;&#x7684;&#x5176;&#x4ED6;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x4E0D;&#x80FD;&#x53CD;&#x6620;&#x591A;&#x89E6;&#x70B9;&#x548C;&#x8DE8;&#x6E20;&#x9053;&#x7684;&#x4EF7;&#x503C;&#x3002;<br></p><p><strong>2. &#x9996;&#x6B21;&#x70B9;&#x51FB;&#x5F52;&#x56E0;&#xFF08;First Click Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x54C1;&#x724C;&#x610F;&#x8BC6;&#x63D0;&#x5347;</strong>&#xFF1A;&#x5F53;&#x5E7F;&#x544A;&#x4E3B;&#x5173;&#x6CE8;&#x7684;&#x662F;<strong>&#x63D0;&#x5347;&#x54C1;&#x724C;&#x77E5;&#x540D;&#x5EA6;</strong>&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x60F3;&#x8981;&#x77E5;&#x9053;&#x54EA;&#x4E2A;&#x6E20;&#x9053;&#x9996;&#x6B21;&#x5438;&#x5F15;&#x4E86;&#x7528;&#x6237;&#x7684;&#x6CE8;&#x610F;&#x529B;&#x65F6;&#x3002;</p><p><strong>&#x5F15;&#x5BFC;&#x65B0;&#x7528;&#x6237;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x65B0;&#x7528;&#x6237;&#x7684;&#x83B7;&#x53D6;&#x5E7F;&#x544A;&#x6D3B;&#x52A8;&#xFF0C;&#x6BD4;&#x5982;&#x4E00;&#x4E9B;&#x54C1;&#x724C;&#x63A8;&#x5E7F;&#x3001;&#x77E5;&#x540D;&#x5EA6;&#x6269;&#x5C55;&#x7684;&#x5E7F;&#x544A;&#xFF0C;&#x5E7F;&#x544A;&#x4E3B;&#x5E0C;&#x671B;&#x77E5;&#x9053;&#x54EA;&#x4E2A;&#x6E20;&#x9053;&#x5438;&#x5F15;&#x4E86;&#x7528;&#x6237;&#x9996;&#x6B21;&#x53C2;&#x4E0E;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x5E2E;&#x52A9;&#x5E7F;&#x544A;&#x4E3B;&#x8BC6;&#x522B;&#x54EA;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x6700;&#x521D;&#x5438;&#x5F15;&#x4E86;&#x7528;&#x6237;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x957F;&#x671F;&#x4EF7;&#x503C;&#x7684;&#x79EF;&#x7D2F;&#x548C;&#x54C1;&#x724C;&#x5EFA;&#x8BBE;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x5FFD;&#x89C6;&#x4E86;&#x540E;&#x671F;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x53EF;&#x80FD;&#x65E0;&#x6CD5;&#x51C6;&#x786E;&#x8BC4;&#x4F30;&#x7528;&#x6237;&#x6700;&#x7EC8;&#x7684;&#x8F6C;&#x5316;&#x51B3;&#x7B56;&#x3002;</p><p><strong>3. &#x7EBF;&#x6027;&#x5F52;&#x56E0;&#xFF08;Linear Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x591A;&#x89E6;&#x70B9;&#x8425;&#x9500;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x9700;&#x8981;<strong>&#x7EFC;&#x5408;&#x8BC4;&#x4F30;&#x5404;&#x4E2A;&#x89E6;&#x70B9;&#x8D21;&#x732E;</strong>&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x7528;&#x6237;&#x5728;&#x8F6C;&#x5316;&#x8DEF;&#x5F84;&#x4E2D;&#x6D89;&#x53CA;&#x591A;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x573A;&#x666F;&#x3002;</p><p><strong>&#x54C1;&#x724C;&#x548C;&#x8F6C;&#x5316;&#x4E4B;&#x95F4;&#x7684;&#x5E73;&#x8861;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x4E3B;&#x5E0C;&#x671B;&#x5BF9;&#x6240;&#x6709;&#x63A5;&#x89E6;&#x70B9;&#x7ED9;&#x4E88;&#x5E73;&#x7B49;&#x91CD;&#x89C6;&#xFF0C;&#x907F;&#x514D;&#x504F;&#x5411;&#x67D0;&#x4E00;&#x9636;&#x6BB5;&#x7684;&#x5F71;&#x54CD;&#x3002;</p><p><strong>&#x957F;&#x671F;&#x591A;&#x6E20;&#x9053;&#x6218;&#x7565;</strong>&#xFF1A;&#x5F53;&#x7528;&#x6237;&#x591A;&#x6B21;&#x63A5;&#x89E6;&#x591A;&#x4E2A;&#x5E7F;&#x544A;&#x6E20;&#x9053;&#xFF08;&#x4F8B;&#x5982;&#x641C;&#x7D22;&#x3001;&#x793E;&#x4EA4;&#x3001;&#x7535;&#x5B50;&#x90AE;&#x4EF6;&#x7B49;&#xFF09;&#xFF0C;&#x5E7F;&#x544A;&#x4E3B;&#x5E0C;&#x671B;&#x8BC4;&#x4F30;&#x5404;&#x4E2A;&#x6E20;&#x9053;&#x7684;&#x603B;&#x4F53;&#x4F5C;&#x7528;&#x65F6;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x80FD;&#x591F;&#x5168;&#x9762;&#x8861;&#x91CF;&#x6240;&#x6709;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x4F5C;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x591A;&#x6E20;&#x9053;&#x8425;&#x9500;&#x7B56;&#x7565;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x6CA1;&#x6709;&#x8003;&#x8651;&#x5230;&#x4E0D;&#x540C;&#x63A5;&#x89E6;&#x70B9;&#x5BF9;&#x8F6C;&#x5316;&#x7684;&#x5B9E;&#x9645;&#x5F71;&#x54CD;&#xFF0C;&#x53EF;&#x80FD;&#x65E0;&#x6CD5;&#x51C6;&#x786E;&#x53CD;&#x6620;&#x4E0D;&#x540C;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x91CD;&#x8981;&#x6027;&#x3002;</p><p><strong>4. &#x65F6;&#x95F4;&#x8870;&#x51CF;&#x5F52;&#x56E0;&#xFF08;Time Decay Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x957F;&#x671F;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;</strong>&#xFF1A;&#x5F53;&#x7528;&#x6237;&#x8D2D;&#x4E70;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;&#x8F83;&#x957F;&#x65F6;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x90A3;&#x4E9B;<strong>&#x6D89;&#x53CA;&#x591A;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x4E14;&#x8F6C;&#x5316;&#x5468;&#x671F;&#x8F83;&#x957F;</strong>&#x7684;&#x4EA7;&#x54C1;&#x6216;&#x670D;&#x52A1;&#xFF0C;&#x5982;&#x9AD8;&#x4EF7;&#x5546;&#x54C1;&#x6216;&#x957F;&#x671F;&#x670D;&#x52A1;&#xFF08;&#x4F8B;&#x5982;&#x623F;&#x4EA7;&#x3001;&#x4FDD;&#x9669;&#x3001;&#x6C7D;&#x8F66;&#x7B49;&#xFF09;&#x3002;</p><p><strong>&#x8FD1;&#x671F;&#x63A5;&#x89E6;&#x70B9;&#x66F4;&#x4E3A;&#x91CD;&#x8981;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x4E3B;&#x5E0C;&#x671B;&#x8BA4;&#x4E3A;&#x79BB;&#x8F6C;&#x5316;&#x65F6;&#x95F4;&#x8F83;&#x8FD1;&#x7684;&#x5E7F;&#x544A;&#x89E6;&#x70B9;&#x66F4;&#x6709;&#x5F71;&#x54CD;&#x529B;&#xFF0C;&#x800C;&#x8F83;&#x65E9;&#x7684;&#x89E6;&#x70B9;&#x4F5C;&#x7528;&#x8F83;&#x5C0F;&#x3002;</p><p><strong>&#x63A8;&#x5E7F;&#x5468;&#x671F;&#x8F83;&#x957F;</strong>&#xFF1A;&#x5F53;&#x8425;&#x9500;&#x6D3B;&#x52A8;&#x6A2A;&#x8DE8;&#x8F83;&#x957F;&#x65F6;&#x95F4;&#xFF0C;&#x7528;&#x6237;&#x6700;&#x7EC8;&#x5728;&#x591A;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x5F71;&#x54CD;&#x4E0B;&#x505A;&#x51FA;&#x8D2D;&#x4E70;&#x51B3;&#x5B9A;&#x65F6;&#xFF0C;&#x9002;&#x7528;&#x8BE5;&#x6A21;&#x578B;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x66F4;&#x52A0;&#x8D34;&#x5408;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#xFF0C;&#x80FD;&#x591F;&#x53CD;&#x6620;&#x8FD1;&#x671F;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x91CD;&#x8981;&#x6027;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x957F;&#x671F;&#x51B3;&#x7B56;&#x7684;&#x4EA7;&#x54C1;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x65E9;&#x671F;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x8D21;&#x732E;&#x53EF;&#x80FD;&#x88AB;&#x4F4E;&#x4F30;&#x3002;</p><p><strong>5. &#x4F4D;&#x7F6E;&#x5F52;&#x56E0;&#xFF08;Position-Based Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x591A;&#x9636;&#x6BB5;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x7528;&#x6237;&#x6709;&#x660E;&#x786E;&#x7684;&#x8D2D;&#x4E70;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E14;&#x5E7F;&#x544A;&#x4E3B;&#x8BA4;&#x4E3A;<strong>&#x9996;&#x6B21;&#x63A5;&#x89E6;&#x70B9;&#x548C;&#x6700;&#x540E;&#x63A5;&#x89E6;&#x70B9;</strong>&#x6700;&#x4E3A;&#x5173;&#x952E;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x9996;&#x6B21;&#x63A5;&#x89E6;&#x63D0;&#x4F9B;&#x4E86;&#x4EA7;&#x54C1;&#x7684;&#x57FA;&#x672C;&#x4FE1;&#x606F;&#xFF0C;&#x800C;&#x6700;&#x540E;&#x7684;&#x63A5;&#x89E6;&#x4FC3;&#x4F7F;&#x4E86;&#x8D2D;&#x4E70;&#x51B3;&#x7B56;&#xFF09;&#x3002;</p><p><strong>&#x6E20;&#x9053;&#x91CD;&#x8981;&#x6027;&#x5206;&#x914D;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x4E3B;&#x8BA4;&#x4E3A;&#x4E0D;&#x540C;&#x9636;&#x6BB5;&#x7684;&#x63A5;&#x89E6;&#x70B9;&#x5BF9;&#x6700;&#x7EC8;&#x51B3;&#x7B56;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x91CD;&#x8981;&#x6027;&#xFF0C;&#x9002;&#x5408;&#x5BF9;&#x6240;&#x6709;&#x63A5;&#x89E6;&#x70B9;&#x8FDB;&#x884C;&#x52A0;&#x6743;&#x5904;&#x7406;&#x7684;&#x573A;&#x666F;&#x3002;</p><p><strong>&#x8DE8;&#x6E20;&#x9053;&#x5F71;&#x54CD;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x6D89;&#x53CA;&#x591A;&#x4E2A;&#x5E7F;&#x544A;&#x6E20;&#x9053;&#xFF0C;&#x5E76;&#x5E0C;&#x671B;&#x8BC4;&#x4F30;&#x9996;&#x6B21;&#x63A5;&#x89E6;&#x548C;&#x6700;&#x7EC8;&#x63A5;&#x89E6;&#x7684;&#x6E20;&#x9053;&#x5F71;&#x54CD;&#x7684;&#x60C5;&#x51B5;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x7ED3;&#x5408;&#x4E86;&#x9996;&#x6B21;&#x548C;&#x6700;&#x540E;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x91CD;&#x8981;&#x6027;&#xFF0C;&#x9002;&#x5408;&#x591A;&#x9636;&#x6BB5;&#x51B3;&#x7B56;&#x7684;&#x7528;&#x6237;&#x8DEF;&#x5F84;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x4E2D;&#x95F4;&#x9636;&#x6BB5;&#x7684;&#x89E6;&#x70B9;&#x8D21;&#x732E;&#x8F83;&#x5C0F;&#xFF0C;&#x65E0;&#x6CD5;&#x5168;&#x9762;&#x53CD;&#x6620;&#x7528;&#x6237;&#x8DEF;&#x5F84;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x89E6;&#x70B9;&#x5F71;&#x54CD;&#x3002;</p><p><strong>6. &#x6570;&#x636E;&#x9A71;&#x52A8;&#x5F52;&#x56E0;&#xFF08;Data-Driven Attribution&#xFF09;</strong></p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</p><p><strong>&#x590D;&#x6742;&#x7684;&#x591A;&#x6E20;&#x9053;&#x8425;&#x9500;&#x6D3B;&#x52A8;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x6D89;&#x53CA;&#x591A;&#x4E2A;&#x6E20;&#x9053;&#x548C;&#x5E7F;&#x544A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x590D;&#x6742;&#x8425;&#x9500;&#x6D3B;&#x52A8;&#x3002;&#x5E7F;&#x544A;&#x4E3B;&#x5E0C;&#x671B;&#x4F9D;&#x9760;<strong>&#x673A;&#x5668;&#x5B66;&#x4E60;&#x7B97;&#x6CD5;&#x5206;&#x6790;&#x6BCF;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x5B9E;&#x9645;&#x8D21;&#x732E;</strong>&#x3002;</p><p><strong>&#x5927;&#x6570;&#x636E;&#x652F;&#x6301;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x5E7F;&#x544A;&#x4E3B;&#x62E5;&#x6709;&#x8DB3;&#x591F;&#x7684;&#x5386;&#x53F2;&#x6570;&#x636E;&#x5E76;&#x5E0C;&#x671B;&#x901A;&#x8FC7;&#x6570;&#x636E;&#x5206;&#x6790;&#x6765;&#x7CBE;&#x786E;&#x5206;&#x914D;&#x5F52;&#x56E0;&#x6743;&#x91CD;&#xFF0C;&#x901A;&#x5E38;&#x7528;&#x4E8E;&#x5927;&#x89C4;&#x6A21;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x3002;</p><p><strong>&#x4E2A;&#x6027;&#x5316;&#x8425;&#x9500;&#x7B56;&#x7565;</strong>&#xFF1A;&#x5F53;&#x5E7F;&#x544A;&#x4E3B;&#x9700;&#x8981;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x6BCF;&#x4E2A;&#x7528;&#x6237;&#x7684;&#x884C;&#x4E3A;&#x548C;&#x8DEF;&#x5F84;&#xFF0C;&#x5E76;&#x57FA;&#x4E8E;&#x6570;&#x636E;&#x5206;&#x6790;&#x4F18;&#x5316;&#x6295;&#x653E;&#x7B56;&#x7565;&#x65F6;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x80FD;&#x591F;&#x7CBE;&#x786E;&#x5730;&#x6839;&#x636E;&#x5386;&#x53F2;&#x6570;&#x636E;&#x5206;&#x6790;&#x5404;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x8D21;&#x732E;&#xFF0C;&#x6700;&#x4E3A;&#x7CBE;&#x51C6;&#x4E14;&#x4E2A;&#x6027;&#x5316;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x9700;&#x8981;&#x5927;&#x91CF;&#x7684;&#x5386;&#x53F2;&#x6570;&#x636E;&#x652F;&#x6301;&#xFF0C;&#x5B9E;&#x65BD;&#x8D77;&#x6765;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x4E14;&#x9700;&#x8981;&#x9AD8;&#x6280;&#x672F;&#x652F;&#x6301;&#x3002;</p><p><strong>&#x77ED;&#x671F;&#x8F6C;&#x5316;&#x76EE;&#x6807;&#xFF08;&#x4F8B;&#x5982;&#x7535;&#x5546;&#x7F51;&#x7AD9;&#x7684;&#x8D2D;&#x4E70;&#xFF09;</strong>&#xFF1A;&#x4F7F;&#x7528;<strong>&#x6700;&#x540E;&#x70B9;&#x51FB;&#x5F52;&#x56E0;</strong>&#x6216;<strong>&#x65F6;&#x95F4;&#x8870;&#x51CF;&#x5F52;&#x56E0;</strong>&#xFF0C;&#x5F3A;&#x8C03;&#x6700;&#x7EC8;&#x51B3;&#x7B56;&#x7684;&#x5173;&#x952E;&#x4F5C;&#x7528;&#x3002;</p><p><strong>&#x54C1;&#x724C;&#x5EFA;&#x8BBE;&#x548C;&#x65B0;&#x5BA2;&#x6237;&#x83B7;&#x53D6;</strong>&#xFF1A;&#x4F7F;&#x7528;<strong>&#x9996;&#x6B21;&#x70B9;&#x51FB;&#x5F52;&#x56E0;</strong>&#xFF0C;&#x5E2E;&#x52A9;&#x5E7F;&#x544A;&#x4E3B;&#x8BC6;&#x522B;&#x6700;&#x521D;&#x5438;&#x5F15;&#x5BA2;&#x6237;&#x7684;&#x6E20;&#x9053;&#x3002;</p><p><strong>&#x591A;&#x6E20;&#x9053;&#x548C;&#x957F;&#x671F;&#x51B3;&#x7B56;&#x8FC7;&#x7A0B;</strong>&#xFF1A;&#x4F7F;&#x7528;<strong>&#x7EBF;&#x6027;&#x5F52;&#x56E0;</strong>&#x6216;<strong>&#x4F4D;&#x7F6E;&#x5F52;&#x56E0;</strong>&#xFF0C;&#x5168;&#x9762;&#x8BC4;&#x4F30;&#x5404;&#x4E2A;&#x63A5;&#x89E6;&#x70B9;&#x7684;&#x8D21;&#x732E;&#x3002;</p><p><strong>&#x5927;&#x6570;&#x636E;&#x9A71;&#x52A8;&#x7684;&#x7CBE;&#x786E;&#x4F18;&#x5316;</strong>&#xFF1A;&#x4F7F;&#x7528;<strong>&#x6570;&#x636E;&#x9A71;&#x52A8;&#x5F52;&#x56E0;</strong>&#xFF0C;&#x901A;&#x8FC7;&#x673A;&#x5668;&#x5B66;&#x4E60;&#x6765;&#x5206;&#x6790;&#x591A;&#x6E20;&#x9053;&#x5E7F;&#x544A;&#x7684;&#x8D21;&#x732E;&#x3002;</p><p>&#x9009;&#x62E9;&#x9002;&#x5408;&#x7684;&#x5F52;&#x56E0;&#x6A21;&#x578B;&#x5C06;&#x6709;&#x52A9;&#x4E8E;&#x5E7F;&#x544A;&#x4E3B;&#x66F4;&#x6E05;&#x6670;&#x5730;&#x4E86;&#x89E3;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x5E76;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x8425;&#x9500;&#x573A;&#x666F;&#x4E2D;&#x5236;&#x5B9A;&#x5408;&#x7406;&#x7684;&#x9884;&#x7B97;&#x548C;&#x4F18;&#x5316;&#x7B56;&#x7565;&#x3002;</p><h2 id="%E5%9B%9B%E3%80%81%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"><strong>&#x56DB;&#x3001;&#x5E38;&#x89C1;&#x95EE;&#x9898;&#x4E0E;&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong></h2><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>&#x95EE;&#x9898;&#x573A;&#x666F;</th>
<th>&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x5EFA;&#x8BAE;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>&#x6570;&#x636E;&#x5B64;&#x5C9B;</strong></td>
<td>&#x6253;&#x901A;&#x5E7F;&#x544A;&#x5E73;&#x53F0;API+CRM&#x7CFB;&#x7EDF;&#xFF08;&#x5982;Segment.com&#xFF09;</td>
</tr>
<tr>
<td><strong>&#x6A21;&#x578B;&#x9009;&#x62E9;&#x56F0;&#x96BE;</strong></td>
<td>&#x7528;A/B&#x6D4B;&#x8BD5;&#x5BF9;&#x6BD4;&#x4E0D;&#x540C;&#x6A21;&#x578B;&#x4E0B;&#x7684;ROAS&#x53D8;&#x5316;</td>
</tr>
<tr>
<td><strong>&#x8DE8;&#x8BBE;&#x5907;&#x5F52;&#x56E0;&#x4E22;&#x5931;</strong></td>
<td>&#x5F3A;&#x5316;&#x7528;&#x6237;&#x767B;&#x5F55;&#x4F53;&#x7CFB;&#xFF0C;&#x5173;&#x8054;&#x591A;&#x8BBE;&#x5907;&#x884C;&#x4E3A;</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><hr><h2 id="%E4%BA%94%E3%80%81%E6%A1%88%E4%BE%8B%EF%BC%9A%E6%9F%90%E7%94%B5%E5%95%86%E5%93%81%E7%89%8C%E5%BD%92%E5%9B%A0%E4%BC%98%E5%8C%96%E5%AE%9E%E6%88%98"><strong>&#x4E94;&#x3001;&#x6848;&#x4F8B;&#xFF1A;&#x67D0;&#x7535;&#x5546;&#x54C1;&#x724C;&#x5F52;&#x56E0;&#x4F18;&#x5316;&#x5B9E;&#x6218;</strong></h2><h3 id="%E8%83%8C%E6%99%AF">&#x80CC;&#x666F;</h3><ul><li>&#x75DB;&#x70B9;&#xFF1A;70%&#x9884;&#x7B97;&#x6295;&#x653E;&#x5230;&#x641C;&#x7D22;&#x5E7F;&#x544A;&#xFF0C;&#x4F46;ROI&#x6301;&#x7EED;&#x4E0B;&#x964D;&#x3002;</li><li>&#x5F52;&#x56E0;&#x5206;&#x6790;&#x53D1;&#x73B0;&#xFF1A;<br>65%&#x7684;&#x7528;&#x6237;&#x8F6C;&#x5316;&#x524D;&#x66FE;&#x901A;&#x8FC7;&#x77ED;&#x89C6;&#x9891;&#x5E7F;&#x544A;&#x63A5;&#x89E6;&#x54C1;&#x724C;&#x3002;</li></ul><h3 id="%E8%A1%8C%E5%8A%A8">&#x884C;&#x52A8;</h3><ol><li>&#x8C03;&#x6574;&#x9884;&#x7B97;&#xFF1A;&#x5C06;&#x77ED;&#x89C6;&#x9891;&#x5E7F;&#x544A;&#x9884;&#x7B97;&#x5360;&#x6BD4;&#x4ECE;15%&#x63D0;&#x5347;&#x81F3;40%&#x3002;</li><li>&#x521B;&#x610F;&#x4F18;&#x5316;&#xFF1A;&#x9488;&#x5BF9;&#x201C;&#x770B;&#x8FC7;&#x77ED;&#x89C6;&#x9891;&#x4F46;&#x672A;&#x8D2D;&#x4E70;&#x201D;&#x7684;&#x7528;&#x6237;&#x63A8;&#x9001;&#x518D;&#x8425;&#x9500;&#x5E7F;&#x544A;&#x3002;</li></ol><h3 id="%E7%BB%93%E6%9E%9C">&#x7ED3;&#x679C;</h3><ul><li>30&#x5929;&#x5185;&#x6574;&#x4F53;ROI&#x63D0;&#x5347;22%&#xFF0C;&#x83B7;&#x5BA2;&#x6210;&#x672C;&#x964D;&#x4F4E;17%&#x3002;</li></ul><hr>]]></content:encoded></item><item><title><![CDATA[跨境电商广告投放：指标解析与优化策略]]></title><description><![CDATA[<h4 id="1-%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E7%9A%84%E8%83%8C%E6%99%AF"><strong>1. &#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x80CC;&#x666F;</strong></h4><p>&#x5E7F;&#x544A;&#x6295;&#x653E;&#x662F;&#x73B0;&#x4EE3;&#x7535;&#x5546;&#x8425;&#x9500;&#x7684;&#x6838;&#x5FC3;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#xFF0C;&#x5C24;&#x5176;&#x5728;&#x8DE8;&#x5883;&#x7535;&#x5546;&#x73AF;&#x5883;&#x4E2D;&#xFF0C;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x4E0D;&#x4EC5;&#x662F;&#x5438;&#x5F15;&#x6D41;&#x91CF;&#x7684;</p>]]></description><link>https://pureo.cn/ads/</link><guid isPermaLink="false">67e67f05ad84660001b56103</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Fri, 28 Mar 2025 10:53:44 GMT</pubDate><content:encoded><![CDATA[<h4 id="1-%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E7%9A%84%E8%83%8C%E6%99%AF"><strong>1. &#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x80CC;&#x666F;</strong></h4><p>&#x5E7F;&#x544A;&#x6295;&#x653E;&#x662F;&#x73B0;&#x4EE3;&#x7535;&#x5546;&#x8425;&#x9500;&#x7684;&#x6838;&#x5FC3;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#xFF0C;&#x5C24;&#x5176;&#x5728;&#x8DE8;&#x5883;&#x7535;&#x5546;&#x73AF;&#x5883;&#x4E2D;&#xFF0C;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x4E0D;&#x4EC5;&#x662F;&#x5438;&#x5F15;&#x6D41;&#x91CF;&#x7684;&#x6709;&#x6548;&#x624B;&#x6BB5;&#xFF0C;&#x4E5F;&#x662F;&#x63D0;&#x9AD8;&#x54C1;&#x724C;&#x66DD;&#x5149;&#x5EA6;&#x3001;&#x63A8;&#x52A8;&#x9500;&#x552E;&#x8F6C;&#x5316;&#x7684;&#x5173;&#x952E;&#x3002;&#x968F;&#x7740;&#x5168;&#x7403;&#x5316;&#x53D1;&#x5C55;&#xFF0C;&#x8DE8;&#x5883;&#x7535;&#x5546;&#x5E73;&#x53F0;&#xFF08;&#x5982;&#x4E9A;&#x9A6C;&#x900A;&#x3001;AliExpress&#x3001;eBay&#x7B49;&#xFF09;&#x4EE5;&#x53CA;&#x793E;&#x4EA4;&#x5A92;&#x4F53;&#x5E73;&#x53F0;&#xFF08;&#x5982;Facebook&#x3001;Instagram&#x3001;TikTok&#x7B49;&#xFF09;&#x4E3A;&#x5E7F;&#x544A;&#x4E3B;&#x63D0;&#x4F9B;&#x4E86;&#x5168;&#x7403;&#x8303;&#x56F4;&#x5185;&#x7684;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x673A;&#x4F1A;&#x3002;&#x5E7F;&#x544A;&#x4E3B;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x6570;&#x636E;&#x5206;&#x6790;&#x3001;&#x9884;&#x7B97;&#x7BA1;&#x7406;&#x548C;&#x7CBE;&#x51C6;&#x5B9A;&#x5411;&#x7B49;&#x7B56;&#x7565;&#xFF0C;&#x6700;&#x5927;&#x5316;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x6548;&#x679C;&#x3002;</p><h4 id="2-%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E5%B9%B3%E5%8F%B0%E4%B8%8E%E7%9B%AE%E6%A0%87"><strong>2. &#x5E7F;&#x544A;&#x6295;&#x653E;&#x5E73;&#x53F0;&#x4E0E;&#x76EE;&#x6807;</strong></h4><p>&#x5E7F;&#x544A;&#x6295;&#x653E;&#x5E73;&#x53F0;&#x7684;&#x9009;&#x62E9;&#x548C;&#x76EE;&#x6807;&#x7684;&#x5236;&#x5B9A;&#x81F3;&#x5173;&#x91CD;&#x8981;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x8DE8;&#x5883;&#x7535;&#x5546;&#x4E2D;&#xFF0C;&#x5E7F;&#x544A;&#x4E3B;&#x9700;&#x8981;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x5E02;&#x573A;&#x7684;&#x9700;&#x6C42;&#x6765;&#x8C03;&#x6574;&#x7B56;&#x7565;&#x3002;</p><p><strong>&#x8DE8;&#x5883;&#x7535;&#x5546;&#x5E73;&#x53F0;</strong>&#xFF1A;&#x5982; Amazon&#x3001;AliExpress&#x3001;eBay &#x7B49;&#xFF0C;&#x4E3B;&#x8981;&#x76EE;&#x6807;&#x4E3A;&#x63D0;&#x5347;&#x4EA7;&#x54C1;&#x66DD;&#x5149;&#x3001;&#x589E;&#x52A0;&#x9500;&#x91CF;&#x3001;&#x83B7;&#x5F97;&#x7528;&#x6237;&#x5173;&#x6CE8;&#x3002;&#x5E7F;&#x544A;&#x5F62;&#x5F0F;&#x5305;&#x62EC;&#x5C55;&#x793A;&#x5E7F;&#x544A;&#x3001;&#x641C;&#x7D22;&#x5E7F;&#x544A;&#x7B49;&#x3002;</p><p><strong>&#x793E;&#x4EA4;&#x5A92;&#x4F53;&#x5E73;&#x53F0;</strong>&#xFF1A;&#x5982; Facebook&#x3001;Instagram&#x3001;TikTok &#x7B49;&#xFF0C;&#x5E7F;&#x544A;&#x4E3B;&#x8981;&#x901A;&#x8FC7;&#x7CBE;&#x51C6;&#x5B9A;&#x5411;&#x89E6;&#x53CA;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x7FA4;&#x4F53;&#xFF0C;&#x63D0;&#x5347;&#x54C1;&#x724C;&#x77E5;&#x540D;&#x5EA6;&#x548C;&#x8F6C;&#x5316;&#x7387;&#x3002;</p><p><strong>&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x5E7F;&#x544A;</strong>&#xFF1A;&#x5982; Google Ads&#xFF0C;&#x4E3B;&#x8981;&#x901A;&#x8FC7;&#x5173;&#x952E;&#x8BCD;&#x7ADE;&#x4EF7;&#x5B9E;&#x73B0;&#x7CBE;&#x51C6;&#x5E7F;&#x544A;&#x6295;&#x653E;&#xFF0C;&#x5E2E;&#x52A9;&#x63D0;&#x5347;&#x641C;&#x7D22;&#x5F15;&#x64CE;&#x4E2D;&#x7684;&#x4EA7;&#x54C1;&#x66DD;&#x5149;&#x5EA6;&#x3002;</p><h4 id="3-%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E6%8C%87%E6%A0%87%E8%A7%A3%E6%9E%90%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95"><strong>3. &#x5E7F;&#x544A;&#x6295;&#x653E;&#x6307;&#x6807;&#x89E3;&#x6790;&#x4E0E;&#x8BA1;&#x7B97;&#x65B9;&#x6CD5;</strong></h4><p>&#x5E7F;&#x544A;&#x6295;&#x653E;&#x6307;&#x6807;&#x662F;&#x8861;&#x91CF;&#x5E7F;&#x544A;&#x6548;&#x679C;&#x7684;&#x5173;&#x952E;&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x6307;&#x6807;&#xFF0C;&#x5E7F;&#x544A;&#x4E3B;&#x53EF;&#x4EE5;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x8FDB;&#x884C;&#x5FC5;&#x8981;&#x7684;&#x8C03;&#x6574;&#x548C;&#x4F18;&#x5316;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x5404;&#x4E2A;&#x5E7F;&#x544A;&#x6307;&#x6807;&#x7684;&#x89E3;&#x91CA;&#x53CA;&#x5176;&#x8BA1;&#x7B97;&#x65B9;&#x6CD5;&#xFF1A;</p><p><strong>CPC&#xFF08;Cost Per Click&#xFF0C;&#x70B9;&#x51FB;&#x5355;&#x4EF7;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x6BCF;&#x6B21;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x5E7F;&#x544A;&#x6240;&#x9700;&#x652F;&#x4ED8;&#x7684;&#x8D39;&#x7528;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;CPC=&#x5E7F;&#x544A;&#x652F;&#x51FA;&#x70B9;&#x51FB;&#x6B21;&#x6570;\text{CPC} = \frac{\text{&#x5E7F;&#x544A;&#x652F;&#x51FA;}}{\text{&#x70B9;&#x51FB;&#x6B21;&#x6570;}}</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x5E0C;&#x671B;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x5E7F;&#x544A;&#x3001;&#x8BBF;&#x95EE;&#x7F51;&#x7AD9;&#x6216;&#x8FDB;&#x884C;&#x8D2D;&#x4E70;&#x7684;&#x5E7F;&#x544A;&#x6D3B;&#x52A8;&#x3002;</p><p><strong>CPM&#xFF08;Cost Per Thousand Impressions&#xFF0C;&#x6BCF;&#x5343;&#x6B21;&#x5C55;&#x793A;&#x6210;&#x672C;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x6BCF; 1,000 &#x6B21;&#x5E7F;&#x544A;&#x5C55;&#x793A;&#x6240;&#x82B1;&#x8D39;&#x7684;&#x8D39;&#x7528;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;CPM=&#x5E7F;&#x544A;&#x652F;&#x51FA;&#x5C55;&#x793A;&#x6B21;&#x6570;&#xD7;1000\text{CPM} = \frac{\text{&#x5E7F;&#x544A;&#x652F;&#x51FA;}}{\text{&#x5C55;&#x793A;&#x6B21;&#x6570;}} \times 1000</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x54C1;&#x724C;&#x66DD;&#x5149;&#x7684;&#x5E7F;&#x544A;&#x6D3B;&#x52A8;&#xFF0C;&#x7528;&#x4E8E;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x7684;&#x8986;&#x76D6;&#x5EA6;&#x3002;</p><p><strong>CTR&#xFF08;Click-Through Rate&#xFF0C;&#x70B9;&#x51FB;&#x7387;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x88AB;&#x70B9;&#x51FB;&#x7684;&#x6B21;&#x6570;&#x4E0E;&#x5C55;&#x793A;&#x6B21;&#x6570;&#x4E4B;&#x95F4;&#x7684;&#x6BD4;&#x4F8B;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;CTR=&#x70B9;&#x51FB;&#x6B21;&#x6570;&#x5C55;&#x793A;&#x6B21;&#x6570;&#xD7;100%\text{CTR} = \frac{\text{&#x70B9;&#x51FB;&#x6B21;&#x6570;}}{\text{&#x5C55;&#x793A;&#x6B21;&#x6570;}} \times 100\%</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x7528;&#x4E8E;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x7684;&#x5438;&#x5F15;&#x529B;&#x548C;&#x7528;&#x6237;&#x4E0E;&#x5E7F;&#x544A;&#x7684;&#x4E92;&#x52A8;&#x60C5;&#x51B5;&#x3002;</p><p><strong>ROAS&#xFF08;Return on Ad Spend&#xFF0C;&#x5E7F;&#x544A;&#x652F;&#x51FA;&#x56DE;&#x62A5;&#x7387;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x6295;&#x5165;&#x6240;&#x4EA7;&#x751F;&#x7684;&#x6536;&#x5165;&#x56DE;&#x62A5;&#xFF0C;&#x7528;&#x4E8E;&#x8861;&#x91CF;&#x5E7F;&#x544A;&#x6295;&#x8D44;&#x7684;&#x6548;&#x76CA;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;ROAS=&#x5E7F;&#x544A;&#x6536;&#x5165;&#x5E7F;&#x544A;&#x652F;&#x51FA;\text{ROAS} = \frac{\text{&#x5E7F;&#x544A;&#x6536;&#x5165;}}{\text{&#x5E7F;&#x544A;&#x652F;&#x51FA;}}</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x7535;&#x5546;&#x5E7F;&#x544A;&#xFF0C;&#x7528;&#x4E8E;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x662F;&#x5426;&#x5E26;&#x6765;&#x4E86;&#x9884;&#x671F;&#x7684;&#x6536;&#x5165;&#x56DE;&#x62A5;&#x3002;</p><p><strong>CPL&#xFF08;Cost Per Lead&#xFF0C;&#x6BCF;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x6210;&#x672C;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x6BCF;&#x83B7;&#x53D6;&#x4E00;&#x4E2A;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x6240;&#x652F;&#x4ED8;&#x7684;&#x8D39;&#x7528;&#xFF0C;&#x901A;&#x5E38;&#x7528;&#x4E8E;&#x6536;&#x96C6;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x4FE1;&#x606F;&#xFF08;&#x5982;&#x6CE8;&#x518C;&#x8868;&#x5355;&#x3001;&#x8BE2;&#x76D8;&#x7B49;&#xFF09;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;CPL=&#x5E7F;&#x544A;&#x652F;&#x51FA;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x6570;&#x91CF;\text{CPL} = \frac{\text{&#x5E7F;&#x544A;&#x652F;&#x51FA;}}{\text{&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x6570;&#x91CF;}}</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x5E7F;&#x544A;&#x6536;&#x96C6;&#x6F5C;&#x5728;&#x5BA2;&#x6237;&#x4FE1;&#x606F;&#x7684;&#x6D3B;&#x52A8;&#x3002;</p><p><strong>Conversion Rate&#xFF08;&#x8F6C;&#x5316;&#x7387;&#xFF09;</strong></p><p><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x70B9;&#x51FB;&#x540E;&#xFF0C;&#x5B8C;&#x6210;&#x9884;&#x5B9A;&#x76EE;&#x6807;&#xFF08;&#x5982;&#x8D2D;&#x4E70;&#x3001;&#x6CE8;&#x518C;&#x3001;&#x4E0B;&#x8F7D;&#x7B49;&#xFF09;&#x7684;&#x6BD4;&#x4F8B;&#x3002;</p><p><strong>&#x8BA1;&#x7B97;&#x516C;&#x5F0F;</strong>&#xFF1A;&#x8F6C;&#x5316;&#x7387;=&#x8F6C;&#x5316;&#x6B21;&#x6570;&#x70B9;&#x51FB;&#x6B21;&#x6570;&#xD7;100%\text{&#x8F6C;&#x5316;&#x7387;} = \frac{\text{&#x8F6C;&#x5316;&#x6B21;&#x6570;}}{\text{&#x70B9;&#x51FB;&#x6B21;&#x6570;}} \times 100\%</p><p><strong>&#x9002;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;&#x7528;&#x4E8E;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x5224;&#x65AD;&#x5E7F;&#x544A;&#x662F;&#x5426;&#x6210;&#x529F;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x5B8C;&#x6210;&#x8D2D;&#x4E70;&#x6216;&#x5176;&#x4ED6;&#x76EE;&#x6807;&#x884C;&#x4E3A;&#x3002;</p><h4 id="4-%E5%A6%82%E4%BD%95%E8%AF%84%E4%BC%B0%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E6%8C%87%E6%A0%87"><strong>4. &#x5982;&#x4F55;&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x6307;&#x6807;</strong></h4><p>&#x8BC4;&#x4F30;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x6307;&#x6807;&#x662F;&#x4F18;&#x5316;&#x5E7F;&#x544A;&#x6548;&#x679C;&#x7684;&#x57FA;&#x7840;&#x3002;&#x4E0D;&#x540C;&#x6307;&#x6807;&#x8868;&#x73B0;&#x7684;&#x597D;&#x574F;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x5E7F;&#x544A;&#x4E3B;&#x53D1;&#x73B0;&#x6F5C;&#x5728;&#x7684;&#x95EE;&#x9898;&#x5E76;&#x8FDB;&#x884C;&#x8C03;&#x6574;&#x3002;</p><p><strong>&#x5065;&#x5EB7;&#x7684;&#x8868;&#x73B0;</strong>&#xFF1A;</p><p><strong>CPC&#x8F83;&#x4F4E;</strong>&#xFF1A;&#x8868;&#x793A;&#x5E7F;&#x544A;&#x80FD;&#x591F;&#x5438;&#x5F15;&#x5927;&#x91CF;&#x70B9;&#x51FB;&#x4E14;&#x5355;&#x4F4D;&#x6210;&#x672C;&#x8F83;&#x4F4E;&#xFF0C;&#x901A;&#x5E38;&#x53CD;&#x6620;&#x5E7F;&#x544A;&#x5185;&#x5BB9;&#x4E0E;&#x76EE;&#x6807;&#x53D7;&#x4F17;&#x7684;&#x9AD8;&#x5EA6;&#x5339;&#x914D;&#x3002;</p><p><strong>CPM&#x8F83;&#x4F4E;&#x4E14;&#x8F6C;&#x5316;&#x7387;&#x8F83;&#x9AD8;</strong>&#xFF1A;&#x610F;&#x5473;&#x7740;&#x5E7F;&#x544A;&#x80FD;&#x591F;&#x4EE5;&#x4F4E;&#x6210;&#x672C;&#x83B7;&#x5F97;&#x5927;&#x91CF;&#x66DD;&#x5149;&#xFF0C;&#x5E76;&#x6709;&#x6548;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x8F6C;&#x5316;&#x4E3A;&#x8D2D;&#x4E70;&#x6216;&#x5176;&#x4ED6;&#x76EE;&#x6807;&#x884C;&#x4E3A;&#x3002;</p><p><strong>CTR&#x8F83;&#x9AD8;</strong>&#xFF1A;&#x8868;&#x793A;&#x5E7F;&#x544A;&#x5185;&#x5BB9;&#x5177;&#x6709;&#x8F83;&#x5F3A;&#x5438;&#x5F15;&#x529B;&#xFF0C;&#x80FD;&#x591F;&#x5438;&#x5F15;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x5E7F;&#x544A;&#x3002;</p><p><strong>ROAS&#x8F83;&#x9AD8;&#xFF08;&#x81F3;&#x5C11;4:1&#xFF09;</strong>&#xFF1A;&#x6BCF;&#x6295;&#x5165;1&#x5143;&#x5E7F;&#x544A;&#x8D39;&#x7528;&#x80FD;&#x591F;&#x5E26;&#x6765;&#x81F3;&#x5C11;4&#x5143;&#x7684;&#x6536;&#x5165;&#x56DE;&#x62A5;&#xFF0C;&#x8BF4;&#x660E;&#x5E7F;&#x544A;&#x6295;&#x5165;&#x5E26;&#x6765;&#x4E86;&#x826F;&#x597D;&#x7684;&#x5546;&#x4E1A;&#x6548;&#x76CA;&#x3002;</p><p><strong>&#x8F6C;&#x5316;&#x7387;&#x8F83;&#x9AD8;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x80FD;&#x591F;&#x6709;&#x6548;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x5B8C;&#x6210;&#x8D2D;&#x4E70;&#x3001;&#x6CE8;&#x518C;&#x7B49;&#x884C;&#x4E3A;&#xFF0C;&#x8BF4;&#x660E;&#x5E7F;&#x544A;&#x7B56;&#x7565;&#x6210;&#x529F;&#x3002;</p><p><strong>&#x8868;&#x73B0;&#x4E0D;&#x4F73;&#x7684;&#x60C5;&#x51B5;</strong>&#xFF1A;</p><p><strong>CPC&#x8FC7;&#x9AD8;</strong>&#xFF1A;&#x8868;&#x793A;&#x5E7F;&#x544A;&#x7684;&#x70B9;&#x51FB;&#x6210;&#x672C;&#x8FC7;&#x9AD8;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x56E0;&#x4E3A;&#x5E7F;&#x544A;&#x5B9A;&#x5411;&#x4E0D;&#x51C6;&#x786E;&#x6216;&#x5E7F;&#x544A;&#x521B;&#x610F;&#x4E0D;&#x591F;&#x5438;&#x5F15;&#x4EBA;&#x3002;</p><p><strong>CPM&#x8FC7;&#x9AD8;&#x4E14;&#x8F6C;&#x5316;&#x7387;&#x4F4E;</strong>&#xFF1A;&#x8BF4;&#x660E;&#x5E7F;&#x544A;&#x82B1;&#x8D39;&#x4E86;&#x8F83;&#x9AD8;&#x7684;&#x5C55;&#x793A;&#x6210;&#x672C;&#xFF0C;&#x4F46;&#x672A;&#x80FD;&#x6709;&#x6548;&#x5438;&#x5F15;&#x76EE;&#x6807;&#x7528;&#x6237;&#x8FDB;&#x884C;&#x8FDB;&#x4E00;&#x6B65;&#x4E92;&#x52A8;&#x6216;&#x8D2D;&#x4E70;&#x3002;</p><p><strong>CTR&#x4F4E;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x521B;&#x610F;&#x6216;&#x76EE;&#x6807;&#x53D7;&#x4F17;&#x5B9A;&#x4F4D;&#x53EF;&#x80FD;&#x5B58;&#x5728;&#x95EE;&#x9898;&#xFF0C;&#x5E7F;&#x544A;&#x672A;&#x80FD;&#x6709;&#x6548;&#x5438;&#x5F15;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x3002;</p><p><strong>ROAS&#x4F4E;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x56DE;&#x62A5;&#x4E0D;&#x8DB3;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x7531;&#x4E8E;&#x5E7F;&#x544A;&#x5B9A;&#x5411;&#x4E0D;&#x51C6;&#x786E;&#x3001;&#x521B;&#x610F;&#x4E0D;&#x5438;&#x5F15;&#x7528;&#x6237;&#x6216;&#x5E02;&#x573A;&#x7ADE;&#x4E89;&#x8FC7;&#x4E8E;&#x6FC0;&#x70C8;&#x3002;</p><p><strong>&#x8F6C;&#x5316;&#x7387;&#x4F4E;</strong>&#xFF1A;&#x5E7F;&#x544A;&#x867D;&#x7136;&#x5438;&#x5F15;&#x4E86;&#x70B9;&#x51FB;&#xFF0C;&#x4F46;&#x672A;&#x80FD;&#x6709;&#x6548;&#x4FC3;&#x4F7F;&#x7528;&#x6237;&#x5B8C;&#x6210;&#x8D2D;&#x4E70;&#x6216;&#x5176;&#x4ED6;&#x9884;&#x5B9A;&#x884C;&#x4E3A;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x7740;&#x9646;&#x9875;&#x4E0D;&#x4F18;&#x5316;&#x6216;&#x6D41;&#x7A0B;&#x4E0D;&#x987A;&#x7545;&#x3002;</p><h4 id="5-%E8%B7%A8%E5%A2%83%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE%E7%9A%84%E4%BC%98%E5%8C%96%E7%AD%96%E7%95%A5"><strong>5. &#x8DE8;&#x5883;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x4F18;&#x5316;&#x7B56;&#x7565;</strong></h4><p>&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x5E7F;&#x544A;&#x6295;&#x653E;&#x7684;&#x9AD8;&#x6548;&#x6027;&#xFF0C;&#x8DE8;&#x5883;&#x7535;&#x5546;&#x5E7F;&#x544A;&#x4E3B;&#x9700;&#x8981;&#x91C7;&#x53D6;&#x4EE5;&#x4E0B;&#x4F18;&#x5316;&#x7B56;&#x7565;&#xFF1A;</p><p><strong>A/B&#x6D4B;&#x8BD5;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x6D4B;&#x8BD5;&#x4E0D;&#x540C;&#x5E7F;&#x544A;&#x521B;&#x610F;&#x3001;&#x53D7;&#x4F17;&#x5B9A;&#x5411;&#x3001;&#x5E7F;&#x544A;&#x6587;&#x6848;&#x7B49;&#xFF0C;&#x786E;&#x5B9A;&#x6700;&#x9002;&#x5408;&#x76EE;&#x6807;&#x5E02;&#x573A;&#x7684;&#x5E7F;&#x544A;&#x7B56;&#x7565;&#x3002;</p><p><strong>&#x7CBE;&#x51C6;&#x5B9A;&#x5411;</strong>&#xFF1A;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x56FD;&#x5BB6;&#x3001;&#x5730;&#x533A;&#x7684;&#x7528;&#x6237;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x5E7F;&#x544A;&#x5B9A;&#x5411;&#xFF0C;&#x786E;&#x4FDD;&#x5E7F;&#x544A;&#x89E6;&#x53CA;&#x5230;&#x771F;&#x6B63;&#x6709;&#x5174;&#x8DA3;&#x7684;&#x7528;&#x6237;&#x7FA4;&#x4F53;&#x3002;</p><p><strong>&#x5E7F;&#x544A;&#x521B;&#x610F;&#x4F18;&#x5316;</strong>&#xFF1A;&#x6839;&#x636E;&#x5E7F;&#x544A;&#x7684;&#x8868;&#x73B0;&#x6570;&#x636E;&#x4E0D;&#x65AD;&#x4F18;&#x5316;&#x5E7F;&#x544A;&#x5185;&#x5BB9;&#xFF0C;&#x4F7F;&#x5176;&#x66F4;&#x52A0;&#x5438;&#x5F15;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x3002;</p><p><strong>&#x9884;&#x7B97;&#x7075;&#x6D3B;&#x5206;&#x914D;</strong>&#xFF1A;&#x5C06;&#x66F4;&#x591A;&#x9884;&#x7B97;&#x6295;&#x5165;&#x5230;&#x8868;&#x73B0;&#x6700;&#x597D;&#x7684;&#x5E7F;&#x544A;&#x6D3B;&#x52A8;&#x4E0A;&#xFF0C;&#x4F18;&#x5316;&#x5E7F;&#x544A;&#x6548;&#x679C;&#xFF0C;&#x63D0;&#x9AD8;ROI&#x3002;</p><p><strong>&#x672C;&#x5730;&#x5316;&#x4E0E;&#x6587;&#x5316;&#x9002;&#x914D;</strong>&#xFF1A;&#x8DE8;&#x5883;&#x5E7F;&#x544A;&#x9700;&#x8981;&#x8003;&#x8651;&#x76EE;&#x6807;&#x5E02;&#x573A;&#x7684;&#x6587;&#x5316;&#x5DEE;&#x5F02;&#x3001;&#x8BED;&#x8A00;&#x969C;&#x788D;&#x4EE5;&#x53CA;&#x5F53;&#x5730;&#x6D88;&#x8D39;&#x8005;&#x7684;&#x8D2D;&#x7269;&#x4E60;&#x60EF;&#xFF0C;&#x786E;&#x4FDD;&#x5E7F;&#x544A;&#x5185;&#x5BB9;&#x548C;&#x6295;&#x653E;&#x7B56;&#x7565;&#x5177;&#x6709;&#x672C;&#x5730;&#x5316;&#x7684;&#x5438;&#x5F15;&#x529B;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[TypeORM]]></title><description><![CDATA[<p></p><h2 id="1-nestjs-typeorm-%E6%A6%82%E8%BF%B0"><strong>1. NestJS + TypeORM &#x6982;&#x8FF0;</strong></h2><ul><li>TypeORM &#x5728; NestJS &#x9879;&#x76EE;&#x4E2D;&#x7684;&#x4F5C;&#x7528;</li><li>&#x4E3A;&#x4EC0;&#x4E48;&#x9009;&#x62E9; TypeORM&#xFF08;&#x652F;&#x6301;&#x88C5;&#x9970;&#x5668;&#x3001;Active Record &#x548C; Data Mapper&#x3001;&#x5173;&#x7CFB;&#x7BA1;&#x7406;&#x7B49;&#xFF09;</li></ul><h2 id="2-%E9%A1%B9%E7%9B%AE%E5%88%9D%E5%A7%8B%E5%8C%96"><strong>2. &#x9879;&#x76EE;&#x521D;&#x59CB;&#x5316;</strong></h2><ul><li>&#x4F7F;&#x7528; Nest CLI &#x521B;</li></ul>]]></description><link>https://pureo.cn/typeorm/</link><guid isPermaLink="false">67b5d816a3d7cd0001cf2e1d</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Wed, 19 Feb 2025 13:10:06 GMT</pubDate><content:encoded><![CDATA[<p></p><h2 id="1-nestjs-typeorm-%E6%A6%82%E8%BF%B0"><strong>1. NestJS + TypeORM &#x6982;&#x8FF0;</strong></h2><ul><li>TypeORM &#x5728; NestJS &#x9879;&#x76EE;&#x4E2D;&#x7684;&#x4F5C;&#x7528;</li><li>&#x4E3A;&#x4EC0;&#x4E48;&#x9009;&#x62E9; TypeORM&#xFF08;&#x652F;&#x6301;&#x88C5;&#x9970;&#x5668;&#x3001;Active Record &#x548C; Data Mapper&#x3001;&#x5173;&#x7CFB;&#x7BA1;&#x7406;&#x7B49;&#xFF09;</li></ul><h2 id="2-%E9%A1%B9%E7%9B%AE%E5%88%9D%E5%A7%8B%E5%8C%96"><strong>2. &#x9879;&#x76EE;&#x521D;&#x59CB;&#x5316;</strong></h2><ul><li>&#x4F7F;&#x7528; Nest CLI &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; NestJS &#x9879;&#x76EE;&#xFF1A;</li></ul><pre><code class="language-sh">nest new nest-typeorm-example
</code></pre><ul><li>&#x5B89;&#x88C5; TypeORM &#x548C;&#x6570;&#x636E;&#x5E93;&#x9A71;&#x52A8;&#xFF08;&#x4EE5; PostgreSQL &#x4E3A;&#x4F8B;&#xFF09;&#xFF1A;</li></ul><pre><code class="language-sh">npm install @nestjs/typeorm typeorm pg
</code></pre><h2 id="3-%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5"><strong>3. &#x914D;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x8FDE;&#x63A5;</strong></h2><ul><li>&#x5728; <code>app.module.ts</code> &#x4E2D;&#x914D;&#x7F6E; TypeORM&#xFF1A;</li></ul><pre><code class="language-ts">import { Module } from &apos;@nestjs/common&apos;;
import { TypeOrmModule } from &apos;@nestjs/typeorm&apos;;

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: &apos;postgres&apos;,
      host: &apos;localhost&apos;,
      port: 5432,
      username: &apos;postgres&apos;,
      password: &apos;password&apos;,
      database: &apos;nestjs_typeorm&apos;,
      autoLoadEntities: true,
      synchronize: true, // &#x751F;&#x4EA7;&#x73AF;&#x5883;&#x5EFA;&#x8BAE;&#x7981;&#x7528;
    }),
  ],
})
export class AppModule {}
</code></pre><h2 id="4-%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BD%93%EF%BC%88entities%EF%BC%89"><strong>4. &#x521B;&#x5EFA;&#x5B9E;&#x4F53;&#xFF08;Entities&#xFF09;</strong></h2><ul><li>&#x4F7F;&#x7528;&#x88C5;&#x9970;&#x5668;&#x5B9A;&#x4E49;&#x6570;&#x636E;&#x6A21;&#x578B;&#xFF1A;</li></ul><pre><code class="language-ts">import { Entity, PrimaryGeneratedColumn, Column } from &apos;typeorm&apos;;

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column({ unique: true })
  email: string;

  @Column()
  password: string;
}
</code></pre><h2 id="5-%E5%88%9B%E5%BB%BA-service-%E5%92%8C-repository"><strong>5. &#x521B;&#x5EFA; Service &#x548C; Repository</strong></h2><ul><li>&#x5728; <code>users</code> &#x6A21;&#x5757;&#x4E2D;&#x4F7F;&#x7528; <code>TypeOrmModule.forFeature()</code>&#xFF1A;</li></ul><pre><code class="language-ts">import { Module } from &apos;@nestjs/common&apos;;
import { TypeOrmModule } from &apos;@nestjs/typeorm&apos;;
import { User } from &apos;./user.entity&apos;;
import { UsersService } from &apos;./users.service&apos;;
import { UsersController } from &apos;./users.controller&apos;;

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}
</code></pre><ul><li>&#x5728; <code>users.service.ts</code> &#x4E2D;&#x4F7F;&#x7528; <code>Repository</code> &#x8FDB;&#x884C; CRUD &#x64CD;&#x4F5C;&#xFF1A;</li></ul><pre><code class="language-ts">import { Injectable } from &apos;@nestjs/common&apos;;
import { InjectRepository } from &apos;@nestjs/typeorm&apos;;
import { Repository } from &apos;typeorm&apos;;
import { User } from &apos;./user.entity&apos;;

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository&lt;User&gt;,
  ) {}

  findAll(): Promise&lt;User[]&gt; {
    return this.usersRepository.find();
  }

  findOne(id: number): Promise&lt;User&gt; {
    return this.usersRepository.findOneBy({ id });
  }

  create(user: User): Promise&lt;User&gt; {
    return this.usersRepository.save(user);
  }

  async remove(id: number): Promise&lt;void&gt; {
    await this.usersRepository.delete(id);
  }
}
</code></pre><h2 id="6-%E5%88%9B%E5%BB%BA-controller"><strong>6. &#x521B;&#x5EFA; Controller</strong></h2><ul><li>&#x5728; <code>users.controller.ts</code> &#x4E2D;&#x5B9A;&#x4E49; API &#x8DEF;&#x7531;&#xFF1A;</li></ul><pre><code class="language-ts">import { Controller, Get, Post, Body, Param, Delete } from &apos;@nestjs/common&apos;;
import { UsersService } from &apos;./users.service&apos;;
import { User } from &apos;./user.entity&apos;;

@Controller(&apos;users&apos;)
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll(): Promise&lt;User[]&gt; {
    return this.usersService.findAll();
  }

  @Get(&apos;:id&apos;)
  findOne(@Param(&apos;id&apos;) id: string): Promise&lt;User&gt; {
    return this.usersService.findOne(Number(id));
  }

  @Post()
  create(@Body() user: User): Promise&lt;User&gt; {
    return this.usersService.create(user);
  }

  @Delete(&apos;:id&apos;)
  remove(@Param(&apos;id&apos;) id: string): Promise&lt;void&gt; {
    return this.usersService.remove(Number(id));
  }
}
</code></pre><h2 id="7-%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB"><strong>7. &#x6570;&#x636E;&#x8FC1;&#x79FB;</strong></h2><ul><li>&#x751F;&#x6210;&#x8FC1;&#x79FB;&#x6587;&#x4EF6;&#xFF1A;</li></ul><pre><code class="language-sh">npm run typeorm migration:generate -- -n CreateUserTable
</code></pre><ul><li>&#x8FD0;&#x884C;&#x8FC1;&#x79FB;&#xFF1A;</li></ul><pre><code class="language-sh">npm run typeorm migration:run
</code></pre><h2 id="8-%E8%BF%9B%E9%98%B6%E5%8A%9F%E8%83%BD"><strong>8. &#x8FDB;&#x9636;&#x529F;&#x80FD;</strong></h2><h3 id="%E5%85%B3%E7%B3%BB%E7%AE%A1%E7%90%86"><strong>&#x5173;&#x7CFB;&#x7BA1;&#x7406;</strong></h3><ul><li><code>OneToOne</code>&#x3001;<code>OneToMany</code>&#x3001;<code>ManyToMany</code> &#x5173;&#x7CFB;&#x7684;&#x4F7F;&#x7528;&#x3002;</li></ul><h3 id="%E4%BD%BF%E7%94%A8-dto-%E8%BF%9B%E8%A1%8C%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81"><strong>&#x4F7F;&#x7528; DTO &#x8FDB;&#x884C;&#x6570;&#x636E;&#x9A8C;&#x8BC1;</strong></h3><ul><li>&#x5229;&#x7528; <code>class-validator</code> &#x548C; <code>class-transformer</code> &#x8FDB;&#x884C;&#x6570;&#x636E;&#x9A8C;&#x8BC1;&#x3002;</li></ul><h3 id="%E4%BD%BF%E7%94%A8%E4%BA%8B%E5%8A%A1"><strong>&#x4F7F;&#x7528;&#x4E8B;&#x52A1;</strong></h3><ul><li><code>EntityManager</code> &#x548C; <code>QueryRunner</code> &#x5B9E;&#x73B0;&#x4E8B;&#x52A1;&#x5904;&#x7406;&#x3002;</li></ul><hr>]]></content:encoded></item><item><title><![CDATA[Cloudflare 技术分享文档]]></title><description><![CDATA[<h2 id="%E4%B8%80%E3%80%81%E6%A6%82%E8%BF%B0">&#x4E00;&#x3001;&#x6982;&#x8FF0;</h2><p>&#x968F;&#x7740;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x7F51;&#x7AD9;&#x6027;&#x80FD;&#x4E0E;&#x5B89;&#x5168;&#x6210;&#x4E3A;&#x4E86;&#x8FD0;&#x8425;&#x548C;&#x7EF4;&#x62A4;&#x4E2D;&#x4E0D;&#x53EF;&#x5FFD;&#x89C6;&#x7684;&#x5173;&#x952E;&#x8981;&#x7D20;&#x3002;Cloudflare &#x4F5C;&#x4E3A;&#x4E00;&#x5BB6;&#x5168;&#x7403;&#x9886;&#x5148;&#x7684;&#x4E92;</p>]]></description><link>https://pureo.cn/cloudflare-ji-zhu-fen-xiang-wen-dang/</link><guid isPermaLink="false">67ab2d74a3d7cd0001cf2e13</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Tue, 11 Feb 2025 10:59:14 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E4%B8%80%E3%80%81%E6%A6%82%E8%BF%B0">&#x4E00;&#x3001;&#x6982;&#x8FF0;</h2><p>&#x968F;&#x7740;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x7F51;&#x7AD9;&#x6027;&#x80FD;&#x4E0E;&#x5B89;&#x5168;&#x6210;&#x4E3A;&#x4E86;&#x8FD0;&#x8425;&#x548C;&#x7EF4;&#x62A4;&#x4E2D;&#x4E0D;&#x53EF;&#x5FFD;&#x89C6;&#x7684;&#x5173;&#x952E;&#x8981;&#x7D20;&#x3002;Cloudflare &#x4F5C;&#x4E3A;&#x4E00;&#x5BB6;&#x5168;&#x7403;&#x9886;&#x5148;&#x7684;&#x4E92;&#x8054;&#x7F51;&#x670D;&#x52A1;&#x63D0;&#x4F9B;&#x5546;&#xFF0C;&#x5229;&#x7528;&#x5176;&#x904D;&#x5E03;&#x5168;&#x7403;&#x7684;&#x8FB9;&#x7F18;&#x7F51;&#x7EDC;&#xFF0C;&#x63D0;&#x4F9B;&#x5185;&#x5BB9;&#x5206;&#x53D1;&#x7F51;&#x7EDC;&#xFF08;CDN&#xFF09;&#x3001;DNS&#x89E3;&#x6790;&#x3001;&#x5B89;&#x5168;&#x9632;&#x62A4;&#xFF08;&#x5982; DDoS &#x9632;&#x62A4;&#x3001;WAF &#x7B49;&#xFF09;&#x548C;&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;&#x7B49;&#x4E00;&#x7CFB;&#x5217;&#x670D;&#x52A1;&#x3002;&#x672C;&#x6587;&#x5C06;&#x5BF9; Cloudflare &#x7684;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x3001;&#x4E3B;&#x8981;&#x529F;&#x80FD;&#x3001;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x53CA;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x505A;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#xFF0C;&#x5E2E;&#x52A9;&#x5927;&#x5BB6;&#x66F4;&#x597D;&#x5730;&#x7406;&#x89E3;&#x548C;&#x5E94;&#x7528; Cloudflare &#x6765;&#x4F18;&#x5316;&#x7F51;&#x7AD9;&#x6027;&#x80FD;&#x4E0E;&#x5B89;&#x5168;&#x3002;</p><hr><h2 id="%E4%BA%8C%E3%80%81cloudflare-%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">&#x4E8C;&#x3001;Cloudflare &#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2><p>Cloudflare &#x662F;&#x4E00;&#x5BB6;&#x603B;&#x90E8;&#x4F4D;&#x4E8E;&#x7F8E;&#x56FD;&#x7684;&#x7F51;&#x7EDC;&#x670D;&#x52A1;&#x516C;&#x53F8;&#xFF0C;&#x5176;&#x6838;&#x5FC3;&#x7406;&#x5FF5;&#x662F;&#x201C;&#x8BA9;&#x4E92;&#x8054;&#x7F51;&#x66F4;&#x5FEB;&#x3001;&#x66F4;&#x5B89;&#x5168;&#x201D;&#x3002;&#x901A;&#x8FC7;&#x5728;&#x5168;&#x7403; 200 &#x591A;&#x4E2A;&#x57CE;&#x5E02;&#x5E03;&#x7F6E;&#x7684;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#xFF0C;Cloudflare &#x4E3A;&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x4EE5;&#x4E0B;&#x4E3B;&#x8981;&#x670D;&#x52A1;&#xFF1A;</p><ul><li><strong>CDN&#xFF08;&#x5185;&#x5BB9;&#x5206;&#x53D1;&#x7F51;&#x7EDC;&#xFF09;</strong>&#xFF1A;&#x5C06;&#x7F51;&#x7AD9;&#x9759;&#x6001;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x5230;&#x79BB;&#x7528;&#x6237;&#x66F4;&#x8FD1;&#x7684;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#xFF0C;&#x7F29;&#x77ED;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#xFF0C;&#x63D0;&#x5347;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x3002;</li><li><strong>DNS &#x670D;&#x52A1;</strong>&#xFF1A;&#x63D0;&#x4F9B;&#x5FEB;&#x901F;&#x4E14;&#x5B89;&#x5168;&#x7684;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x670D;&#x52A1;&#x3002;</li><li><strong>&#x5B89;&#x5168;&#x9632;&#x62A4;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x5185;&#x7F6E;&#x7684; DDoS &#x9632;&#x62A4;&#x3001;Web &#x5E94;&#x7528;&#x9632;&#x706B;&#x5899;&#xFF08;WAF&#xFF09;&#x3001;SSL/TLS &#x52A0;&#x5BC6;&#x7B49;&#x63AA;&#x65BD;&#xFF0C;&#x4FDD;&#x62A4;&#x7F51;&#x7AD9;&#x514D;&#x53D7;&#x6076;&#x610F;&#x653B;&#x51FB;&#x3002;</li><li><strong>&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;</strong>&#xFF1A;&#x5229;&#x7528; Cloudflare Workers &#x7B49;&#x4EA7;&#x54C1;&#xFF0C;&#x5728;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#x4E0A;&#x8FD0;&#x884C;&#x81EA;&#x5B9A;&#x4E49;&#x4EE3;&#x7801;&#xFF0C;&#x5B9E;&#x73B0;&#x4F4E;&#x5EF6;&#x8FDF;&#x3001;&#x7075;&#x6D3B;&#x7684;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x5904;&#x7406;&#x3002;</li></ul><p>Cloudflare &#x901A;&#x8FC7;&#x5145;&#x5F53;&#x7F51;&#x7AD9;&#x4E0E;&#x6700;&#x7EC8;&#x7528;&#x6237;&#x4E4B;&#x95F4;&#x7684;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5B9E;&#x73B0;&#x4E86;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x4E0E;&#x5B89;&#x5168;&#x9632;&#x62A4;&#x7684;&#x53CC;&#x91CD;&#x76EE;&#x6807;&#x3002;</p><hr><h2 id="%E4%B8%89%E3%80%81cloudflare-%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8A%9F%E8%83%BD">&#x4E09;&#x3001;Cloudflare &#x7684;&#x4E3B;&#x8981;&#x529F;&#x80FD;</h2><h3 id="31-%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C%EF%BC%88cdn%EF%BC%89">3.1 &#x5185;&#x5BB9;&#x5206;&#x53D1;&#x7F51;&#x7EDC;&#xFF08;CDN&#xFF09;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x7F13;&#x5B58;&#x7F51;&#x7AD9;&#x9759;&#x6001;&#x8D44;&#x6E90;&#xFF08;&#x5982;&#x56FE;&#x7247;&#x3001;JS&#x3001;CSS &#x7B49;&#xFF09;&#xFF0C;&#x5C06;&#x5185;&#x5BB9;&#x5B58;&#x50A8;&#x5728;&#x5168;&#x7403;&#x5404;&#x5730;&#x7684;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#x3002;</li><li><strong>&#x4F18;&#x52BF;</strong>&#xFF1A;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x4E0E;&#x670D;&#x52A1;&#x5668;&#x7684;&#x7269;&#x7406;&#x8DDD;&#x79BB;&#xFF0C;&#x964D;&#x4F4E;&#x5EF6;&#x8FDF;&#xFF0C;&#x63D0;&#x9AD8;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#xFF1B;&#x51CF;&#x8F7B;&#x6E90;&#x7AD9;&#x670D;&#x52A1;&#x5668;&#x8D1F;&#x8F7D;&#x3002;</li></ul><h3 id="32-dns-%E6%9C%8D%E5%8A%A1">3.2 DNS &#x670D;&#x52A1;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x63D0;&#x4F9B;&#x5FEB;&#x901F;&#x3001;&#x7A33;&#x5B9A;&#x3001;&#x5B89;&#x5168;&#x7684;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x670D;&#x52A1;&#x3002;</li><li><strong>&#x7279;&#x70B9;</strong>&#xFF1A;Cloudflare DNS &#x662F;&#x5168;&#x7403;&#x6700;&#x5FEB;&#x7684; DNS &#x670D;&#x52A1;&#x4E4B;&#x4E00;&#xFF0C;&#x540C;&#x65F6;&#x5177;&#x5907;&#x6297; DDoS &#x80FD;&#x529B;&#x3002;</li></ul><h3 id="33-ssltls-%E5%8A%A0%E5%AF%86">3.3 SSL/TLS &#x52A0;&#x5BC6;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x81EA;&#x52A8;&#x7BA1;&#x7406;&#x548C;&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x4F20;&#x8F93;&#xFF0C;&#x786E;&#x4FDD;&#x7F51;&#x7AD9;&#x901A;&#x4FE1;&#x5B89;&#x5168;&#x3002;</li><li><strong>&#x529F;&#x80FD;</strong>&#xFF1A;</li><li>&#x81EA;&#x52A8;&#x7B7E;&#x53D1;&#x514D;&#x8D39;&#x7684; SSL &#x8BC1;&#x4E66;&#xFF1B;</li><li>&#x652F;&#x6301;&#x5168;&#x7AD9; HTTPS &#x52A0;&#x5BC6;&#xFF1B;</li><li>&#x63D0;&#x4F9B;&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#x8BBE;&#x7F6E;&#xFF0C;&#x5982; Flexible&#x3001;Full &#x548C; Full (Strict)&#x3002;</li></ul><h3 id="34-web-%E5%BA%94%E7%94%A8%E9%98%B2%E7%81%AB%E5%A2%99%EF%BC%88waf%EF%BC%89">3.4 Web &#x5E94;&#x7528;&#x9632;&#x706B;&#x5899;&#xFF08;WAF&#xFF09;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x5BF9;&#x7F51;&#x7AD9;&#x6D41;&#x91CF;&#x8FDB;&#x884C;&#x5B9E;&#x65F6;&#x76D1;&#x63A7;&#xFF0C;&#x62E6;&#x622A; SQL &#x6CE8;&#x5165;&#x3001;&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#xFF08;XSS&#xFF09;&#x7B49;&#x5E38;&#x89C1;&#x653B;&#x51FB;&#x3002;</li><li><strong>&#x7279;&#x70B9;</strong>&#xFF1A;&#x57FA;&#x4E8E;&#x89C4;&#x5219;&#x5F15;&#x64CE;&#x548C;&#x4E0D;&#x65AD;&#x66F4;&#x65B0;&#x7684;&#x5A01;&#x80C1;&#x60C5;&#x62A5;&#x5E93;&#x8FDB;&#x884C;&#x9632;&#x62A4;&#xFF0C;&#x53EF;&#x81EA;&#x5B9A;&#x4E49;&#x9632;&#x706B;&#x5899;&#x89C4;&#x5219;&#x3002;</li></ul><h3 id="35-ddos-%E9%98%B2%E6%8A%A4">3.5 DDoS &#x9632;&#x62A4;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x9632;&#x6B62;&#x5206;&#x5E03;&#x5F0F;&#x62D2;&#x7EDD;&#x670D;&#x52A1;&#x653B;&#x51FB;&#xFF08;DDoS&#xFF09;&#x901A;&#x8FC7; Cloudflare &#x7F51;&#x7EDC;&#x8FC7;&#x6EE4;&#x6076;&#x610F;&#x6D41;&#x91CF;&#x3002;</li><li><strong>&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;</strong>&#xFF1A;&#x81EA;&#x52A8;&#x8BC6;&#x522B;&#x5E76;&#x62E6;&#x622A;&#x5F02;&#x5E38;&#x6D41;&#x91CF;&#xFF0C;&#x4FDD;&#x62A4;&#x7F51;&#x7AD9;&#x6301;&#x7EED;&#x5728;&#x7EBF;&#x3002;</li></ul><h3 id="36-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1">3.6 &#x8D1F;&#x8F7D;&#x5747;&#x8861;</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x5728;&#x591A;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x5206;&#x914D;&#x6D41;&#x91CF;&#xFF0C;&#x63D0;&#x9AD8;&#x7F51;&#x7AD9;&#x7684;&#x9AD8;&#x53EF;&#x7528;&#x6027;&#x548C;&#x5BB9;&#x9519;&#x80FD;&#x529B;&#x3002;</li><li><strong>&#x7279;&#x70B9;</strong>&#xFF1A;&#x652F;&#x6301;&#x8DE8;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#xFF0C;&#x5E76;&#x7ED3;&#x5408;&#x5065;&#x5EB7;&#x68C0;&#x67E5;&#x529F;&#x80FD;&#x3002;</li></ul><h3 id="37-cloudflare-workers">3.7 Cloudflare Workers</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x5728; Cloudflare &#x7684;&#x8FB9;&#x7F18;&#x7F51;&#x7EDC;&#x4E0A;&#x8FD0;&#x884C; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x5B9E;&#x73B0;&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;&#x3002;</li><li><strong>&#x4F18;&#x52BF;</strong>&#xFF1A;</li><li>&#x6781;&#x4F4E;&#x7684;&#x54CD;&#x5E94;&#x5EF6;&#x8FDF;&#xFF1B;</li><li>&#x7075;&#x6D3B;&#x6269;&#x5C55;&#xFF1A;&#x53EF;&#x4EE5;&#x5728;&#x8FB9;&#x7F18;&#x6267;&#x884C;&#x8BF8;&#x5982; A/B &#x6D4B;&#x8BD5;&#x3001;&#x4E2A;&#x6027;&#x5316;&#x5185;&#x5BB9;&#x5206;&#x53D1;&#x3001;API &#x7F51;&#x5173;&#x7B49;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x3002;</li></ul><h3 id="38-argo-smart-routing">3.8 Argo Smart Routing</h3><ul><li><strong>&#x4F5C;&#x7528;</strong>&#xFF1A;&#x5229;&#x7528; Cloudflare &#x5168;&#x7403;&#x7F51;&#x7EDC;&#x7684;&#x5B9E;&#x65F6;&#x72B6;&#x51B5;&#xFF0C;&#x4E3A;&#x7528;&#x6237;&#x9009;&#x62E9;&#x6700;&#x5FEB;&#x3001;&#x6700;&#x7A33;&#x5B9A;&#x7684;&#x8BBF;&#x95EE;&#x8DEF;&#x5F84;&#x3002;</li><li><strong>&#x6548;&#x679C;</strong>&#xFF1A;&#x8FDB;&#x4E00;&#x6B65;&#x964D;&#x4F4E;&#x7F51;&#x7AD9;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#xFF0C;&#x63D0;&#x9AD8;&#x8BBF;&#x95EE;&#x6210;&#x529F;&#x7387;&#x3002;</li></ul><hr><h2 id="%E5%9B%9B%E3%80%81cloudflare-%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">&#x56DB;&#x3001;Cloudflare &#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;</h2><p>Cloudflare &#x7684;&#x6838;&#x5FC3;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x57FA;&#x4E8E;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x4E0E;&#x8FB9;&#x7F18;&#x7F13;&#x5B58;&#x6280;&#x672F;&#xFF0C;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x6B65;&#x9AA4;&#xFF1A;</p><p><strong>DNS &#x89E3;&#x6790;</strong></p><ul><li>&#x7528;&#x6237;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x8F93;&#x5165;&#x7F51;&#x5740;&#xFF0C;DNS &#x89E3;&#x6790;&#x9996;&#x5148;&#x5C06;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x81F3; Cloudflare &#x63D0;&#x4F9B;&#x7684; IP &#x5730;&#x5740;&#xFF0C;&#x800C;&#x975E;&#x76F4;&#x63A5;&#x6307;&#x5411;&#x6E90;&#x7AD9;&#x670D;&#x52A1;&#x5668;&#x3002;</li></ul><p><strong>&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x4E0E;&#x6D41;&#x91CF;&#x5206;&#x53D1;</strong></p><ul><li>&#x7528;&#x6237;&#x7684;&#x8BF7;&#x6C42;&#x9996;&#x5148;&#x5230;&#x8FBE; Cloudflare &#x8FB9;&#x7F18;&#x8282;&#x70B9;&#x3002;&#x8282;&#x70B9;&#x6839;&#x636E;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5DF2;&#x6709;&#x5BF9;&#x5E94;&#x7F13;&#x5B58;&#xFF1A;</li><li><strong>&#x6709;&#x7F13;&#x5B58;</strong>&#xFF1A;&#x76F4;&#x63A5;&#x5C06;&#x7F13;&#x5B58;&#x5185;&#x5BB9;&#x8FD4;&#x56DE;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x52A0;&#x901F;&#x54CD;&#x5E94;&#x3002;</li><li><strong>&#x65E0;&#x7F13;&#x5B58;</strong>&#xFF1A;&#x5C06;&#x8BF7;&#x6C42;&#x8F6C;&#x53D1;&#x81F3;&#x6E90;&#x7AD9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x83B7;&#x53D6;&#x6700;&#x65B0;&#x5185;&#x5BB9;&#x5E76;&#x7F13;&#x5B58;&#x3002;</li></ul><p><strong>&#x5B89;&#x5168;&#x9632;&#x62A4;</strong></p><ul><li>&#x5728;&#x8BF7;&#x6C42;&#x8F6C;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;Cloudflare &#x5BF9;&#x6D41;&#x91CF;&#x8FDB;&#x884C;&#x5B9E;&#x65F6;&#x68C0;&#x6D4B;&#xFF0C;&#x62E6;&#x622A;&#x6F5C;&#x5728;&#x7684;&#x6076;&#x610F;&#x8BF7;&#x6C42;&#xFF0C;&#x5982; DDoS &#x653B;&#x51FB;&#x3001;SQL &#x6CE8;&#x5165;&#x3001;&#x8DE8;&#x7AD9;&#x811A;&#x672C;&#x653B;&#x51FB;&#x7B49;&#x3002;</li></ul><p><strong>&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x4E0E;&#x667A;&#x80FD;&#x8DEF;&#x7531;</strong></p><ul><li>&#x5F53;&#x914D;&#x7F6E;&#x4E86;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x65F6;&#xFF0C;Cloudflare &#x6839;&#x636E;&#x670D;&#x52A1;&#x5668;&#x5065;&#x5EB7;&#x72B6;&#x51B5;&#x548C;&#x7F51;&#x7EDC;&#x5EF6;&#x8FDF;&#x667A;&#x80FD;&#x5206;&#x914D;&#x6D41;&#x91CF;&#x3002;</li><li>Argo Smart Routing &#x6280;&#x672F;&#x53EF;&#x52A8;&#x6001;&#x9009;&#x62E9;&#x6700;&#x4F18;&#x8DEF;&#x5F84;&#xFF0C;&#x8FDB;&#x4E00;&#x6B65;&#x964D;&#x4F4E;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#x3002;</li></ul><p><strong>&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;&#xFF08;Cloudflare Workers&#xFF09;</strong></p><ul><li>&#x5F00;&#x53D1;&#x8005;&#x53EF;&#x4EE5;&#x5728; Cloudflare &#x7684;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#x4E0A;&#x90E8;&#x7F72; JavaScript &#x4EE3;&#x7801;&#xFF0C;&#x5B9E;&#x73B0;&#x5982; A/B &#x6D4B;&#x8BD5;&#x3001;&#x52A8;&#x6001;&#x5185;&#x5BB9;&#x5904;&#x7406;&#x7B49;&#x529F;&#x80FD;&#xFF0C;&#x65E0;&#x9700;&#x56DE;&#x6E90;&#x8BF7;&#x6C42;&#x3002;</li></ul><hr><h2 id="%E4%BA%94%E3%80%81%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-cloudflare%EF%BC%9F">&#x4E94;&#x3001;&#x5982;&#x4F55;&#x4F7F;&#x7528; Cloudflare&#xFF1F;</h2><p>&#x4E0B;&#x9762;&#x4EE5;&#x5C06;&#x4E00;&#x4E2A;&#x7F51;&#x7AD9;&#x63A5;&#x5165; Cloudflare &#x4E3A;&#x4F8B;&#xFF0C;&#x4ECB;&#x7ECD;&#x57FA;&#x672C;&#x4F7F;&#x7528;&#x6B65;&#x9AA4;&#x3002;</p><h3 id="51-%E6%B3%A8%E5%86%8C%E4%B8%8E%E8%B4%A6%E5%8F%B7%E5%88%9B%E5%BB%BA">5.1 &#x6CE8;&#x518C;&#x4E0E;&#x8D26;&#x53F7;&#x521B;&#x5EFA;</h3><ol><li>&#x8BBF;&#x95EE; <a href="https://www.cloudflare.com/">Cloudflare &#x5B98;&#x7F51;</a> &#x5E76;&#x70B9;&#x51FB;&#x201C;Sign Up&#x201D;&#x8FDB;&#x884C;&#x6CE8;&#x518C;&#x3002;</li><li>&#x6309;&#x7167;&#x63D0;&#x793A;&#x586B;&#x5199;&#x90AE;&#x7BB1;&#x3001;&#x5BC6;&#x7801;&#x7B49;&#x4FE1;&#x606F;&#xFF0C;&#x5B8C;&#x6210;&#x8D26;&#x53F7;&#x6CE8;&#x518C;&#x3002;</li></ol><h3 id="52-%E6%B7%BB%E5%8A%A0%E5%9F%9F%E5%90%8D">5.2 &#x6DFB;&#x52A0;&#x57DF;&#x540D;</h3><ol><li>&#x767B;&#x5F55; Cloudflare &#x540E;&#xFF0C;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x70B9;&#x51FB;&#x201C;Add a Site&#x201D;&#x3002;</li><li>&#x8F93;&#x5165;&#x4F60;&#x7684;&#x57DF;&#x540D;&#xFF08;&#x4F8B;&#x5982;&#xFF1A;example.com&#xFF09;&#xFF0C;Cloudflare &#x4F1A;&#x81EA;&#x52A8;&#x626B;&#x63CF;&#x5E76;&#x5BFC;&#x5165;&#x73B0;&#x6709;&#x7684; DNS &#x8BB0;&#x5F55;&#x3002;</li><li>&#x68C0;&#x67E5;&#x5E76;&#x786E;&#x8BA4; DNS &#x8BB0;&#x5F55;&#x662F;&#x5426;&#x5B8C;&#x6574;&#x3001;&#x6B63;&#x786E;&#x3002;</li></ol><h3 id="53-%E6%9B%B4%E6%96%B0%E5%9F%9F%E5%90%8D%E7%9A%84-name-server">5.3 &#x66F4;&#x65B0;&#x57DF;&#x540D;&#x7684; Name Server</h3><ol><li>Cloudflare &#x4F1A;&#x63D0;&#x4F9B;&#x4E00;&#x7EC4; Name Server&#xFF08;NS&#xFF09;&#x5730;&#x5740;&#x3002;</li><li>&#x767B;&#x5F55;&#x4F60;&#x7684;&#x57DF;&#x540D;&#x6CE8;&#x518C;&#x5546;&#x540E;&#x53F0;&#xFF0C;&#x5C06;&#x539F;&#x6709; NS &#x4FEE;&#x6539;&#x4E3A; Cloudflare &#x63D0;&#x4F9B;&#x7684; NS &#x5730;&#x5740;&#x3002;</li><li>DNS &#x53D8;&#x66F4;&#x901A;&#x5E38;&#x9700;&#x8981;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF08;&#x4ECE;&#x51E0;&#x5206;&#x949F;&#x5230;48&#x5C0F;&#x65F6;&#x4E0D;&#x7B49;&#xFF09;&#x8FDB;&#x884C;&#x5168;&#x7403;&#x4F20;&#x64AD;&#x3002;</li></ol><h3 id="54-%E9%85%8D%E7%BD%AE-ssltls-%E4%B8%8E%E5%AE%89%E5%85%A8%E8%AE%BE%E7%BD%AE">5.4 &#x914D;&#x7F6E; SSL/TLS &#x4E0E;&#x5B89;&#x5168;&#x8BBE;&#x7F6E;</h3><ol><li>&#x5728; Cloudflare &#x63A7;&#x5236;&#x53F0;&#x7684; SSL/TLS &#x8BBE;&#x7F6E;&#x4E2D;&#x9009;&#x62E9;&#x5408;&#x9002;&#x7684;&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#xFF1A;</li></ol><ul><li><strong>Flexible</strong>&#xFF1A;&#x7528;&#x6237;&#x4E0E; Cloudflare &#x4E4B;&#x95F4;&#x4F7F;&#x7528; HTTPS&#xFF0C;&#x4F46; Cloudflare &#x4E0E;&#x6E90;&#x7AD9;&#x4E4B;&#x95F4;&#x4F7F;&#x7528; HTTP&#x3002;</li><li><strong>Full</strong>&#xFF1A;&#x53CC;&#x65B9;&#x5747;&#x4F7F;&#x7528; HTTPS&#xFF0C;&#x4F46;&#x4E0D;&#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;&#x7684;&#x6709;&#x6548;&#x6027;&#x3002;</li><li><strong>Full (Strict)</strong>&#xFF1A;&#x53CC;&#x65B9;&#x4F7F;&#x7528; HTTPS&#xFF0C;&#x5E76;&#x4E14;&#x6E90;&#x7AD9;&#x8BC1;&#x4E66;&#x5FC5;&#x987B;&#x662F;&#x6709;&#x6548;&#x7684;&#x3002;</li></ul><ol><li>&#x5F00;&#x542F; <strong>Always Use HTTPS</strong>&#xFF08;&#x59CB;&#x7EC8;&#x4F7F;&#x7528; HTTPS&#xFF09;&#x4EE5;&#x53CA; <strong>Automatic HTTPS Rewrites</strong>&#xFF08;&#x81EA;&#x52A8; HTTPS &#x91CD;&#x5199;&#xFF09;&#x3002;</li><li>&#x5728; &#x201C;Firewall&#x201D; &#x8BBE;&#x7F6E;&#x4E2D;&#xFF0C;&#x5F00;&#x542F; WAF &#x89C4;&#x5219;&#xFF0C;&#x8BBE;&#x7F6E;&#x81EA;&#x5B9A;&#x4E49;&#x9632;&#x706B;&#x5899;&#x89C4;&#x5219;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x63D0;&#x5347;&#x5B89;&#x5168;&#x6027;&#x3002;</li></ol><h3 id="55-%E9%85%8D%E7%BD%AE%E9%A1%B5%E9%9D%A2%E8%A7%84%E5%88%99%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">5.5 &#x914D;&#x7F6E;&#x9875;&#x9762;&#x89C4;&#x5219;&#x4E0E;&#x6027;&#x80FD;&#x4F18;&#x5316;</h3><ol><li><strong>&#x9875;&#x9762;&#x89C4;&#x5219;</strong></li></ol><ul><li>&#x8FDB;&#x5165;&#x201C;Page Rules&#x201D;&#x9009;&#x9879;&#xFF0C;&#x53EF;&#x4EE5;&#x4E3A;&#x7279;&#x5B9A; URL &#x8DEF;&#x5F84;&#x8BBE;&#x7F6E;&#x7F13;&#x5B58;&#x7EA7;&#x522B;&#x3001;&#x91CD;&#x5B9A;&#x5411;&#x3001;&#x7981;&#x7528;&#x7279;&#x5B9A;&#x529F;&#x80FD;&#x7B49;&#x89C4;&#x5219;&#x3002;</li></ul><ol><li><strong>&#x7F13;&#x5B58;&#x8BBE;&#x7F6E;</strong></li></ol><ul><li>&#x5728; &#x201C;Caching&#x201D; &#x9875;&#x9762;&#x4E2D;&#xFF0C;&#x9009;&#x62E9;&#x5408;&#x9002;&#x7684;&#x7F13;&#x5B58;&#x7EA7;&#x522B;&#xFF0C;&#x5E76;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x9700;&#x6C42;&#x8BBE;&#x7F6E;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x3002;</li></ul><ol><li><strong>&#x667A;&#x80FD;&#x8DEF;&#x7531;&#x4E0E; Argo</strong></li></ol><ul><li>&#x6839;&#x636E;&#x9700;&#x8981;&#x542F;&#x7528; Argo Smart Routing &#x63D0;&#x5347;&#x7F51;&#x7EDC;&#x4F20;&#x8F93;&#x901F;&#x5EA6;&#xFF08;&#x9700;&#x6CE8;&#x610F;&#x53EF;&#x80FD;&#x6D89;&#x53CA;&#x989D;&#x5916;&#x8D39;&#x7528;&#xFF09;&#x3002;</li></ul><h3 id="56-cloudflare-workers-%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88%E9%80%89%E5%81%9A%EF%BC%89">5.6 Cloudflare Workers &#x7684;&#x4F7F;&#x7528;&#xFF08;&#x9009;&#x505A;&#xFF09;</h3><p>&#x5728; Cloudflare &#x63A7;&#x5236;&#x53F0;&#x9009;&#x62E9; &#x201C;Workers&#x201D; &#x9009;&#x9879;&#x3002;</p><p>&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; Worker &#x811A;&#x672C;&#xFF0C;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p><pre><code class="language-javascript">addEventListener(&apos;fetch&apos;, event =&gt; {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  return new Response(&apos;Hello from Cloudflare Workers!&apos;, {
    headers: { &apos;content-type&apos;: &apos;text/plain&apos; },
  })
}
</code></pre><p>&#x90E8;&#x7F72; Worker &#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7ED1;&#x5B9A;&#x8DEF;&#x7531;&#x4F7F;&#x5176;&#x751F;&#x6548;&#xFF0C;&#x5982;&#x5C06;&#x5176;&#x4F5C;&#x7528;&#x4E8E;&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x8DEF;&#x5F84;&#x3002;</p><hr><h2 id="%E5%85%AD%E3%80%81%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF">&#x516D;&#x3001;&#x5E94;&#x7528;&#x573A;&#x666F;</h2><p>Cloudflare &#x7684;&#x529F;&#x80FD;&#x5E7F;&#x6CDB;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x591A;&#x79CD;&#x573A;&#x666F;&#xFF0C;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#xFF1A;</p><p><strong>&#x7F51;&#x7AD9;&#x52A0;&#x901F;</strong><br>&#x5229;&#x7528; CDN &#x7F13;&#x5B58;&#x9759;&#x6001;&#x5185;&#x5BB9;&#xFF0C;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#xFF0C;&#x63D0;&#x5347;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p><p><strong>&#x5B89;&#x5168;&#x9632;&#x62A4;</strong><br>&#x901A;&#x8FC7; DDoS &#x9632;&#x62A4;&#x3001;WAF &#x4EE5;&#x53CA; SSL/TLS &#x52A0;&#x5BC6;&#x4FDD;&#x62A4;&#x7F51;&#x7AD9;&#x514D;&#x53D7;&#x5404;&#x7C7B;&#x653B;&#x51FB;&#xFF0C;&#x4FDD;&#x8BC1;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x5B89;&#x5168;&#x3002;</p><p><strong>&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x4E0E;&#x9AD8;&#x53EF;&#x7528;&#x6027;</strong><br>&#x914D;&#x5408;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x529F;&#x80FD;&#xFF0C;&#x5C06;&#x6D41;&#x91CF;&#x5206;&#x6563;&#x5230;&#x591A;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x63D0;&#x5347;&#x6574;&#x4F53;&#x670D;&#x52A1;&#x7A33;&#x5B9A;&#x6027;&#x3002;</p><p><strong>&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;</strong><br>&#x901A;&#x8FC7; Cloudflare Workers &#x5728;&#x8FB9;&#x7F18;&#x8282;&#x70B9;&#x8FD0;&#x884C;&#x81EA;&#x5B9A;&#x4E49;&#x4EE3;&#x7801;&#xFF0C;&#x5B9E;&#x73B0;&#x5B9E;&#x65F6;&#x5904;&#x7406;&#x548C;&#x4E2A;&#x6027;&#x5316;&#x5185;&#x5BB9;&#x5206;&#x53D1;&#xFF0C;&#x5982; A/B &#x6D4B;&#x8BD5;&#x3001;API &#x7F51;&#x5173;&#x3001;&#x6570;&#x636E;&#x9884;&#x5904;&#x7406;&#x7B49;&#x5E94;&#x7528;&#x3002;</p><p><strong>&#x5168;&#x7403;&#x6D41;&#x91CF;&#x7BA1;&#x7406;</strong><br>&#x9002;&#x7528;&#x4E8E;&#x8DE8;&#x56FD;&#x6216;&#x8DE8;&#x5730;&#x533A;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x901A;&#x8FC7;&#x667A;&#x80FD;&#x8DEF;&#x7531;&#x3001;Argo &#x4F18;&#x5316;&#x7F51;&#x7EDC;&#x4F20;&#x8F93;&#x8DEF;&#x5F84;&#xFF0C;&#x964D;&#x4F4E;&#x5EF6;&#x8FDF;&#x3002;</p><hr><h2 id="%E4%B8%83%E3%80%81%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E4%B8%8E%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">&#x4E03;&#x3001;&#x6700;&#x4F73;&#x5B9E;&#x8DF5;&#x4E0E;&#x6CE8;&#x610F;&#x4E8B;&#x9879;</h2><h3 id="71-%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86">7.1 &#x914D;&#x7F6E;&#x7BA1;&#x7406;</h3><ul><li><strong>DNS &#x8BB0;&#x5F55;</strong>&#xFF1A;&#x5728;&#x63A5;&#x5165; Cloudflare &#x524D;&#x540E;&#xFF0C;&#x786E;&#x4FDD;&#x6240;&#x6709;&#x5FC5;&#x8981;&#x7684; DNS &#x8BB0;&#x5F55;&#x90FD;&#x5DF2;&#x6B63;&#x786E;&#x5BFC;&#x5165;&#xFF0C;&#x907F;&#x514D;&#x56E0;&#x8BB0;&#x5F55;&#x7F3A;&#x5931;&#x5BFC;&#x81F4;&#x670D;&#x52A1;&#x4E2D;&#x65AD;&#x3002;</li><li><strong>&#x9875;&#x9762;&#x89C4;&#x5219;</strong>&#xFF1A;&#x5408;&#x7406;&#x8BBE;&#x7F6E;&#x9875;&#x9762;&#x89C4;&#x5219;&#xFF0C;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x8DEF;&#x5F84;&#x3001;&#x6587;&#x4EF6;&#x7C7B;&#x578B;&#x914D;&#x7F6E;&#x7F13;&#x5B58;&#x3001;&#x91CD;&#x5B9A;&#x5411;&#x3001;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x7B49;&#x7B56;&#x7565;&#x3002;</li></ul><h3 id="72-%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4">7.2 &#x5B89;&#x5168;&#x9632;&#x62A4;</h3><ul><li><strong>&#x5B9A;&#x671F;&#x68C0;&#x67E5;</strong>&#xFF1A;&#x5B9A;&#x671F;&#x5BA1;&#x67E5;&#x9632;&#x706B;&#x5899;&#x89C4;&#x5219;&#x548C; WAF &#x65E5;&#x5FD7;&#xFF0C;&#x53CA;&#x65F6;&#x53D1;&#x73B0;&#x5E76;&#x8C03;&#x6574;&#x6F5C;&#x5728;&#x98CE;&#x9669;&#x3002;</li><li><strong>SSL/TLS &#x914D;&#x7F6E;</strong>&#xFF1A;&#x63A8;&#x8350;&#x4F7F;&#x7528; Full (Strict) &#x6A21;&#x5F0F;&#xFF0C;&#x540C;&#x65F6;&#x786E;&#x4FDD;&#x8BC1;&#x4E66;&#x6709;&#x6548;&#x6027;&#xFF0C;&#x907F;&#x514D;&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;&#x3002;</li></ul><h3 id="73-%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%E4%B8%8E%E8%B0%83%E4%BC%98">7.3 &#x6027;&#x80FD;&#x76D1;&#x63A7;&#x4E0E;&#x8C03;&#x4F18;</h3><ul><li><strong>&#x5206;&#x6790;&#x62A5;&#x544A;</strong>&#xFF1A;&#x5229;&#x7528; Cloudflare &#x63D0;&#x4F9B;&#x7684;&#x7EDF;&#x8BA1;&#x6570;&#x636E;&#x548C;&#x65E5;&#x5FD7;&#xFF0C;&#x76D1;&#x63A7;&#x7F51;&#x7AD9;&#x6D41;&#x91CF;&#x3001;&#x7F13;&#x5B58;&#x547D;&#x4E2D;&#x7387;&#x53CA;&#x653B;&#x51FB;&#x4E8B;&#x4EF6;&#x3002;</li><li><strong>&#x6301;&#x7EED;&#x4F18;&#x5316;</strong>&#xFF1A;&#x7ED3;&#x5408;&#x7F51;&#x7AD9;&#x5B9E;&#x9645;&#x8BBF;&#x95EE;&#x60C5;&#x51B5;&#xFF0C;&#x8C03;&#x6574;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#x3001;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x8BBE;&#x7F6E;&#x548C; Workers &#x4EE3;&#x7801;&#xFF0C;&#x63D0;&#x5347;&#x6574;&#x4F53;&#x6027;&#x80FD;&#x3002;</li></ul><h3 id="74-%E6%88%90%E6%9C%AC%E4%B8%8E%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6">7.4 &#x6210;&#x672C;&#x4E0E;&#x6D41;&#x91CF;&#x63A7;&#x5236;</h3><ul><li><strong>&#x670D;&#x52A1;&#x5957;&#x9910;</strong>&#xFF1A;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x9700;&#x6C42;&#x9009;&#x62E9;&#x514D;&#x8D39;&#x7248;&#x6216;&#x4ED8;&#x8D39;&#x7248;&#x670D;&#x52A1;&#xFF0C;&#x5408;&#x7406;&#x89C4;&#x5212;&#x5404;&#x9879;&#x529F;&#x80FD;&#x7684;&#x4F7F;&#x7528;&#x3002;</li><li><strong>&#x6D41;&#x91CF;&#x76D1;&#x63A7;</strong>&#xFF1A;&#x5BF9;&#x4E8E;&#x5927;&#x6D41;&#x91CF;&#x7F51;&#x7AD9;&#xFF0C;&#x5B9A;&#x671F;&#x76D1;&#x63A7;&#x6D41;&#x91CF;&#x4F7F;&#x7528;&#x60C5;&#x51B5;&#xFF0C;&#x907F;&#x514D;&#x56E0;&#x5F02;&#x5E38;&#x6D41;&#x91CF;&#x4EA7;&#x751F;&#x989D;&#x5916;&#x8D39;&#x7528;&#x3002;</li></ul><hr><h2 id="%E5%85%AB%E3%80%81%E6%80%BB%E7%BB%93%E4%B8%8E%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">&#x516B;&#x3001;&#x603B;&#x7ED3;&#x4E0E;&#x53C2;&#x8003;&#x8D44;&#x6599;</h2><h3 id="81-%E6%80%BB%E7%BB%93">8.1 &#x603B;&#x7ED3;</h3><p>Cloudflare &#x901A;&#x8FC7;&#x5168;&#x7403;&#x5316;&#x7684;&#x8FB9;&#x7F18;&#x7F51;&#x7EDC;&#x548C;&#x4E00;&#x7CFB;&#x5217;&#x6027;&#x80FD;&#x3001;&#x5B89;&#x5168;&#x4EA7;&#x54C1;&#xFF0C;&#x5E2E;&#x52A9;&#x7F51;&#x7AD9;&#x52A0;&#x901F;&#x3001;&#x4FDD;&#x62A4;&#x548C;&#x6269;&#x5C55;&#x3002;&#x5176;&#x6838;&#x5FC3;&#x4F18;&#x52BF;&#x5728;&#x4E8E;&#xFF1A;</p><ul><li><strong>&#x5168;&#x7403; CDN</strong>&#xFF1A;&#x7F29;&#x77ED;&#x7528;&#x6237;&#x4E0E;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x7684;&#x8DDD;&#x79BB;&#xFF0C;&#x63D0;&#x9AD8;&#x54CD;&#x5E94;&#x901F;&#x5EA6;&#x3002;</li><li><strong>&#x591A;&#x5C42;&#x6B21;&#x5B89;&#x5168;&#x9632;&#x62A4;</strong>&#xFF1A;&#x7ED3;&#x5408; DDoS &#x9632;&#x62A4;&#x3001;WAF &#x548C; SSL/TLS &#x52A0;&#x5BC6;&#xFF0C;&#x4FDD;&#x969C;&#x6570;&#x636E;&#x5B89;&#x5168;&#x3002;</li><li><strong>&#x667A;&#x80FD;&#x8DEF;&#x7531;&#x4E0E;&#x8D1F;&#x8F7D;&#x5747;&#x8861;</strong>&#xFF1A;&#x4F18;&#x5316;&#x6D41;&#x91CF;&#x5206;&#x53D1;&#xFF0C;&#x63D0;&#x5347;&#x7F51;&#x7AD9;&#x7A33;&#x5B9A;&#x6027;&#x3002;</li><li><strong>&#x8FB9;&#x7F18;&#x8BA1;&#x7B97;&#x5E73;&#x53F0;&#xFF08;Workers&#xFF09;</strong>&#xFF1A;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#x63D0;&#x4F9B;&#x4F4E;&#x5EF6;&#x8FDF;&#x3001;&#x9AD8;&#x6269;&#x5C55;&#x7684;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x73AF;&#x5883;&#x3002;</li></ul><p>&#x638C;&#x63E1; Cloudflare &#x7684;&#x4F7F;&#x7528;&#x6280;&#x5DE7;&#xFF0C;&#x80FD;&#x591F;&#x6709;&#x6548;&#x63D0;&#x5347;&#x7F51;&#x7AD9;&#x6027;&#x80FD;&#x3001;&#x589E;&#x5F3A;&#x5B89;&#x5168;&#x9632;&#x62A4;&#x5E76;&#x652F;&#x6301;&#x590D;&#x6742;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x7684;&#x5B9E;&#x65F6;&#x5904;&#x7406;&#x3002;</p><h3 id="82-%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">8.2 &#x53C2;&#x8003;&#x8D44;&#x6599;</h3><ul><li><a href="https://www.cloudflare.com/">Cloudflare &#x5B98;&#x65B9;&#x7F51;&#x7AD9;</a></li><li><a href="https://developers.cloudflare.com/">Cloudflare &#x5F00;&#x53D1;&#x8005;&#x6587;&#x6863;</a></li><li><a href="https://blog.cloudflare.com/">Cloudflare &#x535A;&#x5BA2;</a></li><li>&#x76F8;&#x5173;&#x6280;&#x672F;&#x793E;&#x533A;&#x548C;&#x8BBA;&#x575B;&#xFF0C;&#x5982; Stack Overflow&#x3001;Reddit &#x4E0A;&#x7684; Cloudflare &#x8BA8;&#x8BBA;&#x533A;</li></ul><hr><p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;&#x4E00;&#x4EFD;&#x8F83;&#x4E3A;&#x5168;&#x9762;&#x7684; Cloudflare &#x6280;&#x672F;&#x5206;&#x4EAB;&#x6587;&#x6863;&#x793A;&#x4F8B;&#x3002;&#x5E0C;&#x671B;&#x8FD9;&#x4EFD;&#x6587;&#x6863;&#x80FD;&#x4E3A;&#x4F60;&#x7684;&#x6280;&#x672F;&#x5206;&#x4EAB;&#x63D0;&#x4F9B;&#x53C2;&#x8003;&#x4E0E;&#x5E2E;&#x52A9;&#x3002;&#x5982;&#x679C;&#x6709;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x95EE;&#x9898;&#x6216;&#x9700;&#x8981;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x6B22;&#x8FCE;&#x8BA8;&#x8BBA;&#xFF01;</p>]]></content:encoded></item><item><title><![CDATA[事件循环]]></title><description><![CDATA[<h1 id="%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-javascript-%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%E4%B8%8E%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97">&#x6DF1;&#x5165;&#x7406;&#x89E3; JavaScript &#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x4E0E;&#x4EFB;&#x52A1;&#x961F;&#x5217;</h1><h2 id="1-%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%EF%BC%9F">1. &#x4EC0;&#x4E48;&#x662F;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF1F;</h2><p>JavaScript &#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x8BED;&#x8A00;&#xFF0C;&#x4F46;&#x901A;&#x8FC7; <strong>&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF08;Event Loop&#xFF09;</strong> &#x5B9E;&#x73B0;&#x4E86;&#x975E;&#x963B;&#x585E;&#x7684;&#x5F02;</p>]]></description><link>https://pureo.cn/shi-jian-xun-huan/</link><guid isPermaLink="false">679517fa587455000113d8ab</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Sat, 25 Jan 2025 16:58:11 GMT</pubDate><content:encoded><![CDATA[<h1 id="%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-javascript-%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%E4%B8%8E%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97">&#x6DF1;&#x5165;&#x7406;&#x89E3; JavaScript &#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x4E0E;&#x4EFB;&#x52A1;&#x961F;&#x5217;</h1><h2 id="1-%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%EF%BC%9F">1. &#x4EC0;&#x4E48;&#x662F;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF1F;</h2><p>JavaScript &#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x8BED;&#x8A00;&#xFF0C;&#x4F46;&#x901A;&#x8FC7; <strong>&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF08;Event Loop&#xFF09;</strong> &#x5B9E;&#x73B0;&#x4E86;&#x975E;&#x963B;&#x585E;&#x7684;&#x5F02;&#x6B65;&#x884C;&#x4E3A;&#x3002;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x7684;&#x6838;&#x5FC3;&#x804C;&#x8D23;&#x662F;&#x534F;&#x8C03;&#x8C03;&#x7528;&#x6808;&#xFF08;Call Stack&#xFF09;&#x3001;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF08;Task Queues&#xFF09;&#x548C;&#x5BBF;&#x4E3B;&#x73AF;&#x5883;&#xFF08;&#x5982;&#x6D4F;&#x89C8;&#x5668;&#x6216; Node.js&#xFF09;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x9AD8;&#x6548;&#x6267;&#x884C;&#x3002;</p><h2 id="2-%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E4%B8%8E%E8%BF%90%E8%A1%8C%E6%9C%BA%E5%88%B6">2. &#x6838;&#x5FC3;&#x6982;&#x5FF5;&#x4E0E;&#x8FD0;&#x884C;&#x673A;&#x5236;</h2><h3 id="21-%E8%B0%83%E7%94%A8%E6%A0%88%EF%BC%88call-stack%EF%BC%89">2.1 &#x8C03;&#x7528;&#x6808;&#xFF08;Call Stack&#xFF09;</h3><ul><li><strong>&#x5B9A;&#x4E49;</strong>&#xFF1A;&#x4E00;&#x4E2A;&#x540E;&#x8FDB;&#x5148;&#x51FA;&#xFF08;LIFO&#xFF09;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x7528;&#x4E8E;&#x8FFD;&#x8E2A;&#x5F53;&#x524D;&#x6267;&#x884C;&#x7684;&#x51FD;&#x6570;&#x8C03;&#x7528;&#x3002;</li><li><strong>&#x884C;&#x4E3A;</strong>&#xFF1A;</li><li>&#x6267;&#x884C;&#x51FD;&#x6570;&#x65F6;&#xFF0C;&#x5C06;&#x5176;&#x63A8;&#x5165;&#x6808;&#x9876;&#x3002;</li><li>&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x65F6;&#xFF0C;&#x5C06;&#x5176;&#x5F39;&#x51FA;&#x6808;&#x3002;</li><li><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;</li></ul><pre><code class="language-javascript">function a() { b(); }
function b() { c(); }
function c() { console.log(&apos;Done&apos;); }
a();
</code></pre><p><strong>&#x8C03;&#x7528;&#x6808;&#x987A;&#x5E8F;</strong>&#xFF1A;<code>a() &#x2192; b() &#x2192; c() &#x2192; console.log()</code>&#x3002;</p><h3 id="22-%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97%EF%BC%88task-queues%EF%BC%89">2.2 &#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF08;Task Queues&#xFF09;</h3><p>JavaScript &#x901A;&#x8FC7; <strong>&#x4EFB;&#x52A1;&#x961F;&#x5217;</strong> &#x7BA1;&#x7406;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x56DE;&#x8C03;&#x3002;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x5206;&#x4E3A;&#x4E24;&#x7C7B;&#xFF1A;</p><h4 id="221-%E5%AE%8F%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97%EF%BC%88macrotask-queue%EF%BC%89">2.2.1 &#x5B8F;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF08;MacroTask Queue&#xFF09;</h4><ul><li><strong>&#x5305;&#x542B;&#x4EFB;&#x52A1;</strong>&#xFF1A;</li><li><code>setTimeout</code> / <code>setInterval</code></li><li>I/O &#x64CD;&#x4F5C;&#xFF08;&#x5982;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x3001;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF09;</li><li>DOM &#x4E8B;&#x4EF6;&#x56DE;&#x8C03;&#xFF08;&#x5982; <code>click</code>&#x3001;<code>load</code>&#xFF09;</li><li><code>requestAnimationFrame</code>&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#xFF09;</li><li>UI &#x6E32;&#x67D3;&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#xFF09;</li><li><strong>&#x6267;&#x884C;&#x89C4;&#x5219;</strong>&#xFF1A;&#x6BCF;&#x6B21;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x8FED;&#x4EE3;&#x5904;&#x7406;&#x4E00;&#x4E2A;&#x5B8F;&#x4EFB;&#x52A1;&#x3002;</li></ul><h4 id="222-%E5%BE%AE%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97%EF%BC%88microtask-queue%EF%BC%89">2.2.2 &#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF08;MicroTask Queue&#xFF09;</h4><ul><li><strong>&#x5305;&#x542B;&#x4EFB;&#x52A1;</strong>&#xFF1A;</li><li><code>Promise.then()</code> / <code>Promise.catch()</code> / <code>Promise.finally()</code></li><li><code>MutationObserver</code>&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#xFF09;</li><li><code>queueMicrotask()</code></li><li><code>process.nextTick()</code>&#xFF08;Node.js&#xFF0C;&#x4F18;&#x5148;&#x7EA7;&#x9AD8;&#x4E8E;&#x5FAE;&#x4EFB;&#x52A1;&#xFF09;</li><li><strong>&#x6267;&#x884C;&#x89C4;&#x5219;</strong>&#xFF1A;<br>&#x6BCF;&#x4E2A;&#x5B8F;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x540E;&#xFF0C;&#x6E05;&#x7A7A;&#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x4EFB;&#x52A1;&#x3002;</li></ul><h3 id="23-%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%E6%B5%81%E7%A8%8B">2.3 &#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x6D41;&#x7A0B;</h3><p>&#x4EE5;&#x4E0B;&#x662F;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x7684;&#x7B80;&#x5316;&#x6D41;&#x7A0B;&#xFF08;&#x4EE5;&#x6D4F;&#x89C8;&#x5668;&#x4E3A;&#x4F8B;&#xFF09;&#xFF1A;</p><ol><li><strong>&#x6267;&#x884C;&#x5168;&#x5C40;&#x540C;&#x6B65;&#x4EE3;&#x7801;</strong>&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x8C03;&#x7528;&#x6808;&#x3002;</li><li><strong>&#x5904;&#x7406;&#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;</strong>&#xFF1A;</li></ol><ul><li>&#x6267;&#x884C;&#x6240;&#x6709;&#x5FAE;&#x4EFB;&#x52A1;&#xFF0C;&#x76F4;&#x5230;&#x961F;&#x5217;&#x4E3A;&#x7A7A;&#x3002;</li></ul><ol><li><strong>&#x6267;&#x884C;&#x6E32;&#x67D3;&#xFF08;&#x5982;&#x9700;&#x8981;&#xFF09;</strong>&#xFF1A;</li></ol><ul><li>&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x8FDB;&#x884C;&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;&#x3001;&#x7ED8;&#x5236;&#xFF08;Paint&#xFF09;&#x3002;</li></ul><ol><li><strong>&#x4ECE;&#x5B8F;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;&#x6267;&#x884C;</strong>&#xFF0C;&#x56DE;&#x5230;&#x6B65;&#x9AA4; 2&#x3002;</li></ol><figure class="kg-card kg-image-card"><img src="https://mdn.mozillademos.org/files/17124/The_Javascript_Runtime_Environment_Example.svg" class="kg-image" alt="Event Loop Diagram" loading="lazy"></figure><h2 id="3-%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F%E7%A4%BA%E4%BE%8B">3. &#x4EE3;&#x7801;&#x6267;&#x884C;&#x987A;&#x5E8F;&#x793A;&#x4F8B;</h2><pre><code class="language-javascript">console.log(&apos;Start&apos;);

setTimeout(() =&gt; console.log(&apos;Timeout&apos;), 0);

Promise.resolve()
  .then(() =&gt; console.log(&apos;Promise 1&apos;))
  .then(() =&gt; console.log(&apos;Promise 2&apos;));

console.log(&apos;End&apos;);
</code></pre><p><strong>&#x8F93;&#x51FA;&#x987A;&#x5E8F;</strong>&#xFF1A;</p><pre><code>Start &#x2192; End &#x2192; Promise 1 &#x2192; Promise 2 &#x2192; Timeout
</code></pre><p><strong>&#x89E3;&#x91CA;</strong>&#xFF1A;</p><ul><li>&#x540C;&#x6B65;&#x4EE3;&#x7801;&#x5148;&#x6267;&#x884C;&#xFF08;<code>Start</code>, <code>End</code>&#xFF09;&#x3002;</li><li>&#x5FAE;&#x4EFB;&#x52A1;&#xFF08;Promise&#xFF09;&#x4F18;&#x5148;&#x4E8E;&#x5B8F;&#x4EFB;&#x52A1;&#xFF08;<code>setTimeout</code>&#xFF09;&#x3002;</li></ul><hr><h2 id="4-%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8E-nodejs-%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF%E5%B7%AE%E5%BC%82">4. &#x6D4F;&#x89C8;&#x5668;&#x4E0E; Node.js &#x7684;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x5DEE;&#x5F02;</h2><h3 id="41-%E6%B5%8F%E8%A7%88%E5%99%A8%E7%8E%AF%E5%A2%83">4.1 &#x6D4F;&#x89C8;&#x5668;&#x73AF;&#x5883;</h3><ul><li><strong>&#x5B8F;&#x4EFB;&#x52A1;&#x961F;&#x5217;</strong>&#xFF1A;&#x7531;&#x5BBF;&#x4E3B;&#x73AF;&#x5883;&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#xFF09;&#x7BA1;&#x7406;&#xFF0C;&#x4E0E;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#x8026;&#x5408;&#x3002;</li><li><strong>&#x5FAE;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x65F6;&#x673A;</strong>&#xFF1A;&#x5728;&#x6BCF;&#x4E00;&#x4E2A;&#x5B8F;&#x4EFB;&#x52A1;&#x4E4B;&#x540E;&#x3001;&#x6E32;&#x67D3;&#x4E4B;&#x524D;&#x6267;&#x884C;&#x3002;</li></ul><h3 id="42-nodejs-%E7%8E%AF%E5%A2%83">4.2 Node.js &#x73AF;&#x5883;</h3><p>Node.js &#x4F7F;&#x7528; <strong>libuv</strong> &#x5B9E;&#x73B0;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#xFF0C;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x9636;&#x6BB5;&#xFF1A;</p><pre><code class="language-text">&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;        Timers         &#x2502;  // setTimeout/setInterval
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Pending I/O Callbacks &#x2502;  // &#x4E0A;&#x4E00;&#x8F6E;&#x672A;&#x6267;&#x884C;&#x7684; I/O &#x56DE;&#x8C03;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;     Idle, Prepare     &#x2502;  // &#x5185;&#x90E8;&#x4F7F;&#x7528;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;       Poll Phase      &#x2502;  // &#x68C0;&#x7D22;&#x65B0;&#x7684; I/O &#x4E8B;&#x4EF6;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;       Check Phase     &#x2502;  // setImmediate
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;   Close Callbacks     &#x2502;  // &#x5173;&#x95ED;&#x4E8B;&#x4EF6;&#xFF08;&#x5982; socket.on(&apos;close&apos;)&#xFF09;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><ul><li><strong><code>process.nextTick()</code></strong>&#xFF1A;&#x72EC;&#x7ACB;&#x4E8E;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x9636;&#x6BB5;&#xFF0C;&#x4F18;&#x5148;&#x7EA7;&#x6700;&#x9AD8;&#x3002;</li><li><strong><code>setImmediate</code> vs <code>setTimeout</code></strong>&#xFF1A;<br><code>setImmediate</code> &#x5728; Check &#x9636;&#x6BB5;&#x6267;&#x884C;&#xFF0C;<code>setTimeout</code> &#x5728; Timers &#x9636;&#x6BB5;&#x6267;&#x884C;&#x3002;</li></ul><hr><h2 id="5-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E4%BC%98%E5%8C%96">5. &#x5E38;&#x89C1;&#x95EE;&#x9898;&#x4E0E;&#x4F18;&#x5316;</h2><h3 id="51-%E9%95%BF%E4%BB%BB%E5%8A%A1%EF%BC%88long-tasks%EF%BC%89">5.1 &#x957F;&#x4EFB;&#x52A1;&#xFF08;Long Tasks&#xFF09;</h3><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x6267;&#x884C;&#x65F6;&#x95F4;&#x8D85;&#x8FC7; 50ms &#x7684;&#x4EFB;&#x52A1;&#x4F1A;&#x963B;&#x585E;&#x6E32;&#x67D3;&#xFF0C;&#x5BFC;&#x81F4;&#x9875;&#x9762;&#x5361;&#x987F;&#x3002;</li><li><strong>&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong>&#xFF1A;</li><li>&#x62C6;&#x5206;&#x4EFB;&#x52A1;&#xFF1A;&#x4F7F;&#x7528; <code>setTimeout</code> &#x6216; <code>requestIdleCallback</code> &#x5206;&#x7247;&#x6267;&#x884C;&#x3002;</li><li>Web Workers&#xFF1A;&#x5C06;&#x8BA1;&#x7B97;&#x5BC6;&#x96C6;&#x578B;&#x4EFB;&#x52A1;&#x79FB;&#x81F3;&#x5B50;&#x7EBF;&#x7A0B;&#x3002;</li></ul><h3 id="52-%E5%BE%AE%E4%BB%BB%E5%8A%A1%E6%BB%A5%E7%94%A8">5.2 &#x5FAE;&#x4EFB;&#x52A1;&#x6EE5;&#x7528;</h3><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x5728;&#x5355;&#x6B21;&#x5FAA;&#x73AF;&#x4E2D;&#x4F1A;&#x5168;&#x90E8;&#x6267;&#x884C;&#xFF0C;&#x82E5;&#x9012;&#x5F52;&#x6DFB;&#x52A0;&#x5FAE;&#x4EFB;&#x52A1;&#x4F1A;&#x5BFC;&#x81F4;&#x6B7B;&#x5FAA;&#x73AF;&#x3002;</li><li><strong>&#x793A;&#x4F8B;</strong>&#xFF1A;</li></ul><pre><code class="language-javascript">function loop() {
  Promise.resolve().then(loop);
}
loop(); // &#x9875;&#x9762;&#x5361;&#x6B7B;&#xFF01;
</code></pre><h3 id="53-%E4%BC%98%E5%85%88%E7%BA%A7%E6%8E%A7%E5%88%B6">5.3 &#x4F18;&#x5148;&#x7EA7;&#x63A7;&#x5236;</h3><ul><li><strong>&#x7B56;&#x7565;</strong>&#xFF1A;</li><li>&#x7D27;&#x6025;&#x4EFB;&#x52A1;&#x7528;&#x5FAE;&#x4EFB;&#x52A1;&#xFF08;&#x5982; <code>Promise</code>&#xFF09;&#x3002;</li><li>&#x975E;&#x7D27;&#x6025;&#x4EFB;&#x52A1;&#x7528;&#x5B8F;&#x4EFB;&#x52A1;&#xFF08;&#x5982; <code>setTimeout</code>&#xFF09;&#x3002;</li></ul><hr><h2 id="6-%E9%9D%A2%E8%AF%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">6. &#x9762;&#x8BD5;&#x5E38;&#x89C1;&#x95EE;&#x9898;</h2><p><strong><code>setTimeout(fn, 0)</code> &#x662F;&#x5426;&#x771F;&#x7684; 0ms &#x540E;&#x6267;&#x884C;&#xFF1F;</strong></p><ul><li>&#x5426;&#xFF0C;&#x6700;&#x77ED;&#x5EF6;&#x8FDF;&#x4E3A; 4ms&#xFF08;HTML5 &#x89C4;&#x8303;&#xFF09;&#xFF0C;&#x4E14;&#x53D7;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x72B6;&#x6001;&#x5F71;&#x54CD;&#x3002;</li></ul><p><strong><code>process.nextTick()</code> &#x4E0E; <code>Promise</code> &#x7684;&#x6267;&#x884C;&#x987A;&#x5E8F;&#xFF1F;</strong></p><ul><li>Node.js &#x4E2D;&#xFF1A;<code>process.nextTick</code> &#x4F18;&#x5148;&#x7EA7;&#x9AD8;&#x4E8E;&#x5FAE;&#x4EFB;&#x52A1;&#x3002;</li></ul><p><strong>&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x67D0;&#x51FD;&#x6570;&#x5728;&#x6E32;&#x67D3;&#x540E;&#x6267;&#x884C;&#xFF1F;</strong></p><ul><li>&#x4F7F;&#x7528; <code>requestAnimationFrame</code>&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#xFF09;&#x6216; <code>setTimeout</code>&#x3002;</li></ul><hr><h2 id="7-%E6%80%BB%E7%BB%93">7. &#x603B;&#x7ED3;</h2><ul><li><strong>&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x672C;&#x8D28;</strong>&#xFF1A;&#x5355;&#x7EBF;&#x7A0B;&#x4E0B;&#x901A;&#x8FC7;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x5B9E;&#x73B0;&#x5F02;&#x6B65;&#x975E;&#x963B;&#x585E;&#x3002;</li><li><strong>&#x6838;&#x5FC3;&#x89C4;&#x5219;</strong>&#xFF1A;</li><li>&#x540C;&#x6B65;&#x4EE3;&#x7801;&#x4F18;&#x5148;&#x6267;&#x884C;&#x3002;</li><li>&#x5FAE;&#x4EFB;&#x52A1;&#x5728;&#x6E32;&#x67D3;&#x524D;&#x6E05;&#x7A7A;&#x3002;</li><li>&#x5B8F;&#x4EFB;&#x52A1;&#x5728;&#x6BCF;&#x6B21;&#x5FAA;&#x73AF;&#x4E2D;&#x5904;&#x7406;&#x4E00;&#x4E2A;&#x3002;</li><li><strong>&#x6700;&#x4F73;&#x5B9E;&#x8DF5;</strong>&#xFF1A;&#x907F;&#x514D;&#x957F;&#x4EFB;&#x52A1;&#x3001;&#x5408;&#x7406;&#x9009;&#x62E9;&#x4EFB;&#x52A1;&#x7C7B;&#x578B;&#x3001;&#x5584;&#x7528; Web Workers&#x3002;</li></ul><hr><p><strong>&#x53C2;&#x8003;&#x8D44;&#x6599;</strong>&#xFF1A;</p><ul><li><a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loops">WHATWG Event Loop &#x89C4;&#x8303;</a></li><li><a href="https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/">Node.js Event Loop &#x6587;&#x6863;</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop">MDN &#x5E76;&#x53D1;&#x6A21;&#x578B;&#x4E0E;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;</a></li></ul><hr><p>&#x5E0C;&#x671B;&#x8FD9;&#x7BC7;&#x6587;&#x6863;&#x80FD;&#x5E2E;&#x52A9;&#x4F60;&#x6DF1;&#x5165;&#x7406;&#x89E3; JavaScript &#x7684;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x673A;&#x5236;&#xFF01;</p>]]></content:encoded></item><item><title><![CDATA[链表]]></title><description><![CDATA[<p>&#x94FE;&#x8868;&#x7684;&#x672C;&#x8D28;&#x662F;&#x4E00;&#x79CD; <strong>&#x52A8;&#x6001;&#x6570;&#x636E;&#x7ED3;&#x6784;</strong>&#xFF0C;&#x7531;&#x4E00;&#x7CFB;&#x5217;&#x901A;&#x8FC7;&#x6307;&#x9488;&#xFF08;&#x6216;&#x5F15;&#x7528;&#xFF09;&#x8FDE;&#x63A5;&#x7684;&#x8282;&#x70B9;&#x7EC4;&#x6210;&#x3002;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;</p><ol><li><strong>&#x6570;&#x636E;&#x57DF;</strong></li></ol>]]></description><link>https://pureo.cn/lian-biao/</link><guid isPermaLink="false">678a2891aafa5e00011774f8</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Fri, 17 Jan 2025 09:55:05 GMT</pubDate><content:encoded><![CDATA[<p>&#x94FE;&#x8868;&#x7684;&#x672C;&#x8D28;&#x662F;&#x4E00;&#x79CD; <strong>&#x52A8;&#x6001;&#x6570;&#x636E;&#x7ED3;&#x6784;</strong>&#xFF0C;&#x7531;&#x4E00;&#x7CFB;&#x5217;&#x901A;&#x8FC7;&#x6307;&#x9488;&#xFF08;&#x6216;&#x5F15;&#x7528;&#xFF09;&#x8FDE;&#x63A5;&#x7684;&#x8282;&#x70B9;&#x7EC4;&#x6210;&#x3002;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;</p><ol><li><strong>&#x6570;&#x636E;&#x57DF;</strong>&#xFF08;Data&#xFF09;&#xFF1A;&#x5B58;&#x50A8;&#x6570;&#x636E;&#x5143;&#x7D20;&#x7684;&#x5B9E;&#x9645;&#x5185;&#x5BB9;&#x3002;</li><li><strong>&#x6307;&#x9488;&#x57DF;</strong>&#xFF08;Pointer / Link&#xFF09;&#xFF1A;&#x5B58;&#x50A8;&#x6307;&#x5411;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x5F15;&#x7528;&#x6216;&#x6307;&#x9488;&#x3002;&#x5728;&#x53CC;&#x5411;&#x94FE;&#x8868;&#x4E2D;&#xFF0C;&#x8FD8;&#x4F1A;&#x5305;&#x542B;&#x6307;&#x5411;&#x524D;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6307;&#x9488;&#x3002;</li></ol><p>&#x94FE;&#x8868;&#x4E0E;&#x6570;&#x7EC4;&#x4E0D;&#x540C;&#xFF0C;&#x5B83;&#x4E0D;&#x8981;&#x6C42;&#x6570;&#x636E;&#x5143;&#x7D20;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#x662F;&#x8FDE;&#x7EED;&#x5B58;&#x50A8;&#x7684;&#xFF0C;&#x800C;&#x662F;&#x901A;&#x8FC7;&#x6307;&#x9488;&#x5C06;&#x6570;&#x636E;&#x5143;&#x7D20;&#x6309;&#x987A;&#x5E8F;&#x8FDE;&#x63A5;&#x8D77;&#x6765;&#x3002;&#x94FE;&#x8868;&#x7684;&#x8282;&#x70B9;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#x662F;&#x6563;&#x5E03;&#x7684;&#xFF0C;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x90FD;&#x77E5;&#x9053;&#x81EA;&#x5DF1;&#x4E0E;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x8FDE;&#x63A5;&#x5173;&#x7CFB;&#xFF0C;&#x56E0;&#x6B64;&#x652F;&#x6301;&#x7075;&#x6D3B;&#x7684;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x3002;</p><h3 id="%E9%93%BE%E8%A1%A8%E7%9A%84%E6%9C%AC%E8%B4%A8%E7%89%B9%E5%BE%81%EF%BC%9A">&#x94FE;&#x8868;&#x7684;&#x672C;&#x8D28;&#x7279;&#x5F81;&#xFF1A;</h3><p><strong>&#x52A8;&#x6001;&#x5185;&#x5B58;&#x5206;&#x914D;</strong>&#xFF1A;&#x94FE;&#x8868;&#x7684;&#x5927;&#x5C0F;&#x4E0D;&#x56FA;&#x5B9A;&#xFF0C;&#x8282;&#x70B9;&#x53EF;&#x4EE5;&#x52A8;&#x6001;&#x5730;&#x6DFB;&#x52A0;&#x6216;&#x5220;&#x9664;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#x94FE;&#x8868;&#x80FD;&#x591F;&#x66F4;&#x9AD8;&#x6548;&#x5730;&#x5229;&#x7528;&#x5185;&#x5B58;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x9700;&#x8981;&#x9891;&#x7E41;&#x4FEE;&#x6539;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x5206;&#x914D;&#x548C;&#x590D;&#x5236;&#x6570;&#x636E;&#xFF08;&#x5982;&#x6570;&#x7EC4;&#x90A3;&#x6837;&#xFF09;&#x3002;</p><p><strong>&#x8282;&#x70B9;&#x8FDE;&#x63A5;&#x6027;</strong>&#xFF1A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x9664;&#x4E86;&#x5B58;&#x50A8;&#x6570;&#x636E;&#xFF0C;&#x8FD8;&#x6301;&#x6709;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x5F15;&#x7528;&#x6216;&#x6307;&#x9488;&#xFF08;&#x5355;&#x5411;&#x94FE;&#x8868;&#xFF09;&#xFF0C;&#x6216;&#x8005;&#x662F;&#x6307;&#x5411;&#x524D;&#x540E;&#x8282;&#x70B9;&#x7684;&#x5F15;&#x7528;&#xFF08;&#x53CC;&#x5411;&#x94FE;&#x8868;&#xFF09;&#x3002;&#x8FD9;&#x79CD;&#x6307;&#x9488;&#x7684;&#x8FDE;&#x63A5;&#x8BA9;&#x94FE;&#x8868;&#x80FD;&#x591F;&#x6309;&#x7167;&#x7EBF;&#x6027;&#x987A;&#x5E8F;&#x8FDB;&#x884C;&#x904D;&#x5386;&#x3002;</p><p><strong>&#x7075;&#x6D3B;&#x6027;</strong>&#xFF1A;&#x63D2;&#x5165;&#x3001;&#x5220;&#x9664;&#x8282;&#x70B9;&#x64CD;&#x4F5C;&#x975E;&#x5E38;&#x9AD8;&#x6548;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x94FE;&#x8868;&#x5934;&#x90E8;&#x6216;&#x4E2D;&#x95F4;&#x4F4D;&#x7F6E;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0D;&#x9700;&#x8981;&#x50CF;&#x6570;&#x7EC4;&#x90A3;&#x6837;&#x79FB;&#x52A8;&#x5927;&#x91CF;&#x5143;&#x7D20;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x8C03;&#x6574;&#x6307;&#x9488;&#x7684;&#x6307;&#x5411;&#x5373;&#x53EF;&#x3002;</p><p><strong>&#x987A;&#x5E8F;&#x8BBF;&#x95EE;</strong>&#xFF1A;&#x94FE;&#x8868;&#x7684;&#x8282;&#x70B9;&#x662F;&#x7EBF;&#x6027;&#x6392;&#x5217;&#x7684;&#xFF0C;&#x4F46;&#x5B83;&#x4E0D;&#x652F;&#x6301;&#x968F;&#x673A;&#x8BBF;&#x95EE;&#x3002;&#x4E3A;&#x4E86;&#x8BBF;&#x95EE;&#x67D0;&#x4E2A;&#x5143;&#x7D20;&#xFF0C;&#x9700;&#x8981;&#x4ECE;&#x5934;&#x8282;&#x70B9;&#x5F00;&#x59CB;&#x6309;&#x987A;&#x5E8F;&#x904D;&#x5386;&#x6574;&#x4E2A;&#x94FE;&#x8868;&#xFF0C;&#x76F4;&#x5230;&#x627E;&#x5230;&#x76EE;&#x6807;&#x8282;&#x70B9;&#x3002;&#x8FD9;&#x4E5F;&#x662F;&#x94FE;&#x8868;&#x7684;&#x4E00;&#x5927;&#x9650;&#x5236;&#xFF0C;&#x5B83;&#x7684;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x662F; <strong>O(n)</strong>&#x3002;</p><h3 id="%E4%B8%BB%E8%A6%81%E4%BC%98%E7%BC%BA%E7%82%B9%EF%BC%9A">&#x4E3B;&#x8981;&#x4F18;&#x7F3A;&#x70B9;&#xFF1A;</h3><ul><li><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;</li><li>&#x7075;&#x6D3B;&#x7684;&#x5185;&#x5B58;&#x7BA1;&#x7406;&#xFF1A;&#x94FE;&#x8868;&#x52A8;&#x6001;&#x5206;&#x914D;&#x5185;&#x5B58;&#xFF0C;&#x907F;&#x514D;&#x4E86;&#x6570;&#x7EC4;&#x5927;&#x5C0F;&#x56FA;&#x5B9A;&#x7684;&#x95EE;&#x9898;&#x3002;</li><li>&#x9AD8;&#x6548;&#x7684;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#xFF1A;&#x5C24;&#x5176;&#x662F;&#x5728;&#x94FE;&#x8868;&#x7684;&#x5934;&#x90E8;&#x548C;&#x4E2D;&#x95F4;&#x63D2;&#x5165;&#x3001;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x5177;&#x6709;&#x5E38;&#x6570;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6; <strong>O(1)</strong>&#x3002;</li><li><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;</li><li>&#x4E0D;&#x652F;&#x6301;&#x9AD8;&#x6548;&#x7684;&#x968F;&#x673A;&#x8BBF;&#x95EE;&#xFF1A;&#x8BBF;&#x95EE;&#x94FE;&#x8868;&#x4E2D;&#x7684;&#x67D0;&#x4E2A;&#x5143;&#x7D20;&#x9700;&#x8981;&#x904D;&#x5386;&#x6574;&#x4E2A;&#x94FE;&#x8868;&#xFF0C;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x662F; <strong>O(n)</strong>&#x3002;</li><li>&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x9700;&#x8981;&#x989D;&#x5916;&#x7684;&#x5185;&#x5B58;&#x6765;&#x5B58;&#x50A8;&#x6307;&#x9488;&#xFF0C;&#x56E0;&#x6B64;&#x7A7A;&#x95F4;&#x5F00;&#x9500;&#x76F8;&#x5BF9;&#x8F83;&#x5927;&#x3002;</li></ul><h3 id="%E9%93%BE%E8%A1%A8%E7%9A%84%E5%88%86%E7%B1%BB%EF%BC%9A">&#x94FE;&#x8868;&#x7684;&#x5206;&#x7C7B;&#xFF1A;</h3><p><strong>&#x5355;&#x5411;&#x94FE;&#x8868;</strong>&#xFF08;Singly Linked List&#xFF09;&#xFF1A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x53EA;&#x5305;&#x542B;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x94FE;&#x8868;&#x53EA;&#x80FD;&#x5355;&#x5411;&#x904D;&#x5386;&#x3002;</p><p><strong>&#x53CC;&#x5411;&#x94FE;&#x8868;</strong>&#xFF08;Doubly Linked List&#xFF09;&#xFF1A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x6307;&#x9488;&#xFF0C;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x524D;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x652F;&#x6301;&#x53CC;&#x5411;&#x904D;&#x5386;&#x3002;</p><p><strong>&#x5FAA;&#x73AF;&#x94FE;&#x8868;</strong>&#xFF08;Circular Linked List&#xFF09;&#xFF1A;&#x94FE;&#x8868;&#x7684;&#x5C3E;&#x8282;&#x70B9;&#x6307;&#x5411;&#x5934;&#x8282;&#x70B9;&#xFF0C;&#x5F62;&#x6210;&#x4E00;&#x4E2A;&#x5FAA;&#x73AF;&#x7ED3;&#x6784;&#x3002;&#x53EF;&#x4EE5;&#x662F;&#x5355;&#x5411;&#x5FAA;&#x73AF;&#x94FE;&#x8868;&#x6216;&#x53CC;&#x5411;&#x5FAA;&#x73AF;&#x94FE;&#x8868;&#x3002;</p><pre><code class="language-javascript">class Node {
  constructor(value) {
    this.value = value;  // &#x8282;&#x70B9;&#x7684;&#x503C;
    this.next = null;    // &#x6307;&#x5411;&#x4E0B;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6307;&#x9488;
  }
}

class LinkedList {
  constructor() {
    this.head = null;  // &#x94FE;&#x8868;&#x7684;&#x5934;&#x90E8;
    this.size = 0;     // &#x94FE;&#x8868;&#x7684;&#x5927;&#x5C0F;
  }

  // &#x63D2;&#x5165;&#x65B0;&#x8282;&#x70B9;&#x5230;&#x94FE;&#x8868;&#x5C3E;&#x90E8;
  append(value) {
    const newNode = new Node(value);
    if (!this.head) {
      this.head = newNode;
    } else {
      let current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = newNode;
    }
    this.size++;
  }

  // &#x904D;&#x5386;&#x94FE;&#x8868;
  printList() {
    let current = this.head;
    let result = &apos;&apos;;
    while (current) {
      result += current.value + &apos; -&gt; &apos;;
      current = current.next;
    }
    console.log(result.slice(0, -4)); // &#x53BB;&#x6389;&#x6700;&#x540E;&#x7684;&#x7BAD;&#x5934;
  }
}

// &#x6D4B;&#x8BD5;&#x94FE;&#x8868;
const list = new LinkedList();
list.append(10);
list.append(20);
list.append(30);
list.printList();  // &#x8F93;&#x51FA;: 10 -&gt; 20 -&gt; 30
</code></pre><p>&#x94FE;&#x8868;&#x5728;&#x524D;&#x7AEF;&#x4E2D;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x5E76;&#x4E0D;&#x50CF;&#x5728;&#x4F20;&#x7EDF;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x4E2D;&#x90A3;&#x6837;&#x5E38;&#x89C1;&#xFF0C;&#x4F46;&#x5728;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x94FE;&#x8868;&#x80FD;&#x591F;&#x53D1;&#x6325;&#x5176;&#x9AD8;&#x6548;&#x7684;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x4F18;&#x52BF;&#x3002;</p><h3 id="1-%E8%99%9A%E6%8B%9F%E6%BB%9A%E5%8A%A8%EF%BC%88virtual-scrolling%EF%BC%89">1. <strong>&#x865A;&#x62DF;&#x6EDA;&#x52A8;&#xFF08;Virtual Scrolling&#xFF09;</strong></h3><p>&#x865A;&#x62DF;&#x6EDA;&#x52A8;&#x6280;&#x672F;&#x7528;&#x4E8E;&#x4F18;&#x5316;&#x957F;&#x5217;&#x8868;&#xFF08;&#x5982;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x7684;&#x5185;&#x5BB9;&#x6216;&#x5927;&#x6570;&#x636E;&#x5217;&#x8868;&#xFF09;&#x7684;&#x6E32;&#x67D3;&#x6027;&#x80FD;&#x3002;&#x94FE;&#x8868;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x9AD8;&#x6548;&#x5730;&#x7BA1;&#x7406;&#x53EF;&#x89C6;&#x533A;&#x57DF;&#x4E2D;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x907F;&#x514D;&#x4E00;&#x6B21;&#x6027;&#x6E32;&#x67D3;&#x5927;&#x91CF;DOM&#x8282;&#x70B9;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x3002;</p><h4 id="%E7%A4%BA%E4%BE%8B%EF%BC%9A">&#x793A;&#x4F8B;&#xFF1A;</h4><p>&#x5F53;&#x4F60;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x865A;&#x62DF;&#x6EDA;&#x52A8;&#x5217;&#x8868;&#x65F6;&#xFF0C;&#x901A;&#x5E38;&#x4F1A;&#x6839;&#x636E;&#x7528;&#x6237;&#x6EDA;&#x52A8;&#x7684;&#x4F4D;&#x7F6E;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x548C;&#x5378;&#x8F7D;&#x5217;&#x8868;&#x9879;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x94FE;&#x8868;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x7BA1;&#x7406;&#x8FD9;&#x4E9B;&#x52A8;&#x6001;&#x6DFB;&#x52A0;&#x548C;&#x5220;&#x9664;&#x7684;&#x5217;&#x8868;&#x9879;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6BCF;&#x6B21;&#x90FD;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x6574;&#x4E2A;&#x5217;&#x8868;&#x3002;&#x94FE;&#x8868;&#x7684;&#x4F18;&#x70B9;&#x662F;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x8282;&#x70B9;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x5904;&#x7406;&#x8F83;&#x5927;&#x7684;&#x5217;&#x8868;&#x65F6;&#xFF0C;&#x80FD;&#x663E;&#x8457;&#x63D0;&#x9AD8;&#x6E32;&#x67D3;&#x6548;&#x7387;&#x3002;</p><pre><code class="language-javascript">class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
    this.prev = null; // &#x5982;&#x679C;&#x662F;&#x53CC;&#x5411;&#x94FE;&#x8868;
  }
}

class VirtualList {
  constructor() {
    this.head = null;
    this.tail = null;
    this.size = 0;
  }

  append(value) {
    const newNode = new Node(value);
    if (!this.tail) {
      this.head = this.tail = newNode;
    } else {
      this.tail.next = newNode;
      newNode.prev = this.tail;
      this.tail = newNode;
    }
    this.size++;
  }

  // &#x5220;&#x9664;&#x94FE;&#x8868;&#x4E2D;&#x7684;&#x67D0;&#x4E2A;&#x8282;&#x70B9;
  remove(value) {
    let current = this.head;
    while (current) {
      if (current.value === value) {
        if (current.prev) current.prev.next = current.next;
        if (current.next) current.next.prev = current.prev;
        if (current === this.head) this.head = current.next;
        if (current === this.tail) this.tail = current.prev;
        this.size--;
        return;
      }
      current = current.next;
    }
  }
  
  // &#x6253;&#x5370;&#x5217;&#x8868;&#x6570;&#x636E;
  printList() {
    let current = this.head;
    while (current) {
      console.log(current.value);
      current = current.next;
    }
  }
}

// &#x4F7F;&#x7528;&#x793A;&#x4F8B;
const virtualList = new VirtualList();
virtualList.append(&apos;item1&apos;);
virtualList.append(&apos;item2&apos;);
virtualList.append(&apos;item3&apos;);
virtualList.remove(&apos;item2&apos;);
virtualList.printList();  // &#x8F93;&#x51FA;: item1, item3
</code></pre><h3 id="2-%E6%92%A4%E9%94%80%E9%87%8D%E5%81%9A%EF%BC%88undoredo%EF%BC%89%E5%8A%9F%E8%83%BD">2. <strong>&#x64A4;&#x9500;/&#x91CD;&#x505A;&#xFF08;Undo/Redo&#xFF09;&#x529F;&#x80FD;</strong></h3><p>&#x5728;&#x8BB8;&#x591A;&#x524D;&#x7AEF;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x6BD4;&#x5982;&#x6587;&#x672C;&#x7F16;&#x8F91;&#x5668;&#x3001;&#x7ED8;&#x56FE;&#x5E94;&#x7528;&#x7B49;&#xFF0C;&#x64A4;&#x9500;&#xFF08;Undo&#xFF09;&#x548C;&#x91CD;&#x505A;&#xFF08;Redo&#xFF09;&#x529F;&#x80FD;&#x662F;&#x5E38;&#x89C1;&#x9700;&#x6C42;&#x3002;&#x94FE;&#x8868;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x7BA1;&#x7406;&#x6BCF;&#x6B21;&#x64CD;&#x4F5C;&#x7684;&#x5386;&#x53F2;&#x8BB0;&#x5F55;&#xFF0C;&#x5141;&#x8BB8;&#x4F60;&#x9AD8;&#x6548;&#x5730;&#x8FDB;&#x884C;&#x64A4;&#x9500;&#x548C;&#x91CD;&#x505A;&#x3002;</p><h4 id="%E7%A4%BA%E4%BE%8B%EF%BC%9A-1">&#x793A;&#x4F8B;&#xFF1A;</h4><p>&#x5728;&#x64A4;&#x9500;&#x548C;&#x91CD;&#x505A;&#x7684;&#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x6BCF;&#x6B21;&#x64CD;&#x4F5C;&#x90FD;&#x4F1A;&#x4EA7;&#x751F;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x8282;&#x70B9;&#xFF0C;&#x8282;&#x70B9;&#x4FDD;&#x5B58;&#x64CD;&#x4F5C;&#x7684;&#x72B6;&#x6001;&#x3002;&#x94FE;&#x8868;&#x7684;&#x7075;&#x6D3B;&#x6027;&#x4F7F;&#x5F97;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x53D8;&#x5F97;&#x9AD8;&#x6548;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x751F;&#x6210;&#x6574;&#x4E2A;&#x5386;&#x53F2;&#x8BB0;&#x5F55;&#x3002;</p><pre><code class="language-javascript">class ActionNode {
  constructor(action, prev = null) {
    this.action = action;
    this.prev = prev;
  }
}

class UndoRedoManager {
  constructor() {
    this.head = null;
    this.tail = null;
    this.current = null; // &#x5F53;&#x524D;&#x64CD;&#x4F5C;&#x6307;&#x9488;
  }

  // &#x6267;&#x884C;&#x4E00;&#x4E2A;&#x65B0;&#x64CD;&#x4F5C;
  execute(action) {
    const newNode = new ActionNode(action, this.current);
    if (this.tail === this.current) {
      this.tail = newNode;
    }
    this.current = newNode;
    if (!this.head) {
      this.head = newNode;
    }
  }

  // &#x64A4;&#x9500;&#x64CD;&#x4F5C;
  undo() {
    if (this.current &amp;&amp; this.current.prev) {
      this.current = this.current.prev;
      return this.current.action;
    }
    return null; // &#x65E0;&#x6CD5;&#x64A4;&#x9500;
  }

  // &#x91CD;&#x505A;&#x64CD;&#x4F5C;
  redo() {
    if (this.current &amp;&amp; this.current.next) {
      this.current = this.current.next;
      return this.current.action;
    }
    return null; // &#x65E0;&#x6CD5;&#x91CD;&#x505A;
  }
}

// &#x4F7F;&#x7528;&#x793A;&#x4F8B;
const manager = new UndoRedoManager();
manager.execute(&apos;Action 1&apos;);
manager.execute(&apos;Action 2&apos;);
console.log(manager.undo()); // &#x8F93;&#x51FA;: Action 1
console.log(manager.redo()); // &#x8F93;&#x51FA;: Action 2
</code></pre><h3 id="3-%E5%8A%A8%E7%94%BB%E9%98%9F%E5%88%97">3. <strong>&#x52A8;&#x753B;&#x961F;&#x5217;</strong></h3><p>&#x94FE;&#x8868;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x5B9E;&#x73B0;&#x52A8;&#x753B;&#x961F;&#x5217;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x9700;&#x8981;&#x5BF9;&#x52A8;&#x753B;&#x5143;&#x7D20;&#x8FDB;&#x884C;&#x52A8;&#x6001;&#x6DFB;&#x52A0;&#x3001;&#x5220;&#x9664;&#x3001;&#x6682;&#x505C;&#x3001;&#x6062;&#x590D;&#x65F6;&#x3002;&#x94FE;&#x8868;&#x7684;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x4F60;&#x5FEB;&#x901F;&#x66F4;&#x65B0;&#x52A8;&#x753B;&#x961F;&#x5217;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x91CD;&#x7ED8;&#x6574;&#x4E2A;&#x52A8;&#x753B;&#x3002;</p><h4 id="%E7%A4%BA%E4%BE%8B%EF%BC%9A-2">&#x793A;&#x4F8B;&#xFF1A;</h4><p>&#x5047;&#x8BBE;&#x6709;&#x591A;&#x4E2A;&#x52A8;&#x753B;&#x5BF9;&#x8C61;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x52A8;&#x6001;&#x7BA1;&#x7406;&#x8FD9;&#x4E9B;&#x52A8;&#x753B;&#x7684;&#x542F;&#x52A8;&#x987A;&#x5E8F;&#x3001;&#x6682;&#x505C;&#x6216;&#x5220;&#x9664;&#x7B49;&#x3002;&#x94FE;&#x8868;&#x53EF;&#x4EE5;&#x8BA9;&#x4F60;&#x5FEB;&#x901F;&#x5B9E;&#x73B0;&#x8FD9;&#x4E9B;&#x64CD;&#x4F5C;&#x3002;</p><pre><code class="language-javascript">class AnimationNode {
  constructor(animation) {
    this.animation = animation;  // &#x52A8;&#x753B;&#x5BF9;&#x8C61;
    this.next = null;
  }
}

class AnimationQueue {
  constructor() {
    this.head = null;
    this.tail = null;
  }

  addAnimation(animation) {
    const newNode = new AnimationNode(animation);
    if (!this.head) {
      this.head = this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
  }

  startAllAnimations() {
    let current = this.head;
    while (current) {
      current.animation.start();
      current = current.next;
    }
  }

  removeAnimation(animation) {
    let current = this.head;
    let prev = null;
    while (current) {
      if (current.animation === animation) {
        if (prev) {
          prev.next = current.next;
        } else {
          this.head = current.next;
        }
        if (!current.next) this.tail = prev;
        break;
      }
      prev = current;
      current = current.next;
    }
  }
}

// &#x4F7F;&#x7528;&#x793A;&#x4F8B;
const animationQueue = new AnimationQueue();
const anim1 = { start: () =&gt; console.log(&apos;Anim1 started&apos;) };
const anim2 = { start: () =&gt; console.log(&apos;Anim2 started&apos;) };

animationQueue.addAnimation(anim1);
animationQueue.addAnimation(anim2);
animationQueue.startAllAnimations();  // &#x8F93;&#x51FA;: Anim1 started, Anim2 started
animationQueue.removeAnimation(anim1);
</code></pre><h3 id="4-%E9%93%BE%E5%BC%8F%E8%B0%83%E7%94%A8%EF%BC%88chaining%EF%BC%89">4. <strong>&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#xFF08;Chaining&#xFF09;</strong></h3><p>&#x94FE;&#x8868;&#x7684;&#x8BBE;&#x8BA1;&#x975E;&#x5E38;&#x9002;&#x5408;&#x5B9E;&#x73B0;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x6A21;&#x5F0F;&#xFF0C;&#x5728;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4E2D;&#xFF0C;&#x51FD;&#x6570;&#x8C03;&#x7528;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD4;&#x56DE;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x672C;&#x8EAB;&#x6765;&#x5B9E;&#x73B0;&#x8FDE;&#x9501;&#x53CD;&#x5E94;&#x3002;&#x867D;&#x7136;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x901A;&#x5E38;&#x662F;&#x901A;&#x8FC7;&#x5BF9;&#x8C61;&#x548C;&#x65B9;&#x6CD5;&#x94FE;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x4F46;&#x5176;&#x5185;&#x90E8;&#x5B9E;&#x73B0;&#x5F80;&#x5F80;&#x7C7B;&#x4F3C;&#x4E8E;&#x94FE;&#x8868;&#x7ED3;&#x6784;&#x3002;</p><h4 id="%E7%A4%BA%E4%BE%8B%EF%BC%9A-3">&#x793A;&#x4F8B;&#xFF1A;</h4><p>&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x5E38;&#x89C1;&#x4E8E;&#x6D41;&#x5F0F;API&#x4E2D;&#xFF0C;&#x4F8B;&#x5982;jQuery&#x7B49;&#x5E93;&#x5C31;&#x5229;&#x7528;&#x94FE;&#x8868;&#x7684;&#x601D;&#x60F3;&#x6765;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#x7684;&#x94FE;&#x5F0F;&#x8C03;&#x7528;&#x3002;</p><pre><code class="language-javascript">class Chainable {
  constructor(value = 0) {
    this.value = value;
  }

  add(num) {
    this.value += num;
    return this;  // &#x8FD4;&#x56DE;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#xFF0C;&#x5B9E;&#x73B0;&#x94FE;&#x5F0F;&#x8C03;&#x7528;
  }

  subtract(num) {
    this.value -= num;
    return this;  // &#x8FD4;&#x56DE;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#xFF0C;&#x5B9E;&#x73B0;&#x94FE;&#x5F0F;&#x8C03;&#x7528;
  }

  getResult() {
    return this.value;
  }
}

// &#x4F7F;&#x7528;&#x793A;&#x4F8B;
const result = new Chainable(10)
  .add(5)
  .subtract(3)
  .getResult();
console.log(result);  // &#x8F93;&#x51FA;: 12
</code></pre><hr><p>&#x603B;&#x7ED3;&#x6765;&#x8BF4;&#xFF0C;&#x94FE;&#x8868;&#x5728;&#x524D;&#x7AEF;&#x4E2D;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x5E76;&#x4E0D;&#x5E7F;&#x6CDB;&#xFF0C;&#x4F46;&#x5728;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x9700;&#x6C42;&#x4E0B;&#xFF0C;&#x5B83;&#x80FD;&#x591F;&#x63D0;&#x4F9B;&#x9AD8;&#x6548;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x9700;&#x8981;&#x9891;&#x7E41;&#x52A8;&#x6001;&#x4FEE;&#x6539;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF08;&#x5982;&#x63D2;&#x5165;&#x3001;&#x5220;&#x9664;&#x3001;&#x64A4;&#x9500;&#x3001;&#x91CD;&#x505A;&#x3001;&#x961F;&#x5217;&#x7BA1;&#x7406;&#x7B49;&#xFF09;&#x65F6;&#x3002;&#x94FE;&#x8868;&#x7684;&#x4F18;&#x52BF;&#x4E3B;&#x8981;&#x4F53;&#x73B0;&#x5728;&#x5176;&#x7075;&#x6D3B;&#x6027;&#x548C;&#x9AD8;&#x6548;&#x7684;&#x5185;&#x5B58;&#x7BA1;&#x7406;&#x4E0A;&#xFF0C;&#x5C24;&#x5176;&#x9002;&#x5408;&#x90A3;&#x4E9B;&#x4E0D;&#x8981;&#x6C42;&#x6570;&#x636E;&#x5143;&#x7D20;&#x6309;&#x987A;&#x5E8F;&#x5B58;&#x50A8;&#x4E14;&#x9700;&#x8981;&#x9891;&#x7E41;&#x4FEE;&#x6539;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x7684;&#x573A;&#x666F;&#x3002;</p><h3 id="%E5%BD%A2%E8%B1%A1%E5%8C%96%E7%90%86%E8%A7%A3%EF%BC%9A">&#x5F62;&#x8C61;&#x5316;&#x7406;&#x89E3;&#xFF1A;</h3><p>&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x94FE;&#x8868;&#x770B;&#x4F5C;&#x662F;&#x4E00;&#x4E2A;&#x706B;&#x8F66;&#xFF0C;&#x6BCF;&#x4E00;&#x8282;&#x8F66;&#x53A2;&#x90FD;&#x5305;&#x542B;&#x4E00;&#x4E9B;&#x8D27;&#x7269;&#xFF08;&#x6570;&#x636E;&#xFF09;&#xFF0C;&#x800C;&#x6BCF;&#x8282;&#x8F66;&#x53A2;&#x7684;&#x524D;&#x9762;&#x6216;&#x540E;&#x9762;&#xFF08;&#x53D6;&#x51B3;&#x4E8E;&#x94FE;&#x8868;&#x7C7B;&#x578B;&#xFF09;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x4E0B;&#x4E00;&#x8282;&#x8F66;&#x53A2;&#x7684;&#x6307;&#x9488;&#x3002;&#x4F60;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8DF3;&#x5230;&#x67D0;&#x4E00;&#x8282;&#x8F66;&#x53A2;&#xFF0C;&#x800C;&#x662F;&#x9700;&#x8981;&#x4ECE;&#x7B2C;&#x4E00;&#x8282;&#x8F66;&#x53A2;&#x5F00;&#x59CB;&#xFF0C;&#x6309;&#x987A;&#x5E8F;&#x67E5;&#x770B;&#x6BCF;&#x4E00;&#x8282;&#x8F66;&#x53A2;&#x3002;</p><p>&#x603B;&#x7ED3;&#x6765;&#x8BF4;&#xFF0C;&#x94FE;&#x8868;&#x7684;&#x672C;&#x8D28;&#x662F;&#x4E00;&#x4E2A;&#x7531;&#x8282;&#x70B9;&#x901A;&#x8FC7;&#x6307;&#x9488;&#x94FE;&#x63A5;&#x8D77;&#x6765;&#x7684;&#x7EBF;&#x6027;&#x7ED3;&#x6784;&#xFF0C;&#x5176;&#x6838;&#x5FC3;&#x4F18;&#x52BF;&#x5728;&#x4E8E;&#x80FD;&#x591F;&#x9AD8;&#x6548;&#x5730;&#x8FDB;&#x884C;&#x63D2;&#x5165;&#x548C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#xFF0C;&#x7F3A;&#x70B9;&#x662F;&#x8BBF;&#x95EE;&#x901F;&#x5EA6;&#x8F83;&#x6162;&#xFF0C;&#x4E14;&#x5185;&#x5B58;&#x5F00;&#x9500;&#x8F83;&#x5927;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[DNS]]></title><description><![CDATA[<h2 id="%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E7%BD%91%E7%BB%9C%E5%B1%82%EF%BC%9A%E4%BB%8Edns%E5%88%B0tcp%E5%8D%8F%E8%AE%AE">&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x7F51;&#x7EDC;&#x5C42;&#xFF1A;&#x4ECE;DNS&#x5230;TCP&#x534F;&#x8BAE;</h2><p>&#x5728;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x4E2D;&#xFF0C;&#x7F51;&#x7EDC;&#x5C42;&#x662F;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x73AF;&#xFF0C;&#x8D1F;&#x8D23;&#x6570;&#x636E;&#x5305;&#x5728;&#x7F51;&#x7EDC;&#x4E2D;&#x7684;&#x4F20;&#x8F93;&#x4E0E;&#x8DEF;&#x7531;&#x3002;&#x7406;&#x89E3;</p>]]></description><link>https://pureo.cn/shen-ru-li-jie-wang-luo-ceng-cong-dnsdao-tcpxie-yi/</link><guid isPermaLink="false">6786539caafa5e00011774e9</guid><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Tue, 14 Jan 2025 12:08:21 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E7%BD%91%E7%BB%9C%E5%B1%82%EF%BC%9A%E4%BB%8Edns%E5%88%B0tcp%E5%8D%8F%E8%AE%AE">&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x7F51;&#x7EDC;&#x5C42;&#xFF1A;&#x4ECE;DNS&#x5230;TCP&#x534F;&#x8BAE;</h2><p>&#x5728;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x4E2D;&#xFF0C;&#x7F51;&#x7EDC;&#x5C42;&#x662F;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x73AF;&#xFF0C;&#x8D1F;&#x8D23;&#x6570;&#x636E;&#x5305;&#x5728;&#x7F51;&#x7EDC;&#x4E2D;&#x7684;&#x4F20;&#x8F93;&#x4E0E;&#x8DEF;&#x7531;&#x3002;&#x7406;&#x89E3;&#x7F51;&#x7EDC;&#x5C42;&#x53CA;&#x5176;&#x534F;&#x8BAE;&#x662F;&#x7F51;&#x7EDC;&#x5DE5;&#x7A0B;&#x5E08;&#x3001;&#x7CFB;&#x7EDF;&#x7BA1;&#x7406;&#x5458;&#x3001;&#x4EE5;&#x53CA;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x5FC5;&#x5907;&#x7684;&#x6280;&#x80FD;&#x4E4B;&#x4E00;&#x3002;&#x672C;&#x6587;&#x5C06;&#x5E26;&#x4F60;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x4E2D;&#x7684;&#x7F51;&#x7EDC;&#x5C42;&#xFF0C;&#x91CD;&#x70B9;&#x63A2;&#x8BA8;DNS&#xFF08;&#x57DF;&#x540D;&#x7CFB;&#x7EDF;&#xFF09;&#x3001;TCP&#xFF08;&#x4F20;&#x8F93;&#x63A7;&#x5236;&#x534F;&#x8BAE;&#xFF09;&#x548C;UDP&#xFF08;&#x7528;&#x6237;&#x6570;&#x636E;&#x62A5;&#x534F;&#x8BAE;&#xFF09;&#x3002;</p><h3 id="1-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80%E4%B8%8E%E7%BD%91%E7%BB%9C%E5%B1%82%E6%A6%82%E8%BF%B0">1. &#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x57FA;&#x7840;&#x4E0E;&#x7F51;&#x7EDC;&#x5C42;&#x6982;&#x8FF0;</h3><p>&#x5728;&#x6DF1;&#x5165;&#x8BA8;&#x8BBA;&#x5177;&#x4F53;&#x7684;&#x534F;&#x8BAE;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x9700;&#x8981;&#x7406;&#x89E3;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x7684;&#x57FA;&#x672C;&#x6982;&#x5FF5;&#x3002;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x901A;&#x5E38;&#x9075;&#x5FAA;<strong>OSI&#x4E03;&#x5C42;&#x6A21;&#x578B;</strong>&#x548C;<strong>TCP/IP&#x534F;&#x8BAE;&#x6808;</strong>&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x5BF9;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x8FC7;&#x7A0B;&#x7684;&#x62BD;&#x8C61;&#x548C;&#x6807;&#x51C6;&#x5316;&#x3002;OSI&#x6A21;&#x578B;&#x5C06;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x5212;&#x5206;&#x4E3A;&#x4E03;&#x5C42;&#xFF0C;&#x4ECE;&#x7269;&#x7406;&#x5C42;&#x5230;&#x5E94;&#x7528;&#x5C42;&#xFF0C;&#x800C;TCP/IP&#x6A21;&#x578B;&#x5219;&#x901A;&#x5E38;&#x7B80;&#x5316;&#x4E3A;&#x56DB;&#x5C42;&#x3002;</p><h4 id="osi%E4%B8%83%E5%B1%82%E6%A8%A1%E5%9E%8B">OSI&#x4E03;&#x5C42;&#x6A21;&#x578B;</h4><ul><li><strong>&#x7269;&#x7406;&#x5C42;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x6BD4;&#x7279;&#x6D41;&#x7684;&#x4F20;&#x8F93;&#x3002;</li><li><strong>&#x6570;&#x636E;&#x94FE;&#x8DEF;&#x5C42;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x5E27;&#x7684;&#x4F20;&#x8F93;&#xFF0C;&#x63D0;&#x4F9B;&#x9519;&#x8BEF;&#x68C0;&#x6D4B;&#x4E0E;&#x7EA0;&#x6B63;&#x3002;</li><li><strong>&#x7F51;&#x7EDC;&#x5C42;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x6570;&#x636E;&#x5305;&#x7684;&#x4F20;&#x8F93;&#x4E0E;&#x8DEF;&#x7531;&#x9009;&#x62E9;&#xFF0C;&#x786E;&#x4FDD;&#x6570;&#x636E;&#x5305;&#x4ECE;&#x6E90;&#x5230;&#x76EE;&#x7684;&#x5730;&#x3002;</li><li><strong>&#x4F20;&#x8F93;&#x5C42;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x7AEF;&#x5230;&#x7AEF;&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#xFF0C;&#x786E;&#x4FDD;&#x6570;&#x636E;&#x7684;&#x53EF;&#x9760;&#x6027;&#x3002;</li><li><strong>&#x4F1A;&#x8BDD;&#x5C42;</strong>&#xFF1A;&#x7BA1;&#x7406;&#x901A;&#x4FE1;&#x4F1A;&#x8BDD;&#x3002;</li><li><strong>&#x8868;&#x793A;&#x5C42;</strong>&#xFF1A;&#x8D1F;&#x8D23;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x8F6C;&#x6362;&#x3001;&#x52A0;&#x5BC6;&#x4E0E;&#x538B;&#x7F29;&#x3002;</li><li><strong>&#x5E94;&#x7528;&#x5C42;</strong>&#xFF1A;&#x63D0;&#x4F9B;&#x6700;&#x7EC8;&#x7528;&#x6237;&#x670D;&#x52A1;&#x3002;</li></ul><p>&#x5728;&#x8FD9;&#x4E2A;&#x6A21;&#x578B;&#x4E2D;&#xFF0C;&#x7F51;&#x7EDC;&#x5C42;&#x4E3B;&#x8981;&#x8D1F;&#x8D23;&#x5904;&#x7406;&#x6570;&#x636E;&#x5305;&#x7684;&#x8DEF;&#x7531;&#x548C;&#x8F6C;&#x53D1;&#xFF0C;&#x4EE5;&#x53CA;&#x7BA1;&#x7406;&#x4E0E;&#x8BA1;&#x7B97;&#x673A;&#x4E4B;&#x95F4;&#x7684;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x3002;&#x5E38;&#x89C1;&#x7684;&#x7F51;&#x7EDC;&#x5C42;&#x534F;&#x8BAE;&#x6709;<strong>IP&#x534F;&#x8BAE;</strong>&#x3001;<strong>ICMP&#x534F;&#x8BAE;</strong>&#x7B49;&#x3002;</p><h4 id="tcpip%E5%8D%8F%E8%AE%AE%E6%A0%88">TCP/IP&#x534F;&#x8BAE;&#x6808;</h4><p>TCP/IP&#x534F;&#x8BAE;&#x6808;&#x76F8;&#x5BF9;&#x7B80;&#x5355;&#xFF0C;&#x5B83;&#x5C06;&#x6A21;&#x578B;&#x538B;&#x7F29;&#x4E3A;&#x56DB;&#x5C42;&#xFF1A;</p><ul><li><strong>&#x5E94;&#x7528;&#x5C42;</strong>&#xFF1A;&#x5982;HTTP&#x3001;FTP&#x3001;DNS&#x3002;</li><li><strong>&#x4F20;&#x8F93;&#x5C42;</strong>&#xFF1A;TCP&#x548C;UDP&#x3002;</li><li><strong>&#x7F51;&#x7EDC;&#x5C42;</strong>&#xFF1A;IP&#x534F;&#x8BAE;&#x3002;</li><li><strong>&#x6570;&#x636E;&#x94FE;&#x8DEF;&#x5C42;</strong>&#xFF1A;Ethernet&#x7B49;&#x3002;</li></ul><p>&#x7F51;&#x7EDC;&#x5C42;&#x662F;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x4E2D;&#x6700;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x5C42;&#x4E4B;&#x4E00;&#xFF0C;&#x5B83;&#x51B3;&#x5B9A;&#x4E86;&#x6570;&#x636E;&#x5982;&#x4F55;&#x4ECE;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x4F20;&#x8F93;&#x5230;&#x53E6;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x3002;</p><h3 id="2-dns%EF%BC%9A%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">2. DNS&#xFF1A;&#x57DF;&#x540D;&#x7CFB;&#x7EDF;&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;</h3><h4 id="%E4%BB%80%E4%B9%88%E6%98%AFdns%EF%BC%9F">&#x4EC0;&#x4E48;&#x662F;DNS&#xFF1F;</h4><p>DNS&#xFF08;Domain Name System&#xFF09;&#x662F;&#x5C06;&#x6613;&#x4E8E;&#x8BB0;&#x5FC6;&#x7684;&#x57DF;&#x540D;&#x6620;&#x5C04;&#x5230;&#x8BA1;&#x7B97;&#x673A;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x7684;IP&#x5730;&#x5740;&#x7684;&#x7CFB;&#x7EDF;&#x3002;&#x5B83;&#x662F;&#x4E92;&#x8054;&#x7F51;&#x7684;&#x201C;&#x7535;&#x8BDD;&#x7C3F;&#x201D;&#xFF0C;&#x5E2E;&#x52A9;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x7F51;&#x7AD9;&#x65F6;&#x65E0;&#x9700;&#x8BB0;&#x4F4F;&#x590D;&#x6742;&#x7684;IP&#x5730;&#x5740;&#x3002;</p><p>&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x4F60;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x8F93;&#x5165;<code>www.example.com</code>&#x65F6;&#xFF0C;DNS&#x4F1A;&#x5C06;&#x5176;&#x8F6C;&#x6362;&#x4E3A;IP&#x5730;&#x5740;&#xFF08;&#x5982;<code>93.184.216.34</code>&#xFF09;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x5C06;&#x8BF7;&#x6C42;&#x53D1;&#x9001;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x670D;&#x52A1;&#x5668;&#x3002;</p><h4 id="dns%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B">DNS&#x7684;&#x5DE5;&#x4F5C;&#x6D41;&#x7A0B;</h4><ol><li><strong>&#x7528;&#x6237;&#x67E5;&#x8BE2;</strong>&#xFF1A;&#x5F53;&#x4F60;&#x8BBF;&#x95EE;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x65F6;&#xFF0C;&#x9996;&#x5148;&#x4F1A;&#x68C0;&#x67E5;&#x672C;&#x5730;&#x7F13;&#x5B58;&#x4E2D;&#x662F;&#x5426;&#x5DF2;&#x6709;&#x8BE5;&#x57DF;&#x540D;&#x7684;IP&#x5730;&#x5740;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x67E5;&#x8BE2;&#x5C06;&#x7EE7;&#x7EED;&#x3002;</li><li><strong>&#x9012;&#x5F52;&#x67E5;&#x8BE2;</strong>&#xFF1A;DNS&#x5BA2;&#x6237;&#x7AEF;&#x4F1A;&#x5411;DNS&#x89E3;&#x6790;&#x5668;&#x8BF7;&#x6C42;&#x89E3;&#x6790;&#x57DF;&#x540D;&#x3002;&#x89E3;&#x6790;&#x5668;&#x53EF;&#x80FD;&#x4F1A;&#x5148;&#x67E5;&#x8BE2;&#x6839;DNS&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x83B7;&#x5F97;&#x9876;&#x7EA7;&#x57DF;&#xFF08;TLD&#xFF09;DNS&#x670D;&#x52A1;&#x5668;&#x7684;&#x5730;&#x5740;&#x3002;</li><li><strong>&#x8FED;&#x4EE3;&#x67E5;&#x8BE2;</strong>&#xFF1A;&#x7136;&#x540E;&#xFF0C;DNS&#x89E3;&#x6790;&#x5668;&#x7EE7;&#x7EED;&#x5411;TLD&#x670D;&#x52A1;&#x5668;&#x67E5;&#x8BE2;&#xFF0C;&#x6700;&#x7EC8;&#x5230;&#x8FBE;&#x6743;&#x5A01;DNS&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5F97;&#x5230;&#x57DF;&#x540D;&#x7684;&#x6700;&#x7EC8;IP&#x5730;&#x5740;&#x3002;</li><li><strong>&#x7ED3;&#x679C;&#x7F13;&#x5B58;</strong>&#xFF1A;&#x83B7;&#x53D6;&#x5230;IP&#x5730;&#x5740;&#x540E;&#xFF0C;DNS&#x89E3;&#x6790;&#x5668;&#x4F1A;&#x5C06;&#x5176;&#x7F13;&#x5B58;&#x4E00;&#x5B9A;&#x65F6;&#x95F4;&#xFF0C;&#x4EE5;&#x4FBF;&#x4E0B;&#x6B21;&#x67E5;&#x8BE2;&#x65F6;&#x52A0;&#x901F;&#x54CD;&#x5E94;&#x3002;</li></ol><h4 id="%E5%B8%B8%E8%A7%81%E7%9A%84dns%E8%AE%B0%E5%BD%95%E7%B1%BB%E5%9E%8B">&#x5E38;&#x89C1;&#x7684;DNS&#x8BB0;&#x5F55;&#x7C7B;&#x578B;</h4><ul><li><strong>A&#x8BB0;&#x5F55;</strong>&#xFF1A;&#x5C06;&#x57DF;&#x540D;&#x6620;&#x5C04;&#x5230;IPv4&#x5730;&#x5740;&#x3002;</li><li><strong>AAAA&#x8BB0;&#x5F55;</strong>&#xFF1A;&#x5C06;&#x57DF;&#x540D;&#x6620;&#x5C04;&#x5230;IPv6&#x5730;&#x5740;&#x3002;</li><li><strong>MX&#x8BB0;&#x5F55;</strong>&#xFF1A;&#x90AE;&#x4EF6;&#x4EA4;&#x6362;&#x8BB0;&#x5F55;&#xFF0C;&#x6307;&#x793A;&#x90AE;&#x4EF6;&#x670D;&#x52A1;&#x5668;&#x7684;&#x5730;&#x5740;&#x3002;</li><li><strong>CNAME&#x8BB0;&#x5F55;</strong>&#xFF1A;&#x522B;&#x540D;&#x8BB0;&#x5F55;&#xFF0C;&#x5C06;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x6307;&#x5411;&#x53E6;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x3002;</li></ul><p>DNS&#x4E5F;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x5B89;&#x5168;&#x673A;&#x5236;&#xFF0C;&#x5982;<strong>DNSSEC</strong>&#xFF08;DNS&#x5B89;&#x5168;&#x6269;&#x5C55;&#xFF09;&#x7528;&#x4E8E;&#x9632;&#x6B62;DNS&#x6B3A;&#x9A97;&#x548C;&#x7F13;&#x5B58;&#x4E2D;&#x6BD2;&#x3002;</p><h3 id="3-tcp%EF%BC%9A%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE">3. TCP&#xFF1A;&#x4F20;&#x8F93;&#x63A7;&#x5236;&#x534F;&#x8BAE;</h3><h4 id="%E4%BB%80%E4%B9%88%E6%98%AFtcp%EF%BC%9F">&#x4EC0;&#x4E48;&#x662F;TCP&#xFF1F;</h4><p>TCP&#xFF08;Transmission Control Protocol&#xFF09;&#x662F;&#x4E00;&#x4E2A;&#x9762;&#x5411;&#x8FDE;&#x63A5;&#x7684;&#x534F;&#x8BAE;&#xFF0C;&#x63D0;&#x4F9B;&#x53EF;&#x9760;&#x7684;&#x7AEF;&#x5230;&#x7AEF;&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x670D;&#x52A1;&#x3002;TCP&#x7684;&#x6700;&#x5927;&#x7279;&#x70B9;&#x662F;&#x4FDD;&#x8BC1;&#x6570;&#x636E;&#x7684;&#x5B8C;&#x6574;&#x6027;&#x3001;&#x987A;&#x5E8F;&#x548C;&#x53EF;&#x9760;&#x6027;&#xFF0C;&#x901A;&#x8FC7;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x3001;&#x786E;&#x8BA4;&#x548C;&#x91CD;&#x4F20;&#x7B49;&#x673A;&#x5236;&#xFF0C;&#x786E;&#x4FDD;&#x6570;&#x636E;&#x5728;&#x4F20;&#x8F93;&#x8FC7;&#x7A0B;&#x4E2D;&#x4E0D;&#x4F1A;&#x4E22;&#x5931;&#x3002;</p><h4 id="tcp%E7%9A%84%E8%BF%9E%E6%8E%A5%E8%BF%87%E7%A8%8B%EF%BC%88%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%EF%BC%89">TCP&#x7684;&#x8FDE;&#x63A5;&#x8FC7;&#x7A0B;&#xFF08;&#x4E09;&#x6B21;&#x63E1;&#x624B;&#xFF09;</h4><ol><li><strong>SYN</strong>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x4E00;&#x4E2A;SYN&#x5305;&#xFF0C;&#x8868;&#x793A;&#x8BF7;&#x6C42;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x3002;</li><li><strong>SYN-ACK</strong>&#xFF1A;&#x670D;&#x52A1;&#x5668;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x53D1;&#x9001;SYN-ACK&#x5305;&#x786E;&#x8BA4;&#x8FDE;&#x63A5;&#x8BF7;&#x6C42;&#x3002;</li><li><strong>ACK</strong>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x518D;&#x6B21;&#x54CD;&#x5E94;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x53D1;&#x9001;ACK&#x5305;&#xFF0C;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x3002;</li></ol><p>&#x6B64;&#x8FC7;&#x7A0B;&#x786E;&#x4FDD;&#x5BA2;&#x6237;&#x7AEF;&#x548C;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x53EF;&#x9760;&#x7684;&#x8FDE;&#x63A5;&#x3002;</p><h4 id="tcp%E7%9A%84%E6%96%AD%E5%BC%80%E8%BF%87%E7%A8%8B%EF%BC%88%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%EF%BC%89">TCP&#x7684;&#x65AD;&#x5F00;&#x8FC7;&#x7A0B;&#xFF08;&#x56DB;&#x6B21;&#x6325;&#x624B;&#xFF09;</h4><ol><li><strong>FIN</strong>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x9001;FIN&#x5305;&#xFF0C;&#x8868;&#x793A;&#x8BF7;&#x6C42;&#x5173;&#x95ED;&#x8FDE;&#x63A5;&#x3002;</li><li><strong>ACK</strong>&#xFF1A;&#x670D;&#x52A1;&#x5668;&#x54CD;&#x5E94;ACK&#x5305;&#xFF0C;&#x786E;&#x8BA4;&#x63A5;&#x6536;&#x5230;&#x5173;&#x95ED;&#x8BF7;&#x6C42;&#x3002;</li><li><strong>FIN</strong>&#xFF1A;&#x670D;&#x52A1;&#x5668;&#x4E5F;&#x53D1;&#x9001;FIN&#x5305;&#xFF0C;&#x8868;&#x793A;&#x51C6;&#x5907;&#x5173;&#x95ED;&#x8FDE;&#x63A5;&#x3002;</li><li><strong>ACK</strong>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x54CD;&#x5E94;ACK&#x5305;&#xFF0C;&#x5B8C;&#x6210;&#x8FDE;&#x63A5;&#x7684;&#x65AD;&#x5F00;&#x3002;</li></ol><h4 id="tcp%E7%9A%84%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E4%B8%8E%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6">TCP&#x7684;&#x6D41;&#x91CF;&#x63A7;&#x5236;&#x4E0E;&#x62E5;&#x585E;&#x63A7;&#x5236;</h4><ul><li><strong>&#x6D41;&#x91CF;&#x63A7;&#x5236;</strong>&#xFF1A;&#x4F7F;&#x7528;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x673A;&#x5236;&#x63A7;&#x5236;&#x63A5;&#x6536;&#x65B9;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x5927;&#x5C0F;&#xFF0C;&#x907F;&#x514D;&#x63A5;&#x6536;&#x65B9;&#x65E0;&#x6CD5;&#x5904;&#x7406;&#x8FC7;&#x5FEB;&#x7684;&#x6570;&#x636E;&#x6D41;&#x3002;</li><li><strong>&#x62E5;&#x585E;&#x63A7;&#x5236;</strong>&#xFF1A;&#x4F7F;&#x7528;&#x6162;&#x542F;&#x52A8;&#x3001;&#x62E5;&#x585E;&#x907F;&#x514D;&#x3001;&#x5FEB;&#x901F;&#x91CD;&#x4F20;&#x7B49;&#x7B97;&#x6CD5;&#xFF0C;&#x9632;&#x6B62;&#x7F51;&#x7EDC;&#x4E2D;&#x53D1;&#x751F;&#x62E5;&#x585E;&#x3002;</li></ul><h4 id="tcp%E7%9A%84%E7%8A%B6%E6%80%81%E6%9C%BA">TCP&#x7684;&#x72B6;&#x6001;&#x673A;</h4><p>TCP&#x8FDE;&#x63A5;&#x7684;&#x72B6;&#x6001;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#xFF1A;</p><ul><li><strong>LISTEN</strong>&#xFF1A;&#x670D;&#x52A1;&#x5668;&#x7B49;&#x5F85;&#x8FDE;&#x63A5;&#x3002;</li><li><strong>SYN_SENT</strong>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x5DF2;&#x53D1;&#x9001;SYN&#xFF0C;&#x7B49;&#x5F85;&#x54CD;&#x5E94;&#x3002;</li><li><strong>ESTABLISHED</strong>&#xFF1A;&#x8FDE;&#x63A5;&#x5DF2;&#x5EFA;&#x7ACB;&#xFF0C;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x3002;</li><li><strong>FIN_WAIT</strong>&#xFF1A;&#x5173;&#x95ED;&#x8FDE;&#x63A5;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x3002;</li></ul><h3 id="4-%E6%80%BB%E7%BB%93">4. &#x603B;&#x7ED3;</h3><p>&#x5728;&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x7B80;&#x8981;&#x4ECB;&#x7ECD;&#x4E86;&#x8BA1;&#x7B97;&#x673A;&#x7F51;&#x7EDC;&#x4E2D;&#x7684;<strong>&#x7F51;&#x7EDC;&#x5C42;</strong>&#x53CA;&#x5176;&#x5173;&#x952E;&#x534F;&#x8BAE;&#x3002;&#x6211;&#x4EEC;&#x63A2;&#x8BA8;&#x4E86;DNS&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#xFF0C;TCP&#x534F;&#x8BAE;&#x7684;&#x53EF;&#x9760;&#x4F20;&#x8F93;&#x673A;&#x5236;&#xFF0C;&#x4EE5;&#x53CA;TCP&#x8FDE;&#x63A5;&#x7684;&#x5EFA;&#x7ACB;&#x4E0E;&#x65AD;&#x5F00;&#x8FC7;&#x7A0B;&#x3002;&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x8FD9;&#x4E9B;&#x534F;&#x8BAE;&#x548C;&#x673A;&#x5236;&#x80FD;&#x591F;&#x5E2E;&#x52A9;&#x4F60;&#x5728;&#x7F51;&#x7EDC;&#x7BA1;&#x7406;&#x3001;&#x5F00;&#x53D1;&#x548C;&#x6545;&#x969C;&#x6392;&#x67E5;&#x4E2D;&#x66F4;&#x597D;&#x5730;&#x7406;&#x89E3;&#x7F51;&#x7EDC;&#x901A;&#x4FE1;&#x7684;&#x539F;&#x7406;&#x3002;</p><p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E00;&#x4E9B;&#x7F51;&#x7EDC;&#x5DE5;&#x5177;&#xFF08;&#x5982;<code>dig</code>&#x3001;<code>nslookup</code>&#x3001;<code>tcpdump</code>&#x7B49;&#xFF09;&#x8FDB;&#x884C;&#x5B9E;&#x8DF5;&#xFF0C;&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x8FD9;&#x4E9B;&#x534F;&#x8BAE;&#x7684;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x3002;</p><hr><p>&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;&#x4E3A;&#x5B66;&#x4E60;&#x7F51;&#x7EDC;&#x5C42;&#x7684;&#x57FA;&#x7840;&#x77E5;&#x8BC6;&#x5960;&#x5B9A;&#x4E86;&#x4E00;&#x4E2A;&#x575A;&#x5B9E;&#x7684;&#x57FA;&#x7840;&#x3002;&#x5982;&#x679C;&#x4F60;&#x6709;&#x4EFB;&#x4F55;&#x95EE;&#x9898;&#x6216;&#x60F3;&#x8981;&#x66F4;&#x6DF1;&#x5165;&#x4E86;&#x89E3;&#x67D0;&#x4E2A;&#x90E8;&#x5206;&#xFF0C;&#x6B22;&#x8FCE;&#x7559;&#x8A00;&#x8BA8;&#x8BBA;&#xFF01;</p>]]></content:encoded></item><item><title><![CDATA[后台权限功能设计与实现]]></title><description><![CDATA[<p>&#x672C;&#x6587;&#x6863;&#x8BE6;&#x7EC6;&#x63CF;&#x8FF0;&#x4E86;&#x5982;&#x4F55;&#x5728;&#x57FA;&#x4E8E; Postgres &#x548C; Node.js &#x7684; Nest.js &#x9879;&#x76EE;&#x4E2D;&#x8BBE;&#x8BA1;&#x5E76;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x9AD8;&#x8D28;&#x91CF;&#x7684;&#x540E;&#x53F0;&#x6743;&#x9650;&#x7BA1;&#x7406;&#x529F;&#x80FD;&#x3002;&#x8BBE;&#x8BA1;&#x5305;&#x62EC;&#x83DC;&#x5355;&#x3001;</p>]]></description><link>https://pureo.cn/promission/</link><guid isPermaLink="false">67865001aafa5e00011774d8</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Tue, 14 Jan 2025 11:53:15 GMT</pubDate><content:encoded><![CDATA[<p>&#x672C;&#x6587;&#x6863;&#x8BE6;&#x7EC6;&#x63CF;&#x8FF0;&#x4E86;&#x5982;&#x4F55;&#x5728;&#x57FA;&#x4E8E; Postgres &#x548C; Node.js &#x7684; Nest.js &#x9879;&#x76EE;&#x4E2D;&#x8BBE;&#x8BA1;&#x5E76;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x9AD8;&#x8D28;&#x91CF;&#x7684;&#x540E;&#x53F0;&#x6743;&#x9650;&#x7BA1;&#x7406;&#x529F;&#x80FD;&#x3002;&#x8BBE;&#x8BA1;&#x5305;&#x62EC;&#x83DC;&#x5355;&#x3001;&#x6309;&#x94AE;&#x3001;&#x63A5;&#x53E3;&#x7EA7;&#x522B;&#x7684;&#x6743;&#x9650;&#x63A7;&#x5236;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x6E05;&#x6670;&#x7684;&#x5B9E;&#x73B0;&#x6B65;&#x9AA4;&#x548C;&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#x3002;</p><hr><h2 id="%E5%8A%9F%E8%83%BD%E9%9C%80%E6%B1%82">&#x529F;&#x80FD;&#x9700;&#x6C42;</h2><ol><li><strong>&#x7528;&#x6237;&#x7BA1;&#x7406;</strong></li></ol><ul><li>&#x6DFB;&#x52A0;&#x3001;&#x7F16;&#x8F91;&#x3001;&#x5220;&#x9664;&#x7528;&#x6237;&#x3002;</li><li>&#x5206;&#x914D;&#x89D2;&#x8272;&#x7ED9;&#x7528;&#x6237;&#x3002;</li></ul><ol><li><strong>&#x89D2;&#x8272;&#x7BA1;&#x7406;</strong></li></ol><ul><li>&#x521B;&#x5EFA;&#x3001;&#x7F16;&#x8F91;&#x3001;&#x5220;&#x9664;&#x89D2;&#x8272;&#x3002;</li><li>&#x5206;&#x914D;&#x6743;&#x9650;&#x5230;&#x89D2;&#x8272;&#x3002;</li></ul><ol><li><strong>&#x6743;&#x9650;&#x7BA1;&#x7406;</strong></li></ol><ul><li>&#x5B9A;&#x4E49;&#x83DC;&#x5355;&#x3001;&#x6309;&#x94AE;&#x3001;&#x63A5;&#x53E3;&#x6743;&#x9650;&#x3002;</li></ul><ol><li><strong>&#x6743;&#x9650;&#x63A7;&#x5236;</strong></li></ol><ul><li>&#x4E0D;&#x540C;&#x7528;&#x6237;&#x6839;&#x636E;&#x89D2;&#x8272;&#x770B;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x83DC;&#x5355;&#x548C;&#x64CD;&#x4F5C;&#x3002;</li><li>&#x63A5;&#x53E3;&#x6743;&#x9650;&#x6821;&#x9A8C;&#xFF0C;&#x9632;&#x6B62;&#x975E;&#x6CD5;&#x8BBF;&#x95EE;&#x3002;</li></ul><hr><h2 id="%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1">&#x6570;&#x636E;&#x5E93;&#x8BBE;&#x8BA1;</h2><h3 id="%E8%A1%A8%E7%BB%93%E6%9E%84">&#x8868;&#x7ED3;&#x6784;</h3><ol><li><strong>users</strong> (&#x7528;&#x6237;&#x8868;)</li></ol><pre><code class="language-sql">CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL, -- &#x7528;&#x6237;&#x540D;&#xFF0C;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x7528;&#x6237;
    password VARCHAR(255) NOT NULL,        -- &#x7528;&#x6237;&#x5BC6;&#x7801;&#xFF0C;&#x5EFA;&#x8BAE;&#x52A0;&#x5BC6;&#x5B58;&#x50A8;
    role_id INT REFERENCES roles(id) ON DELETE SET NULL, -- &#x5173;&#x8054;&#x89D2;&#x8272;&#x8868;&#xFF0C;&#x89D2;&#x8272;&#x88AB;&#x5220;&#x9664;&#x65F6;&#x8BBE;&#x4E3A;&#x7A7A;
    created_at TIMESTAMP DEFAULT NOW(),    -- &#x521B;&#x5EFA;&#x65F6;&#x95F4;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x5F53;&#x524D;&#x65F6;&#x95F4;
    updated_at TIMESTAMP DEFAULT NOW()     -- &#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF0C;&#x81EA;&#x52A8;&#x66F4;&#x65B0;
);
</code></pre><ol><li><strong>roles</strong> (&#x89D2;&#x8272;&#x8868;)</li></ol><pre><code class="language-sql">CREATE TABLE roles (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) UNIQUE NOT NULL,      -- &#x89D2;&#x8272;&#x540D;&#x79F0;&#xFF0C;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x89D2;&#x8272;
    description TEXT,                      -- &#x89D2;&#x8272;&#x63CF;&#x8FF0;&#xFF0C;&#x7528;&#x4E8E;&#x8BF4;&#x660E;&#x89D2;&#x8272;&#x7528;&#x9014;
    created_at TIMESTAMP DEFAULT NOW(),    -- &#x521B;&#x5EFA;&#x65F6;&#x95F4;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x5F53;&#x524D;&#x65F6;&#x95F4;
    updated_at TIMESTAMP DEFAULT NOW()     -- &#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF0C;&#x81EA;&#x52A8;&#x66F4;&#x65B0;
);
</code></pre><ol><li><strong>permissions</strong> (&#x6743;&#x9650;&#x8868;)</li></ol><pre><code class="language-sql">CREATE TABLE permissions (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,            -- &#x6743;&#x9650;&#x540D;&#x79F0;&#xFF0C;&#x4FBF;&#x4E8E;&#x8BC6;&#x522B;
    type VARCHAR(20) CHECK (type IN (&apos;menu&apos;, &apos;button&apos;, &apos;api&apos;)) NOT NULL, -- &#x6743;&#x9650;&#x7C7B;&#x578B;&#xFF0C;&#x83DC;&#x5355;&#x3001;&#x6309;&#x94AE;&#x6216;&#x63A5;&#x53E3;
    value VARCHAR(255) UNIQUE NOT NULL,    -- &#x6743;&#x9650;&#x503C;&#xFF0C;&#x7528;&#x4E8E;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#x6743;&#x9650;
    created_at TIMESTAMP DEFAULT NOW(),    -- &#x521B;&#x5EFA;&#x65F6;&#x95F4;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x5F53;&#x524D;&#x65F6;&#x95F4;
    updated_at TIMESTAMP DEFAULT NOW()     -- &#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF0C;&#x81EA;&#x52A8;&#x66F4;&#x65B0;
);
</code></pre><ol><li><strong>role_permissions</strong> (&#x89D2;&#x8272;&#x6743;&#x9650;&#x8868;)</li></ol><pre><code class="language-sql">CREATE TABLE role_permissions (
    id SERIAL PRIMARY KEY,
    role_id INT REFERENCES roles(id) ON DELETE CASCADE, -- &#x5173;&#x8054;&#x89D2;&#x8272;&#x8868;&#xFF0C;&#x89D2;&#x8272;&#x5220;&#x9664;&#x65F6;&#x7EA7;&#x8054;&#x5220;&#x9664;
    permission_id INT REFERENCES permissions(id) ON DELETE CASCADE, -- &#x5173;&#x8054;&#x6743;&#x9650;&#x8868;&#xFF0C;&#x6743;&#x9650;&#x5220;&#x9664;&#x65F6;&#x7EA7;&#x8054;&#x5220;&#x9664;
    UNIQUE(role_id, permission_id) -- &#x786E;&#x4FDD;&#x89D2;&#x8272;&#x4E0E;&#x6743;&#x9650;&#x7684;&#x7EC4;&#x5408;&#x552F;&#x4E00;
);
</code></pre><hr><h2 id="%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AE%9E%E7%8E%B0">&#x670D;&#x52A1;&#x7AEF;&#x5B9E;&#x73B0;</h2><h3 id="%E6%A0%B8%E5%BF%83%E6%A8%A1%E5%9D%97">&#x6838;&#x5FC3;&#x6A21;&#x5757;</h3><p><strong>&#x7528;&#x6237;&#x6A21;&#x5757; (UsersModule)</strong></p><ul><li>&#x5305;&#x542B;&#x7528;&#x6237; CRUD &#x548C;&#x89D2;&#x8272;&#x5206;&#x914D;&#x63A5;&#x53E3;&#x3002;</li></ul><p><strong>&#x89D2;&#x8272;&#x6A21;&#x5757; (RolesModule)</strong></p><ul><li>&#x63D0;&#x4F9B;&#x89D2;&#x8272;&#x7BA1;&#x7406;&#x548C;&#x6743;&#x9650;&#x5206;&#x914D;&#x529F;&#x80FD;&#x3002;</li></ul><p><strong>&#x6743;&#x9650;&#x6A21;&#x5757; (PermissionsModule)</strong></p><ul><li>&#x8D1F;&#x8D23;&#x5B9A;&#x4E49;&#x6743;&#x9650;&#xFF0C;&#x5E76;&#x4E3A;&#x89D2;&#x8272;&#x5206;&#x914D;&#x6743;&#x9650;&#x3002;</li></ul><p><strong>&#x9274;&#x6743;&#x6A21;&#x5757; (AuthModule)</strong></p><ul><li>&#x63D0;&#x4F9B;&#x767B;&#x5F55;&#x3001;JWT &#x8BA4;&#x8BC1;&#x548C;&#x6743;&#x9650;&#x6821;&#x9A8C;&#x4E2D;&#x95F4;&#x4EF6;&#x3002;</li></ul><h3 id="%E6%9D%83%E9%99%90%E6%A0%A1%E9%AA%8C%E4%B8%AD%E9%97%B4%E4%BB%B6">&#x6743;&#x9650;&#x6821;&#x9A8C;&#x4E2D;&#x95F4;&#x4EF6;</h3><p>&#x6743;&#x9650;&#x6821;&#x9A8C;&#x4E2D;&#x95F4;&#x4EF6;&#x8D1F;&#x8D23;&#x5728;&#x6BCF;&#x4E2A;&#x63A5;&#x53E3;&#x8BF7;&#x6C42;&#x4E2D;&#x6821;&#x9A8C;&#x7528;&#x6237;&#x662F;&#x5426;&#x5177;&#x5907;&#x5FC5;&#x8981;&#x7684;&#x6743;&#x9650;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x6838;&#x5FC3;&#x903B;&#x8F91;&#x7684;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#xFF1A;</p><p><strong>&#x4ECE;&#x8BF7;&#x6C42;&#x4E2D;&#x83B7;&#x53D6;&#x7528;&#x6237;&#x6743;&#x9650;</strong></p><ul><li>&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x901A;&#x8FC7; <code>Authorization</code> &#x5934;&#x90E8;&#x643A;&#x5E26; JWT Token&#x3002;</li><li>&#x4E2D;&#x95F4;&#x4EF6;&#x89E3;&#x6790; Token&#xFF0C;&#x4ECE;&#x4E2D;&#x63D0;&#x53D6;&#x7528;&#x6237; ID&#x3002;</li><li>&#x6839;&#x636E;&#x7528;&#x6237; ID &#x67E5;&#x8BE2;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x83B7;&#x53D6;&#x5176;&#x6743;&#x9650;&#x96C6;&#x5408;&#x3002;&#x53EF;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x67E5;&#x8BE2;&#x5B9E;&#x73B0;&#xFF1A;</li></ul><pre><code class="language-sql">SELECT p.value
FROM permissions p
INNER JOIN role_permissions rp ON p.id = rp.permission_id
INNER JOIN users u ON rp.role_id = u.role_id
WHERE u.id = $1;
</code></pre><p><strong>&#x7F13;&#x5B58;&#x673A;&#x5236;</strong></p><ul><li>&#x4E3A;&#x4E86;&#x4F18;&#x5316;&#x6027;&#x80FD;&#xFF0C;&#x7528;&#x6237;&#x6743;&#x9650;&#x96C6;&#x5408;&#x53EF;&#x4EE5;&#x5B58;&#x50A8;&#x5728;&#x7F13;&#x5B58;&#x4E2D;&#xFF08;&#x5982; Redis&#xFF09;&#x3002;</li><li>&#x6BCF;&#x6B21;&#x67E5;&#x8BE2;&#x524D;&#x68C0;&#x67E5;&#x7F13;&#x5B58;&#x662F;&#x5426;&#x6709;&#x5BF9;&#x5E94;&#x6743;&#x9650;&#x6570;&#x636E;&#x3002;</li><li>&#x7528;&#x6237;&#x6743;&#x9650;&#x53D8;&#x66F4;&#x540E;&#xFF0C;&#x53EF;&#x901A;&#x8FC7;&#x4E8B;&#x4EF6;&#x6216;&#x624B;&#x52A8;&#x89E6;&#x53D1;&#x6E05;&#x9664;&#x7F13;&#x5B58;&#x3002;</li></ul><p><strong>&#x6821;&#x9A8C;&#x903B;&#x8F91;</strong></p><ul><li>&#x901A;&#x8FC7; <code>Reflector</code> &#x83B7;&#x53D6;&#x63A5;&#x53E3;&#x6240;&#x9700;&#x7684;&#x6743;&#x9650;&#x5217;&#x8868;&#x3002;</li><li>&#x68C0;&#x67E5;&#x7528;&#x6237;&#x6743;&#x9650;&#x96C6;&#x5408;&#x662F;&#x5426;&#x5305;&#x542B;&#x6240;&#x6709;&#x6240;&#x9700;&#x6743;&#x9650;&#x3002;</li><li>&#x793A;&#x4F8B;&#x6821;&#x9A8C;&#x4EE3;&#x7801;&#xFF1A;</li></ul><pre><code class="language-typescript">const requiredPermissions = this.reflector.get&lt;string[]&gt;(&apos;permissions&apos;, context.getHandler());
if (!requiredPermissions) return true;

const hasPermission = requiredPermissions.every(permission =&gt; userPermissions.includes(permission));
if (!hasPermission) {
  throw new ForbiddenException(&apos;Access denied&apos;);
}
return true;
</code></pre><p><strong>&#x6027;&#x80FD;&#x4F18;&#x5316;&#x63AA;&#x65BD;</strong></p><ul><li><strong>&#x6279;&#x91CF;&#x67E5;&#x8BE2;</strong>&#xFF1A;&#x5BF9;&#x4E8E;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#xFF0C;&#x53EF;&#x4E00;&#x6B21;&#x6027;&#x67E5;&#x8BE2;&#x591A;&#x4E2A;&#x7528;&#x6237;&#x6743;&#x9650;&#x96C6;&#x5408;&#xFF0C;&#x51CF;&#x5C11;&#x6570;&#x636E;&#x5E93;&#x67E5;&#x8BE2;&#x6B21;&#x6570;&#x3002;</li><li><strong>&#x6570;&#x636E;&#x7ED3;&#x6784;&#x4F18;&#x5316;</strong>&#xFF1A;&#x5728;&#x7F13;&#x5B58;&#x4E2D;&#x5B58;&#x50A8;&#x6743;&#x9650;&#x96C6;&#x5408;&#x65F6;&#xFF0C;&#x91C7;&#x7528; Set &#x6570;&#x636E;&#x7ED3;&#x6784;&#x4EE5;&#x63D0;&#x9AD8;&#x67E5;&#x8BE2;&#x901F;&#x5EA6;&#x3002;</li><li><strong>&#x6309;&#x9700;&#x52A0;&#x8F7D;</strong>&#xFF1A;&#x5BF9;&#x4E8E;&#x52A8;&#x6001;&#x6743;&#x9650;&#x68C0;&#x67E5;&#xFF0C;&#x53EA;&#x52A0;&#x8F7D;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x6240;&#x9700;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x51CF;&#x5C11;&#x6570;&#x636E;&#x4F20;&#x8F93;&#x91CF;&#x3002;</li></ul><p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x8BBE;&#x8BA1;&#xFF0C;&#x6743;&#x9650;&#x6821;&#x9A8C;&#x4E2D;&#x95F4;&#x4EF6;&#x4E0D;&#x4EC5;&#x786E;&#x4FDD;&#x4E86;&#x5B89;&#x5168;&#x6027;&#xFF0C;&#x8FD8;&#x5728;&#x9AD8;&#x5E76;&#x53D1;&#x573A;&#x666F;&#x4E0B;&#x63D0;&#x4F9B;&#x4E86;&#x826F;&#x597D;&#x7684;&#x6027;&#x80FD;&#x3002;</p><pre><code class="language-typescript">import { Injectable, CanActivate, ExecutionContext } from &apos;@nestjs/common&apos;;
import { Reflector } from &apos;@nestjs/core&apos;;
import { JwtService } from &apos;@nestjs/jwt&apos;;
import { Request } from &apos;express&apos;;

@Injectable()
export class PermissionsGuard implements CanActivate {
  constructor(private reflector: Reflector, private jwtService: JwtService) {}

  async canActivate(context: ExecutionContext): Promise&lt;boolean&gt; {
    const requiredPermissions = this.reflector.get&lt;string[]&gt;(&apos;permissions&apos;, context.getHandler());
    if (!requiredPermissions) return true;

    const request = context.switchToHttp().getRequest&lt;Request&gt;();
    const authHeader = request.headers[&apos;authorization&apos;];
    if (!authHeader) return false;

    const token = authHeader.split(&apos; &apos;)[1];
    const user = this.jwtService.verify(token);

    // Fetch user&apos;s permissions from DB or cache
    const userPermissions = await this.getUserPermissions(user.id);

    return requiredPermissions.every(permission =&gt; userPermissions.includes(permission));
  }

  private async getUserPermissions(userId: number): Promise&lt;string[]&gt; {
    // Query the database for the user&apos;s permissions
    return [&apos;menu:dashboard&apos;, &apos;button:create-user&apos;, &apos;api:get-users&apos;]; // Example
  }
}
</code></pre><h3 id="%E6%8E%A5%E5%8F%A3%E7%A4%BA%E4%BE%8B">&#x63A5;&#x53E3;&#x793A;&#x4F8B;</h3><ol><li><strong>&#x83B7;&#x53D6;&#x83DC;&#x5355;</strong></li></ol><pre><code class="language-typescript">@Get(&apos;menus&apos;)
@UseGuards(PermissionsGuard)
@SetMetadata(&apos;permissions&apos;, [&apos;menu:dashboard&apos;])
async getMenus() {
  return [
    {
      id: 1,
      name: &apos;Dashboard&apos;,
      path: &apos;/dashboard&apos;,
      icon: &apos;dashboard&apos;, // &#x83DC;&#x5355;&#x56FE;&#x6807;&#xFF0C;&#x7528;&#x4E8E;&#x524D;&#x7AEF;&#x663E;&#x793A;
      children: [], // &#x5B50;&#x83DC;&#x5355;&#x5217;&#x8868;&#xFF0C;&#x82E5;&#x4E3A;&#x9876;&#x7EA7;&#x83DC;&#x5355;&#x5219;&#x4E3A;&#x7A7A;&#x6570;&#x7EC4;
    },
    {
      id: 2,
      name: &apos;Users&apos;,
      path: &apos;/users&apos;,
      icon: &apos;users&apos;, // &#x83DC;&#x5355;&#x56FE;&#x6807;
      children: [
        {
          id: 3,
          name: &apos;User List&apos;,
          path: &apos;/users/list&apos;,
          icon: &apos;list&apos;,
        },
        {
          id: 4,
          name: &apos;User Roles&apos;,
          path: &apos;/users/roles&apos;,
          icon: &apos;roles&apos;,
        },
      ],
    },
  ];
}
@Get(&apos;menus&apos;)
@UseGuards(PermissionsGuard)
@SetMetadata(&apos;permissions&apos;, [&apos;menu:dashboard&apos;])
async getMenus() {
  return [
    { id: 1, name: &apos;Dashboard&apos;, path: &apos;/dashboard&apos; },
    { id: 2, name: &apos;Users&apos;, path: &apos;/users&apos; },
  ];
}
</code></pre><ol><li><strong>&#x521B;&#x5EFA;&#x7528;&#x6237;</strong></li></ol><pre><code class="language-typescript">@Post(&apos;users&apos;)
@UseGuards(PermissionsGuard)
@SetMetadata(&apos;permissions&apos;, [&apos;button:create-user&apos;])
async createUser(@Body() createUserDto: CreateUserDto) {
  return this.userService.create(createUserDto);
}
</code></pre><hr><h2 id="%E5%89%8D%E7%AB%AF%E5%AE%9E%E7%8E%B0">&#x524D;&#x7AEF;&#x5B9E;&#x73B0;</h2><h3 id="%E8%8F%9C%E5%8D%95%E5%8A%A8%E6%80%81%E6%B8%B2%E6%9F%93">&#x83DC;&#x5355;&#x52A8;&#x6001;&#x6E32;&#x67D3;</h3><p><strong>&#x57FA;&#x4E8E;&#x7528;&#x6237;&#x6743;&#x9650;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x83DC;&#x5355;</strong></p><ol><li>&#x7528;&#x6237;&#x767B;&#x5F55;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x524D;&#x7AEF;&#x901A;&#x8FC7; API &#x83B7;&#x53D6;&#x7528;&#x6237;&#x6743;&#x9650;&#x5217;&#x8868;&#x53CA;&#x5176;&#x5BF9;&#x5E94;&#x7684;&#x83DC;&#x5355;&#x6570;&#x636E;&#x3002;</li><li>&#x540E;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x83DC;&#x5355;&#x6570;&#x636E;&#x5305;&#x542B;&#x83DC;&#x5355;&#x5C42;&#x7EA7;&#x5173;&#x7CFB;&#xFF08;&#x7236;&#x5B50;&#x5173;&#x7CFB;&#xFF09;&#x3001;&#x8DEF;&#x5F84;&#xFF08;<code>path</code>&#xFF09;&#x3001;&#x663E;&#x793A;&#x540D;&#x79F0;&#xFF08;<code>name</code>&#xFF09;&#x3001;&#x56FE;&#x6807;&#xFF08;<code>icon</code>&#xFF09;&#x7B49;&#x5B57;&#x6BB5;&#x3002;</li><li>&#x524D;&#x7AEF;&#x6839;&#x636E;&#x7528;&#x6237;&#x6743;&#x9650;&#x52A8;&#x6001;&#x751F;&#x6210;&#x83DC;&#x5355;&#x6811;&#xFF0C;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</li></ol><pre><code class="language-typescript">const renderMenu = (permissions, allMenus) =&gt; {
  const buildMenuTree = (menuList, parentId = null) =&gt; {
    return menuList
      .filter(menu =&gt; menu.parentId === parentId &amp;&amp; permissions.includes(menu.permission))
      .map(menu =&gt; ({
        ...menu,
        children: buildMenuTree(menuList, menu.id),
      }));
  };

  return buildMenuTree(allMenus);
};

const userPermissions = [&apos;menu:dashboard&apos;, &apos;menu:users&apos;];
const allMenus = [
  { id: 1, name: &apos;Dashboard&apos;, path: &apos;/dashboard&apos;, icon: &apos;dashboard&apos;, permission: &apos;menu:dashboard&apos;, parentId: null },
  { id: 2, name: &apos;Users&apos;, path: &apos;/users&apos;, icon: &apos;users&apos;, permission: &apos;menu:users&apos;, parentId: null },
  { id: 3, name: &apos;User List&apos;, path: &apos;/users/list&apos;, icon: &apos;list&apos;, permission: &apos;menu:user:list&apos;, parentId: 2 },
  { id: 4, name: &apos;User Roles&apos;, path: &apos;/users/roles&apos;, icon: &apos;roles&apos;, permission: &apos;menu:user:roles&apos;, parentId: 2 },
];

const menuTree = renderMenu(userPermissions, allMenus);
console.log(menuTree);
</code></pre><p><strong>&#x7F13;&#x5B58;&#x83DC;&#x5355;&#x6570;&#x636E;</strong></p><ul><li>&#x4F7F;&#x7528; LocalStorage &#x6216; SessionStorage &#x7F13;&#x5B58;&#x83DC;&#x5355;&#x6570;&#x636E;&#xFF0C;&#x51CF;&#x5C11;&#x91CD;&#x590D;&#x8BF7;&#x6C42;&#xFF1A;</li></ul><pre><code class="language-typescript">const fetchMenus = async () =&gt; {
  const cachedMenus = localStorage.getItem(&apos;menus&apos;);
  if (cachedMenus) {
    return JSON.parse(cachedMenus);
  }
  const menus = await api.getMenus();
  localStorage.setItem(&apos;menus&apos;, JSON.stringify(menus));
  return menus;
};
</code></pre><p><strong>&#x6743;&#x9650;&#x53D8;&#x66F4;&#x5904;&#x7406;&#x7B56;&#x7565;</strong></p><ul><li><strong>&#x5B9E;&#x65F6;&#x66F4;&#x65B0;</strong>&#xFF1A;&#x5728;&#x540E;&#x53F0;&#x4FEE;&#x6539;&#x7528;&#x6237;&#x6743;&#x9650;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x4E8B;&#x4EF6;&#x901A;&#x77E5;&#x6216; WebSocket &#x63A8;&#x9001;&#x901A;&#x77E5;&#x524D;&#x7AEF;&#x6E05;&#x7406;&#x7F13;&#x5B58;&#x5E76;&#x91CD;&#x65B0;&#x62C9;&#x53D6;&#x6700;&#x65B0;&#x6570;&#x636E;&#x3002;</li><li><strong>&#x5B9A;&#x671F;&#x6821;&#x9A8C;</strong>&#xFF1A;&#x524D;&#x7AEF;&#x5B9A;&#x671F;&#x6821;&#x9A8C;&#x6743;&#x9650;&#x6709;&#x6548;&#x6027;&#xFF0C;&#x4F8B;&#x5982;&#x5728;&#x7528;&#x6237;&#x957F;&#x65F6;&#x95F4;&#x672A;&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x91CD;&#x65B0;&#x6821;&#x9A8C;&#x6743;&#x9650;&#x3002;</li></ul><p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x903B;&#x8F91;&#xFF0C;&#x524D;&#x7AEF;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x7684;&#x83DC;&#x5355;&#x6570;&#x636E;&#x548C;&#x6743;&#x9650;&#x8BBE;&#x7F6E;&#x7075;&#x6D3B;&#x5730;&#x6E32;&#x67D3;&#x7528;&#x6237;&#x754C;&#x9762;&#xFF0C;&#x5E76;&#x5728;&#x6743;&#x9650;&#x53D8;&#x66F4;&#x65F6;&#x4FDD;&#x6301;&#x6570;&#x636E;&#x4E00;&#x81F4;&#x6027;&#x548C;&#x5B89;&#x5168;&#x6027;&#x3002;</p><ul><li>&#x57FA;&#x4E8E;&#x7528;&#x6237;&#x6743;&#x9650;&#xFF0C;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x83DC;&#x5355;&#x3002;</li><li>&#x793A;&#x4F8B;&#xFF1A;</li></ul><pre><code class="language-typescript">const renderMenu = (permissions) =&gt; {
  const allMenus = [
    { id: 1, name: &apos;Dashboard&apos;, path: &apos;/dashboard&apos;, permission: &apos;menu:dashboard&apos; },
    { id: 2, name: &apos;Users&apos;, path: &apos;/users&apos;, permission: &apos;menu:users&apos; },
  ];

  return allMenus.filter(menu =&gt; permissions.includes(menu.permission));
};
</code></pre><h3 id="%E6%8C%89%E9%92%AE%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6">&#x6309;&#x94AE;&#x6743;&#x9650;&#x63A7;&#x5236;</h3><ul><li>&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x6307;&#x4EE4;&#x63A7;&#x5236;&#x6309;&#x94AE;&#x663E;&#x793A;&#x3002;</li></ul><pre><code class="language-javascript">Vue.directive(&apos;permission&apos;, {
  inserted(el, binding, vnode) {
    const userPermissions = vnode.context.$store.state.permissions;
    if (!userPermissions.includes(binding.value)) {
      el.parentNode &amp;&amp; el.parentNode.removeChild(el);
    }
  }
});
</code></pre><h3 id="%E6%8E%A5%E5%8F%A3%E6%9D%83%E9%99%90%E5%B0%81%E8%A3%85">&#x63A5;&#x53E3;&#x6743;&#x9650;&#x5C01;&#x88C5;</h3><ul><li>Axios &#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x5668;&#xFF1A;</li></ul><pre><code class="language-javascript">axios.interceptors.response.use(null, (error) =&gt; {
  if (error.response.status === 403) {
    alert(&apos;Permission denied&apos;);
  }
  return Promise.reject(error);
});
</code></pre><hr><figure class="kg-card kg-image-card"><img src="https://pureo.cn/content/images/2025/01/DALL-E-2025-01-14-20.01.10---A-clean-hand-drawn-style-architecture-diagram-for-a-role-based-access-control--RBAC--system.-The-diagram-has-four-clear-layers_-Database--Backend--API.webp" class="kg-image" alt loading="lazy" width="1792" height="1024" srcset="https://pureo.cn/content/images/size/w600/2025/01/DALL-E-2025-01-14-20.01.10---A-clean-hand-drawn-style-architecture-diagram-for-a-role-based-access-control--RBAC--system.-The-diagram-has-four-clear-layers_-Database--Backend--API.webp 600w, https://pureo.cn/content/images/size/w1000/2025/01/DALL-E-2025-01-14-20.01.10---A-clean-hand-drawn-style-architecture-diagram-for-a-role-based-access-control--RBAC--system.-The-diagram-has-four-clear-layers_-Database--Backend--API.webp 1000w, https://pureo.cn/content/images/size/w1600/2025/01/DALL-E-2025-01-14-20.01.10---A-clean-hand-drawn-style-architecture-diagram-for-a-role-based-access-control--RBAC--system.-The-diagram-has-four-clear-layers_-Database--Backend--API.webp 1600w, https://pureo.cn/content/images/2025/01/DALL-E-2025-01-14-20.01.10---A-clean-hand-drawn-style-architecture-diagram-for-a-role-based-access-control--RBAC--system.-The-diagram-has-four-clear-layers_-Database--Backend--API.webp 1792w" sizes="(min-width: 720px) 720px"></figure><h2 id="%E6%80%BB%E7%BB%93">&#x603B;&#x7ED3;</h2><p>&#x672C;&#x8BBE;&#x8BA1;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x9AD8;&#x6548;&#x4E14;&#x5B89;&#x5168;&#x7684;&#x6743;&#x9650;&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#xFF0C;&#x6DB5;&#x76D6;&#x4E86;&#x4ECE;&#x6570;&#x636E;&#x5E93;&#x5230;&#x524D;&#x540E;&#x7AEF;&#x5B8C;&#x6574;&#x7684;&#x6280;&#x672F;&#x7EC6;&#x8282;&#x3002;&#x901A;&#x8FC7;&#x89D2;&#x8272;&#x548C;&#x6743;&#x9650;&#x7684;&#x7EC4;&#x5408;&#xFF0C;&#x7CFB;&#x7EDF;&#x53EF;&#x4EE5;&#x7075;&#x6D3B;&#x5730;&#x9002;&#x914D;&#x4E0D;&#x540C;&#x4E1A;&#x52A1;&#x9700;&#x6C42;&#xFF0C;&#x540C;&#x65F6;&#x786E;&#x4FDD;&#x6743;&#x9650;&#x6821;&#x9A8C;&#x7684;&#x51C6;&#x786E;&#x6027;&#x548C;&#x5B89;&#x5168;&#x6027;&#x3002;</p><h3 id="%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF">&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x573A;&#x666F;</h3><ul><li><strong>&#x7535;&#x5546;&#x5E73;&#x53F0;&#x540E;&#x53F0;</strong>&#xFF1A;&#x4E3A;&#x5546;&#x5BB6;&#x3001;&#x7BA1;&#x7406;&#x5458;&#x548C;&#x5BA2;&#x670D;&#x4EBA;&#x5458;&#x8BBE;&#x7F6E;&#x4E0D;&#x540C;&#x7684;&#x6743;&#x9650;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5546;&#x5BB6;&#x53EF;&#x4EE5;&#x7BA1;&#x7406;&#x81EA;&#x5DF1;&#x7684;&#x5E97;&#x94FA;&#x548C;&#x8BA2;&#x5355;&#xFF0C;&#x7BA1;&#x7406;&#x5458;&#x53EF;&#x4EE5;&#x7BA1;&#x7406;&#x5168;&#x5E73;&#x53F0;&#x7684;&#x7528;&#x6237;&#x548C;&#x6570;&#x636E;&#x3002;</li><li><strong>&#x4F01;&#x4E1A;&#x5185;&#x90E8;&#x7CFB;&#x7EDF;</strong>&#xFF1A;&#x5728; HR &#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x4E0D;&#x540C;&#x90E8;&#x95E8;&#x7684;&#x5458;&#x5DE5;&#x8BBF;&#x95EE;&#x4E0D;&#x540C;&#x7684;&#x6A21;&#x5757;&#xFF0C;&#x4F8B;&#x5982;&#x62DB;&#x8058;&#x6A21;&#x5757;&#x3001;&#x7EE9;&#x6548;&#x8003;&#x6838;&#x6A21;&#x5757;&#x3002;</li><li><strong>&#x6559;&#x80B2;&#x5E73;&#x53F0;</strong>&#xFF1A;&#x6559;&#x5E08;&#x53EF;&#x4EE5;&#x7BA1;&#x7406;&#x8BFE;&#x7A0B;&#x548C;&#x5B66;&#x751F;&#x6570;&#x636E;&#xFF0C;&#x5B66;&#x751F;&#x53EA;&#x80FD;&#x8BBF;&#x95EE;&#x81EA;&#x5DF1;&#x7684;&#x8BFE;&#x7A0B;&#x4FE1;&#x606F;&#x3002;</li></ul><h3 id="%E5%8F%AF%E8%83%BD%E9%81%87%E5%88%B0%E7%9A%84%E6%8C%91%E6%88%98">&#x53EF;&#x80FD;&#x9047;&#x5230;&#x7684;&#x6311;&#x6218;</h3><p><strong>&#x6743;&#x9650;&#x7C92;&#x5EA6;&#x8FC7;&#x7EC6;</strong>&#xFF1A;</p><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x7C92;&#x5EA6;&#x8FC7;&#x7EC6;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x6743;&#x9650;&#x7BA1;&#x7406;&#x7684;&#x590D;&#x6742;&#x6027;&#x589E;&#x52A0;&#xFF0C;&#x96BE;&#x4EE5;&#x7EF4;&#x62A4;&#x3002;</li><li><strong>&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong>&#xFF1A;&#x4F7F;&#x7528;&#x5206;&#x5C42;&#x6743;&#x9650;&#x8BBE;&#x8BA1;&#xFF0C;&#x5C06;&#x4F4E;&#x7EA7;&#x6743;&#x9650;&#x7ED1;&#x5B9A;&#x5230;&#x89D2;&#x8272;&#xFF0C;&#x901A;&#x8FC7;&#x89D2;&#x8272;&#x5B9E;&#x73B0;&#x6743;&#x9650;&#x5206;&#x914D;&#x3002;</li></ul><p><strong>&#x9AD8;&#x5E76;&#x53D1;&#x4E0B;&#x7684;&#x6027;&#x80FD;&#x74F6;&#x9888;</strong>&#xFF1A;</p><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x9891;&#x7E41;&#x67E5;&#x8BE2;&#x6743;&#x9650;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x6570;&#x636E;&#x5E93;&#x538B;&#x529B;&#x8FC7;&#x5927;&#x3002;</li><li><strong>&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong>&#xFF1A;</li><li>&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#xFF08;&#x5982; Redis&#xFF09;&#x5B58;&#x50A8;&#x7528;&#x6237;&#x6743;&#x9650;&#x96C6;&#x5408;&#x3002;</li><li>&#x5728;&#x7F13;&#x5B58;&#x5931;&#x6548;&#x65F6;&#x5206;&#x6279;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#x6743;&#x9650;&#x3002;</li></ul><p><strong>&#x6743;&#x9650;&#x53D8;&#x66F4;&#x540C;&#x6B65;&#x95EE;&#x9898;</strong>&#xFF1A;</p><ul><li><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x6743;&#x9650;&#x66F4;&#x65B0;&#x540E;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x65E0;&#x6CD5;&#x53CA;&#x65F6;&#x83B7;&#x77E5;&#x53D8;&#x5316;&#x3002;</li><li><strong>&#x89E3;&#x51B3;&#x65B9;&#x6848;</strong>&#xFF1A;&#x901A;&#x8FC7; WebSocket &#x6216;&#x4E8B;&#x4EF6;&#x901A;&#x77E5;&#x673A;&#x5236;&#x5B9E;&#x65F6;&#x63A8;&#x9001;&#x6743;&#x9650;&#x53D8;&#x66F4;&#xFF0C;&#x6216;&#x5B9A;&#x671F;&#x5237;&#x65B0;&#x6743;&#x9650;&#x6570;&#x636E;&#x3002;</li></ul><p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x5206;&#x6790;&#x548C;&#x4F18;&#x5316;&#x7B56;&#x7565;&#xFF0C;&#x6743;&#x9650;&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#x80FD;&#x591F;&#x5728;&#x590D;&#x6742;&#x4E1A;&#x52A1;&#x573A;&#x666F;&#x4E0B;&#x4FDD;&#x6301;&#x9AD8;&#x6548;&#x548C;&#x7075;&#x6D3B;&#x6027;&#xFF0C;&#x540C;&#x65F6;&#x63D0;&#x4F9B;&#x826F;&#x597D;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[project]]></title><description><![CDATA[<p>&#x4E00;&#x4E2A;&#x8D85;&#x5927;&#x578B;&#x5546;&#x57CE;&#x9879;&#x76EE;&#x7684;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x9700;&#x8981;&#x7EFC;&#x5408;&#x8003;&#x8651;&#x524D;&#x7AEF;&#x3001;&#x540E;&#x7AEF;&#x3001;&#x8FD0;&#x7EF4;&#x3001;&#x5B89;&#x5168;&#x6027;&#x3001;&#x6027;&#x80FD;&#x3001;&#x6269;&#x5C55;&#x6027;&#x7B49;&#x591A;&#x4E2A;&#x65B9;&#x9762;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x4E00;&#x4E2A;</p>]]></description><link>https://pureo.cn/project/</link><guid isPermaLink="false">677e69202a645e0001e88d41</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Wed, 08 Jan 2025 12:02:09 GMT</pubDate><content:encoded><![CDATA[<p>&#x4E00;&#x4E2A;&#x8D85;&#x5927;&#x578B;&#x5546;&#x57CE;&#x9879;&#x76EE;&#x7684;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x9700;&#x8981;&#x7EFC;&#x5408;&#x8003;&#x8651;&#x524D;&#x7AEF;&#x3001;&#x540E;&#x7AEF;&#x3001;&#x8FD0;&#x7EF4;&#x3001;&#x5B89;&#x5168;&#x6027;&#x3001;&#x6027;&#x80FD;&#x3001;&#x6269;&#x5C55;&#x6027;&#x7B49;&#x591A;&#x4E2A;&#x65B9;&#x9762;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x4E00;&#x4E2A;&#x8BE6;&#x7EC6;&#x7684;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x65B9;&#x6848;&#xFF1A;</p><p><strong>1. &#x9879;&#x76EE;&#x9700;&#x6C42;&#x5206;&#x6790;</strong></p><p>&#x2022;	<strong>&#x6838;&#x5FC3;&#x529F;&#x80FD;</strong></p><p>&#x2022;	&#x5546;&#x54C1;&#x5C55;&#x793A;&#x3001;&#x5206;&#x7C7B;&#x548C;&#x641C;&#x7D22;</p><p>&#x2022;	&#x7528;&#x6237;&#x6CE8;&#x518C;&#x3001;&#x767B;&#x5F55;&#x3001;&#x6743;&#x9650;&#x7BA1;&#x7406;</p><p>&#x2022;	&#x8D2D;&#x7269;&#x8F66;&#x3001;&#x8BA2;&#x5355;&#x7BA1;&#x7406;&#x3001;&#x652F;&#x4ED8;&#x529F;&#x80FD;</p><p>&#x2022;	&#x6D3B;&#x52A8;&#x4FC3;&#x9500;&#xFF08;&#x9650;&#x65F6;&#x6298;&#x6263;&#x3001;&#x6EE1;&#x51CF;&#x7B49;&#xFF09;</p><p>&#x2022;	&#x5546;&#x5BB6;&#x540E;&#x53F0;&#x7BA1;&#x7406;&#xFF08;&#x5546;&#x54C1;&#x4E0A;&#x4E0B;&#x67B6;&#x3001;&#x8BA2;&#x5355;&#x7BA1;&#x7406;&#xFF09;</p><p>&#x2022;	<strong>&#x975E;&#x529F;&#x80FD;&#x6027;&#x9700;&#x6C42;</strong></p><p>&#x2022;	&#x9AD8;&#x5E76;&#x53D1;&#x652F;&#x6301;&#xFF1A;&#x81F3;&#x5C11;&#x652F;&#x6301;&#x767E;&#x4E07;&#x7EA7;&#x65E5;&#x6D3B;</p><p>&#x2022;	&#x9AD8;&#x53EF;&#x7528;&#x6027;&#xFF1A;7&#xD7;24 &#x5C0F;&#x65F6;&#x65E0;&#x4E2D;&#x65AD;</p><p>&#x2022;	&#x5B89;&#x5168;&#x6027;&#xFF1A;&#x4FDD;&#x62A4;&#x7528;&#x6237;&#x6570;&#x636E;&#x3001;&#x652F;&#x4ED8;&#x5B89;&#x5168;</p><p>&#x2022;	&#x53EF;&#x6269;&#x5C55;&#x6027;&#xFF1A;&#x65B9;&#x4FBF;&#x529F;&#x80FD;&#x8FED;&#x4EE3;&#x548C;&#x6269;&#x5C55;</p><p>&#x2022;	&#x6027;&#x80FD;&#xFF1A;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#x63A7;&#x5236;&#x5728; 300ms &#x5185;</p><p><br></p><p><strong>2. &#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x6574;&#x4F53;&#x601D;&#x8DEF;</strong></p><p><br></p><p>&#x91C7;&#x7528;&#x5206;&#x5C42;&#x3001;&#x5206;&#x5E03;&#x5F0F;&#x3001;&#x9AD8;&#x53EF;&#x7528;&#x7684;&#x5FAE;&#x670D;&#x52A1;&#x67B6;&#x6784;&#xFF0C;&#x901A;&#x8FC7; DevOps &#x548C;&#x4E91;&#x539F;&#x751F;&#x6280;&#x672F;&#x652F;&#x6301;&#x9AD8;&#x6548;&#x8FD0;&#x7EF4;&#x548C;&#x5F39;&#x6027;&#x6269;&#x5C55;&#x3002;</p><p><br></p><p><strong>2.1 &#x6280;&#x672F;&#x6808;</strong></p><p>&#x2022;	<strong>&#x524D;&#x7AEF;</strong>&#xFF1A;</p><p>&#x2022;	&#x6846;&#x67B6;&#xFF1A;React + Next.js &#x6216; Vue3 + Nuxt.js&#xFF08;&#x652F;&#x6301;&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#x548C; SEO&#xFF09;</p><p>&#x2022;	&#x72B6;&#x6001;&#x7BA1;&#x7406;&#xFF1A;Redux Toolkit &#x6216; Pinia</p><p>&#x2022;	&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#xFF1A;Vite</p><p>&#x2022;	&#x63A5;&#x53E3;&#x901A;&#x4FE1;&#xFF1A;GraphQL &#x6216; REST + Axios</p><p>&#x2022;	<strong>&#x540E;&#x7AEF;</strong>&#xFF1A;</p><p>&#x2022;	&#x4E3B;&#x6846;&#x67B6;&#xFF1A;Spring Boot / NestJS</p><p>&#x2022;	&#x5FAE;&#x670D;&#x52A1;&#xFF1A;&#x4F7F;&#x7528; Spring Cloud / K8s &#x90E8;&#x7F72;&#x591A;&#x4E2A;&#x72EC;&#x7ACB;&#x670D;&#x52A1;</p><p>&#x2022;	&#x6570;&#x636E;&#x5C42;&#xFF1A;MySQL&#xFF08;&#x5173;&#x7CFB;&#x578B;&#x6570;&#x636E;&#x5E93;&#xFF09; + MongoDB&#xFF08;&#x5546;&#x54C1;&#x8BE6;&#x60C5;&#x3001;&#x65E5;&#x5FD7;&#x7B49;&#x975E;&#x7ED3;&#x6784;&#x5316;&#x6570;&#x636E;&#xFF09;</p><p>&#x2022;	&#x7F13;&#x5B58;&#xFF1A;Redis&#xFF08;&#x7528;&#x6237;&#x4F1A;&#x8BDD;&#x3001;&#x8D2D;&#x7269;&#x8F66;&#x3001;&#x79D2;&#x6740;&#x6D3B;&#x52A8;&#x7B49;&#xFF09;</p><p>&#x2022;	&#x641C;&#x7D22;&#x5F15;&#x64CE;&#xFF1A;Elasticsearch&#xFF08;&#x652F;&#x6301;&#x5168;&#x6587;&#x641C;&#x7D22;&#xFF09;</p><p>&#x2022;	&#x6D88;&#x606F;&#x961F;&#x5217;&#xFF1A;RabbitMQ / Kafka&#xFF08;&#x5904;&#x7406;&#x5F02;&#x6B65;&#x4EFB;&#x52A1;&#xFF0C;&#x5982;&#x8BA2;&#x5355;&#x901A;&#x77E5;&#xFF09;</p><p>&#x2022;	<strong>&#x57FA;&#x7840;&#x8BBE;&#x65BD;</strong>&#xFF1A;</p><p>&#x2022;	&#x5BB9;&#x5668;&#x5316;&#xFF1A;Docker + Kubernetes</p><p>&#x2022;	&#x6570;&#x636E;&#x5E93;&#x5206;&#x5E93;&#x5206;&#x8868;&#xFF1A;MyCAT &#x6216; ShardingSphere</p><p>&#x2022;	API &#x7F51;&#x5173;&#xFF1A;Kong / Nginx</p><p>&#x2022;	&#x76D1;&#x63A7;&#x4E0E;&#x544A;&#x8B66;&#xFF1A;Prometheus + Grafana + ELK</p><p>&#x2022;	CI/CD&#xFF1A;Jenkins &#x6216; GitHub Actions</p><p><br></p><p><strong>3. &#x8BE6;&#x7EC6;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;</strong></p><p><br></p><p><strong>3.1 &#x524D;&#x7AEF;&#x67B6;&#x6784;</strong></p><p>&#x2022;	<strong>&#x591A;&#x7AEF;&#x9002;&#x914D;</strong>&#xFF1A;</p><p>&#x2022;	Web&#xFF1A;&#x54CD;&#x5E94;&#x5F0F;&#x5E03;&#x5C40;</p><p>&#x2022;	&#x79FB;&#x52A8;&#x7AEF;&#xFF1A;PWA + React Native/Flutter &#x5F00;&#x53D1; App</p><p>&#x2022;	&#x5C0F;&#x7A0B;&#x5E8F;&#xFF1A;&#x57FA;&#x4E8E; uni-app &#x6216; Taro &#x5B9E;&#x73B0;</p><p>&#x2022;	<strong>&#x6A21;&#x5757;&#x5212;&#x5206;</strong>&#xFF1A;</p><p>&#x2022;	&#x9996;&#x9875;&#x6A21;&#x5757;&#xFF1A;&#x52A8;&#x6001;&#x63A8;&#x8350;&#x3001;&#x70ED;&#x95E8;&#x5546;&#x54C1;</p><p>&#x2022;	&#x5206;&#x7C7B;&#x6A21;&#x5757;&#xFF1A;&#x57FA;&#x4E8E;&#x6811;&#x7ED3;&#x6784;&#x7684;&#x5206;&#x7C7B;&#x5BFC;&#x822A;</p><p>&#x2022;	&#x641C;&#x7D22;&#x6A21;&#x5757;&#xFF1A;&#x652F;&#x6301;&#x5173;&#x952E;&#x5B57;&#x8054;&#x60F3;&#x3001;&#x7ED3;&#x679C;&#x8FC7;&#x6EE4;</p><p>&#x2022;	&#x7528;&#x6237;&#x6A21;&#x5757;&#xFF1A;&#x767B;&#x5F55;&#x3001;&#x6CE8;&#x518C;&#x3001;&#x8BA2;&#x5355;&#x5386;&#x53F2;</p><p>&#x2022;	&#x8D2D;&#x7269;&#x8F66;&#x548C;&#x652F;&#x4ED8;&#x6A21;&#x5757;&#xFF1A;&#x8BA2;&#x5355;&#x786E;&#x8BA4;&#x3001;&#x4F18;&#x60E0;&#x5238;&#x5E94;&#x7528;&#x3001;&#x652F;&#x4ED8;&#x7ED3;&#x679C;&#x56DE;&#x8C03;</p><p><br></p><p><strong>3.2 &#x540E;&#x7AEF;&#x67B6;&#x6784;</strong></p><p>&#x2022;	<strong>&#x670D;&#x52A1;&#x5212;&#x5206;</strong>&#xFF1A;</p><p>&#x2022;	&#x7528;&#x6237;&#x670D;&#x52A1;&#xFF1A;&#x7528;&#x6237;&#x6CE8;&#x518C;&#x3001;&#x767B;&#x5F55;&#x3001;&#x6743;&#x9650;&#x7BA1;&#x7406;&#xFF08;RBAC &#x6A21;&#x578B;&#xFF09;</p><p>&#x2022;	&#x5546;&#x54C1;&#x670D;&#x52A1;&#xFF1A;&#x5546;&#x54C1;&#x4E0A;&#x4E0B;&#x67B6;&#x3001;&#x5E93;&#x5B58;&#x7BA1;&#x7406;</p><p>&#x2022;	&#x8BA2;&#x5355;&#x670D;&#x52A1;&#xFF1A;&#x8BA2;&#x5355;&#x521B;&#x5EFA;&#x3001;&#x652F;&#x4ED8;&#x56DE;&#x8C03;&#x3001;&#x7269;&#x6D41;&#x72B6;&#x6001;</p><p>&#x2022;	&#x641C;&#x7D22;&#x670D;&#x52A1;&#xFF1A;&#x57FA;&#x4E8E; Elasticsearch &#x5B9E;&#x73B0;</p><p>&#x2022;	&#x8425;&#x9500;&#x670D;&#x52A1;&#xFF1A;&#x4F18;&#x60E0;&#x5238;&#x3001;&#x4FC3;&#x9500;&#x6D3B;&#x52A8;</p><p>&#x2022;	&#x652F;&#x4ED8;&#x670D;&#x52A1;&#xFF1A;&#x652F;&#x6301;&#x7B2C;&#x4E09;&#x65B9;&#x652F;&#x4ED8;&#xFF08;&#x652F;&#x4ED8;&#x5B9D;&#x3001;&#x5FAE;&#x4FE1;&#x652F;&#x4ED8;&#x3001;PayPal&#xFF09;</p><p>&#x2022;	&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#xFF1A;&#x64CD;&#x4F5C;&#x65E5;&#x5FD7;&#x3001;&#x5BA1;&#x8BA1;&#x65E5;&#x5FD7;</p><p>&#x2022;	&#x6D88;&#x606F;&#x670D;&#x52A1;&#xFF1A;&#x8BA2;&#x5355;&#x901A;&#x77E5;&#x3001;&#x77ED;&#x4FE1;/&#x90AE;&#x4EF6;&#x670D;&#x52A1;</p><p>&#x2022;	<strong>&#x5206;&#x5E03;&#x5F0F;&#x8BBE;&#x8BA1;</strong>&#xFF1A;</p><p>&#x2022;	<strong>&#x6CE8;&#x518C;&#x4E2D;&#x5FC3;</strong>&#xFF1A;Eureka / Consul / etcd</p><p>&#x2022;	<strong>&#x914D;&#x7F6E;&#x4E2D;&#x5FC3;</strong>&#xFF1A;Nacos / Apollo</p><p>&#x2022;	<strong>&#x5206;&#x5E03;&#x5F0F;&#x4E8B;&#x52A1;</strong>&#xFF1A;Seata&#xFF08;&#x89E3;&#x51B3;&#x8BA2;&#x5355;&#x4E0E;&#x5E93;&#x5B58;&#x4E00;&#x81F4;&#x6027;&#x95EE;&#x9898;&#xFF09;</p><p><br></p><p><strong>3.3 &#x6570;&#x636E;&#x67B6;&#x6784;</strong></p><p>&#x2022;	<strong>&#x4E3B;&#x6570;&#x636E;&#x5E93;</strong>&#xFF1A;</p><p>&#x2022;	&#x7528;&#x6237;&#x3001;&#x8BA2;&#x5355;&#xFF1A;MySQL&#xFF0C;&#x5782;&#x76F4;&#x62C6;&#x5206; + &#x6C34;&#x5E73;&#x5206;&#x5E93;&#x5206;&#x8868;</p><p>&#x2022;	&#x5546;&#x54C1;&#x8BE6;&#x60C5;&#xFF1A;MongoDB&#xFF0C;&#x652F;&#x6301;&#x5927;&#x6570;&#x636E;&#x5B58;&#x50A8;</p><p>&#x2022;	<strong>&#x7F13;&#x5B58;&#x5C42;</strong>&#xFF1A;</p><p>&#x2022;	Redis&#xFF1A;&#x7F13;&#x5B58;&#x5546;&#x54C1;&#x8BE6;&#x60C5;&#x3001;&#x7528;&#x6237;&#x4F1A;&#x8BDD;&#x3001;&#x6D3B;&#x52A8;&#x6570;&#x636E;</p><p>&#x2022;	&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF1A;LRU &#x6DD8;&#x6C70;&#x673A;&#x5236; + &#x53CC;&#x5199;&#x4E00;&#x81F4;&#x6027;&#x7B56;&#x7565;</p><p>&#x2022;	<strong>&#x641C;&#x7D22;&#x5C42;</strong>&#xFF1A;</p><p>&#x2022;	Elasticsearch&#xFF1A;&#x5546;&#x54C1;&#x7D22;&#x5F15;&#x4E0E;&#x641C;&#x7D22;</p><p><br></p><p><strong>3.4 &#x8FD0;&#x7EF4;&#x67B6;&#x6784;</strong></p><p>&#x2022;	<strong>&#x5BB9;&#x5668;&#x5316;&#x90E8;&#x7F72;</strong>&#xFF1A;</p><p>&#x2022;	&#x4F7F;&#x7528; Docker &#x5C01;&#x88C5;&#x670D;&#x52A1;&#xFF0C;Kubernetes &#x5B9E;&#x73B0;&#x670D;&#x52A1;&#x7F16;&#x6392;&#x3001;&#x5F39;&#x6027;&#x4F38;&#x7F29;</p><p>&#x2022;	<strong>&#x76D1;&#x63A7;&#x4E0E;&#x544A;&#x8B66;</strong>&#xFF1A;</p><p>&#x2022;	Prometheus &#x76D1;&#x63A7;&#x670D;&#x52A1;&#x72B6;&#x6001;</p><p>&#x2022;	Grafana &#x5C55;&#x793A;&#x7CFB;&#x7EDF;&#x6027;&#x80FD;&#x6307;&#x6807;</p><p>&#x2022;	ELK &#x5206;&#x6790;&#x65E5;&#x5FD7;&#xFF08;Elastic + Logstash + Kibana&#xFF09;</p><p>&#x2022;	<strong>&#x9AD8;&#x53EF;&#x7528;&#x8BBE;&#x8BA1;</strong>&#xFF1A;</p><p>&#x2022;	&#x6570;&#x636E;&#x5E93;&#x4E3B;&#x4ECE;&#x540C;&#x6B65; + &#x8BFB;&#x5199;&#x5206;&#x79BB;</p><p>&#x2022;	Redis &#x54E8;&#x5175;&#x6A21;&#x5F0F;&#x6216;&#x96C6;&#x7FA4;&#x6A21;&#x5F0F;</p><p>&#x2022;	&#x670D;&#x52A1;&#x9650;&#x6D41;&#x4E0E;&#x964D;&#x7EA7;&#xFF1A;Hystrix &#x6216; Sentinel</p><p>&#x2022;	<strong>CDN &#x52A0;&#x901F;</strong>&#xFF1A;</p><p>&#x2022;	&#x9759;&#x6001;&#x8D44;&#x6E90;&#x901A;&#x8FC7; CDN &#x5206;&#x53D1;&#xFF0C;&#x51CF;&#x8F7B;&#x670D;&#x52A1;&#x5668;&#x538B;&#x529B;</p><p>&#x2022;	&#x52A8;&#x6001;&#x8BF7;&#x6C42;&#x901A;&#x8FC7; Nginx &#x505A;&#x8D1F;&#x8F7D;&#x5747;&#x8861;</p><p><br></p><p><strong>3.5 &#x5B89;&#x5168;&#x6027;&#x8BBE;&#x8BA1;</strong></p><p>&#x2022;	&#x6570;&#x636E;&#x4F20;&#x8F93;&#xFF1A;&#x5168;&#x7AD9; HTTPS</p><p>&#x2022;	&#x7528;&#x6237;&#x6570;&#x636E;&#xFF1A;&#x5BC6;&#x7801;&#x52A0;&#x5BC6;&#xFF08;BCrypt&#xFF09;+ &#x654F;&#x611F;&#x4FE1;&#x606F;&#x8131;&#x654F;</p><p>&#x2022;	API &#x5B89;&#x5168;&#xFF1A;JWT &#x9274;&#x6743; + &#x7B7E;&#x540D;&#x6821;&#x9A8C;</p><p>&#x2022;	&#x9632;&#x5237;&#x7B56;&#x7565;&#xFF1A;&#x9A8C;&#x8BC1;&#x7801; + &#x9650;&#x6D41;</p><p>&#x2022;	&#x652F;&#x4ED8;&#x5B89;&#x5168;&#xFF1A;&#x9632;&#x6B62;&#x91CD;&#x653E;&#x653B;&#x51FB;&#xFF0C;&#x4F7F;&#x7528;&#x5E42;&#x7B49;&#x6027;&#x8BBE;&#x8BA1;</p><p><br></p><p><strong>4. &#x5F00;&#x53D1;&#x4E0E;&#x8FED;&#x4EE3;&#x6D41;&#x7A0B;</strong></p><p>&#x2022;	<strong>&#x654F;&#x6377;&#x5F00;&#x53D1;</strong>&#xFF1A;</p><p>&#x2022;	&#x4F7F;&#x7528; Scrum &#x65B9;&#x6CD5;&#xFF0C;&#x6BCF;&#x4E24;&#x5468;&#x4E3A;&#x4E00;&#x4E2A;&#x8FED;&#x4EE3;&#x5468;&#x671F;</p><p>&#x2022;	&#x4EA7;&#x54C1;&#x8BBE;&#x8BA1;&#x3001;&#x5F00;&#x53D1;&#x3001;&#x6D4B;&#x8BD5;&#x3001;&#x8FD0;&#x7EF4;&#x65E0;&#x7F1D;&#x8854;&#x63A5;</p><p>&#x2022;	<strong>CI/CD &#x81EA;&#x52A8;&#x5316;</strong>&#xFF1A;</p><p>&#x2022;	Git &#x7BA1;&#x7406;&#x4EE3;&#x7801;&#x5206;&#x652F;&#xFF0C;Jenkins &#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72;</p><p>&#x2022;	&#x7070;&#x5EA6;&#x53D1;&#x5E03; + A/B &#x6D4B;&#x8BD5;&#xFF0C;&#x964D;&#x4F4E;&#x4E0A;&#x7EBF;&#x98CE;&#x9669;</p><p><br></p><p><strong>5. &#x9AD8;&#x5E76;&#x53D1;&#x573A;&#x666F;&#x4F18;&#x5316;</strong></p><p>&#x2022;	<strong>&#x79D2;&#x6740;&#x573A;&#x666F;</strong>&#xFF1A;</p><p>&#x2022;	&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x5546;&#x54C1;&#x5E93;&#x5B58;&#x5230; Redis</p><p>&#x2022;	&#x8BF7;&#x6C42;&#x9884;&#x5904;&#x7406;&#xFF1A;&#x79D2;&#x6740;&#x8BA2;&#x5355;&#x901A;&#x8FC7; Kafka &#x5F02;&#x6B65;&#x5904;&#x7406;</p><p>&#x2022;	&#x6570;&#x636E;&#x5E93;&#x5C42;&#x4E50;&#x89C2;&#x9501;&#xFF1A;&#x9632;&#x6B62;&#x8D85;&#x5356;</p><p>&#x2022;	<strong>&#x641C;&#x7D22;&#x4F18;&#x5316;</strong>&#xFF1A;</p><p>&#x2022;	&#x70ED;&#x95E8;&#x5546;&#x54C1;&#x7F13;&#x5B58;</p><p>&#x2022;	&#x67E5;&#x8BE2;&#x5206;&#x9875;&#x4E0E;&#x7ED3;&#x679C;&#x7F13;&#x5B58;</p><p>&#x2022;	<strong>&#x6C34;&#x5E73;&#x6269;&#x5C55;</strong>&#xFF1A;</p><p>&#x2022;	&#x6570;&#x636E;&#x5E93;&#x3001;&#x7F13;&#x5B58;&#x670D;&#x52A1;&#x3001;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x5747;&#x652F;&#x6301;&#x6A2A;&#x5411;&#x6269;&#x5C55;</p><p><br></p><p>&#x5982;&#x679C;&#x6709;&#x66F4;&#x5177;&#x4F53;&#x7684;&#x9700;&#x6C42;&#x6216;&#x7EA6;&#x675F;&#x6761;&#x4EF6;&#xFF0C;&#x6211;&#x53EF;&#x4EE5;&#x8FDB;&#x4E00;&#x6B65;&#x4F18;&#x5316;&#x7EC6;&#x8282;&#xFF01;&#x8FD9;&#x5957;&#x65B9;&#x6848;&#x662F;&#x5426;&#x7B26;&#x5408;&#x4F60;&#x7684;&#x9884;&#x671F;&#xFF1F;</p>]]></content:encoded></item><item><title><![CDATA[open]]></title><description><![CDATA[<h3 id="%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1">&#x9879;&#x76EE;&#x67B6;&#x6784;&#x4E0E;&#x8BBE;&#x8BA1;</h3><h4 id="%E8%AF%B7%E6%8F%8F%E8%BF%B0%E4%B8%80%E4%B8%8B%E4%BD%A0%E5%8F%82%E4%B8%8E%E8%BF%87%E7%9A%84%E4%B8%80%E4%B8%AA%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE%EF%BC%8C%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%B6%E6%9E%84%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E7%9A%84%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E5%8F%AF%E6%89%A9%E5%B1%95%E6%80%A7%E5%92%8C%E5%8F%AF%E7%BB%B4%E6%8A%A4%E6%80%A7%EF%BC%9F">&#x8BF7;&#x63CF;&#x8FF0;&#x4E00;&#x4E0B;&#x4F60;&#x53C2;&#x4E0E;&#x8FC7;&#x7684;&#x4E00;&#x4E2A;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#xFF0C;&#x9879;&#x76EE;&#x7684;&#x67B6;&#x6784;&#x662F;&#x5982;&#x4F55;&#x8BBE;&#x8BA1;&#x7684;&#xFF1F;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x53EF;&#x6269;&#x5C55;&#x6027;&#x548C;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#xFF1F;</h4>]]></description><link>https://pureo.cn/open/</link><guid isPermaLink="false">677bc03191ad920001d1f39c</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Mon, 06 Jan 2025 11:36:34 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1">&#x9879;&#x76EE;&#x67B6;&#x6784;&#x4E0E;&#x8BBE;&#x8BA1;</h3><h4 id="%E8%AF%B7%E6%8F%8F%E8%BF%B0%E4%B8%80%E4%B8%8B%E4%BD%A0%E5%8F%82%E4%B8%8E%E8%BF%87%E7%9A%84%E4%B8%80%E4%B8%AA%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE%EF%BC%8C%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%B6%E6%9E%84%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E7%9A%84%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E5%8F%AF%E6%89%A9%E5%B1%95%E6%80%A7%E5%92%8C%E5%8F%AF%E7%BB%B4%E6%8A%A4%E6%80%A7%EF%BC%9F">&#x8BF7;&#x63CF;&#x8FF0;&#x4E00;&#x4E0B;&#x4F60;&#x53C2;&#x4E0E;&#x8FC7;&#x7684;&#x4E00;&#x4E2A;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#xFF0C;&#x9879;&#x76EE;&#x7684;&#x67B6;&#x6784;&#x662F;&#x5982;&#x4F55;&#x8BBE;&#x8BA1;&#x7684;&#xFF1F;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x53EF;&#x6269;&#x5C55;&#x6027;&#x548C;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#xFF1F;</h4><p>&#x5728;&#x6211;&#x53C2;&#x4E0E;&#x7684;&#x4E00;&#x4E2A;&#x7535;&#x5546;&#x5E73;&#x53F0;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x91C7;&#x7528;&#x4E86;&#x6A21;&#x5757;&#x5316;&#x3001;&#x7EC4;&#x4EF6;&#x5316;&#x7684;&#x524D;&#x7AEF;&#x67B6;&#x6784;&#xFF0C;&#x5E76;&#x4E14;&#x901A;&#x8FC7;&#x5FAE;&#x524D;&#x7AEF;&#x67B6;&#x6784;&#xFF08;Micro Frontends&#xFF09;&#x5B9E;&#x73B0;&#x4E86;&#x8DE8;&#x56E2;&#x961F;&#x7684;&#x72EC;&#x7ACB;&#x5F00;&#x53D1;&#x4E0E;&#x90E8;&#x7F72;&#x3002;&#x9879;&#x76EE;&#x7684;&#x67B6;&#x6784;&#x8BBE;&#x8BA1;&#x4E3B;&#x8981;&#x8003;&#x8651;&#x4E86;&#x4EE5;&#x4E0B;&#x51E0;&#x70B9;&#xFF1A;</p><p><strong>&#x7EC4;&#x4EF6;&#x5316;&#x8BBE;&#x8BA1;</strong>&#xFF1A;&#x6240;&#x6709;&#x9875;&#x9762;&#x90FD;&#x7531;&#x4E00;&#x7EC4;&#x590D;&#x7528;&#x7684; UI &#x7EC4;&#x4EF6;&#x6784;&#x6210;&#xFF0C;&#x901A;&#x8FC7; React &#x6216; Vue &#x7EC4;&#x4EF6;&#x5316;&#x5F00;&#x53D1;&#x3002;&#x7EC4;&#x4EF6;&#x4E4B;&#x95F4;&#x901A;&#x8FC7;&#x4E8B;&#x4EF6;&#x4F20;&#x9012;&#x6216;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x5E93;&#xFF08;&#x5982; Redux &#x6216; Vuex&#xFF09;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x5171;&#x4EAB;&#xFF0C;&#x786E;&#x4FDD;&#x9875;&#x9762;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x548C;&#x6A21;&#x5757;&#x95F4;&#x89E3;&#x8026;&#x3002;</p><p><strong>&#x8DEF;&#x7531;&#x7BA1;&#x7406;</strong>&#xFF1A;&#x91C7;&#x7528;&#x52A8;&#x6001;&#x8DEF;&#x7531;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x6839;&#x636E;&#x6743;&#x9650;&#x548C;&#x9875;&#x9762;&#x7C7B;&#x578B;&#x52A0;&#x8F7D;&#x76F8;&#x5E94;&#x7684;&#x8DEF;&#x7531;&#x6A21;&#x5757;&#xFF0C;&#x4FDD;&#x8BC1;&#x4E86;&#x7075;&#x6D3B;&#x6027;&#x3002;</p><p><strong>&#x72B6;&#x6001;&#x7BA1;&#x7406;</strong>&#xFF1A;&#x4F7F;&#x7528; Redux &#x6216; Vuex &#x8FDB;&#x884C;&#x5168;&#x5C40;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x591A;&#x9875;&#x9762;&#x4E4B;&#x95F4;&#x5171;&#x4EAB;&#x72B6;&#x6001;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x591A;&#x6B21;&#x8BF7;&#x6C42;&#x548C;&#x72B6;&#x6001;&#x4E0D;&#x4E00;&#x81F4;&#x95EE;&#x9898;&#x3002;</p><p><strong>&#x5FAE;&#x524D;&#x7AEF;&#x67B6;&#x6784;</strong>&#xFF1A;&#x901A;&#x8FC7; Webpack Module Federation &#x6216; Single-SPA &#x5B9E;&#x73B0;&#x5FAE;&#x524D;&#x7AEF;&#x67B6;&#x6784;&#xFF0C;&#x6BCF;&#x4E2A;&#x5B50;&#x5E94;&#x7528;&#x72EC;&#x7ACB;&#x5F00;&#x53D1;&#x548C;&#x90E8;&#x7F72;&#xFF0C;&#x51CF;&#x5C11;&#x4E86;&#x56E2;&#x961F;&#x95F4;&#x7684;&#x8026;&#x5408;&#x5EA6;&#xFF0C;&#x63D0;&#x9AD8;&#x4E86;&#x9879;&#x76EE;&#x7684;&#x53EF;&#x6269;&#x5C55;&#x6027;&#x3002;</p><p><strong>&#x6A21;&#x5757;&#x5316;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x5408;&#x7406;&#x5212;&#x5206;&#x4E1A;&#x52A1;&#x6A21;&#x5757;&#xFF0C;&#x5C06;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x548C; UI &#x5C55;&#x793A;&#x5206;&#x79BB;&#xFF0C;&#x4FBF;&#x4E8E;&#x672A;&#x6765;&#x6839;&#x636E;&#x9700;&#x6C42;&#x8FDB;&#x884C;&#x6269;&#x5C55;&#x6216;&#x91CD;&#x6784;&#x3002;</p><h4 id="%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E5%8F%AF%E6%89%A9%E5%B1%95%E6%80%A7%E5%92%8C%E5%8F%AF%E7%BB%B4%E6%8A%A4%E6%80%A7%EF%BC%9F">&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x53EF;&#x6269;&#x5C55;&#x6027;&#x548C;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#xFF1F;</h4><p><strong>&#x4EE3;&#x7801;&#x89C4;&#x8303;</strong>&#xFF1A;&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x7EDF;&#x4E00;&#x4EE3;&#x7801;&#x89C4;&#x8303;&#xFF0C;&#x4F7F;&#x7528; ESLint&#x3001;Prettier &#x7B49;&#x5DE5;&#x5177;&#x81EA;&#x52A8;&#x5316;&#x683C;&#x5F0F;&#x5316;&#x548C;&#x68C0;&#x67E5;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x3002;</p><p><strong>&#x6587;&#x6863;&#x548C;&#x6CE8;&#x91CA;</strong>&#xFF1A;&#x7F16;&#x5199;&#x5B8C;&#x5584;&#x7684;&#x6587;&#x6863;&#x548C;&#x4EE3;&#x7801;&#x6CE8;&#x91CA;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x590D;&#x6742;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x548C;&#x516C;&#x7528;&#x5DE5;&#x5177;&#x7C7B;&#x4E0A;&#xFF0C;&#x4FBF;&#x4E8E;&#x56E2;&#x961F;&#x6210;&#x5458;&#x7406;&#x89E3;&#x548C;&#x7EF4;&#x62A4;&#x3002;</p><p><strong>&#x81EA;&#x52A8;&#x5316;&#x6D4B;&#x8BD5;</strong>&#xFF1A;&#x901A;&#x8FC7; Jest &#x548C; Enzyme &#x7B49;&#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x548C;&#x96C6;&#x6210;&#x6D4B;&#x8BD5;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x5728;&#x6269;&#x5C55;&#x65F6;&#x4E0D;&#x5F71;&#x54CD;&#x73B0;&#x6709;&#x529F;&#x80FD;&#x3002;</p><p><strong>CI/CD &#x96C6;&#x6210;</strong>&#xFF1A;&#x7ED3;&#x5408; GitLab CI &#x6216; Jenkins&#xFF0C;&#x642D;&#x5EFA;&#x81EA;&#x52A8;&#x5316;&#x6784;&#x5EFA;&#x548C;&#x90E8;&#x7F72;&#x6D41;&#x7A0B;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x5728;&#x5F00;&#x53D1;&#x3001;&#x6D4B;&#x8BD5;&#x548C;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E2D;&#x7684;&#x7A33;&#x5B9A;&#x6027;&#x3002;</p><h4 id="%E5%9C%A8%E9%A1%B9%E7%9B%AE%E4%B8%AD%EF%BC%8C%E4%BD%A0%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E6%A8%A1%E5%9D%97%E5%8C%96%E5%BC%80%E5%8F%91%E7%9A%84%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E4%BB%A3%E7%A0%81%E7%9A%84%E5%A4%8D%E7%94%A8%E6%80%A7%EF%BC%9F">&#x5728;&#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x4F60;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x6A21;&#x5757;&#x5316;&#x5F00;&#x53D1;&#x7684;&#xFF1F;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x4EE3;&#x7801;&#x7684;&#x590D;&#x7528;&#x6027;&#xFF1F;</h4><p><strong>&#x529F;&#x80FD;&#x6A21;&#x5757;&#x5212;&#x5206;</strong>&#xFF1A;&#x6839;&#x636E;&#x9879;&#x76EE;&#x9700;&#x6C42;&#x548C;&#x4E1A;&#x52A1;&#x573A;&#x666F;&#xFF0C;&#x5C06;&#x9879;&#x76EE;&#x62C6;&#x5206;&#x6210;&#x591A;&#x4E2A;&#x529F;&#x80FD;&#x6A21;&#x5757;&#xFF0C;&#x6BCF;&#x4E2A;&#x6A21;&#x5757;&#x72EC;&#x7ACB;&#x5F00;&#x53D1;&#xFF0C;&#x907F;&#x514D;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x7684;&#x53D8;&#x52A8;&#x5F71;&#x54CD;&#x5230;&#x5176;&#x4ED6;&#x6A21;&#x5757;&#x3002;</p><p><strong>&#x7EC4;&#x4EF6;&#x590D;&#x7528;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x521B;&#x5EFA;&#x901A;&#x7528;&#x7684; UI &#x7EC4;&#x4EF6;&#x5E93;&#xFF08;&#x5982;&#x6309;&#x94AE;&#x3001;&#x8F93;&#x5165;&#x6846;&#x3001;&#x5361;&#x7247;&#x7B49;&#xFF09;&#xFF0C;&#x4F7F;&#x5F97;&#x591A;&#x4E2A;&#x9875;&#x9762;&#x53EF;&#x4EE5;&#x590D;&#x7528;&#x8FD9;&#x4E9B;&#x7EC4;&#x4EF6;&#xFF0C;&#x907F;&#x514D;&#x91CD;&#x590D;&#x5F00;&#x53D1;&#x3002;</p><p><strong>&#x5DE5;&#x5177;&#x7C7B;&#x4E0E;&#x670D;&#x52A1;</strong>&#xFF1A;&#x5C06;&#x516C;&#x5171;&#x7684;&#x903B;&#x8F91;&#xFF08;&#x5982;&#x8BF7;&#x6C42;&#x5C01;&#x88C5;&#x3001;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x5316;&#x7B49;&#xFF09;&#x63D0;&#x53D6;&#x5230;&#x5DE5;&#x5177;&#x51FD;&#x6570;&#x6216;&#x670D;&#x52A1;&#x7C7B;&#x4E2D;&#xFF0C;&#x4FBF;&#x4E8E;&#x4E0D;&#x540C;&#x6A21;&#x5757;&#x590D;&#x7528;&#x3002;</p><p><strong>&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x4E0E;&#x61D2;&#x52A0;&#x8F7D;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x548C;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x51CF;&#x5C11;&#x521D;&#x59CB;&#x5305;&#x5927;&#x5C0F;&#xFF0C;&#x63D0;&#x9AD8;&#x4EE3;&#x7801;&#x52A0;&#x8F7D;&#x6027;&#x80FD;&#xFF0C;&#x4E5F;&#x786E;&#x4FDD;&#x4E86;&#x5728;&#x529F;&#x80FD;&#x6A21;&#x5757;&#x6269;&#x5C55;&#x65F6;&#x4E0D;&#x5F71;&#x54CD;&#x6027;&#x80FD;&#x3002;</p><h4 id="%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%EF%BC%9F%E8%AF%B7%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8B%E5%B8%B8%E7%94%A8%E7%9A%84%E8%B7%A8%E5%9F%9F%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E3%80%82">&#x5982;&#x4F55;&#x5904;&#x7406;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x4E2D;&#x7684;&#x8DE8;&#x57DF;&#x95EE;&#x9898;&#xFF1F;&#x8BF7;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x5E38;&#x7528;&#x7684;&#x8DE8;&#x57DF;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</h4><p>&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x4E2D;&#x7684;&#x8DE8;&#x57DF;&#x95EE;&#x9898;&#x901A;&#x5E38;&#x662F;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x4E0B;&#xFF0C;&#x9650;&#x5236;&#x4E86;&#x4E0D;&#x540C;&#x57DF;&#x4E4B;&#x95F4;&#x7684;&#x8D44;&#x6E90;&#x8BF7;&#x6C42;&#x3002;&#x5E38;&#x89C1;&#x7684;&#x8DE8;&#x57DF;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x6709;&#xFF1A;</p><p><strong>CORS&#xFF08;Cross-Origin Resource Sharing&#xFF09;</strong>&#xFF1A;<br>&#x670D;&#x52A1;&#x7AEF;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; HTTP &#x5934;&#x90E8;&#xFF08;&#x5982; <code>Access-Control-Allow-Origin</code>&#xFF09;&#x6765;&#x5141;&#x8BB8;&#x6307;&#x5B9A;&#x7684;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;&#x3002;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x7684;&#x54CD;&#x5E94;&#x5934;&#x4E2D;&#x6DFB;&#x52A0;&#x76F8;&#x5E94;&#x7684;&#x8DE8;&#x57DF;&#x5B57;&#x6BB5;&#xFF1A;</p><pre><code class="language-javascript">res.setHeader(&apos;Access-Control-Allow-Origin&apos;, &apos;*&apos;);
</code></pre><p><strong>JSONP</strong>&#xFF1A;<br>&#x901A;&#x8FC7;&#x52A8;&#x6001;&#x521B;&#x5EFA; <code>&lt;script&gt;</code> &#x6807;&#x7B7E;&#x6765;&#x8FDB;&#x884C;&#x8DE8;&#x57DF;&#x8BF7;&#x6C42;&#x3002;&#x56E0;&#x4E3A; <code>&lt;script&gt;</code> &#x6807;&#x7B7E;&#x4E0D;&#x53D7;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x53EA;&#x80FD;&#x7528;&#x4E8E; GET &#x8BF7;&#x6C42;&#x3002;</p><p><strong>&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</strong>&#xFF1A;<br>&#x5728;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x5982; Webpack Dev Server &#x7684; <code>proxy</code> &#x914D;&#x7F6E;&#xFF09;&#x6765;&#x8F6C;&#x53D1;&#x8BF7;&#x6C42;&#xFF0C;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x8DE8;&#x57DF;&#x3002;</p><p><strong>PostMessage</strong>&#xFF1A;<br>&#x5F53;&#x8DE8;&#x57DF;&#x7684;&#x4E24;&#x4E2A;&#x9875;&#x9762;&#x95F4;&#x6709;&#x901A;&#x4FE1;&#x9700;&#x6C42;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>window.postMessage()</code> &#x6765;&#x5B9E;&#x73B0;&#x8DE8;&#x7A97;&#x53E3;&#x6216;&#x8DE8;&#x57DF;&#x7684;&#x901A;&#x4FE1;&#x3002;</p><p><strong>WebSocket</strong>&#xFF1A;<br>WebSocket &#x4E0D;&#x53D7;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x8DE8;&#x57DF;&#x7684;&#x53CC;&#x5411;&#x901A;&#x4FE1;&#x3002;</p><h3 id="%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B%E4%B8%8E%E5%B7%A5%E5%85%B7">&#x5F00;&#x53D1;&#x6D41;&#x7A0B;&#x4E0E;&#x5DE5;&#x5177;</h3><h4 id="%E4%BD%A0%E5%B9%B3%E6%97%B6%E4%BD%BF%E7%94%A8%E5%93%AA%E4%BA%9B%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-webpack-%E6%88%96%E5%85%B6%E4%BB%96%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E6%9D%A5%E4%BC%98%E5%8C%96%E6%9E%84%E5%BB%BA%E8%BF%87%E7%A8%8B%EF%BC%9F">&#x4F60;&#x5E73;&#x65F6;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x5F00;&#x53D1;&#x5DE5;&#x5177;&#xFF1F;&#x5982;&#x4F55;&#x4F7F;&#x7528; Webpack &#x6216;&#x5176;&#x4ED6;&#x6784;&#x5EFA;&#x5DE5;&#x5177;&#x6765;&#x4F18;&#x5316;&#x6784;&#x5EFA;&#x8FC7;&#x7A0B;&#xFF1F;</h4><p>&#x5E73;&#x65F6;&#x4F7F;&#x7528;&#x7684;&#x5F00;&#x53D1;&#x5DE5;&#x5177;&#x5305;&#x62EC;&#xFF1A;</p><ol><li><strong>&#x4EE3;&#x7801;&#x7F16;&#x8F91;&#x5668;</strong>&#xFF1A;VSCode&#xFF0C;&#x914D;&#x5408;&#x63D2;&#x4EF6;&#xFF08;&#x5982; ESLint&#x3001;Prettier&#x3001;GitLens&#xFF09;&#x63D0;&#x9AD8;&#x5F00;&#x53D1;&#x6548;&#x7387;&#x3002;</li><li><strong>&#x7248;&#x672C;&#x63A7;&#x5236;</strong>&#xFF1A;Git&#xFF0C;&#x4F7F;&#x7528; GitHub &#x6216; GitLab &#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x6258;&#x7BA1;&#x548C;&#x56E2;&#x961F;&#x534F;&#x4F5C;&#x3002;</li><li><strong>&#x6784;&#x5EFA;&#x5DE5;&#x5177;</strong>&#xFF1A;Webpack&#xFF0C;&#x7ED3;&#x5408; Babel&#x3001;ESLint&#x3001;Prettier &#x7B49;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x7F16;&#x8BD1;&#x548C;&#x683C;&#x5F0F;&#x5316;&#x3002;</li></ol><p>&#x4F7F;&#x7528; <strong>Webpack</strong> &#x4F18;&#x5316;&#x6784;&#x5EFA;&#x8FC7;&#x7A0B;&#x7684;&#x65B9;&#x5F0F;&#xFF1A;</p><ul><li><strong>&#x4EE3;&#x7801;&#x5206;&#x5272;</strong>&#xFF1A;&#x901A;&#x8FC7; <code>optimization.splitChunks</code> &#x914D;&#x7F6E;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x5206;&#x5272;&#xFF0C;&#x51CF;&#x5C0F;&#x5355;&#x6B21;&#x6784;&#x5EFA;&#x7684;&#x5305;&#x4F53;&#x79EF;&#x3002;</li><li><strong>&#x7F13;&#x5B58;&#x4F18;&#x5316;</strong>&#xFF1A;&#x4F7F;&#x7528; <code>[contenthash]</code> &#x6765;&#x4E3A;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x547D;&#x540D;&#xFF0C;&#x786E;&#x4FDD;&#x7F13;&#x5B58;&#x7684;&#x6709;&#x6548;&#x6027;&#x3002;</li><li><strong>Tree Shaking</strong>&#xFF1A;&#x53BB;&#x9664;&#x672A;&#x4F7F;&#x7528;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x51CF;&#x5C11;&#x6700;&#x7EC8;&#x5305;&#x7684;&#x4F53;&#x79EF;&#x3002;</li><li><strong>&#x538B;&#x7F29;&#x4E0E;&#x4F18;&#x5316;</strong>&#xFF1A;&#x901A;&#x8FC7; <code>TerserPlugin</code> &#x538B;&#x7F29; JS &#x6587;&#x4EF6;&#xFF0C;<code>ImageminPlugin</code> &#x4F18;&#x5316;&#x56FE;&#x7247;&#xFF0C;<code>MiniCssExtractPlugin</code> &#x63D0;&#x53D6; CSS &#x6587;&#x4EF6;&#x3002;</li></ul><h4 id="%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8B%E4%BD%A0%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE%E7%9A%84%E4%BE%9D%E8%B5%96%E7%89%88%E6%9C%AC%EF%BC%88%E5%A6%82-npm%E3%80%81yarn%EF%BC%89%E3%80%82%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%89%8D%E7%AB%AF%E4%BE%9D%E8%B5%96%E5%86%B2%E7%AA%81%EF%BC%9F">&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x4F60;&#x5982;&#x4F55;&#x7BA1;&#x7406;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x7684;&#x4F9D;&#x8D56;&#x7248;&#x672C;&#xFF08;&#x5982; npm&#x3001;yarn&#xFF09;&#x3002;&#x5982;&#x4F55;&#x89E3;&#x51B3;&#x524D;&#x7AEF;&#x4F9D;&#x8D56;&#x51B2;&#x7A81;&#xFF1F;</h4><p><strong>&#x4F9D;&#x8D56;&#x7BA1;&#x7406;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; <strong>npm</strong> &#x6216; <strong>yarn</strong> &#x7BA1;&#x7406;&#x9879;&#x76EE;&#x7684;&#x4F9D;&#x8D56;&#x3002;&#x901A;&#x5E38;&#x9009;&#x62E9; <strong>yarn</strong>&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x7684;&#x9501;&#x5B9A;&#x6587;&#x4EF6;&#xFF08;<code>yarn.lock</code>&#xFF09;&#x80FD;&#x66F4;&#x597D;&#x5730;&#x4FDD;&#x8BC1;&#x8DE8;&#x73AF;&#x5883;&#x7684;&#x4F9D;&#x8D56;&#x4E00;&#x81F4;&#x6027;&#x3002;</p><p><strong>&#x7248;&#x672C;&#x63A7;&#x5236;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <code>package.json</code> &#x6765;&#x6307;&#x5B9A;&#x4F9D;&#x8D56;&#x7684;&#x7248;&#x672C;&#x8303;&#x56F4;&#xFF08;&#x5982; <code>^1.0.0</code> &#x6216; <code>~1.0.0</code>&#xFF09;&#xFF0C;&#x786E;&#x4FDD;&#x7A33;&#x5B9A;&#x6027;&#x548C;&#x53EF;&#x66F4;&#x65B0;&#x6027;&#x3002;</li><li>&#x5B9A;&#x671F;&#x66F4;&#x65B0;&#x4F9D;&#x8D56;&#xFF0C;&#x4F7F;&#x7528;&#x5DE5;&#x5177;&#x5982; <code>npm-check-updates</code> &#x6765;&#x68C0;&#x67E5;&#x8FC7;&#x65F6;&#x7684;&#x4F9D;&#x8D56;&#x3002;</li></ul><p><strong>&#x4F9D;&#x8D56;&#x51B2;&#x7A81;&#x89E3;&#x51B3;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <strong>npm dedupe</strong> &#x6216; <strong>yarn resolutions</strong> &#x6765;&#x89E3;&#x51B3;&#x4F9D;&#x8D56;&#x6811;&#x4E2D;&#x7684;&#x51B2;&#x7A81;&#x3002;</li><li>&#x5982;&#x679C;&#x4F9D;&#x8D56;&#x51B2;&#x7A81;&#x65E0;&#x6CD5;&#x89E3;&#x51B3;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>resolutions</code> &#x6216; <code>overrides</code> &#x6765;&#x5F3A;&#x5236;&#x6307;&#x5B9A;&#x67D0;&#x4E2A;&#x7248;&#x672C;&#x3002;</li></ul><h4 id="%E4%BD%A0%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E5%89%8D%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%EF%BC%9F%E4%BD%A0%E4%BD%BF%E7%94%A8%E8%BF%87%E5%93%AA%E4%BA%9B%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6%EF%BC%88%E5%A6%82-jest%E3%80%81mocha%E3%80%81cypress-%E7%AD%89%EF%BC%89%EF%BC%9F">&#x4F60;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x524D;&#x7AEF;&#x81EA;&#x52A8;&#x5316;&#x6D4B;&#x8BD5;&#x7684;&#xFF1F;&#x4F60;&#x4F7F;&#x7528;&#x8FC7;&#x54EA;&#x4E9B;&#x6D4B;&#x8BD5;&#x6846;&#x67B6;&#xFF08;&#x5982; Jest&#x3001;Mocha&#x3001;Cypress &#x7B49;&#xFF09;&#xFF1F;</h4><p><strong>&#x5355;&#x5143;&#x6D4B;&#x8BD5;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <strong>Jest</strong> &#x4F5C;&#x4E3A;&#x6D4B;&#x8BD5;&#x6846;&#x67B6;&#xFF0C;&#x914D;&#x5408; <strong>React Testing Library</strong> &#x6216; <strong>Enzyme</strong> &#x8FDB;&#x884C;&#x7EC4;&#x4EF6;&#x6D4B;&#x8BD5;&#x3002;</li><li>&#x5728; Jest &#x4E2D;&#xFF0C;&#x4F7F;&#x7528; <code>describe</code>&#x3001;<code>it</code> &#x548C; <code>expect</code> &#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#x7684;&#x7F16;&#x5199;&#xFF0C;&#x4FDD;&#x8BC1;&#x6BCF;&#x4E2A;&#x7EC4;&#x4EF6;&#x548C;&#x51FD;&#x6570;&#x7684;&#x529F;&#x80FD;&#x6B63;&#x5E38;&#x3002;</li></ul><p><strong>&#x7AEF;&#x5230;&#x7AEF;&#x6D4B;&#x8BD5;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <strong>Cypress</strong> &#x8FDB;&#x884C;&#x7AEF;&#x5230;&#x7AEF;&#x7684;&#x81EA;&#x52A8;&#x5316;&#x6D4B;&#x8BD5;&#xFF0C;&#x6A21;&#x62DF;&#x7528;&#x6237;&#x7684;&#x884C;&#x4E3A;&#x8FDB;&#x884C;&#x9875;&#x9762;&#x4EA4;&#x4E92;&#x7684;&#x6D4B;&#x8BD5;&#x3002;</li><li>&#x901A;&#x8FC7; Cypress &#x7684;&#x53EF;&#x89C6;&#x5316;&#x754C;&#x9762;&#xFF0C;&#x5FEB;&#x901F;&#x8C03;&#x8BD5;&#x548C;&#x6355;&#x6349; UI &#x95EE;&#x9898;&#x3002;</li></ul><p><strong>&#x6301;&#x7EED;&#x96C6;&#x6210;</strong>&#xFF1A;</p><ul><li>&#x914D;&#x5408; <strong>GitHub Actions</strong> &#x6216; <strong>GitLab CI</strong> &#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x5316;&#x6D4B;&#x8BD5;&#xFF0C;&#x4FDD;&#x8BC1;&#x6BCF;&#x6B21;&#x63D0;&#x4EA4;&#x90FD;&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x3002;</li></ul><h3 id="%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E4%B8%8E%E5%9B%A2%E9%98%9F%E5%8D%8F%E4%BD%9C">&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x4E0E;&#x56E2;&#x961F;&#x534F;&#x4F5C;</h3><h4 id="%E4%BD%A0%E5%9C%A8%E5%9B%A2%E9%98%9F%E4%B8%AD%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%A0%81%E8%AF%84%E5%AE%A1%E7%9A%84%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%EF%BC%9F">&#x4F60;&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x8BC4;&#x5BA1;&#x7684;&#xFF1F;&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#xFF1F;</h4><p><strong>&#x4EE3;&#x7801;&#x8BC4;&#x5BA1;&#x6D41;&#x7A0B;</strong>&#xFF1A;</p><ul><li>&#x6BCF;&#x6B21;&#x63D0;&#x4EA4;&#x524D;&#xFF0C;&#x56E2;&#x961F;&#x6210;&#x5458;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x81EA;&#x8BC4;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x7B26;&#x5408;&#x89C4;&#x8303;&#x3002;</li><li>&#x4F7F;&#x7528; <strong>GitHub/GitLab</strong> &#x7684; Pull Request &#x529F;&#x80FD;&#xFF0C;&#x63D0;&#x4EA4;&#x540E;&#x7531;&#x5176;&#x4ED6;&#x56E2;&#x961F;&#x6210;&#x5458;&#x8FDB;&#x884C;&#x8BC4;&#x5BA1;&#x3002;</li><li>&#x9488;&#x5BF9;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#x3001;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x3001;&#x53EF;&#x8BFB;&#x6027;&#x3001;&#x6027;&#x80FD;&#x7B49;&#x8FDB;&#x884C;&#x8BC4;&#x5BA1;&#xFF0C;&#x786E;&#x4FDD;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x3002;</li></ul><p><strong>&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x4FDD;&#x8BC1;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <strong>ESLint</strong> &#x548C; <strong>Prettier</strong> &#x4FDD;&#x8BC1;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x7EDF;&#x4E00;&#xFF0C;&#x907F;&#x514D;&#x6F5C;&#x5728;&#x7684; bug&#x3002;</li><li>&#x5728; CI/CD &#x6D41;&#x7A0B;&#x4E2D;&#x96C6;&#x6210;&#x81EA;&#x52A8;&#x5316;&#x6D4B;&#x8BD5;&#xFF0C;&#x786E;&#x4FDD;&#x6BCF;&#x6B21;&#x63D0;&#x4EA4;&#x90FD;&#x901A;&#x8FC7;&#x6D4B;&#x8BD5;&#x3002;</li></ul><h4 id="%E4%BD%A0%E6%98%AF%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86%E5%92%8C%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E7%9A%84%EF%BC%9F%E8%AF%B7%E8%AF%B4%E6%98%8E-git-%E5%B7%A5%E4%BD%9C%E6%B5%81%EF%BC%88%E5%A6%82-gitflow-%E6%88%96%E5%85%B6%E4%BB%96%E5%B7%A5%E4%BD%9C%E6%B5%81%EF%BC%89%E6%98%AF%E5%A6%82%E4%BD%95%E6%93%8D%E4%BD%9C%E7%9A%84%E3%80%82">&#x4F60;&#x662F;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x5206;&#x652F;&#x7BA1;&#x7406;&#x548C;&#x7248;&#x672C;&#x63A7;&#x5236;&#x7684;&#xFF1F;&#x8BF7;&#x8BF4;&#x660E; Git &#x5DE5;&#x4F5C;&#x6D41;&#xFF08;&#x5982; GitFlow &#x6216;&#x5176;&#x4ED6;&#x5DE5;&#x4F5C;&#x6D41;&#xFF09;&#x662F;&#x5982;&#x4F55;&#x64CD;&#x4F5C;&#x7684;&#x3002;</h4><p>&#x6211;&#x4F7F;&#x7528; <strong>GitFlow</strong> &#x5DE5;&#x4F5C;&#x6D41;&#x6765;&#x8FDB;&#x884C;&#x4EE3;&#x7801;&#x5206;&#x652F;&#x7BA1;&#x7406;&#xFF1A;</p><ol><li><strong>master/main</strong>&#xFF1A;&#x7528;&#x4E8E;&#x5B58;&#x50A8;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x7684;&#x4EE3;&#x7801;&#x3002;</li><li><strong>develop</strong>&#xFF1A;&#x5B58;&#x50A8;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x6240;&#x6709;&#x529F;&#x80FD;&#x5206;&#x652F;&#x90FD;&#x4F1A;&#x4ECE;&#x8FD9;&#x91CC;&#x6D3E;&#x751F;&#x51FA;&#x6765;&#x3002;</li><li><strong>feature/</strong>&#xFF1A;&#x6BCF;&#x4E2A;&#x65B0;&#x529F;&#x80FD;&#x90FD;&#x4F1A;&#x4ECE; <code>develop</code> &#x5206;&#x652F;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <code>feature</code> &#x5206;&#x652F;&#xFF0C;&#x5B8C;&#x6210;&#x540E;&#x5408;&#x5E76;&#x56DE; <code>develop</code>&#x3002;</li><li><strong>release/</strong>&#xFF1A;&#x7528;&#x4E8E;&#x51C6;&#x5907;&#x751F;&#x4EA7;&#x7248;&#x672C;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x786E;&#x4FDD;&#x529F;&#x80FD;&#x5B8C;&#x6210;&#x4E14;&#x7A33;&#x5B9A;&#xFF0C;&#x53D1;&#x5E03;&#x524D;&#x8FDB;&#x884C;&#x6700;&#x7EC8;&#x6D4B;&#x8BD5;&#x3002;</li><li><strong>hotfix/</strong>&#xFF1A;&#x7528;&#x4E8E;&#x4FEE;&#x590D;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E2D;&#x7684;&#x7D27;&#x6025;&#x95EE;&#x9898;&#xFF0C;&#x4FEE;&#x590D;&#x540E;&#x5408;&#x5E76;&#x56DE; <code>master</code> &#x548C; <code>develop</code>&#x3002;</li></ol><h4 id="%E4%BD%A0%E6%9C%89%E6%B2%A1%E6%9C%89%E5%81%9A%E8%BF%87%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%EF%BC%9F%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%B7%A5%E5%85%B7%EF%BC%88%E5%A6%82-lighthouse%E3%80%81web-vitals%EF%BC%89%E8%AF%84%E4%BC%B0%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%80%A7%E8%83%BD%EF%BC%9F">&#x4F60;&#x6709;&#x6CA1;&#x6709;&#x505A;&#x8FC7;&#x524D;&#x7AEF;&#x6027;&#x80FD;&#x76D1;&#x63A7;&#xFF1F;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x5DE5;&#x5177;&#xFF08;&#x5982; Lighthouse&#x3001;Web Vitals&#xFF09;&#x8BC4;&#x4F30;&#x9879;&#x76EE;&#x7684;&#x6027;&#x80FD;&#xFF1F;</h4><p><strong>Lighthouse</strong>&#xFF1A;<br>&#x4F7F;&#x7528; Lighthouse &#x6765;&#x8BC4;&#x4F30;&#x9875;&#x9762;&#x7684;&#x6027;&#x80FD;&#x3001;&#x53EF;&#x8BBF;&#x95EE;&#x6027;&#x548C; SEO &#x7B49;&#x6307;&#x6807;&#x3002;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x8BE6;&#x7EC6;&#x7684;&#x6027;&#x80FD;&#x5206;&#x6790;&#xFF0C;&#x5305;&#x62EC;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x95F4;&#x3001;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x65F6;&#x95F4;&#x7B49;&#x3002;</p><p><strong>Web Vitals</strong>&#xFF1A;<br>&#x4F7F;&#x7528; Web Vitals &#x6765;&#x5B9E;&#x65F6;&#x76D1;&#x63A7;&#x6838;&#x5FC3; Web &#x6027;&#x80FD;&#x6307;&#x6807;&#xFF0C;&#x5982; FCP&#xFF08;First Contentful Paint&#xFF09;&#x3001;LCP&#xFF08;Largest Contentful Paint&#xFF09;&#x3001;FID&#xFF08;First Input Delay&#xFF09;&#x548C; CLS&#xFF08;Cumulative Layout Shift&#xFF09;&#x3002;</p><p><strong>&#x81EA;&#x5B9A;&#x4E49;&#x76D1;&#x63A7;</strong>&#xFF1A;<br>&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4E2D;&#x901A;&#x8FC7; JavaScript SDK&#xFF08;&#x5982; <strong>Sentry</strong>&#xFF09;&#x548C;&#x6027;&#x80FD;&#x76D1;&#x63A7;&#x5DE5;&#x5177;&#x8FDB;&#x884C;&#x5B9E;&#x65F6;&#x6027;&#x80FD;&#x6570;&#x636E;&#x6536;&#x96C6;&#xFF0C;&#x76D1;&#x63A7;&#x548C;&#x5206;&#x6790;&#x5173;&#x952E;&#x6027;&#x80FD;&#x74F6;&#x9888;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[frameWork]]></title><description><![CDATA[<h4 id="react-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F">React &#x751F;&#x547D;&#x5468;&#x671F;</h4><p>React &#x7EC4;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x5206;&#x4E3A;&#x4E09;&#x4E2A;&#x4E3B;&#x8981;&#x9636;&#x6BB5;&#xFF1A;<strong>&#x6302;&#x8F7D;&#xFF08;Mounting&#xFF09;</strong>&#x3001;<strong>&#x66F4;&#x65B0;&#xFF08;Updating&#xFF09;</strong> &#x548C; <strong>&#x5378;&#x8F7D;&#xFF08;Unmounting&#xFF09;</strong>&#x3002;&#x6BCF;&#x4E2A;&#x9636;&#x6BB5;&#x90FD;&#x6709;&#x4E00;&#x7CFB;&#x5217;&#x751F;</p>]]></description><link>https://pureo.cn/frame/</link><guid isPermaLink="false">677bbfc491ad920001d1f392</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Mon, 06 Jan 2025 11:35:04 GMT</pubDate><content:encoded><![CDATA[<h4 id="react-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F">React &#x751F;&#x547D;&#x5468;&#x671F;</h4><p>React &#x7EC4;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x5206;&#x4E3A;&#x4E09;&#x4E2A;&#x4E3B;&#x8981;&#x9636;&#x6BB5;&#xFF1A;<strong>&#x6302;&#x8F7D;&#xFF08;Mounting&#xFF09;</strong>&#x3001;<strong>&#x66F4;&#x65B0;&#xFF08;Updating&#xFF09;</strong> &#x548C; <strong>&#x5378;&#x8F7D;&#xFF08;Unmounting&#xFF09;</strong>&#x3002;&#x6BCF;&#x4E2A;&#x9636;&#x6BB5;&#x90FD;&#x6709;&#x4E00;&#x7CFB;&#x5217;&#x751F;&#x547D;&#x5468;&#x671F;&#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x5728;&#x7279;&#x5B9A;&#x65F6;&#x523B;&#x6267;&#x884C;&#x64CD;&#x4F5C;&#x3002;</p><p><strong>&#x6302;&#x8F7D;&#x9636;&#x6BB5;</strong>&#xFF08;&#x7EC4;&#x4EF6;&#x88AB;&#x521B;&#x5EFA;&#x5E76;&#x63D2;&#x5165; DOM &#x4E2D;&#xFF09;&#xFF1A;</p><ul><li><code>constructor(props)</code>&#xFF1A;&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;&#x7528;&#x4E8E;&#x521D;&#x59CB;&#x5316;&#x7EC4;&#x4EF6;&#x72B6;&#x6001;&#x548C;&#x7ED1;&#x5B9A;&#x65B9;&#x6CD5;&#x3002;&#x901A;&#x5E38;&#x5728;&#x6B64;&#x9636;&#x6BB5;&#x521D;&#x59CB;&#x5316; <code>state</code> &#x548C; <code>ref</code>&#x3002;</li></ul><pre><code class="language-javascript">constructor(props) {
  super(props);
  this.state = { count: 0 };
}
</code></pre><ul><li><code>static getDerivedStateFromProps(props, state)</code>&#xFF1A;&#x5728;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x6765;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#xFF0C;&#x6216;&#x8005;&#x8FD4;&#x56DE; <code>null</code> &#x8868;&#x793A;&#x4E0D;&#x66F4;&#x65B0;&#x72B6;&#x6001;&#x3002;</li><li><code>render()</code>&#xFF1A;&#x8FD9;&#x662F;&#x552F;&#x4E00;&#x4E00;&#x4E2A;&#x5FC5;&#x9700;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x8D1F;&#x8D23;&#x6E32;&#x67D3;&#x7EC4;&#x4EF6;&#x5185;&#x5BB9;&#x3002;&#x5B83;&#x8FD4;&#x56DE;&#x865A;&#x62DF; DOM&#x3002;</li><li><code>componentDidMount()</code>&#xFF1A;&#x7EC4;&#x4EF6;&#x6302;&#x8F7D;&#x540E;&#x8C03;&#x7528;&#x3002;&#x9002;&#x5408;&#x6267;&#x884C;&#x526F;&#x4F5C;&#x7528;&#x64CD;&#x4F5C;&#xFF0C;&#x5982;&#x6570;&#x636E;&#x83B7;&#x53D6;&#x3001;&#x8BA2;&#x9605;&#x7B49;&#x3002;</li></ul><pre><code class="language-javascript">componentDidMount() {
  fetchData().then(data =&gt; this.setState({ data }));
}
</code></pre><p><strong>&#x66F4;&#x65B0;&#x9636;&#x6BB5;</strong>&#xFF08;&#x7EC4;&#x4EF6;&#x56E0;&#x72B6;&#x6001;&#x6216;&#x5C5E;&#x6027;&#x53D8;&#x5316;&#x800C;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#xFF09;&#xFF1A;</p><ul><li><code>static getDerivedStateFromProps(props, state)</code>&#xFF1A;&#x540C;&#x6302;&#x8F7D;&#x9636;&#x6BB5;&#xFF0C;&#x5141;&#x8BB8;&#x6839;&#x636E;&#x65B0;&#x7684; props &#x6216; state &#x66F4;&#x65B0; state&#x3002;</li><li><code>shouldComponentUpdate(nextProps, nextState)</code>&#xFF1A;&#x5728;&#x6BCF;&#x6B21;&#x66F4;&#x65B0;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x3002;&#x9ED8;&#x8BA4;&#x8FD4;&#x56DE; <code>true</code>&#xFF0C;&#x5982;&#x679C;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x9700;&#x6C42;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD4;&#x56DE; <code>false</code> &#x6765;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x6E32;&#x67D3;&#x3002;</li></ul><pre><code class="language-javascript">shouldComponentUpdate(nextProps, nextState) {
  return nextState.count !== this.state.count;
}
</code></pre><ul><li><code>render()</code>&#xFF1A;&#x540C;&#x6302;&#x8F7D;&#x9636;&#x6BB5;&#xFF0C;&#x6E32;&#x67D3;&#x7EC4;&#x4EF6; UI&#x3002;</li><li><code>getSnapshotBeforeUpdate(prevProps, prevState)</code>&#xFF1A;&#x5728;&#x53D8;&#x66F4;&#x88AB;&#x63D0;&#x4EA4;&#x5230; DOM &#x4E4B;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x83B7;&#x53D6;&#x4E00;&#x4E9B; DOM &#x72B6;&#x6001;&#xFF08;&#x5982;&#x6EDA;&#x52A8;&#x4F4D;&#x7F6E;&#xFF09;&#x3002;</li><li><code>componentDidUpdate(prevProps, prevState, snapshot)</code>&#xFF1A;&#x5728;&#x7EC4;&#x4EF6;&#x66F4;&#x65B0;&#x540E;&#x8C03;&#x7528;&#x3002;&#x7528;&#x4E8E;&#x6267;&#x884C;&#x526F;&#x4F5C;&#x7528;&#x64CD;&#x4F5C;&#xFF0C;&#x5982;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x6216; DOM &#x66F4;&#x65B0;&#x3002;</li></ul><p><strong>&#x5378;&#x8F7D;&#x9636;&#x6BB5;</strong>&#xFF08;&#x7EC4;&#x4EF6;&#x4ECE; DOM &#x4E2D;&#x79FB;&#x9664;&#xFF09;&#xFF1A;</p><ul><li><code>componentWillUnmount()</code>&#xFF1A;&#x7EC4;&#x4EF6;&#x5378;&#x8F7D;&#x4E4B;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x6E05;&#x7406;&#x8BA2;&#x9605;&#x3001;&#x8BA1;&#x65F6;&#x5668;&#x7B49;&#x526F;&#x4F5C;&#x7528;&#x3002;</li></ul><pre><code class="language-javascript">componentWillUnmount() {
  clearInterval(this.timerID);
}
</code></pre><h4 id="react-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">React &#x6027;&#x80FD;&#x4F18;&#x5316;</h4><p><strong><code>shouldComponentUpdate</code></strong>&#xFF1A; &#x7528;&#x4E8E;&#x63A7;&#x5236;&#x7EC4;&#x4EF6;&#x662F;&#x5426;&#x5728;&#x72B6;&#x6001;&#x6216;&#x5C5E;&#x6027;&#x66F4;&#x65B0;&#x65F6;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6BD4;&#x8F83;&#x65B0;&#x65E7; <code>props</code> &#x548C; <code>state</code> &#x6765;&#x51B3;&#x5B9A;&#x662F;&#x5426;&#x6E32;&#x67D3;&#x7EC4;&#x4EF6;&#x3002;&#x5982;&#x679C;&#x67D0;&#x4E9B;&#x66F4;&#x65B0;&#x4E0D;&#x5F71;&#x54CD; UI&#xFF0C;&#x53EF;&#x4EE5;&#x8FD4;&#x56DE; <code>false</code> &#x6765;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x6E32;&#x67D3;&#x3002;</p><pre><code class="language-javascript">shouldComponentUpdate(nextProps, nextState) {
  return nextState.someValue !== this.state.someValue;
}
</code></pre><p><strong><code>React.memo</code></strong>&#xFF1A; &#x662F;&#x4E00;&#x4E2A;&#x9AD8;&#x9636;&#x7EC4;&#x4EF6;&#xFF0C;&#x7528;&#x4E8E;&#x4F18;&#x5316;&#x51FD;&#x6570;&#x7EC4;&#x4EF6;&#x7684;&#x6027;&#x80FD;&#x3002;&#x5B83;&#x901A;&#x8FC7;&#x6D45;&#x6BD4;&#x8F83; <code>props</code> &#x6765;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x3002;&#x53EA;&#x8981;&#x7EC4;&#x4EF6;&#x7684; <code>props</code> &#x6CA1;&#x6709;&#x53D8;&#x5316;&#xFF0C;React &#x5C31;&#x4F1A;&#x8DF3;&#x8FC7;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x3002;</p><pre><code class="language-javascript">const MyComponent = React.memo(function MyComponent(props) {
  return &lt;div&gt;{props.value}&lt;/div&gt;;
});
</code></pre><p><strong><code>useMemo</code></strong>&#xFF1A; &#x7528;&#x4E8E;&#x7F13;&#x5B58;&#x8BA1;&#x7B97;&#x7ED3;&#x679C;&#xFF0C;&#x53EA;&#x6709;&#x5F53;&#x4F9D;&#x8D56;&#x9879;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x65F6;&#x624D;&#x4F1A;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x6027;&#x80FD;&#x6D88;&#x8017;&#x5927;&#x7684;&#x8BA1;&#x7B97;&#x3002;</p><pre><code class="language-javascript">const expensiveComputation = useMemo(() =&gt; computeExpensiveValue(value), [value]);
</code></pre><p><strong><code>useCallback</code></strong>&#xFF1A; &#x7528;&#x4E8E;&#x7F13;&#x5B58;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x907F;&#x514D;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x65F6;&#x90FD;&#x91CD;&#x65B0;&#x521B;&#x5EFA;&#x51FD;&#x6570;&#x5B9E;&#x4F8B;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x4F5C;&#x4E3A;&#x5B50;&#x7EC4;&#x4EF6; <code>props</code> &#x4F20;&#x9012;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p><pre><code class="language-javascript">const memoizedCallback = useCallback(() =&gt; {
  doSomething(value);
}, [value]);
</code></pre><h4 id="%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86">&#x72B6;&#x6001;&#x7BA1;&#x7406;</h4><p>&#x5728;&#x5927;&#x578B; React &#x9879;&#x76EE;&#x4E2D;&#xFF0C;&#x901A;&#x5E38;&#x4F7F;&#x7528; Redux &#x6216; React Context &#x6765;&#x7BA1;&#x7406;&#x5168;&#x5C40;&#x72B6;&#x6001;&#x3002;</p><p><strong>Redux</strong>&#xFF1A;</p><ul><li><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x63D0;&#x4F9B;&#x4E86;&#x9AD8;&#x5EA6;&#x53EF;&#x9884;&#x6D4B;&#x7684;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x5927;&#x578B;&#x5E94;&#x7528;&#xFF0C;&#x80FD;&#x591F;&#x4E0E;&#x4E2D;&#x95F4;&#x4EF6;&#xFF08;&#x5982; <code>redux-thunk</code> &#x6216; <code>redux-saga</code>&#xFF09;&#x7ED3;&#x5408;&#xFF0C;&#x652F;&#x6301;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x548C;&#x526F;&#x4F5C;&#x7528;&#x5904;&#x7406;&#x3002;&#x80FD;&#x591F;&#x901A;&#x8FC7; <code>DevTools</code> &#x8FDB;&#x884C;&#x72B6;&#x6001;&#x8C03;&#x8BD5;&#x3002;</li><li><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x5BF9;&#x4E8E;&#x5C0F;&#x578B;&#x5E94;&#x7528;&#xFF0C;Redux &#x914D;&#x7F6E;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x4EE3;&#x7801;&#x91CF;&#x5927;&#xFF0C;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#x9700;&#x8981;&#x66F4;&#x591A;&#x7684;&#x6837;&#x677F;&#x4EE3;&#x7801;&#x3002;</li></ul><p><strong>React Context</strong>&#xFF1A;</p><ul><li><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#xFF0C;&#x76F4;&#x63A5;&#x96C6;&#x6210;&#x4E8E; React &#x4E2D;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x989D;&#x5916;&#x7684;&#x5E93;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x5C0F;&#x578B;&#x6216;&#x4E2D;&#x578B;&#x9879;&#x76EE;&#x7684;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x3002;</li><li><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x4E0D;&#x9002;&#x5408;&#x7BA1;&#x7406;&#x5927;&#x91CF;&#x52A8;&#x6001;&#x72B6;&#x6001;&#xFF0C;&#x6027;&#x80FD;&#x53EF;&#x80FD;&#x4F1A;&#x53D7;&#x5230;&#x5F71;&#x54CD;&#xFF0C;&#x56E0;&#x4E3A;&#x6BCF;&#x6B21;&#x66F4;&#x65B0; Context &#x90FD;&#x4F1A;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x6240;&#x6709;&#x4F9D;&#x8D56;&#x5B83;&#x7684;&#x7EC4;&#x4EF6;&#x3002;</li></ul><h3 id="vue">Vue</h3><h4 id="vue-%E5%93%8D%E5%BA%94%E5%BC%8F%E5%8E%9F%E7%90%86">Vue &#x54CD;&#x5E94;&#x5F0F;&#x539F;&#x7406;</h4><p>Vue &#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x7CFB;&#x7EDF;&#x662F;&#x57FA;&#x4E8E; <strong>Object.defineProperty</strong> &#x548C; <strong>Proxy</strong>&#xFF08;Vue 3 &#x4E2D;&#x91C7;&#x7528; <code>Proxy</code>&#xFF09;&#x5B9E;&#x73B0;&#x7684;&#x3002;&#x5B83;&#x4F1A;&#x5728;&#x6570;&#x636E;&#x5BF9;&#x8C61;&#x7684;&#x6BCF;&#x4E2A;&#x5C5E;&#x6027;&#x4E0A;&#x6DFB;&#x52A0; getter &#x548C; setter&#xFF0C;&#x5F53;&#x5C5E;&#x6027;&#x88AB;&#x8BBF;&#x95EE;&#x6216;&#x4FEE;&#x6539;&#x65F6;&#xFF0C;Vue &#x4F1A;&#x81EA;&#x52A8;&#x8DDF;&#x8E2A;&#x4F9D;&#x8D56;&#xFF0C;&#x5E76;&#x5728;&#x5C5E;&#x6027;&#x503C;&#x53D8;&#x5316;&#x65F6;&#x89E6;&#x53D1;&#x89C6;&#x56FE;&#x66F4;&#x65B0;&#x3002;</p><ul><li><strong>getter</strong>&#xFF1A;&#x8BBF;&#x95EE;&#x5C5E;&#x6027;&#x65F6;&#x89E6;&#x53D1;&#xFF0C;&#x7528;&#x4E8E;&#x6536;&#x96C6;&#x4F9D;&#x8D56;&#x3002;</li><li><strong>setter</strong>&#xFF1A;&#x4FEE;&#x6539;&#x5C5E;&#x6027;&#x65F6;&#x89E6;&#x53D1;&#xFF0C;&#x7528;&#x4E8E;&#x901A;&#x77E5;&#x4F9D;&#x8D56;&#x66F4;&#x65B0;&#x3002;</li></ul><p>&#x5F53;&#x6570;&#x636E;&#x53D8;&#x5316;&#x65F6;&#xFF0C;Vue &#x4F1A;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x89C6;&#x56FE;&#xFF0C;&#x786E;&#x4FDD;&#x89C6;&#x56FE;&#x4E0E;&#x6570;&#x636E;&#x4FDD;&#x6301;&#x4E00;&#x81F4;&#x3002;</p><h4 id="vue-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F">Vue &#x751F;&#x547D;&#x5468;&#x671F;</h4><p>Vue &#x7EC4;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x94A9;&#x5B50;&#x5206;&#x4E3A;&#x521B;&#x5EFA;&#x3001;&#x6302;&#x8F7D;&#x3001;&#x66F4;&#x65B0;&#x3001;&#x9500;&#x6BC1;&#x56DB;&#x4E2A;&#x9636;&#x6BB5;&#xFF1A;</p><p><strong>&#x521B;&#x5EFA;&#x9636;&#x6BB5;</strong>&#xFF1A;</p><ul><li><code>beforeCreate</code>&#xFF1A;&#x5B9E;&#x4F8B;&#x521D;&#x59CB;&#x5316;&#x540E;&#xFF0C;&#x6570;&#x636E;&#x89C2;&#x6D4B;&#x548C;&#x4E8B;&#x4EF6;&#x914D;&#x7F6E;&#x524D;&#x8C03;&#x7528;&#x3002;</li><li><code>created</code>&#xFF1A;&#x5B9E;&#x4F8B;&#x521B;&#x5EFA;&#x5B8C;&#x6210;&#x540E;&#x8C03;&#x7528;&#xFF0C;&#x6B64;&#x65F6;&#x6570;&#x636E;&#x5DF2;&#x7ECF;&#x88AB;&#x89C2;&#x6D4B;&#xFF0C;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x53EF;&#x7528;&#x3002;</li></ul><p><strong>&#x6302;&#x8F7D;&#x9636;&#x6BB5;</strong>&#xFF1A;</p><ul><li><code>beforeMount</code>&#xFF1A;&#x6A21;&#x677F;&#x7F16;&#x8BD1;&#x548C;&#x6302;&#x8F7D;&#x524D;&#x8C03;&#x7528;&#x3002;</li><li><code>mounted</code>&#xFF1A;&#x7EC4;&#x4EF6;&#x6302;&#x8F7D;&#x5230; DOM &#x540E;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x8FDB;&#x884C; DOM &#x64CD;&#x4F5C;&#x6216;&#x8BF7;&#x6C42;&#x6570;&#x636E;&#x3002;</li></ul><p><strong>&#x66F4;&#x65B0;&#x9636;&#x6BB5;</strong>&#xFF1A;</p><ul><li><code>beforeUpdate</code>&#xFF1A;&#x6570;&#x636E;&#x53D8;&#x5316;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x5728;&#x89C6;&#x56FE;&#x66F4;&#x65B0;&#x524D;&#x6267;&#x884C;&#x67D0;&#x4E9B;&#x64CD;&#x4F5C;&#x3002;</li><li><code>updated</code>&#xFF1A;&#x6570;&#x636E;&#x53D8;&#x5316;&#x540E;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x5728;&#x89C6;&#x56FE;&#x66F4;&#x65B0;&#x540E;&#x6267;&#x884C;&#x64CD;&#x4F5C;&#x3002;</li></ul><p><strong>&#x9500;&#x6BC1;&#x9636;&#x6BB5;</strong>&#xFF1A;</p><ul><li><code>beforeDestroy</code>&#xFF1A;&#x7EC4;&#x4EF6;&#x9500;&#x6BC1;&#x524D;&#x8C03;&#x7528;&#xFF0C;&#x9002;&#x5408;&#x6E05;&#x7406;&#x526F;&#x4F5C;&#x7528;&#xFF08;&#x5982;&#x5B9A;&#x65F6;&#x5668;&#x3001;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5668;&#xFF09;&#x3002;</li><li><code>destroyed</code>&#xFF1A;&#x7EC4;&#x4EF6;&#x9500;&#x6BC1;&#x540E;&#x8C03;&#x7528;&#xFF0C;&#x6E05;&#x7406;&#x8D44;&#x6E90;&#x3002;</li></ul><h4 id="vuex-%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86">Vuex &#x72B6;&#x6001;&#x7BA1;&#x7406;</h4><p>Vuex &#x662F; Vue &#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x7684;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x5E93;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x4E2D;&#x5927;&#x578B; Vue &#x9879;&#x76EE;&#xFF0C;&#x7528;&#x4E8E;&#x96C6;&#x4E2D;&#x7BA1;&#x7406;&#x6240;&#x6709;&#x7EC4;&#x4EF6;&#x7684;&#x72B6;&#x6001;&#x3002;</p><p><strong>&#x4F7F;&#x7528;</strong>&#xFF1A;Vuex &#x63D0;&#x4F9B;&#x4E86; <strong>state</strong>&#x3001;<strong>mutations</strong>&#x3001;<strong>actions</strong>&#x3001;<strong>getters</strong> &#x7B49; API &#x6765;&#x7BA1;&#x7406;&#x5168;&#x5C40;&#x72B6;&#x6001;&#x3002;&#x901A;&#x8FC7; <code>commit</code> &#x89E6;&#x53D1; mutations &#x66F4;&#x65B0;&#x72B6;&#x6001;&#xFF0C;&#x901A;&#x8FC7; <code>dispatch</code> &#x89E6;&#x53D1; actions &#x6267;&#x884C;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong>&#xFF1A;&#x6709;&#x7EDF;&#x4E00;&#x7684;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x548C;&#x660E;&#x786E;&#x7684;&#x5355;&#x5411;&#x6570;&#x636E;&#x6D41;&#xFF0C;&#x9002;&#x5408;&#x5927;&#x578B;&#x5E94;&#x7528;&#x3002;&#x901A;&#x8FC7; <code>devtools</code> &#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x72B6;&#x6001;&#x8DDF;&#x8E2A;&#x548C;&#x8C03;&#x8BD5;&#x3002;</p><p><strong>&#x7F3A;&#x70B9;</strong>&#xFF1A;&#x914D;&#x7F6E;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x8FC7;&#x591A;&#x7684;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x4EE3;&#x7801;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x7EF4;&#x62A4;&#x56F0;&#x96BE;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x590D;&#x6742;&#x7684;&#x4E2D;&#x5927;&#x578B;&#x5E94;&#x7528;&#x3002;</p><h3 id="%E6%A1%86%E6%9E%B6%E4%BC%98%E5%8C%96">&#x6846;&#x67B6;&#x4F18;&#x5316;</h3><h4 id="%E7%BB%84%E4%BB%B6%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96">&#x7EC4;&#x4EF6;&#x6027;&#x80FD;&#x4F18;&#x5316;</h4><p><strong>React</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <code>shouldComponentUpdate</code> &#x6216; <code>React.memo</code> &#x6765;&#x907F;&#x514D;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x91CD;&#x65B0;&#x6E32;&#x67D3;&#x3002;</li><li>&#x4F7F;&#x7528; <code>useMemo</code> &#x548C; <code>useCallback</code> &#x7F13;&#x5B58;&#x8BA1;&#x7B97;&#x7ED3;&#x679C;&#x548C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x51CF;&#x5C11;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x8BA1;&#x7B97;&#x548C;&#x51FD;&#x6570;&#x5B9E;&#x4F8B;&#x521B;&#x5EFA;&#x3002;</li><li>&#x4F7F;&#x7528;&#x865A;&#x62DF;&#x5316;&#x6280;&#x672F;&#xFF08;&#x5982; React Virtualized&#xFF09;&#x6765;&#x6E32;&#x67D3;&#x957F;&#x5217;&#x8868;&#xFF0C;&#x907F;&#x514D;&#x6E32;&#x67D3;&#x4E0D;&#x5728;&#x89C6;&#x53E3;&#x5185;&#x7684;&#x5143;&#x7D20;&#x3002;</li></ul><p><strong>Vue</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <code>v-once</code> &#x6216; <code>v-memo</code> &#x7F13;&#x5B58;&#x9759;&#x6001;&#x5185;&#x5BB9;&#xFF0C;&#x907F;&#x514D;&#x91CD;&#x590D;&#x6E32;&#x67D3;&#x3002;</li><li>&#x4F7F;&#x7528; <code>computed</code> &#x5C5E;&#x6027;&#x6765;&#x7F13;&#x5B58;&#x8BA1;&#x7B97;&#x7ED3;&#x679C;&#xFF0C;&#x907F;&#x514D;&#x6BCF;&#x6B21;&#x6E32;&#x67D3;&#x65F6;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#x3002;</li><li>&#x907F;&#x514D;&#x5728;&#x6A21;&#x677F;&#x4E2D;&#x8FDB;&#x884C;&#x590D;&#x6742;&#x7684;&#x8BA1;&#x7B97;&#x6216;&#x65B9;&#x6CD5;&#x8C03;&#x7528;&#xFF0C;&#x5C06;&#x8FD9;&#x4E9B;&#x903B;&#x8F91;&#x79FB;&#x81F3; <code>data</code> &#x6216; <code>computed</code> &#x4E2D;&#x3002;</li></ul><h4 id="%E8%99%9A%E6%8B%9F-dom">&#x865A;&#x62DF; DOM</h4><p>&#x865A;&#x62DF; DOM &#x662F;&#x4E00;&#x79CD;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#x521B;&#x5EFA;&#x4E0E;&#x771F;&#x5B9E; DOM &#x7ED3;&#x6784;&#x76F8;&#x4F3C;&#x7684;&#x865A;&#x62DF;&#x8868;&#x793A;&#x7684;&#x6280;&#x672F;&#x3002;&#x5F53;&#x6570;&#x636E;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x65F6;&#xFF0C;&#x6846;&#x67B6;&#x4F1A;&#x66F4;&#x65B0;&#x865A;&#x62DF; DOM&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;&#x4E0E;&#x5F53;&#x524D;&#x865A;&#x62DF; DOM &#x7684;&#x5BF9;&#x6BD4;&#xFF08;diffing&#xFF09;&#x627E;&#x51FA;&#x6700;&#x5C0F;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x6700;&#x540E;&#x53EA;&#x66F4;&#x65B0;&#x8FD9;&#x4E9B;&#x53D8;&#x5316;&#x90E8;&#x5206;&#x5230;&#x771F;&#x5B9E; DOM &#x4E0A;&#x3002;</p><p><strong>&#x63D0;&#x5347;&#x6027;&#x80FD;&#x7684;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><ul><li>&#x51CF;&#x5C11;&#x76F4;&#x63A5;&#x64CD;&#x4F5C; DOM&#xFF0C;&#x56E0;&#x4E3A; DOM &#x64CD;&#x4F5C;&#x5F00;&#x9500;&#x8F83;&#x5927;&#xFF0C;&#x865A;&#x62DF; DOM &#x5C06;&#x591A;&#x6B21;&#x6E32;&#x67D3;&#x548C;&#x5BF9;&#x6BD4;&#x7684;&#x5F00;&#x9500;&#x96C6;&#x4E2D;&#x5904;&#x7406;&#x3002;</li><li>&#x901A;&#x8FC7; diff &#x7B97;&#x6CD5;&#x627E;&#x5230;&#x6700;&#x5C0F;&#x5DEE;&#x5F02;&#x5E76;&#x53EA;&#x66F4;&#x65B0;&#x5DEE;&#x5F02;&#x90E8;&#x5206;&#xFF0C;&#x907F;&#x514D;&#x91CD;&#x7ED8;&#x6574;&#x4E2A;&#x9875;&#x9762;&#x3002;</li></ul>]]></content:encoded></item><item><title><![CDATA[浏览器渲染原理]]></title><description><![CDATA[<p>&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x9875;&#x9762;&#x7684;&#x8FC7;&#x7A0B;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x6B65;&#x9AA4;&#xFF0C;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x9636;&#x6BB5;&#xFF1A;</p><p><strong>&#x89E3;&#x6790; URL &#x5E76;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;</strong>&#xFF1A;<br>&#x5F53;&#x7528;&#x6237;&#x8F93;&#x5165; URL &#x6216;&#x70B9;&#x51FB;&#x94FE;&#x63A5;</p>]]></description><link>https://pureo.cn/liu-lan-qi-xuan-ran-yuan-li/</link><guid isPermaLink="false">677bbed491ad920001d1f380</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Mon, 06 Jan 2025 11:32:41 GMT</pubDate><content:encoded><![CDATA[<p>&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x9875;&#x9762;&#x7684;&#x8FC7;&#x7A0B;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x6B65;&#x9AA4;&#xFF0C;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x9636;&#x6BB5;&#xFF1A;</p><p><strong>&#x89E3;&#x6790; URL &#x5E76;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;</strong>&#xFF1A;<br>&#x5F53;&#x7528;&#x6237;&#x8F93;&#x5165; URL &#x6216;&#x70B9;&#x51FB;&#x94FE;&#x63A5;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x8FC7; DNS &#x67E5;&#x8BE2;&#x57DF;&#x540D;&#xFF0C;&#x627E;&#x5230;&#x76EE;&#x6807;&#x670D;&#x52A1;&#x5668;&#x7684; IP &#x5730;&#x5740;&#xFF0C;&#x5EFA;&#x7ACB; TCP &#x8FDE;&#x63A5;&#xFF08;&#x901A;&#x8FC7;&#x4E09;&#x6B21;&#x63E1;&#x624B;&#xFF09;&#xFF0C;&#x7136;&#x540E;&#x53D1;&#x9001; HTTP &#x8BF7;&#x6C42;&#xFF0C;&#x83B7;&#x53D6;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x7684; HTML &#x6587;&#x4EF6;&#x3002;</p><p><strong>HTML &#x89E3;&#x6790;&#x548C; DOM &#x6811;&#x6784;&#x5EFA;</strong>&#xFF1A;<br>&#x6D4F;&#x89C8;&#x5668;&#x89E3;&#x6790;&#x8FD4;&#x56DE;&#x7684; HTML &#x6587;&#x4EF6;&#xFF0C;&#x5C06; HTML &#x5143;&#x7D20;&#x8F6C;&#x5316;&#x4E3A; DOM&#xFF08;Document Object Model&#xFF09;&#x6811;&#x3002;DOM &#x662F;&#x4E00;&#x4E2A; JavaScript &#x5BF9;&#x8C61;&#x6A21;&#x578B;&#xFF0C;&#x4EE3;&#x8868;&#x4E86; HTML &#x9875;&#x9762;&#x7ED3;&#x6784;&#x3002;DOM &#x6811;&#x662F;&#x4E00;&#x4E2A;&#x6309;&#x6587;&#x6863;&#x7ED3;&#x6784;&#x6392;&#x5217;&#x7684;&#x8282;&#x70B9;&#x6811;&#x3002;</p><p><strong>CSS &#x89E3;&#x6790;&#x5E76;&#x751F;&#x6210; CSSOM &#x6811;</strong>&#xFF1A;<br>&#x540C;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x89E3;&#x6790;&#x6240;&#x6709; CSS &#x6587;&#x4EF6;&#xFF08;&#x5305;&#x62EC;&#x5185;&#x8054;&#x6837;&#x5F0F;&#x548C;&#x5916;&#x90E8;&#x6837;&#x5F0F;&#xFF09;&#xFF0C;&#x751F;&#x6210; CSSOM&#xFF08;CSS Object Model&#xFF09;&#x6811;&#x3002;CSSOM &#x6811;&#x5305;&#x542B;&#x4E86;&#x9875;&#x9762;&#x4E0A;&#x6240;&#x6709;&#x5143;&#x7D20;&#x7684;&#x6837;&#x5F0F;&#x4FE1;&#x606F;&#xFF0C;&#x548C; DOM &#x6811;&#x4E00;&#x8D77;&#x6784;&#x6210;&#x9875;&#x9762;&#x7684;&#x6E32;&#x67D3;&#x6811;&#x3002;</p><p><strong>&#x6E32;&#x67D3;&#x6811;&#x7684;&#x6784;&#x5EFA;</strong>&#xFF1A;<br>&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x8FC7;&#x5C06; DOM &#x6811;&#x4E0E; CSSOM &#x6811;&#x7ED3;&#x5408;&#xFF0C;&#x751F;&#x6210;&#x6E32;&#x67D3;&#x6811;&#x3002;&#x6E32;&#x67D3;&#x6811;&#x4E2D;&#x7684;&#x8282;&#x70B9;&#x4E0D;&#x4EC5;&#x5305;&#x542B; DOM &#x6811;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x8FD8;&#x5305;&#x542B;&#x4E86;&#x6837;&#x5F0F;&#x4FE1;&#x606F;&#x3002;&#x6E32;&#x67D3;&#x6811;&#x7684;&#x8282;&#x70B9;&#x4E0D;&#x5305;&#x62EC;&#x90A3;&#x4E9B;&#x4E0D;&#x53EF;&#x89C1;&#x7684;&#x5143;&#x7D20;&#xFF08;&#x4F8B;&#x5982;&#xFF1A;<code>display: none</code> &#x7684;&#x5143;&#x7D20;&#xFF09;&#x3002;</p><p><strong>&#x5E03;&#x5C40;&#xFF08;Reflow&#xFF09;</strong>&#xFF1A;<br>&#x6E32;&#x67D3;&#x6811;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x6839;&#x636E;&#x5404;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5927;&#x5C0F;&#x3001;&#x4F4D;&#x7F6E;&#x7B49;&#x4FE1;&#x606F;&#x8FDB;&#x884C;&#x5E03;&#x5C40;&#x8BA1;&#x7B97;&#xFF0C;&#x786E;&#x5B9A;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x7CBE;&#x786E;&#x4F4D;&#x7F6E;&#x548C;&#x5C3A;&#x5BF8;&#x3002;&#x8FD9;&#x4E00;&#x8FC7;&#x7A0B;&#x79F0;&#x4E3A;&#x5E03;&#x5C40;&#xFF08;&#x4E5F;&#x53EB;&#x56DE;&#x6D41;&#xFF09;&#x3002;&#x6D4F;&#x89C8;&#x5668;&#x901A;&#x8FC7;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x4F4D;&#x7F6E;&#x548C;&#x5927;&#x5C0F;&#xFF0C;&#x751F;&#x6210;&#x4E00;&#x5F20;&#x9875;&#x9762;&#x7684;&#x5E03;&#x5C40;&#x56FE;&#x3002;</p><p><strong>&#x7ED8;&#x5236;&#xFF08;Paint&#xFF09;</strong>&#xFF1A;<br>&#x5B8C;&#x6210;&#x5E03;&#x5C40;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x6839;&#x636E;&#x6E32;&#x67D3;&#x6811;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x5C06;&#x9875;&#x9762;&#x7684;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7ED8;&#x5236;&#x6210;&#x4F4D;&#x56FE;&#xFF0C;&#x8FDB;&#x884C;&#x50CF;&#x7D20;&#x6E32;&#x67D3;&#x3002;&#x8FD9;&#x4E00;&#x9636;&#x6BB5;&#x5C06;&#x9875;&#x9762;&#x7684;&#x6240;&#x6709;&#x53EF;&#x89C1;&#x5185;&#x5BB9;&#x7ED8;&#x5236;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x3002;</p><p><strong>&#x5408;&#x6210;&#x5C42;&#x5E76;&#x663E;&#x793A;</strong>&#xFF1A;<br>&#x5BF9;&#x4E8E;&#x590D;&#x6742;&#x7684;&#x9875;&#x9762;&#xFF08;&#x5982;&#x5305;&#x542B;&#x52A8;&#x753B;&#x6216;&#x6709;&#x786C;&#x4EF6;&#x52A0;&#x901F;&#x6548;&#x679C;&#x7684;&#x5143;&#x7D20;&#xFF09;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5C06;&#x9875;&#x9762;&#x5206;&#x6210;&#x591A;&#x4E2A;&#x5C42;&#xFF0C;&#x5206;&#x522B;&#x8FDB;&#x884C;&#x5408;&#x6210;&#x5904;&#x7406;&#x3002;&#x6700;&#x7EC8;&#x8FD9;&#x4E9B;&#x5C42;&#x4F1A;&#x88AB;&#x5408;&#x6210;&#x5E76;&#x663E;&#x793A;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x3002;</p><h3 id="%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E9%A1%B5%E9%9D%A2%E7%9A%84%E9%A6%96%E6%AC%A1%E6%B8%B2%E6%9F%93%E5%92%8C%E5%8A%A0%E8%BD%BD%E9%80%9F%E5%BA%A6%EF%BC%9F">&#x5982;&#x4F55;&#x4F18;&#x5316;&#x9875;&#x9762;&#x7684;&#x9996;&#x6B21;&#x6E32;&#x67D3;&#x548C;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#xFF1F;</h3><p><strong>&#x51CF;&#x5C11; HTTP &#x8BF7;&#x6C42;</strong>&#xFF1A;<br>&#x51CF;&#x5C11;&#x9875;&#x9762;&#x8D44;&#x6E90;&#xFF08;&#x5982;&#x56FE;&#x7247;&#x3001;CSS&#x3001;JavaScript&#xFF09;&#x7684;&#x6570;&#x91CF;&#xFF0C;&#x901A;&#x8FC7;&#x5408;&#x5E76;&#x6587;&#x4EF6;&#x3001;&#x4F7F;&#x7528;&#x96EA;&#x78A7;&#x56FE;&#x7B49;&#x65B9;&#x5F0F;&#x51CF;&#x5C11; HTTP &#x8BF7;&#x6C42;&#x6B21;&#x6570;&#x3002;HTTP/2 &#x53EF;&#x4EE5;&#x5229;&#x7528;&#x591A;&#x8DEF;&#x590D;&#x7528;&#x6280;&#x672F;&#x6765;&#x51CF;&#x5C11;&#x8BF7;&#x6C42;&#x5EF6;&#x8FDF;&#x3002;</p><p><strong>&#x8D44;&#x6E90;&#x538B;&#x7F29;&#x4E0E;&#x7F13;&#x5B58;</strong>&#xFF1A;<br>&#x538B;&#x7F29; JS&#x3001;CSS&#x3001;HTML &#x6587;&#x4EF6;&#xFF08;&#x4F8B;&#x5982;&#x4F7F;&#x7528; Gzip &#x6216; Brotli &#x538B;&#x7F29;&#xFF09;&#xFF0C;&#x5E76;&#x914D;&#x7F6E;&#x5408;&#x7406;&#x7684;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF0C;&#x51CF;&#x5C11;&#x8D44;&#x6E90;&#x7684;&#x91CD;&#x590D;&#x4E0B;&#x8F7D;&#x3002;</p><p><strong>&#x5F02;&#x6B65;&#x52A0;&#x8F7D; JavaScript &#x548C; CSS</strong>&#xFF1A;<br>&#x4F7F;&#x7528; <code>async</code> &#x548C; <code>defer</code> &#x5C5E;&#x6027;&#x52A0;&#x8F7D; JavaScript &#x811A;&#x672C;&#xFF0C;&#x907F;&#x514D;&#x963B;&#x585E;&#x9875;&#x9762;&#x7684;&#x6E32;&#x67D3;&#x3002;&#x540C;&#x65F6;&#xFF0C;&#x5C06;&#x975E;&#x5173;&#x952E; CSS &#x6587;&#x4EF6;&#x653E;&#x5728; <code>link</code> &#x6807;&#x7B7E;&#x7684; <code>media</code> &#x5C5E;&#x6027;&#x4E2D;&#xFF0C;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#x4E0D;&#x7ACB;&#x5373;&#x9700;&#x8981;&#x7684;&#x6837;&#x5F0F;&#x3002;</p><p><strong>&#x61D2;&#x52A0;&#x8F7D;&#x56FE;&#x7247;&#x548C;&#x5176;&#x4ED6;&#x8D44;&#x6E90;</strong>&#xFF1A;<br>&#x5BF9;&#x4E8E;&#x56FE;&#x7247;&#x3001;&#x89C6;&#x9891;&#x7B49;&#x5927;&#x6587;&#x4EF6;&#xFF0C;&#x4F7F;&#x7528;&#x61D2;&#x52A0;&#x8F7D;&#x6280;&#x672F;&#xFF0C;&#x53EA;&#x5728;&#x9700;&#x8981;&#x65F6;&#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#xFF0C;&#x907F;&#x514D;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x65F6;&#x5360;&#x7528;&#x8FC7;&#x591A;&#x5E26;&#x5BBD;&#x3002;</p><p><strong>&#x51CF;&#x5C11;&#x963B;&#x585E;&#x6E32;&#x67D3;&#x7684;&#x8D44;&#x6E90;</strong>&#xFF1A;<br>&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x5C06; JavaScript &#x4EE3;&#x7801;&#x653E;&#x5728;&#x9875;&#x9762;&#x7684; <code>&lt;head&gt;</code> &#x90E8;&#x5206;&#xFF0C;&#x5F71;&#x54CD;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#x3002;&#x53EF;&#x4EE5;&#x5C06;&#x811A;&#x672C;&#x653E;&#x5728; <code>&lt;body&gt;</code> &#x5E95;&#x90E8;&#xFF0C;&#x6216;&#x8005;&#x4F7F;&#x7528; <code>defer</code> &#x6216; <code>async</code> &#x5173;&#x952E;&#x5B57;&#xFF0C;&#x786E;&#x4FDD;&#x811A;&#x672C;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#x6E32;&#x67D3;&#x3002;</p><p><strong>&#x4F18;&#x5148;&#x6E32;&#x67D3;&#x5173;&#x952E;&#x5185;&#x5BB9;</strong>&#xFF1A;<br>&#x4F18;&#x5316;&#x6E32;&#x67D3;&#x6D41;&#x7A0B;&#xFF0C;&#x4F7F;&#x7528;&#x5173;&#x952E;&#x6E32;&#x67D3;&#x8DEF;&#x5F84;&#xFF08;Critical Rendering Path&#xFF09;&#x6280;&#x672F;&#xFF0C;&#x4F18;&#x5148;&#x6E32;&#x67D3;&#x9875;&#x9762;&#x4E2D;&#x7528;&#x6237;&#x6700;&#x5173;&#x5FC3;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x907F;&#x514D;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x90FD;&#x963B;&#x585E;&#x6E32;&#x67D3;&#x3002;</p><p><strong>&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#xFF08;SSR&#xFF09;&#x548C;&#x9759;&#x6001;&#x7AD9;&#x70B9;&#x751F;&#x6210;&#xFF08;SSG&#xFF09;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; SSR &#x6216; SSG &#x6765;&#x5C06;&#x9875;&#x9762;&#x7684; HTML &#x7ED3;&#x6784;&#x63D0;&#x524D;&#x6E32;&#x67D3;&#x597D;&#xFF0C;&#x51CF;&#x8F7B;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x8D1F;&#x62C5;&#xFF0C;&#x52A0;&#x5FEB;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x65F6;&#x95F4;&#x3002;</p><p><strong>&#x6027;&#x80FD;&#x76D1;&#x63A7;&#x548C;&#x5206;&#x6790;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; Lighthouse&#x3001;WebPageTest&#x3001;Chrome DevTools &#x7B49;&#x5DE5;&#x5177;&#xFF0C;&#x76D1;&#x63A7;&#x548C;&#x5206;&#x6790;&#x9875;&#x9762;&#x6027;&#x80FD;&#xFF0C;&#x53D1;&#x73B0;&#x74F6;&#x9888;&#x5E76;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3002;</p><h3 id="dom-%E6%A0%91%E3%80%81%E6%B8%B2%E6%9F%93%E6%A0%91%E5%92%8C%E5%B8%83%E5%B1%80%E7%9A%84%E5%8C%BA%E5%88%AB">DOM &#x6811;&#x3001;&#x6E32;&#x67D3;&#x6811;&#x548C;&#x5E03;&#x5C40;&#x7684;&#x533A;&#x522B;</h3><p><strong>DOM &#x6811;</strong>&#xFF1A;<br>DOM &#x6811;&#x662F;&#x4ECE; HTML &#x6587;&#x6863;&#x4E2D;&#x89E3;&#x6790;&#x51FA;&#x6765;&#x7684;&#x8282;&#x70B9;&#x6811;&#xFF0C;&#x8868;&#x793A;&#x6587;&#x6863;&#x7684;&#x7ED3;&#x6784;&#x3002;&#x6BCF;&#x4E00;&#x4E2A; DOM &#x8282;&#x70B9;&#x5BF9;&#x5E94;&#x4E00;&#x4E2A; HTML &#x5143;&#x7D20;&#xFF0C;&#x5305;&#x542B;&#x8BE5;&#x5143;&#x7D20;&#x7684;&#x6807;&#x7B7E;&#x540D;&#x3001;&#x5C5E;&#x6027;&#x3001;&#x5B50;&#x5143;&#x7D20;&#x7B49;&#x4FE1;&#x606F;&#x3002;DOM &#x6811;&#x4E3B;&#x8981;&#x7528;&#x4E8E; JavaScript &#x8BBF;&#x95EE;&#x548C;&#x64CD;&#x4F5C;&#x9875;&#x9762;&#x7684;&#x7ED3;&#x6784;&#x3002;</p><p><strong>&#x6E32;&#x67D3;&#x6811;</strong>&#xFF1A;<br>&#x6E32;&#x67D3;&#x6811;&#x662F;&#x5728; DOM &#x6811;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x7ED3;&#x5408;&#x4E86; CSSOM &#x6811;&#x7684;&#x6837;&#x5F0F;&#x4FE1;&#x606F;&#x6784;&#x5EFA;&#x51FA;&#x6765;&#x7684;&#x6811;&#x3002;&#x5B83;&#x8868;&#x793A;&#x9875;&#x9762;&#x4E2D;&#x7684;&#x53EF;&#x89C1;&#x5185;&#x5BB9;&#x53CA;&#x5176;&#x6837;&#x5F0F;&#xFF0C;&#x4E0D;&#x5305;&#x542B;&#x50CF; <code>display: none</code> &#x7684;&#x9690;&#x85CF;&#x5143;&#x7D20;&#x3002;&#x6E32;&#x67D3;&#x6811;&#x63D0;&#x4F9B;&#x4E86;&#x5143;&#x7D20;&#x7684;&#x5C3A;&#x5BF8;&#x3001;&#x4F4D;&#x7F6E;&#x3001;&#x989C;&#x8272;&#x7B49;&#x4FE1;&#x606F;&#x3002;</p><p><strong>&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;</strong>&#xFF1A;<br>&#x5E03;&#x5C40;&#xFF08;&#x6216;&#x79F0;&#x4E3A;&#x56DE;&#x6D41;&#xFF09;&#x662F;&#x6839;&#x636E;&#x6E32;&#x67D3;&#x6811;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x8FDB;&#x884C;&#x7684;&#x8BA1;&#x7B97;&#x8FC7;&#x7A0B;&#xFF0C;&#x7528;&#x4E8E;&#x786E;&#x5B9A;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x5C3A;&#x5BF8;&#x548C;&#x4F4D;&#x7F6E;&#x3002;&#x5B83;&#x4E0D;&#x6D89;&#x53CA;&#x6837;&#x5F0F;&#xFF0C;&#x53EA;&#x8BA1;&#x7B97;&#x5143;&#x7D20;&#x5728;&#x9875;&#x9762;&#x4E2D;&#x7684;&#x5177;&#x4F53;&#x5750;&#x6807;&#x548C;&#x5927;&#x5C0F;&#x3002;&#x5E03;&#x5C40;&#x8FC7;&#x7A0B;&#x662F;&#x6E32;&#x67D3;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x6B65;&#x9AA4;&#xFF0C;&#x5F71;&#x54CD;&#x6700;&#x7EC8;&#x7684;&#x6E32;&#x67D3;&#x6548;&#x679C;&#x3002;</p><h3 id="%E9%A1%B5%E9%9D%A2%E5%8A%A0%E8%BD%BD%E4%BC%98%E5%8C%96">&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x4F18;&#x5316;</h3><h4 id="%E4%BB%80%E4%B9%88%E6%98%AF%E9%A6%96%E5%B1%8F%E5%8A%A0%E8%BD%BD%EF%BC%9F">&#x4EC0;&#x4E48;&#x662F;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#xFF1F;</h4><p><strong>&#x9996;&#x5C4F;&#x52A0;&#x8F7D;</strong>&#x6307;&#x7684;&#x662F;&#x7528;&#x6237;&#x8FDB;&#x5165;&#x7F51;&#x7AD9;&#x65F6;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x6E32;&#x67D3;&#x5E76;&#x5C55;&#x793A;&#x7684;&#x9875;&#x9762;&#x5185;&#x5BB9;&#x3002;&#x5728;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9996;&#x5C4F;&#x5305;&#x542B;&#x7528;&#x6237;&#x5728;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x540E;&#x7ACB;&#x523B;&#x770B;&#x5230;&#x7684;&#x5185;&#x5BB9;&#x3002;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#x7684;&#x4F18;&#x5316;&#x5BF9;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x81F3;&#x5173;&#x91CD;&#x8981;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5728;&#x79FB;&#x52A8;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x6162;&#x4F1A;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#x5230;&#x7F51;&#x7AD9;&#x7684;&#x7559;&#x5B58;&#x548C;&#x8F6C;&#x5316;&#x7387;&#x3002;</p><h4 id="%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E9%A6%96%E5%B1%8F%E6%B8%B2%E6%9F%93%E6%97%B6%E9%97%B4%EF%BC%9F">&#x5982;&#x4F55;&#x4F18;&#x5316;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x65F6;&#x95F4;&#xFF1F;</h4><p><strong>&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x7EA7;&#x7BA1;&#x7406;</strong>&#xFF1A;<br>&#x786E;&#x4FDD;&#x9996;&#x5C4F;&#x5185;&#x5BB9;&#x6240;&#x9700;&#x7684;&#x8D44;&#x6E90;&#x4F18;&#x5148;&#x52A0;&#x8F7D;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>&lt;link rel=&quot;preload&quot;&gt;</code> &#x6216; <code>&lt;link rel=&quot;prefetch&quot;&gt;</code> &#x6765;&#x9884;&#x52A0;&#x8F7D;&#x9996;&#x5C4F;&#x6240;&#x9700;&#x7684; CSS&#x3001;JavaScript &#x548C;&#x5B57;&#x4F53;&#x6587;&#x4EF6;&#x3002;</p><p><strong>&#x538B;&#x7F29;&#x4E0E;&#x7F13;&#x5B58;</strong>&#xFF1A;<br>&#x538B;&#x7F29; CSS&#x3001;JS &#x548C; HTML &#x6587;&#x4EF6;&#xFF08;&#x4F8B;&#x5982;&#x4F7F;&#x7528; Gzip&#x3001;Brotli &#x7B49;&#xFF09;&#xFF0C;&#x5E76;&#x5408;&#x7406;&#x914D;&#x7F6E;&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF0C;&#x51CF;&#x5C11;&#x91CD;&#x590D;&#x52A0;&#x8F7D;&#xFF0C;&#x63D0;&#x9AD8;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x3002;</p><p><strong>&#x51CF;&#x5C11;&#x6E32;&#x67D3;&#x963B;&#x585E;&#x8D44;&#x6E90;</strong>&#xFF1A;<br>&#x901A;&#x8FC7; <code>async</code> &#x548C; <code>defer</code> &#x6807;&#x7B7E;&#x6765;&#x5F02;&#x6B65;&#x52A0;&#x8F7D; JavaScript &#x6587;&#x4EF6;&#xFF0C;&#x907F;&#x514D;&#x8FD9;&#x4E9B;&#x811A;&#x672C;&#x963B;&#x585E; HTML &#x6E32;&#x67D3;&#x8FC7;&#x7A0B;&#x3002;&#x5C06;&#x5173;&#x952E; CSS &#x6587;&#x4EF6;&#x653E;&#x5728; <code>&lt;head&gt;</code> &#x4E2D;&#xFF0C;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x5916;&#x90E8;&#x6216;&#x672A;&#x4F18;&#x5316;&#x7684; CSS &#x5E93;&#x3002;</p><p><strong>&#x4F7F;&#x7528;&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#xFF08;SSR&#xFF09;</strong>&#xFF1A;<br>&#x670D;&#x52A1;&#x7AEF;&#x6E32;&#x67D3;&#xFF08;SSR&#xFF09;&#x5C06;&#x9875;&#x9762;&#x7684; HTML &#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x751F;&#x6210;&#xFF0C;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x770B;&#x5230;&#x6E32;&#x67D3;&#x597D;&#x7684;&#x9875;&#x9762;&#x5185;&#x5BB9;&#xFF0C;&#x4ECE;&#x800C;&#x63D0;&#x5347;&#x9996;&#x5C4F;&#x6E32;&#x67D3;&#x901F;&#x5EA6;&#x3002;SSR &#x7279;&#x522B;&#x9002;&#x7528;&#x4E8E;&#x52A8;&#x6001;&#x5185;&#x5BB9;&#x8F83;&#x591A;&#x7684;&#x5E94;&#x7528;&#x3002;</p><p><strong>&#x4F18;&#x5316;&#x5B57;&#x4F53;&#x52A0;&#x8F7D;</strong>&#xFF1A;<br>&#x4F7F;&#x7528; <code>font-display: swap</code> &#x6765;&#x907F;&#x514D;&#x5B57;&#x4F53;&#x52A0;&#x8F7D;&#x65F6;&#x7684;&#x95EA;&#x70C1;&#xFF0C;&#x540C;&#x65F6;&#x5C06;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x5B57;&#x4F53;&#x6587;&#x4EF6;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#x3002;</p><p><strong>&#x51CF;&#x5C11;&#x9875;&#x9762;&#x7684;&#x521D;&#x59CB;&#x6E32;&#x67D3;&#x8303;&#x56F4;</strong>&#xFF1A;<br>&#x53EA;&#x6E32;&#x67D3;&#x7528;&#x6237;&#x53EF;&#x89C6;&#x533A;&#x57DF;&#x5185;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x5BF9;&#x4E8E;&#x957F;&#x9875;&#x9762;&#x3002;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x5C55;&#x793A;&#x9996;&#x5C4F;&#x5185;&#x5BB9;&#xFF0C;&#x5E76;&#x51CF;&#x5C11;&#x6E32;&#x67D3;&#x65F6;&#x95F4;&#x3002;</p><h4 id="%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8%E6%87%92%E5%8A%A0%E8%BD%BD%E3%80%81%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD%E6%9D%A5%E5%87%8F%E5%B0%91%E8%B5%84%E6%BA%90%E7%9A%84%E5%8A%A0%E8%BD%BD%EF%BC%9F">&#x5982;&#x4F55;&#x5229;&#x7528;&#x61D2;&#x52A0;&#x8F7D;&#x3001;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x6765;&#x51CF;&#x5C11;&#x8D44;&#x6E90;&#x7684;&#x52A0;&#x8F7D;&#xFF1F;</h4><p><strong>&#x61D2;&#x52A0;&#x8F7D;</strong>&#xFF1A;<br>&#x61D2;&#x52A0;&#x8F7D;&#x662F;&#x6307;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#x975E;&#x9996;&#x5C4F;&#x5185;&#x5BB9;&#xFF0C;&#x4F8B;&#x5982;&#x56FE;&#x7247;&#x3001;&#x89C6;&#x9891;&#x3001;&#x6216;&#x5916;&#x90E8;&#x8D44;&#x6E90;&#xFF0C;&#x76F4;&#x5230;&#x7528;&#x6237;&#x6EDA;&#x52A8;&#x5230;&#x8BE5;&#x5185;&#x5BB9;&#x65F6;&#x624D;&#x8FDB;&#x884C;&#x52A0;&#x8F7D;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>IntersectionObserver</code> API &#x6765;&#x5224;&#x65AD;&#x4F55;&#x65F6;&#x52A0;&#x8F7D;&#x56FE;&#x7247;&#x6216;&#x5176;&#x4ED6;&#x5143;&#x7D20;&#x3002;</p><p><strong>&#x6309;&#x9700;&#x52A0;&#x8F7D;</strong>&#xFF1A;<br>&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x662F;&#x6839;&#x636E;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x6216;&#x9700;&#x6C42;&#x52A0;&#x8F7D;&#x7279;&#x5B9A;&#x8D44;&#x6E90;&#x3002;&#x901A;&#x8FC7; JavaScript &#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x6A21;&#x5757;&#xFF0C;&#x53EA;&#x6709;&#x5728;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x5230;&#x9700;&#x8981;&#x65F6;&#xFF0C;&#x624D;&#x53BB;&#x8BF7;&#x6C42;&#x989D;&#x5916;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>import()</code> &#x52A8;&#x6001;&#x5BFC;&#x5165; JS &#x6587;&#x4EF6;&#x3001;<code>&lt;link rel=&quot;preload&quot;&gt;</code> &#x6765;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x5173;&#x952E;&#x8D44;&#x6E90;&#x3002;</p><p><strong>JavaScript &#x5206;&#x5272;&#x4E0E;&#x61D2;&#x52A0;&#x8F7D;</strong>&#xFF1A;<br>&#x5229;&#x7528; Webpack &#x7B49;&#x5DE5;&#x5177;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x5206;&#x5272;&#xFF0C;&#x5C06;&#x9875;&#x9762;&#x62C6;&#x5206;&#x4E3A;&#x591A;&#x4E2A;&#x6A21;&#x5757;&#xFF0C;&#x4EC5;&#x5F53;&#x7528;&#x6237;&#x9700;&#x8981;&#x65F6;&#x52A0;&#x8F7D;&#x76F8;&#x5173;&#x6A21;&#x5757;&#x3002;&#x8FD9;&#x907F;&#x514D;&#x4E86;&#x5C06;&#x6240;&#x6709; JavaScript &#x4E00;&#x6B21;&#x6027;&#x52A0;&#x8F7D;&#xFF0C;&#x63D0;&#x5347;&#x4E86;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x3002;</p><h3 id="%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96">&#x56FE;&#x7247;&#x4F18;&#x5316;</h3><h4 id="%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96%E7%BD%91%E9%A1%B5%E4%B8%AD%E7%9A%84%E5%9B%BE%E7%89%87%EF%BC%9F">&#x5982;&#x4F55;&#x4F18;&#x5316;&#x7F51;&#x9875;&#x4E2D;&#x7684;&#x56FE;&#x7247;&#xFF1F;</h4><p><strong>&#x9009;&#x62E9;&#x5408;&#x9002;&#x7684;&#x56FE;&#x7247;&#x683C;&#x5F0F;</strong>&#xFF1A;</p><ul><li><strong>JPEG</strong>&#xFF1A;&#x9002;&#x7528;&#x4E8E;&#x7167;&#x7247;&#x7B49;&#x8272;&#x5F69;&#x4E30;&#x5BCC;&#x7684;&#x56FE;&#x7247;&#x3002;&#x652F;&#x6301;&#x6709;&#x635F;&#x538B;&#x7F29;&#xFF0C;&#x6587;&#x4EF6;&#x8F83;&#x5C0F;&#xFF0C;&#x9002;&#x5408;&#x7F51;&#x7EDC;&#x52A0;&#x8F7D;&#x3002;</li><li><strong>PNG</strong>&#xFF1A;&#x9002;&#x5408;&#x900F;&#x660E;&#x80CC;&#x666F;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x4F46;&#x6587;&#x4EF6;&#x76F8;&#x5BF9;&#x8F83;&#x5927;&#xFF0C;&#x5EFA;&#x8BAE;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x9664;&#x975E;&#x9700;&#x8981;&#x900F;&#x660E;&#x5EA6;&#x3002;</li><li><strong>WebP</strong>&#xFF1A;&#x4E00;&#x79CD;&#x73B0;&#x4EE3;&#x56FE;&#x7247;&#x683C;&#x5F0F;&#xFF0C;&#x76F8;&#x6BD4; JPEG &#x548C; PNG&#xFF0C;WebP &#x56FE;&#x7247;&#x4F53;&#x79EF;&#x66F4;&#x5C0F;&#xFF0C;&#x8D28;&#x91CF;&#x76F8;&#x5F53;&#xFF0C;&#x652F;&#x6301;&#x900F;&#x660E;&#x5EA6;&#x548C;&#x52A8;&#x753B;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F18;&#x5148;&#x9009;&#x62E9;&#x3002;</li><li><strong>SVG</strong>&#xFF1A;&#x9002;&#x5408;&#x56FE;&#x6807;&#x548C;&#x77E2;&#x91CF;&#x56FE;&#xFF0C;&#x6587;&#x4EF6;&#x4F53;&#x79EF;&#x5C0F;&#x4E14;&#x652F;&#x6301;&#x65E0;&#x9650;&#x7F29;&#x653E;&#xFF0C;&#x9002;&#x5408;&#x7F51;&#x9875;&#x4E0A;&#x7684;&#x56FE;&#x6807;&#x3001;&#x56FE;&#x8868;&#x7B49;&#x3002;</li></ul><p><strong>&#x538B;&#x7F29;&#x56FE;&#x7247;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528;&#x5DE5;&#x5177;&#x5982; <strong>ImageOptim</strong>&#x3001;<strong>TinyPNG</strong>&#x3001;<strong>Squoosh</strong> &#x6765;&#x538B;&#x7F29;&#x56FE;&#x7247;&#xFF0C;&#x51CF;&#x5C11;&#x6587;&#x4EF6;&#x4F53;&#x79EF;&#x3002;</li><li>&#x5BF9;&#x4E8E;&#x52A8;&#x753B;&#x56FE;&#x50CF;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528; <strong>APNG</strong> &#x6216; <strong>WebP</strong> &#x683C;&#x5F0F;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#x3002;</li></ul><p><strong>&#x54CD;&#x5E94;&#x5F0F;&#x56FE;&#x7247;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528; <code>&lt;picture&gt;</code> &#x6807;&#x7B7E;&#x548C; <code>srcset</code> &#x5C5E;&#x6027;&#xFF0C;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;&#x5C4F;&#x5E55;&#x5C3A;&#x5BF8;&#x548C;&#x5206;&#x8FA8;&#x7387;&#x52A0;&#x8F7D;&#x4E0D;&#x540C;&#x7684;&#x56FE;&#x7247;&#x5C3A;&#x5BF8;&#xFF0C;&#x907F;&#x514D;&#x52A0;&#x8F7D;&#x8FC7;&#x5927;&#x7684;&#x56FE;&#x7247;&#x3002;</li><li>&#x4F8B;&#x5982;&#xFF0C;&#x9488;&#x5BF9;&#x624B;&#x673A;&#x8BBE;&#x5907;&#x4F7F;&#x7528;&#x66F4;&#x5C0F;&#x5206;&#x8FA8;&#x7387;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x51CF;&#x5C11;&#x52A0;&#x8F7D;&#x7684;&#x56FE;&#x7247;&#x4F53;&#x79EF;&#x3002;</li></ul><p><strong>&#x56FE;&#x7247;&#x61D2;&#x52A0;&#x8F7D;</strong>&#xFF1A;</p><ul><li>&#x4F7F;&#x7528;&#x61D2;&#x52A0;&#x8F7D;&#x6280;&#x672F;&#x4EC5;&#x52A0;&#x8F7D;&#x53EF;&#x89C6;&#x533A;&#x57DF;&#x5185;&#x7684;&#x56FE;&#x7247;&#xFF0C;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#x5176;&#x4ED6;&#x56FE;&#x7247;&#xFF0C;&#x51CF;&#x5C11;&#x9996;&#x5C4F;&#x52A0;&#x8F7D;&#x7684;&#x8D44;&#x6E90;&#x91CF;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x539F;&#x751F;&#x7684; <code>loading=&quot;lazy&quot;</code> &#x5C5E;&#x6027;&#xFF0C;&#x6216;&#x8005; JavaScript &#x5E93;&#x5982; <code>lazysizes</code> &#x6765;&#x5B9E;&#x73B0;&#x3002;</li></ul><h3 id="%E4%BB%A3%E7%A0%81%E5%88%86%E5%89%B2">&#x4EE3;&#x7801;&#x5206;&#x5272;</h3><h4 id="%E4%BB%A3%E7%A0%81%E5%88%86%E5%89%B2%E7%9A%84%E5%8E%9F%E7%90%86">&#x4EE3;&#x7801;&#x5206;&#x5272;&#x7684;&#x539F;&#x7406;</h4><p><strong>&#x4EE3;&#x7801;&#x5206;&#x5272;</strong>&#x662F;&#x5C06;&#x5E94;&#x7528;&#x7684; JavaScript &#x6587;&#x4EF6;&#x62C6;&#x5206;&#x4E3A;&#x66F4;&#x5C0F;&#x7684;&#x5757;&#xFF0C;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x6BCF;&#x4E2A;&#x5757;&#x7684;&#x6280;&#x672F;&#x3002;&#x901A;&#x8FC7;&#x5C06;&#x4EE3;&#x7801;&#x62C6;&#x5206;&#x6210;&#x591A;&#x4E2A;&#x6A21;&#x5757;&#xFF0C;&#x53EA;&#x6709;&#x5728;&#x7528;&#x6237;&#x9700;&#x8981;&#x65F6;&#x624D;&#x52A0;&#x8F7D;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x51CF;&#x5C11;&#x521D;&#x59CB;&#x52A0;&#x8F7D;&#x65F6;&#x7684; JavaScript &#x6587;&#x4EF6;&#x5927;&#x5C0F;&#xFF0C;&#x52A0;&#x5FEB;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#x3002;</p><p>&#x4EE3;&#x7801;&#x5206;&#x5272;&#x7684;&#x4E3B;&#x8981;&#x539F;&#x7406;&#x662F;&#xFF1A;</p><ul><li><strong>&#x9759;&#x6001;&#x5206;&#x6790;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x9759;&#x6001;&#x5206;&#x6790;&#x4EE3;&#x7801;&#xFF0C;&#x8BC6;&#x522B;&#x51FA;&#x54EA;&#x4E9B;&#x90E8;&#x5206;&#x662F;&#x72EC;&#x7ACB;&#x7684;&#x3001;&#x53EF;&#x4EE5;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#x7684;&#xFF0C;&#x54EA;&#x4E9B;&#x662F;&#x9700;&#x8981;&#x7ACB;&#x5373;&#x6267;&#x884C;&#x7684;&#x3002;</li><li><strong>&#x6309;&#x9700;&#x52A0;&#x8F7D;</strong>&#xFF1A;&#x5C06;&#x4EE3;&#x7801;&#x62C6;&#x5206;&#x6210;&#x591A;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x5229;&#x7528;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;&#x6280;&#x672F;&#xFF08;&#x5982; <code>import()</code>&#xFF09;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x8FD9;&#x4E9B;&#x6587;&#x4EF6;&#x3002;</li><li><strong>&#x61D2;&#x52A0;&#x8F7D;&#x548C;&#x9884;&#x52A0;&#x8F7D;</strong>&#xFF1A;&#x6839;&#x636E;&#x7528;&#x6237;&#x884C;&#x4E3A;&#x548C;&#x9875;&#x9762;&#x4EA4;&#x4E92;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#x4EE3;&#x7801;&#xFF0C;&#x907F;&#x514D;&#x4E00;&#x6B21;&#x6027;&#x52A0;&#x8F7D;&#x6240;&#x6709;&#x4EE3;&#x7801;&#x3002;</li></ul><h4 id="%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%E5%88%86%E5%89%B2%EF%BC%9F">&#x5982;&#x4F55;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x5206;&#x5272;&#xFF1F;</h4><p><strong>&#x4F7F;&#x7528; Webpack &#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x5206;&#x5272;</strong>&#xFF1A; Webpack &#x63D0;&#x4F9B;&#x4E86;&#x591A;&#x79CD;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x7684;&#x65B9;&#x5F0F;&#xFF1A;</p><ul><li><strong>&#x5165;&#x53E3;&#x4EE3;&#x7801;&#x5206;&#x5272;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x914D;&#x7F6E; Webpack &#x7684; <code>entry</code> &#x914D;&#x7F6E;&#x9879;&#x6765;&#x5206;&#x5272;&#x4E0D;&#x540C;&#x7684;&#x5165;&#x53E3;&#x70B9;&#x3002;</li><li><strong>&#x6309;&#x9700;&#x52A0;&#x8F7D;&#xFF08;&#x52A8;&#x6001;&#x5BFC;&#x5165;&#xFF09;</strong>&#xFF1A;&#x4F7F;&#x7528; <code>import()</code> &#x6765;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x6A21;&#x5757;&#x3002;Webpack &#x4F1A;&#x81EA;&#x52A8;&#x5C06;&#x8FD9;&#x4E9B;&#x52A8;&#x6001;&#x5BFC;&#x5165;&#x7684;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x6210;&#x72EC;&#x7ACB;&#x7684; chunk&#x3002;</li><li><strong>&#x5171;&#x4EAB;&#x5E93;&#x5206;&#x5272;</strong>&#xFF1A;&#x5229;&#x7528; <code>SplitChunksPlugin</code> &#x6765;&#x5C06;&#x591A;&#x4E2A;&#x5165;&#x53E3;&#x6587;&#x4EF6;&#x4E2D;&#x91CD;&#x590D;&#x7684;&#x4F9D;&#x8D56;&#x5206;&#x5272;&#x6210;&#x5171;&#x4EAB;&#x7684; chunk&#xFF0C;&#x4ECE;&#x800C;&#x907F;&#x514D;&#x591A;&#x6B21;&#x52A0;&#x8F7D;&#x76F8;&#x540C;&#x7684;&#x5E93;&#x3002;</li></ul><pre><code class="language-javascript">// Webpack &#x793A;&#x4F8B;&#xFF1A;&#x52A8;&#x6001;&#x5BFC;&#x5165;&#x4EE3;&#x7801;
import(/* webpackChunkName: &quot;module-name&quot; */ &apos;./module&apos;).then(module =&gt; {
  // &#x4F7F;&#x7528;&#x6A21;&#x5757;
});
</code></pre><p><strong>React &#x548C; Vue &#x7B49;&#x6846;&#x67B6;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x5206;&#x5272;</strong>&#xFF1A;</p><ul><li>&#x5728; React &#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x5229;&#x7528; React.lazy &#x548C; Suspense &#x6765;&#x5B9E;&#x73B0;&#x4EE3;&#x7801;&#x5206;&#x5272;&#xFF1A;</li></ul><pre><code class="language-javascript">const MyComponent = React.lazy(() =&gt; import(&apos;./MyComponent&apos;));
</code></pre><p>&#x5728; Vue &#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Vue Router &#x7684;&#x61D2;&#x52A0;&#x8F7D;&#x529F;&#x80FD;&#x6765;&#x5206;&#x5272;&#x4EE3;&#x7801;&#xFF1A;</p><pre><code class="language-javascript">const MyComponent = () =&gt; import(&apos;./MyComponent.vue&apos;);
</code></pre><p><strong>&#x6309;&#x8DEF;&#x7531;&#x5206;&#x5272;&#x4EE3;&#x7801;</strong>&#xFF1A; &#x901A;&#x8FC7;&#x5C06;&#x6BCF;&#x4E2A;&#x8DEF;&#x7531;&#x7684;&#x7EC4;&#x4EF6;&#x5206;&#x5272;&#x6210;&#x72EC;&#x7ACB;&#x7684;&#x4EE3;&#x7801;&#x5757;&#xFF0C;&#x53EA;&#x6709;&#x5728;&#x7528;&#x6237;&#x8BBF;&#x95EE;&#x8BE5;&#x8DEF;&#x7531;&#x65F6;&#x624D;&#x52A0;&#x8F7D;&#x5BF9;&#x5E94;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x4F8B;&#x5982;&#xFF0C;React Router &#x6216; Vue Router &#x90FD;&#x652F;&#x6301;&#x61D2;&#x52A0;&#x8F7D;&#x8DEF;&#x7531;&#x7EC4;&#x4EF6;&#x3002;</p><p><strong>CSS &#x548C;&#x5176;&#x4ED6;&#x8D44;&#x6E90;&#x5206;&#x5272;</strong>&#xFF1A; &#x9664;&#x4E86; JavaScript&#xFF0C;CSS &#x548C;&#x5176;&#x4ED6;&#x8D44;&#x6E90;&#xFF08;&#x5982;&#x56FE;&#x7247;&#x3001;&#x5B57;&#x4F53;&#xFF09;&#x4E5F;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x5206;&#x5272;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x4F7F;&#x7528; Webpack &#x7684; <code>MiniCssExtractPlugin</code> &#x6765;&#x63D0;&#x53D6; CSS &#x5230;&#x72EC;&#x7ACB;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#x3002;</p><p>&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#xFF0C;&#x4EE3;&#x7801;&#x5206;&#x5272;&#x4E0D;&#x4EC5;&#x80FD;&#x52A0;&#x5FEB;&#x9996;&#x6B21;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;&#xFF0C;&#x8FD8;&#x80FD;&#x964D;&#x4F4E;&#x540E;&#x7EED;&#x7684;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x63D0;&#x9AD8;&#x9875;&#x9762;&#x7684;&#x6574;&#x4F53;&#x6027;&#x80FD;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[js]]></title><description><![CDATA[<p>&#x597D;&#x7684;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x6839;&#x636E; <strong>JavaScript &#x57FA;&#x7840;</strong> &#x76F8;&#x5173;&#x95EE;&#x9898;&#x7684;&#x8BE6;&#x7EC6;&#x56DE;&#x7B54;&#xFF1A;</p><hr><h3 id="1-%E9%97%AD%E5%8C%85">1. <strong>&#x95ED;&#x5305;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x89E3;&#x91CA;&#x95ED;&#x5305;&#x662F;&#x4EC0;&#x4E48;&#xFF0C;&#x5E76;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5982;&#x4F55;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;</p>]]></description><link>https://pureo.cn/js/</link><guid isPermaLink="false">677bbdf291ad920001d1f377</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Mon, 06 Jan 2025 11:27:24 GMT</pubDate><content:encoded><![CDATA[<p>&#x597D;&#x7684;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x6839;&#x636E; <strong>JavaScript &#x57FA;&#x7840;</strong> &#x76F8;&#x5173;&#x95EE;&#x9898;&#x7684;&#x8BE6;&#x7EC6;&#x56DE;&#x7B54;&#xFF1A;</p><hr><h3 id="1-%E9%97%AD%E5%8C%85">1. <strong>&#x95ED;&#x5305;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x89E3;&#x91CA;&#x95ED;&#x5305;&#x662F;&#x4EC0;&#x4E48;&#xFF0C;&#x5E76;&#x4E3E;&#x4F8B;&#x8BF4;&#x660E;&#x5982;&#x4F55;&#x5728;&#x5B9E;&#x9645;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;&#x5B83;&#x3002;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A; &#x95ED;&#x5305;&#x662F; JavaScript &#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x6838;&#x5FC3;&#x6982;&#x5FF5;&#x3002;&#x95ED;&#x5305;&#x662F;&#x6307;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x201C;&#x8BB0;&#x4F4F;&#x201D;&#x5E76;&#x8BBF;&#x95EE;&#x5B9A;&#x4E49;&#x65F6;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#xFF0C;&#x5373;&#x4F7F;&#x51FD;&#x6570;&#x5728;&#x5176;&#x5916;&#x90E8;&#x88AB;&#x8C03;&#x7528;&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x95ED;&#x5305;&#x5141;&#x8BB8;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x8BBF;&#x95EE;&#x5176;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x5373;&#x4F7F;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x5DF2;&#x7ECF;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x3002;</p><p><strong>&#x89E3;&#x91CA;</strong>&#xFF1A;</p><pre><code class="language-javascript">function outer() {
  let counter = 0; // outer &#x51FD;&#x6570;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;
  return function inner() {
    counter++; // &#x5185;&#x90E8;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE; outer &#x51FD;&#x6570;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;
    console.log(counter);
  };
}

const counterClosure = outer(); // outer &#x6267;&#x884C;&#x540E;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5185;&#x5C42;&#x51FD;&#x6570;
counterClosure(); // &#x8F93;&#x51FA; 1
counterClosure(); // &#x8F93;&#x51FA; 2
counterClosure(); // &#x8F93;&#x51FA; 3
</code></pre><p><strong>&#x5B9E;&#x9645;&#x5E94;&#x7528;</strong>&#xFF1A;&#x95ED;&#x5305;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x5C01;&#x88C5;&#x79C1;&#x6709;&#x53D8;&#x91CF;&#xFF0C;&#x5B9E;&#x73B0;&#x6570;&#x636E;&#x7684;&#x9690;&#x85CF;&#x548C;&#x4FDD;&#x62A4;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5E38;&#x89C1;&#x7684;&#x6A21;&#x5757;&#x6A21;&#x5F0F;&#x5C31;&#x662F;&#x5229;&#x7528;&#x95ED;&#x5305;&#x5C06;&#x4E00;&#x4E9B;&#x79C1;&#x6709;&#x72B6;&#x6001;&#x548C;&#x65B9;&#x6CD5;&#x5C01;&#x88C5;&#x5728;&#x95ED;&#x5305;&#x4E2D;&#xFF0C;&#x4E0D;&#x8BA9;&#x5916;&#x90E8;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x3002;</p><hr><h3 id="2-%E5%8E%9F%E5%9E%8B%E9%93%BE%E5%92%8C%E7%BB%A7%E6%89%BF">2. <strong>&#x539F;&#x578B;&#x94FE;&#x548C;&#x7EE7;&#x627F;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;JavaScript &#x4E2D;&#x539F;&#x578B;&#x94FE;&#x7684;&#x6982;&#x5FF5;&#x662F;&#x600E;&#x6837;&#x7684;&#xFF1F;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x7EE7;&#x627F;&#x673A;&#x5236;&#x3002;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A; &#x5728; JavaScript &#x4E2D;&#xFF0C;&#x6BCF;&#x4E2A;&#x5BF9;&#x8C61;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x9690;&#x5F0F;&#x7684; <code>prototype</code> &#x5C5E;&#x6027;&#xFF0C;&#x5B83;&#x6307;&#x5411;&#x8BE5;&#x5BF9;&#x8C61;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x7684;&#x539F;&#x578B;&#x3002;&#x5F53;&#x8BBF;&#x95EE;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x5C5E;&#x6027;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x8BE5;&#x5BF9;&#x8C61;&#x672C;&#x8EAB;&#x6CA1;&#x6709;&#x8BE5;&#x5C5E;&#x6027;&#xFF0C;JavaScript &#x4F1A;&#x67E5;&#x627E;&#x8BE5;&#x5BF9;&#x8C61;&#x7684;&#x539F;&#x578B;&#xFF0C;&#x518D;&#x67E5;&#x627E;&#x539F;&#x578B;&#x7684;&#x539F;&#x578B;&#xFF0C;&#x76F4;&#x5230;&#x627E;&#x5230;&#x5C5E;&#x6027;&#x6216;&#x5230;&#x8FBE;&#x539F;&#x578B;&#x94FE;&#x7684;&#x672B;&#x7AEF;&#xFF08;<code>null</code>&#xFF09;&#x3002;&#x8FD9;&#x79CD;&#x67E5;&#x627E;&#x673A;&#x5236;&#x79F0;&#x4E3A;&#x539F;&#x578B;&#x94FE;&#x3002;</p><p><strong>&#x7EE7;&#x627F;</strong>&#xFF1A;JavaScript &#x4E2D;&#x7684;&#x7EE7;&#x627F;&#x662F;&#x57FA;&#x4E8E;&#x539F;&#x578B;&#x7684;&#x3002;&#x5B50;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x53EF;&#x4EE5;&#x7EE7;&#x627F;&#x7236;&#x7C7B;&#x7684;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x3002;</p><p><strong>&#x5B9E;&#x73B0;&#x7EE7;&#x627F;</strong>&#xFF1A;</p><pre><code class="language-javascript">// &#x7236;&#x7C7B;&#x6784;&#x9020;&#x51FD;&#x6570;
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// &#x5B50;&#x7C7B;&#x6784;&#x9020;&#x51FD;&#x6570;
function Dog(name, breed) {
  Animal.call(this, name); // &#x7EE7;&#x627F;&#x7236;&#x7C7B;&#x7684;&#x5C5E;&#x6027;
  this.breed = breed;
}

// &#x7EE7;&#x627F;&#x7236;&#x7C7B;&#x7684;&#x539F;&#x578B;&#x65B9;&#x6CD5;
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // &#x4FEE;&#x590D;&#x6784;&#x9020;&#x51FD;&#x6570;&#x6307;&#x5411;

// &#x65B0;&#x589E;&#x5B50;&#x7C7B;&#x7684;&#x65B9;&#x6CD5;
Dog.prototype.bark = function() {
  console.log(`${this.name} is barking!`);
};

// &#x4F7F;&#x7528;&#x5B50;&#x7C7B;
const dog = new Dog(&apos;Buddy&apos;, &apos;Golden Retriever&apos;);
dog.sayHello(); // Hello, my name is Buddy
dog.bark(); // Buddy is barking!
</code></pre><hr><h3 id="3-%E4%BA%8B%E4%BB%B6%E6%9C%BA%E5%88%B6">3. <strong>&#x4E8B;&#x4EF6;&#x673A;&#x5236;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x89E3;&#x91CA;&#x4E8B;&#x4EF6;&#x5192;&#x6CE1;&#x3001;&#x6355;&#x83B7;&#x3001;&#x4E8B;&#x4EF6;&#x59D4;&#x6258;&#x7684;&#x673A;&#x5236;&#x3002;&#x5982;&#x4F55;&#x63D0;&#x9AD8;&#x4E8B;&#x4EF6;&#x7ED1;&#x5B9A;&#x7684;&#x6548;&#x7387;&#xFF1F;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li><strong>&#x4E8B;&#x4EF6;&#x5192;&#x6CE1;</strong>&#xFF1A;&#x4E8B;&#x4EF6;&#x4ECE;&#x6700;&#x5177;&#x4F53;&#x7684;&#x5143;&#x7D20;&#x5F00;&#x59CB;&#x5411;&#x4E0A;&#x4F20;&#x64AD;&#xFF0C;&#x76F4;&#x5230; <code>document</code> &#x6216; <code>body</code>&#x3002;</li><li><strong>&#x4E8B;&#x4EF6;&#x6355;&#x83B7;</strong>&#xFF1A;&#x4E8B;&#x4EF6;&#x4ECE; <code>document</code> &#x6216; <code>body</code> &#x5F00;&#x59CB;&#x5411;&#x4E0B;&#x4F20;&#x64AD;&#xFF0C;&#x76F4;&#x5230;&#x6700;&#x5177;&#x4F53;&#x7684;&#x5143;&#x7D20;&#x3002;</li><li><strong>&#x4E8B;&#x4EF6;&#x59D4;&#x6258;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x5C06;&#x4E8B;&#x4EF6;&#x7ED1;&#x5B9A;&#x5230;&#x7236;&#x5143;&#x7D20;&#x6765;&#x5904;&#x7406;&#x591A;&#x4E2A;&#x5B50;&#x5143;&#x7D20;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x4ECE;&#x800C;&#x51CF;&#x5C11;&#x7ED1;&#x5B9A;&#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7684;&#x6570;&#x91CF;&#x3002;</li></ul><p><strong>&#x63D0;&#x9AD8;&#x4E8B;&#x4EF6;&#x7ED1;&#x5B9A;&#x6548;&#x7387;</strong>&#xFF1A;</p><ul><li>&#x4E8B;&#x4EF6;&#x59D4;&#x6258;&#x662F;&#x63D0;&#x9AD8;&#x4E8B;&#x4EF6;&#x7ED1;&#x5B9A;&#x6548;&#x7387;&#x7684;&#x5E38;&#x89C1;&#x65B9;&#x6CD5;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5047;&#x8BBE;&#x6709;&#x591A;&#x4E2A;&#x5B50;&#x5143;&#x7D20;&#x9700;&#x8981;&#x7ED1;&#x5B9A;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5C06;&#x4E8B;&#x4EF6;&#x7ED1;&#x5B9A;&#x5230;&#x7236;&#x5143;&#x7D20;&#xFF0C;&#x901A;&#x8FC7; <code>event.target</code> &#x5224;&#x65AD;&#x5B9E;&#x9645;&#x70B9;&#x51FB;&#x7684;&#x5B50;&#x5143;&#x7D20;&#x3002;</li></ul><p><strong>&#x4F8B;&#x5B50;</strong>&#xFF1A;</p><pre><code class="language-javascript">// &#x5047;&#x8BBE;&#x6709;&#x591A;&#x4E2A;&#x5217;&#x8868;&#x9879;&#x9700;&#x8981;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;
document.querySelector(&apos;#parent&apos;).addEventListener(&apos;click&apos;, function(event) {
  if (event.target &amp;&amp; event.target.matches(&apos;li&apos;)) {
    console.log(`You clicked on ${event.target.textContent}`);
  }
});
</code></pre><hr><h3 id="4-%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B">4. <strong>&#x5F02;&#x6B65;&#x7F16;&#x7A0B;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x89E3;&#x91CA; <code>Promise</code>&#x3001;<code>async/await</code> &#x548C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x533A;&#x522B;&#x3002;&#x4F60;&#x5982;&#x4F55;&#x5904;&#x7406;&#x591A;&#x4E2A;&#x5E76;&#x53D1;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#xFF1F;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x7684;&#x5E76;&#x53D1;&#x63A7;&#x5236;&#x51FD;&#x6570;&#x3002;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li><strong>&#x56DE;&#x8C03;&#x51FD;&#x6570;</strong>&#xFF1A;&#x56DE;&#x8C03;&#x662F;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x7684;&#x6700;&#x65E9;&#x5F62;&#x5F0F;&#xFF0C;&#x901A;&#x8FC7;&#x5C06;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x7ED9;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x5728;&#x67D0;&#x4E2A;&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x65F6;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x3002;</li></ul><pre><code class="language-javascript">setTimeout(() =&gt; {
  console.log(&apos;Done!&apos;);
}, 1000);
</code></pre><ul><li><strong>Promise</strong>&#xFF1A;<code>Promise</code> &#x662F;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x8868;&#x793A;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x6700;&#x7EC8;&#x5B8C;&#x6210;&#xFF08;&#x6216;&#x5931;&#x8D25;&#xFF09;&#x53CA;&#x5176;&#x7ED3;&#x679C;&#x503C;&#x3002;&#x901A;&#x8FC7; <code>then</code> &#x548C; <code>catch</code> &#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x6210;&#x529F;&#x548C;&#x5931;&#x8D25;&#x7684;&#x7ED3;&#x679C;&#x3002;</li></ul><pre><code class="language-javascript">let promise = new Promise((resolve, reject) =&gt; {
  setTimeout(() =&gt; resolve(&apos;Done!&apos;), 1000);
});

promise.then(result =&gt; console.log(result)); // &#x8F93;&#x51FA; &apos;Done!&apos;
</code></pre><ul><li><strong>async/await</strong>&#xFF1A;<code>async</code> &#x58F0;&#x660E;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x51FD;&#x6570;&#xFF0C;<code>await</code> &#x7528;&#x4E8E;&#x7B49;&#x5F85; <code>Promise</code> &#x5B8C;&#x6210;&#x3002;<code>async/await</code> &#x4F7F;&#x5F02;&#x6B65;&#x4EE3;&#x7801;&#x66F4;&#x63A5;&#x8FD1;&#x540C;&#x6B65;&#x4EE3;&#x7801;&#xFF0C;&#x6613;&#x4E8E;&#x7406;&#x89E3;&#x548C;&#x7EF4;&#x62A4;&#x3002;</li></ul><pre><code class="language-javascript">async function fetchData() {
  let result = await someAsyncFunction();
  console.log(result);
}
</code></pre><p><strong>&#x5904;&#x7406;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#x7684;&#x6279;&#x91CF;&#x63A7;&#x5236;</strong>&#xFF1A;</p><pre><code class="language-javascript">function batchRequest(urls, handler, limit) {
  return new Promise((resolve, reject) =&gt; {
    const results = [];
    let activeCount = 0;
    let completed = 0;
    let currentIndex = 0;

    const next = () =&gt; {
      if (completed &gt;= urls.length) {
        return resolve(results);
      }
      
      if (activeCount &lt; limit &amp;&amp; currentIndex &lt; urls.length) {
        const index = currentIndex++;
        activeCount++;
        
        handler(urls[index])
          .then(result =&gt; {
            results[index] = result;
          })
          .catch(error =&gt; {
            results[index] = error;
          })
          .finally(() =&gt; {
            completed++;
            activeCount--;
            next();
          });
        
        next();
      }
    };
    
    next();
  });
}
</code></pre><hr><h3 id="5-es6-%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86">5. <strong>ES6+ &#x76F8;&#x5173;&#x77E5;&#x8BC6;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x4E0E;&#x666E;&#x901A;&#x51FD;&#x6570;&#x5728; <code>this</code> &#x7ED1;&#x5B9A;&#x4E0A;&#x7684;&#x533A;&#x522B;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li>&#x666E;&#x901A;&#x51FD;&#x6570;&#xFF1A;<code>this</code> &#x7531;&#x8C03;&#x7528;&#x8BE5;&#x51FD;&#x6570;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x51B3;&#x5B9A;&#xFF0C;&#x53D6;&#x51B3;&#x4E8E;&#x8C03;&#x7528;&#x65F6;&#x7684;&#x4F4D;&#x7F6E;&#x3002;</li></ul><pre><code class="language-javascript">function normalFunc() {
  console.log(this);
}

const obj = { normalFunc };
obj.normalFunc(); // &#x8F93;&#x51FA; obj&#xFF0C;&#x56E0;&#x4E3A;&#x51FD;&#x6570;&#x88AB; obj &#x8C03;&#x7528;
</code></pre><ul><li>&#x7BAD;&#x5934;&#x51FD;&#x6570;&#xFF1A;<code>this</code> &#x7531;&#x5B9A;&#x4E49;&#x65F6;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x51B3;&#x5B9A;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x8C03;&#x7528;&#x65F6;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x3002;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x6CA1;&#x6709;&#x81EA;&#x5DF1;&#x7684; <code>this</code>&#xFF0C;&#x5B83;&#x4F1A;&#x7EE7;&#x627F;&#x5916;&#x90E8;&#x4F5C;&#x7528;&#x57DF;&#x7684; <code>this</code>&#x3002;</li></ul><pre><code class="language-javascript">const obj = {
  name: &apos;Alice&apos;,
  greet: function() {
    setTimeout(() =&gt; {
      console.log(this.name); // this &#x4F1A;&#x6307;&#x5411; obj
    }, 1000);
  }
};
obj.greet(); // &#x8F93;&#x51FA; Alice
</code></pre><hr><p>&#x4EE5;&#x4E0A;&#x662F; JavaScript &#x57FA;&#x7840;&#x77E5;&#x8BC6;&#x7684;&#x8BE6;&#x7EC6;&#x56DE;&#x7B54;&#xFF0C;&#x6DB5;&#x76D6;&#x4E86;&#x95ED;&#x5305;&#x3001;&#x539F;&#x578B;&#x94FE;&#x3001;&#x4E8B;&#x4EF6;&#x673A;&#x5236;&#x3001;&#x5F02;&#x6B65;&#x7F16;&#x7A0B;&#x548C; <code>ES6+</code> &#x7684;&#x4E00;&#x4E9B;&#x91CD;&#x8981;&#x77E5;&#x8BC6;&#x70B9;&#x3002;</p><p>&#x597D;&#x7684;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F; <strong>ES6+</strong> &#x7684;&#x76F8;&#x5173;&#x95EE;&#x9898;&#x53CA;&#x8BE6;&#x7EC6;&#x89E3;&#x7B54;&#xFF1A;</p><hr><h3 id="1-%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0%E4%B8%8E-this-%E7%BB%91%E5%AE%9A%E7%9A%84%E5%8C%BA%E5%88%AB">1. <strong>&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x4E0E; <code>this</code> &#x7ED1;&#x5B9A;&#x7684;&#x533A;&#x522B;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x4E0E;&#x666E;&#x901A;&#x51FD;&#x6570;&#x5728; <code>this</code> &#x7ED1;&#x5B9A;&#x4E0A;&#x7684;&#x533A;&#x522B;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li><strong>&#x666E;&#x901A;&#x51FD;&#x6570;</strong>&#xFF1A;&#x666E;&#x901A;&#x51FD;&#x6570;&#x4E2D;&#x7684; <code>this</code> &#x662F;&#x52A8;&#x6001;&#x7ED1;&#x5B9A;&#x7684;&#xFF0C;&#x53D6;&#x51B3;&#x4E8E;&#x51FD;&#x6570;&#x7684;&#x8C03;&#x7528;&#x65B9;&#x5F0F;&#x3002;&#x5E38;&#x89C1;&#x7684;&#x60C5;&#x51B5;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x5BF9;&#x8C61;&#x7684;&#x65B9;&#x6CD5;&#x88AB;&#x8C03;&#x7528;&#xFF0C;<code>this</code> &#x6307;&#x5411;&#x8C03;&#x7528;&#x5B83;&#x7684;&#x5BF9;&#x8C61;&#x3002;&#x5982;&#x679C;&#x662F;&#x4F5C;&#x4E3A;&#x666E;&#x901A;&#x51FD;&#x6570;&#x8C03;&#x7528;&#xFF0C;<code>this</code> &#x5C06;&#x6307;&#x5411;&#x5168;&#x5C40;&#x5BF9;&#x8C61;&#xFF08;&#x5728;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x4E0B;&#x662F; <code>undefined</code>&#xFF09;&#x3002;</li></ul><pre><code class="language-javascript">function normalFunc() {
  console.log(this);
}

const obj = { normalFunc };
obj.normalFunc(); // &#x8F93;&#x51FA; obj&#xFF0C;&#x56E0;&#x4E3A;&#x51FD;&#x6570;&#x662F;&#x4F5C;&#x4E3A; obj &#x7684;&#x65B9;&#x6CD5;&#x8C03;&#x7528;&#x7684;
normalFunc(); // &#x8F93;&#x51FA; global &#x5BF9;&#x8C61;&#xFF08;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x662F; window&#xFF09;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x5219;&#x8F93;&#x51FA; undefined
</code></pre><ul><li><strong>&#x7BAD;&#x5934;&#x51FD;&#x6570;</strong>&#xFF1A;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x7684; <code>this</code> &#x5E76;&#x4E0D;&#x7531;&#x8C03;&#x7528;&#x65F6;&#x51B3;&#x5B9A;&#xFF0C;&#x800C;&#x662F;&#x7531;&#x5B9A;&#x4E49;&#x65F6;&#x6240;&#x5728;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x51B3;&#x5B9A;&#x3002;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x6CA1;&#x6709;&#x81EA;&#x5DF1;&#x7684; <code>this</code>&#xFF0C;&#x5B83;&#x4F1A;&#x7EE7;&#x627F;&#x5916;&#x90E8;&#xFF08;&#x7236;&#x7EA7;&#x4F5C;&#x7528;&#x57DF;&#xFF09;&#x7684; <code>this</code>&#x3002;</li></ul><pre><code class="language-javascript">const obj = {
  name: &apos;Alice&apos;,
  greet: function() {
    setTimeout(() =&gt; {
      console.log(this.name); // this &#x4F1A;&#x6307;&#x5411; obj&#xFF0C;&#x56E0;&#x4E3A;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x7EE7;&#x627F;&#x4E86;&#x5916;&#x90E8;&#x7684; this
    }, 1000);
  }
};
obj.greet(); // &#x8F93;&#x51FA; &apos;Alice&apos;
</code></pre><h3 id="%E6%80%BB%E7%BB%93%EF%BC%9A"><strong>&#x603B;&#x7ED3;</strong>&#xFF1A;</h3><ul><li>&#x666E;&#x901A;&#x51FD;&#x6570;&#x7684; <code>this</code> &#x7531;&#x8C03;&#x7528;&#x65B9;&#x5F0F;&#x51B3;&#x5B9A;&#x3002;</li><li>&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x7684; <code>this</code> &#x7531;&#x51FD;&#x6570;&#x5B9A;&#x4E49;&#x65F6;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x51B3;&#x5B9A;&#x3002;</li></ul><hr><h3 id="2-%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC">2. <strong>&#x89E3;&#x6784;&#x8D4B;&#x503C;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x8BF7;&#x89E3;&#x91CA;&#x89E3;&#x6784;&#x8D4B;&#x503C;&#x7684;&#x7528;&#x6CD5;&#xFF0C;&#x5E76;&#x7ED9;&#x51FA;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x573A;&#x666F;&#x3002;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A; &#x89E3;&#x6784;&#x8D4B;&#x503C;&#x662F; ES6 &#x5F15;&#x5165;&#x7684;&#x8BED;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6A21;&#x5F0F;&#x5339;&#x914D;&#x7684;&#x65B9;&#x5F0F;&#x5FEB;&#x901F;&#x63D0;&#x53D6;&#x5BF9;&#x8C61;&#x6216;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x503C;&#xFF0C;&#x5E76;&#x8D4B;&#x7ED9;&#x76F8;&#x5E94;&#x7684;&#x53D8;&#x91CF;&#x3002;&#x89E3;&#x6784;&#x8D4B;&#x503C;&#x53EF;&#x4EE5;&#x7B80;&#x5316;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x589E;&#x52A0;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#x3002;</p><h4 id="%E6%95%B0%E7%BB%84%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC"><strong>&#x6570;&#x7EC4;&#x89E3;&#x6784;&#x8D4B;&#x503C;</strong></h4><pre><code class="language-javascript">const arr = [1, 2, 3];
const [a, b] = arr;
console.log(a, b); // &#x8F93;&#x51FA; 1 2
</code></pre><ul><li>&#x53EF;&#x4EE5;&#x8DF3;&#x8FC7;&#x67D0;&#x4E9B;&#x5143;&#x7D20;&#xFF1A;</li></ul><pre><code class="language-javascript">const arr = [1, 2, 3];
const [, b] = arr;
console.log(b); // &#x8F93;&#x51FA; 2
</code></pre><ul><li>&#x9ED8;&#x8BA4;&#x503C;&#xFF1A;&#x5982;&#x679C;&#x89E3;&#x6784;&#x65F6;&#x67D0;&#x4E2A;&#x503C;&#x662F; <code>undefined</code>&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x9ED8;&#x8BA4;&#x503C;&#x3002;</li></ul><pre><code class="language-javascript">const arr = [1];
const [a, b = 2] = arr;
console.log(b); // &#x8F93;&#x51FA; 2
</code></pre><h4 id="%E5%AF%B9%E8%B1%A1%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC"><strong>&#x5BF9;&#x8C61;&#x89E3;&#x6784;&#x8D4B;&#x503C;</strong></h4><pre><code class="language-javascript">const person = { name: &apos;Alice&apos;, age: 25 };
const { name, age } = person;
console.log(name, age); // &#x8F93;&#x51FA; &apos;Alice&apos; 25
</code></pre><ul><li>&#x9ED8;&#x8BA4;&#x503C;&#xFF1A;</li></ul><pre><code class="language-javascript">const person = { name: &apos;Alice&apos; };
const { name, age = 30 } = person;
console.log(age); // &#x8F93;&#x51FA; 30
</code></pre><ul><li>&#x522B;&#x540D;&#xFF1A;&#x89E3;&#x6784;&#x65F6;&#x53EF;&#x4EE5;&#x4E3A;&#x53D8;&#x91CF;&#x91CD;&#x547D;&#x540D;&#x3002;</li></ul><pre><code class="language-javascript">const person = { name: &apos;Alice&apos;, age: 25 };
const { name: n, age: a } = person;
console.log(n, a); // &#x8F93;&#x51FA; &apos;Alice&apos; 25
</code></pre><h4 id="%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%9A"><strong>&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</h4><ol><li><strong>&#x51FD;&#x6570;&#x53C2;&#x6570;&#x89E3;&#x6784;</strong>&#xFF1A;&#x5F53;&#x51FD;&#x6570;&#x6709;&#x591A;&#x4E2A;&#x53C2;&#x6570;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x89E3;&#x6784;&#x8D4B;&#x503C;&#x6765;&#x7B80;&#x5316;&#x4EE3;&#x7801;&#x548C;&#x63D0;&#x9AD8;&#x53EF;&#x8BFB;&#x6027;&#x3002;</li></ol><pre><code class="language-javascript">function greet({ name, age }) {
  console.log(`Hello ${name}, you are ${age} years old.`);
}

const person = { name: &apos;Alice&apos;, age: 25 };
greet(person); // &#x8F93;&#x51FA; &apos;Hello Alice, you are 25 years old.&apos;
</code></pre><ol><li><strong>&#x4EA4;&#x6362;&#x53D8;&#x91CF;&#x503C;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x89E3;&#x6784;&#x53EF;&#x4EE5;&#x7B80;&#x4FBF;&#x5730;&#x4EA4;&#x6362;&#x4E24;&#x4E2A;&#x53D8;&#x91CF;&#x7684;&#x503C;&#x3002;</li></ol><pre><code class="language-javascript">let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // &#x8F93;&#x51FA; 2 1
</code></pre><hr><h3 id="3-%E6%A8%A1%E5%9D%97%E5%8C%96">3. <strong>&#x6A21;&#x5757;&#x5316;</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;ES6 &#x6A21;&#x5757;&#x5316;&#x548C; CommonJS &#x7684;&#x533A;&#x522B;&#xFF0C;&#x5982;&#x4F55;&#x4F7F;&#x7528; <code>import</code> &#x548C; <code>export</code> &#x5B9E;&#x73B0;&#x6A21;&#x5757;&#x5316;&#xFF1F;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li><strong>CommonJS</strong>&#xFF1A;CommonJS &#x662F; Node.js &#x7684;&#x6A21;&#x5757;&#x5316;&#x6807;&#x51C6;&#xFF0C;&#x4E3B;&#x8981;&#x7528;&#x4E8E;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x3002;&#x5B83;&#x4F7F;&#x7528; <code>require</code> &#x5BFC;&#x5165;&#x6A21;&#x5757;&#xFF0C;&#x4F7F;&#x7528; <code>module.exports</code> &#x6216; <code>exports</code> &#x5BFC;&#x51FA;&#x6A21;&#x5757;&#x3002;</li></ul><pre><code class="language-javascript">// &#x5BFC;&#x51FA;
module.exports = function() { console.log(&apos;Hello, CommonJS!&apos;); };

// &#x5BFC;&#x5165;
const greet = require(&apos;./greet&apos;);
greet();
</code></pre><ul><li><strong>ES6 &#x6A21;&#x5757;&#x5316;</strong>&#xFF1A;ES6 &#x5F15;&#x5165;&#x4E86;&#x6A21;&#x5757;&#x5316;&#x6807;&#x51C6;&#xFF0C;&#x4F7F;&#x7528; <code>import</code> &#x548C; <code>export</code> &#x6765;&#x5BFC;&#x5165;&#x548C;&#x5BFC;&#x51FA;&#x6A21;&#x5757;&#x3002;&#x5B83;&#x662F;&#x9759;&#x6001;&#x7684;&#xFF0C;&#x5728;&#x7F16;&#x8BD1;&#x9636;&#x6BB5;&#x5C31;&#x80FD;&#x786E;&#x5B9A;&#x6A21;&#x5757;&#x7684;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#xFF0C;&#x8FD9;&#x4F7F;&#x5F97;&#x5DE5;&#x5177;&#x53EF;&#x4EE5;&#x5BF9;&#x6A21;&#x5757;&#x8FDB;&#x884C;&#x4F18;&#x5316;&#xFF08;&#x4F8B;&#x5982;&#x6309;&#x9700;&#x52A0;&#x8F7D;&#xFF09;&#x3002;</li></ul><h4 id="%E5%AF%BC%E5%87%BA%E6%A8%A1%E5%9D%97%EF%BC%9A"><strong>&#x5BFC;&#x51FA;&#x6A21;&#x5757;</strong>&#xFF1A;</h4><ol><li><strong>&#x547D;&#x540D;&#x5BFC;&#x51FA;</strong>&#xFF1A;</li></ol><pre><code class="language-javascript">// module.js
export const name = &apos;Alice&apos;;
export function greet() {
  console.log(&apos;Hello!&apos;);
}

// &#x5BFC;&#x5165;
import { name, greet } from &apos;./module&apos;;
console.log(name); // &#x8F93;&#x51FA; &apos;Alice&apos;
greet(); // &#x8F93;&#x51FA; &apos;Hello!&apos;
</code></pre><ol><li><strong>&#x9ED8;&#x8BA4;&#x5BFC;&#x51FA;</strong>&#xFF1A;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x9ED8;&#x8BA4;&#x5BFC;&#x51FA;&#xFF0C;&#x9002;&#x5408;&#x5BFC;&#x51FA;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x6216;&#x51FD;&#x6570;&#x3002;</li></ol><pre><code class="language-javascript">// module.js
export default function greet() {
  console.log(&apos;Hello!&apos;);
}

// &#x5BFC;&#x5165;
import greet from &apos;./module&apos;;
greet(); // &#x8F93;&#x51FA; &apos;Hello!&apos;
</code></pre><h4 id="%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB%EF%BC%9A"><strong>&#x4E3B;&#x8981;&#x533A;&#x522B;</strong>&#xFF1A;</h4><ul><li><strong>&#x8BED;&#x6CD5;</strong>&#xFF1A;CommonJS &#x4F7F;&#x7528; <code>require</code> &#x548C; <code>module.exports</code>&#xFF0C;ES6 &#x4F7F;&#x7528; <code>import</code> &#x548C; <code>export</code>&#x3002;</li><li><strong>&#x52A8;&#x6001; vs &#x9759;&#x6001;</strong>&#xFF1A;CommonJS &#x662F;&#x52A8;&#x6001;&#x52A0;&#x8F7D;&#xFF0C;ES6 &#x662F;&#x9759;&#x6001;&#x52A0;&#x8F7D;&#xFF0C;&#x7F16;&#x8BD1;&#x65F6;&#x786E;&#x5B9A;&#x4F9D;&#x8D56;&#x3002;</li><li><strong>&#x5E94;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;CommonJS &#x4E3B;&#x8981;&#x7528;&#x4E8E; Node.js &#x73AF;&#x5883;&#xFF0C;ES6 &#x6A21;&#x5757;&#x5316;&#x7528;&#x4E8E;&#x6D4F;&#x89C8;&#x5668;&#x53CA;&#x73B0;&#x4EE3;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x4E2D;&#x3002;</li></ul><hr><h3 id="4-map-%E5%92%8C-set">4. <strong>Map &#x548C; Set</strong></h3><p><strong>&#x95EE;&#x9898;</strong>&#xFF1A;&#x8FD9;&#x4E24;&#x4E2A;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x7684;&#x7279;&#x70B9;&#x548C;&#x533A;&#x522B;&#xFF0C;&#x5206;&#x522B;&#x5728;&#x4EC0;&#x4E48;&#x573A;&#x666F;&#x4E0B;&#x4F7F;&#x7528;&#x5B83;&#x4EEC;&#xFF1F;</p><p><strong>&#x56DE;&#x7B54;</strong>&#xFF1A;</p><ul><li><strong>Map</strong>&#xFF1A;</li><li><code>Map</code> &#x662F;&#x4E00;&#x79CD;&#x952E;&#x503C;&#x5BF9;&#x96C6;&#x5408;&#xFF0C;&#x5176;&#x4E2D;&#x952E;&#x53EF;&#x4EE5;&#x662F;&#x4EFB;&#x610F;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#xFF08;&#x5305;&#x62EC;&#x5BF9;&#x8C61;&#x3001;&#x51FD;&#x6570;&#x7B49;&#xFF09;&#x3002;</li><li>&#x4FDD;&#x8BC1;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x6309;&#x63D2;&#x5165;&#x987A;&#x5E8F;&#x904D;&#x5386;&#x3002;</li><li><code>Map</code> &#x7684;&#x67E5;&#x627E;&#x3001;&#x63D2;&#x5165;&#x3001;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x4E3A; O(1)&#x3002;</li></ul><pre><code class="language-javascript">const map = new Map();
map.set(&apos;name&apos;, &apos;Alice&apos;);
map.set(&apos;age&apos;, 25);
console.log(map.get(&apos;name&apos;)); // &#x8F93;&#x51FA; &apos;Alice&apos;
</code></pre><ul><li><strong>Set</strong>&#xFF1A;</li><li><code>Set</code> &#x662F;&#x4E00;&#x79CD;&#x503C;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x5176;&#x4E2D;&#x6BCF;&#x4E2A;&#x503C;&#x90FD;&#x662F;&#x552F;&#x4E00;&#x7684;&#xFF0C;&#x4E0D;&#x5141;&#x8BB8;&#x91CD;&#x590D;&#x3002;</li><li><code>Set</code> &#x4FDD;&#x8BC1;&#x5143;&#x7D20;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x53EF;&#x4EE5;&#x6309;&#x63D2;&#x5165;&#x987A;&#x5E8F;&#x904D;&#x5386;&#x5143;&#x7D20;&#x3002;</li><li><code>Set</code> &#x4E2D;&#x7684;&#x5143;&#x7D20;&#x6CA1;&#x6709;&#x7D22;&#x5F15;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x67D0;&#x4E2A;&#x4F4D;&#x7F6E;&#x7684;&#x5143;&#x7D20;&#x3002;</li></ul><pre><code class="language-javascript">const set = new Set();
set.add(1);
set.add(2);
set.add(1); // &#x4E0D;&#x4F1A;&#x91CD;&#x590D;&#x6DFB;&#x52A0; 1
console.log(set.has(1)); // &#x8F93;&#x51FA; true
</code></pre><h4 id="%E5%8C%BA%E5%88%AB%EF%BC%9A"><strong>&#x533A;&#x522B;</strong>&#xFF1A;</h4><ul><li><strong>&#x5B58;&#x50A8;&#x7C7B;&#x578B;</strong>&#xFF1A;<code>Map</code> &#x5B58;&#x50A8;&#x7684;&#x662F;&#x952E;&#x503C;&#x5BF9;&#xFF0C;<code>Set</code> &#x5B58;&#x50A8;&#x7684;&#x662F;&#x5355;&#x4E00;&#x7684;&#x503C;&#x3002;</li><li><strong>&#x952E;&#x7684;&#x7C7B;&#x578B;</strong>&#xFF1A;<code>Map</code> &#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EFB;&#x4F55;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;&#x4F5C;&#x4E3A;&#x952E;&#xFF0C;&#x800C; <code>Set</code> &#x5B58;&#x50A8;&#x7684;&#x662F;&#x552F;&#x4E00;&#x7684;&#x503C;&#xFF0C;&#x4E0D;&#x8003;&#x8651;&#x7C7B;&#x578B;&#x3002;</li><li><strong>&#x904D;&#x5386;&#x987A;&#x5E8F;</strong>&#xFF1A;<code>Map</code> &#x4FDD;&#x8BC1;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x63D2;&#x5165;&#x987A;&#x5E8F;&#xFF0C;&#x800C; <code>Set</code> &#x4FDD;&#x8BC1;&#x503C;&#x7684;&#x63D2;&#x5165;&#x987A;&#x5E8F;&#x3002;</li></ul><h4 id="%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%9A"><strong>&#x4F7F;&#x7528;&#x573A;&#x666F;</strong>&#xFF1A;</h4><ul><li><strong>Map</strong>&#xFF1A;&#x9002;&#x5408;&#x7528;&#x4E8E;&#x9700;&#x8981;&#x5FEB;&#x901F;&#x67E5;&#x627E;&#x3001;&#x63D2;&#x5165;&#x3001;&#x5220;&#x9664;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5F53;&#x952E;&#x9700;&#x8981;&#x662F;&#x975E;&#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;&#x65F6;&#xFF08;&#x4F8B;&#x5982;&#x5BF9;&#x8C61;&#x3001;&#x51FD;&#x6570;&#x7B49;&#xFF09;&#x3002;</li><li><strong>Set</strong>&#xFF1A;&#x9002;&#x5408;&#x7528;&#x4E8E;&#x53BB;&#x91CD;&#x3001;&#x5B58;&#x50A8;&#x552F;&#x4E00;&#x503C;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x4F8B;&#x5982;&#x53BB;&#x91CD;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x3002;</li></ul><pre><code class="language-javascript">// &#x53BB;&#x91CD;&#x6570;&#x7EC4;
const arr = [1, 2, 2, 3, 4, 4];
const uniqueSet = new Set(arr);
const uniqueArr = [...uniqueSet]; // [1, 2, 3, 4]
</code></pre><hr><p>&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x89E3;&#x91CA;&#x548C;&#x4F8B;&#x5B50;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x66F4;&#x6E05;&#x6670;&#x5730;&#x7406;&#x89E3; ES6+ &#x7279;&#x6027;&#x4E2D;&#x7684; <strong>&#x7BAD;&#x5934;&#x51FD;&#x6570;</strong>&#x3001;<strong>&#x89E3;&#x6784;&#x8D4B;&#x503C;</strong>&#x3001;<strong>&#x6A21;&#x5757;&#x5316;</strong>&#x3001;<strong>Map</strong> &#x548C; <strong>Set</strong> &#x7684;&#x7528;&#x6CD5;&#x53CA;&#x5E94;&#x7528;&#x573A;&#x666F;&#x3002;&#x8FD9;&#x4E9B;&#x7279;&#x6027;&#x5728;&#x65E5;&#x5E38;&#x5F00;&#x53D1;&#x4E2D;&#x975E;&#x5E38;&#x5E38;&#x89C1;&#xFF0C;&#x5E76;&#x80FD;&#x663E;&#x8457;&#x63D0;&#x9AD8;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#x548C;&#x6548;&#x7387;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[limitReq]]></title><description><![CDATA[<p>&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x9650;&#x5236;&#x5176;&#x5E76;&#x53D1;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<strong>&#x961F;&#x5217;&#x673A;&#x5236;</strong>&#x6216;<strong>&#x4FE1;&#x53F7;&#x91CF;</strong>&#x6765;&#x5B9E;&#x73B0;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E; <code>Promise</code> &#x548C;&#x961F;&#x5217;&#x673A;&#x5236;&#x7684;&#x5B9E;</p>]]></description><link>https://pureo.cn/limit-req/</link><guid isPermaLink="false">677bbb9291ad920001d1f369</guid><category><![CDATA[习题]]></category><dc:creator><![CDATA[Nash]]></dc:creator><pubDate>Mon, 06 Jan 2025 11:17:12 GMT</pubDate><content:encoded><![CDATA[<p>&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x9650;&#x5236;&#x5176;&#x5E76;&#x53D1;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<strong>&#x961F;&#x5217;&#x673A;&#x5236;</strong>&#x6216;<strong>&#x4FE1;&#x53F7;&#x91CF;</strong>&#x6765;&#x5B9E;&#x73B0;&#x3002;&#x4EE5;&#x4E0B;&#x662F;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E; <code>Promise</code> &#x548C;&#x961F;&#x5217;&#x673A;&#x5236;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x652F;&#x6301;&#x7528;&#x6237;&#x8BBE;&#x7F6E;&#x5E76;&#x53D1;&#x9650;&#x5236;&#x3002;</p><hr><h3 id="%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81"><strong>&#x5B9E;&#x73B0;&#x4EE3;&#x7801;</strong></h3><pre><code class="language-javascript">function batchRequest(urls, handler, limit) {
  return new Promise((resolve, reject) =&gt; {
    const total = urls.length; // &#x603B;&#x8BF7;&#x6C42;&#x6570;
    const results = new Array(total); // &#x5B58;&#x50A8;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;
    let completed = 0; // &#x5DF2;&#x5B8C;&#x6210;&#x7684;&#x8BF7;&#x6C42;&#x6570;
    let activeCount = 0; // &#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x7684;&#x8BF7;&#x6C42;&#x6570;
    let currentIndex = 0; // &#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x7684;&#x7D22;&#x5F15;

    const next = () =&gt; {
      // &#x5982;&#x679C;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x5DF2;&#x5B8C;&#x6210;&#xFF0C;&#x7ED3;&#x675F;&#x6279;&#x91CF;&#x64CD;&#x4F5C;
      if (completed &gt;= total) {
        resolve(results);
        return;
      }

      // &#x5982;&#x679C;&#x8FBE;&#x5230;&#x5E76;&#x53D1;&#x9650;&#x5236;&#x6216;&#x8005;&#x6CA1;&#x6709;&#x66F4;&#x591A;&#x8BF7;&#x6C42;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;
      if (activeCount &gt;= limit || currentIndex &gt;= total) {
        return;
      }

      // &#x53D6;&#x51FA;&#x4E0B;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;
      const index = currentIndex++;
      activeCount++;

      // &#x6267;&#x884C;&#x8BF7;&#x6C42;
      handler(urls[index])
        .then((result) =&gt; {
          results[index] = result; // &#x4FDD;&#x5B58;&#x7ED3;&#x679C;
        })
        .catch((error) =&gt; {
          results[index] = error; // &#x4FDD;&#x5B58;&#x9519;&#x8BEF;
        })
        .finally(() =&gt; {
          completed++; // &#x5B8C;&#x6210;&#x6570;+1
          activeCount--; // &#x6D3B;&#x52A8;&#x6570;-1
          next(); // &#x89E6;&#x53D1;&#x4E0B;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;
        });

      // &#x9012;&#x5F52;&#x89E6;&#x53D1;&#x66F4;&#x591A;&#x7684;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;
      next();
    };

    // &#x542F;&#x52A8;&#x521D;&#x59CB;&#x7684; `limit` &#x4E2A;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;
    for (let i = 0; i &lt; limit; i++) {
      next();
    }
  });
}
</code></pre><hr><h3 id="%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B"><strong>&#x4F7F;&#x7528;&#x793A;&#x4F8B;</strong></h3><p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x6709;&#x4E00;&#x7EC4;&#x6A21;&#x62DF;&#x7684;&#x8BF7;&#x6C42;&#x4EFB;&#x52A1;&#xFF0C;&#x5E76;&#x5E0C;&#x671B;&#x9650;&#x5236;&#x5E76;&#x53D1;&#x6570;&#x4E3A; 3&#xFF1A;</p><pre><code class="language-javascript">// &#x6A21;&#x62DF;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x51FD;&#x6570;
function mockRequest(url) {
  return new Promise((resolve) =&gt; {
    const time = Math.random() * 2000; // &#x968F;&#x673A;&#x8017;&#x65F6;
    setTimeout(() =&gt; resolve(`Response from ${url} in ${time.toFixed(0)}ms`), time);
  });
}

// &#x8BF7;&#x6C42;&#x5730;&#x5740;
const urls = [
  &quot;https://example.com/1&quot;,
  &quot;https://example.com/2&quot;,
  &quot;https://example.com/3&quot;,
  &quot;https://example.com/4&quot;,
  &quot;https://example.com/5&quot;,
  &quot;https://example.com/6&quot;,
];

// &#x6279;&#x91CF;&#x8BF7;&#x6C42;
batchRequest(urls, mockRequest, 3).then((results) =&gt; {
  console.log(&quot;All requests completed:&quot;, results);
});
</code></pre><hr><h3 id="%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C"><strong>&#x6267;&#x884C;&#x7ED3;&#x679C;</strong></h3><ol><li>&#x540C;&#x65F6;&#x6700;&#x591A;&#x4F1A;&#x6709; 3 &#x4E2A;&#x8BF7;&#x6C42;&#x5E76;&#x53D1;&#x3002;</li><li>&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x540E;&#x4F1A;&#x6309;&#x7167;&#x4F20;&#x5165;&#x7684; <code>urls</code> &#x987A;&#x5E8F;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#xFF0C;&#x5373;&#x4F7F;&#x67D0;&#x4E9B;&#x8BF7;&#x6C42;&#x8017;&#x65F6;&#x8F83;&#x957F;&#x3002;</li></ol><p>&#x8F93;&#x51FA;&#x7C7B;&#x4F3C;&#xFF1A;</p><pre><code>All requests completed: [
  &quot;Response from https://example.com/1 in 500ms&quot;,
  &quot;Response from https://example.com/2 in 1000ms&quot;,
  &quot;Response from https://example.com/3 in 300ms&quot;,
  &quot;Response from https://example.com/4 in 200ms&quot;,
  &quot;Response from https://example.com/5 in 700ms&quot;,
  &quot;Response from https://example.com/6 in 100ms&quot;
]
</code></pre><hr><h3 id="%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90"><strong>&#x4EE3;&#x7801;&#x5206;&#x6790;</strong></h3><ol><li><strong>&#x5E76;&#x53D1;&#x63A7;&#x5236;&#xFF1A;</strong></li></ol><ul><li>&#x901A;&#x8FC7; <code>activeCount</code> &#x8BB0;&#x5F55;&#x5F53;&#x524D;&#x6D3B;&#x8DC3;&#x7684;&#x8BF7;&#x6C42;&#x6570;&#xFF0C;&#x5F53;&#x5C0F;&#x4E8E;&#x5E76;&#x53D1;&#x9650;&#x5236;&#x65F6;&#xFF0C;&#x7EE7;&#x7EED;&#x542F;&#x52A8;&#x65B0;&#x7684;&#x8BF7;&#x6C42;&#x3002;</li></ul><ol><li><strong>&#x7ED3;&#x679C;&#x5B58;&#x50A8;&#xFF1A;</strong></li></ol><ul><li>&#x901A;&#x8FC7;&#x6570;&#x7EC4; <code>results</code> &#x6309;&#x539F;&#x59CB; <code>urls</code> &#x987A;&#x5E8F;&#x4FDD;&#x5B58;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x3002;</li></ul><ol><li><strong>&#x9012;&#x5F52;&#x8C03;&#x7528;&#xFF1A;</strong></li></ol><ul><li>&#x6BCF;&#x6B21;&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x8C03;&#x7528; <code>next()</code> &#x542F;&#x52A8;&#x65B0;&#x8BF7;&#x6C42;&#xFF0C;&#x786E;&#x4FDD;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#x59CB;&#x7EC8;&#x63A5;&#x8FD1;&#x9650;&#x5236;&#x3002;</li></ul><hr><h3 id="%E4%BC%98%E5%8C%96%E5%BB%BA%E8%AE%AE"><strong>&#x4F18;&#x5316;&#x5EFA;&#x8BAE;</strong></h3><ol><li><strong>&#x9519;&#x8BEF;&#x5904;&#x7406;&#xFF1A;</strong></li></ol><ul><li>&#x5F53;&#x524D;&#x5B9E;&#x73B0;&#x4E2D;&#xFF0C;&#x5373;&#x4F7F;&#x67D0;&#x4E2A;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#xFF0C;&#x6574;&#x4F53;&#x6D41;&#x7A0B;&#x4E5F;&#x4F1A;&#x7EE7;&#x7EED;&#xFF0C;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9700;&#x6C42;&#x6DFB;&#x52A0;&#x5168;&#x5C40;&#x9519;&#x8BEF;&#x56DE;&#x8C03;&#x3002;</li></ul><ol><li><strong>&#x6682;&#x505C;&#x548C;&#x6062;&#x590D;&#xFF1A;</strong></li></ol><ul><li>&#x53EF;&#x901A;&#x8FC7;&#x589E;&#x52A0;&#x72B6;&#x6001;&#x53D8;&#x91CF;&#xFF08;&#x5982; <code>paused</code>&#xFF09;&#x652F;&#x6301;&#x6682;&#x505C;&#x548C;&#x6062;&#x590D;&#x529F;&#x80FD;&#x3002;</li></ul><ol><li><strong>&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#xFF1A;</strong></li></ol><ul><li>&#x53EF;&#x4E3A;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x6DFB;&#x52A0;&#x8D85;&#x65F6;&#x63A7;&#x5236;&#xFF0C;&#x4EE5;&#x9632;&#x6B62;&#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#x957F;&#x65F6;&#x95F4;&#x963B;&#x585E;&#x961F;&#x5217;&#x3002;</li></ul><p>&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x9AD8;&#x6548;&#x5730;&#x7BA1;&#x7406;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#xFF0C;&#x9002;&#x7528;&#x4E8E;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x3001;&#x6279;&#x91CF;&#x4EFB;&#x52A1;&#x5904;&#x7406;&#x7B49;&#x573A;&#x666F;&#x3002;</p><h3 id="%E4%BD%BF%E7%94%A8-class-%E5%AE%9E%E7%8E%B0%E6%89%B9%E9%87%8F%E8%AF%B7%E6%B1%82%E5%B9%B6%E9%99%90%E5%88%B6%E5%B9%B6%E5%8F%91%E6%95%B0"><strong>&#x4F7F;&#x7528; <code>class</code> &#x5B9E;&#x73B0;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x5E76;&#x9650;&#x5236;&#x5E76;&#x53D1;&#x6570;</strong></h3><pre><code class="language-javascript">class BatchRequest {
  constructor(urls, handler, limit) {
    this.urls = urls; // &#x8BF7;&#x6C42;&#x7684; URL &#x5217;&#x8868;
    this.handler = handler; // &#x8BF7;&#x6C42;&#x5904;&#x7406;&#x51FD;&#x6570;
    this.limit = limit; // &#x9650;&#x5236;&#x7684;&#x5E76;&#x53D1;&#x6570;
    this.results = []; // &#x5B58;&#x50A8;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;
    this.completed = 0; // &#x5DF2;&#x5B8C;&#x6210;&#x7684;&#x8BF7;&#x6C42;&#x6570;&#x91CF;
    this.activeCount = 0; // &#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x7684;&#x8BF7;&#x6C42;&#x6570;&#x91CF;
    this.currentIndex = 0; // &#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x7684;&#x7D22;&#x5F15;
  }

  // &#x53D1;&#x8D77;&#x5355;&#x4E2A;&#x8BF7;&#x6C42;
  async uploadChunk(url, index) {
    try {
      const result = await this.handler(url); // &#x6267;&#x884C;&#x8BF7;&#x6C42;
      this.results[index] = result; // &#x5B58;&#x50A8;&#x7ED3;&#x679C;
    } catch (error) {
      this.results[index] = error; // &#x5B58;&#x50A8;&#x9519;&#x8BEF;&#x4FE1;&#x606F;
    } finally {
      this.completed++; // &#x8BF7;&#x6C42;&#x5B8C;&#x6210;
      this.activeCount--; // &#x6D3B;&#x8DC3;&#x8BF7;&#x6C42;&#x6570;&#x51CF;&#x5C11;
      this.next(); // &#x89E6;&#x53D1;&#x4E0B;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;
    }
  }

  // &#x542F;&#x52A8;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;
  next() {
    // &#x5982;&#x679C;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x5DF2;&#x5B8C;&#x6210;&#xFF0C;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;
    if (this.completed &gt;= this.urls.length) {
      return Promise.resolve(this.results);
    }

    // &#x5982;&#x679C;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#x6570;&#x672A;&#x8FBE;&#x5230;&#x9650;&#x5236;&#x6216;&#x8FD8;&#x6709;&#x66F4;&#x591A;&#x8BF7;&#x6C42;&#xFF0C;&#x7EE7;&#x7EED;&#x542F;&#x52A8;&#x8BF7;&#x6C42;
    if (this.activeCount &lt; this.limit &amp;&amp; this.currentIndex &lt; this.urls.length) {
      const index = this.currentIndex++;
      this.activeCount++;

      this.uploadChunk(this.urls[index], index); // &#x53D1;&#x8D77;&#x8BF7;&#x6C42;

      this.next(); // &#x9012;&#x5F52;&#x89E6;&#x53D1;&#x66F4;&#x591A;&#x7684;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;
    }
  }

  // &#x542F;&#x52A8;&#x6279;&#x91CF;&#x8BF7;&#x6C42;
  start() {
    this.next(); // &#x542F;&#x52A8;&#x7B2C;&#x4E00;&#x4E2A;&#x6279;&#x91CF;&#x8BF7;&#x6C42;
  }
}
</code></pre><hr><h3 id="2-%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B"><strong>2. &#x4F7F;&#x7528;&#x793A;&#x4F8B;</strong></h3><p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x6709;&#x4E00;&#x7EC4;&#x6A21;&#x62DF;&#x7684;&#x8BF7;&#x6C42;&#x4EFB;&#x52A1;&#xFF0C;&#x5E76;&#x5E0C;&#x671B;&#x9650;&#x5236;&#x5E76;&#x53D1;&#x6570;&#x4E3A; 3&#xFF1A;</p><pre><code class="language-javascript">// &#x6A21;&#x62DF;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x51FD;&#x6570;
function mockRequest(url) {
  return new Promise((resolve) =&gt; {
    const time = Math.random() * 2000; // &#x968F;&#x673A;&#x8017;&#x65F6;
    setTimeout(() =&gt; resolve(`Response from ${url} in ${time.toFixed(0)}ms`), time);
  });
}

// &#x8BF7;&#x6C42;&#x5730;&#x5740;&#x5217;&#x8868;
const urls = [
  &quot;https://example.com/1&quot;,
  &quot;https://example.com/2&quot;,
  &quot;https://example.com/3&quot;,
  &quot;https://example.com/4&quot;,
  &quot;https://example.com/5&quot;,
  &quot;https://example.com/6&quot;,
];

// &#x521B;&#x5EFA;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x5B9E;&#x4F8B;
const batchRequest = new BatchRequest(urls, mockRequest, 3);

// &#x542F;&#x52A8;&#x8BF7;&#x6C42;
batchRequest.start();

// &#x83B7;&#x53D6;&#x7ED3;&#x679C;
batchRequest.start().then((results) =&gt; {
  console.log(&quot;All requests completed:&quot;, results);
});
</code></pre><hr><h3 id="3-%E4%BB%A3%E7%A0%81%E8%A7%A3%E6%9E%90"><strong>3. &#x4EE3;&#x7801;&#x89E3;&#x6790;</strong></h3><p><strong>&#x6784;&#x9020;&#x51FD;&#x6570; <code>constructor(urls, handler, limit)</code></strong>&#xFF1A;</p><ul><li><code>urls</code>: &#x9700;&#x8981;&#x8BF7;&#x6C42;&#x7684; URL &#x5217;&#x8868;&#x3002;</li><li><code>handler</code>: &#x8BF7;&#x6C42;&#x7684;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF08;&#x5982; <code>mockRequest</code>&#xFF09;&#x3002;</li><li><code>limit</code>: &#x9650;&#x5236;&#x7684;&#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#x6570;&#x3002;</li></ul><p><strong><code>uploadChunk(url, index)</code></strong>:</p><ul><li>&#x5904;&#x7406;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x5C06;&#x7ED3;&#x679C;&#x6216;&#x9519;&#x8BEF;&#x4FDD;&#x5B58;&#x5230; <code>results</code> &#x6570;&#x7EC4;&#x4E2D;&#x3002;</li><li>&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x540E;&#x9012;&#x51CF;&#x6D3B;&#x8DC3;&#x8BF7;&#x6C42;&#x6570;&#xFF0C;&#x8C03;&#x7528; <code>next()</code> &#x542F;&#x52A8;&#x4E0B;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x3002;</li></ul><p><strong><code>next()</code></strong>:</p><ul><li>&#x63A7;&#x5236;&#x8BF7;&#x6C42;&#x7684;&#x5E76;&#x53D1;&#x6570;&#x3002;</li><li>&#x5F53;&#x6D3B;&#x8DC3;&#x8BF7;&#x6C42;&#x6570;&#x5C0F;&#x4E8E; <code>limit</code> &#x4E14;&#x8FD8;&#x6709;&#x672A;&#x5904;&#x7406;&#x7684;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x4F1A;&#x9012;&#x5F52;&#x8C03;&#x7528;&#x81EA;&#x5DF1;&#x542F;&#x52A8;&#x65B0;&#x7684;&#x8BF7;&#x6C42;&#x3002;</li><li>&#x5F53;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x6700;&#x7EC8;&#x7684;&#x7ED3;&#x679C;&#x3002;</li></ul><p><strong><code>start()</code></strong>:</p><ul><li>&#x542F;&#x52A8;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#xFF0C;&#x8C03;&#x7528; <code>next()</code> &#x5F00;&#x59CB;&#x63A7;&#x5236;&#x8BF7;&#x6C42;&#x3002;</li></ul><hr><h3 id="4-%E4%BC%98%E5%8C%96%E5%92%8C%E6%89%A9%E5%B1%95"><strong>4. &#x4F18;&#x5316;&#x548C;&#x6269;&#x5C55;</strong></h3><ul><li><strong>&#x9519;&#x8BEF;&#x5904;&#x7406;</strong>&#xFF1A;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6269;&#x5C55;&#x9519;&#x8BEF;&#x5904;&#x7406;&#xFF0C;&#x4FDD;&#x8BC1;&#x5373;&#x4F7F;&#x67D0;&#x4E9B;&#x8BF7;&#x6C42;&#x5931;&#x8D25;&#xFF0C;&#x4F9D;&#x7136;&#x7EE7;&#x7EED;&#x5176;&#x4ED6;&#x8BF7;&#x6C42;&#x7684;&#x6267;&#x884C;&#x3002;</li><li><strong>&#x8FDB;&#x5EA6;&#x76D1;&#x63A7;</strong>&#xFF1A;&#x53EF;&#x4EE5;&#x5728;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6216;&#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5668;&#xFF0C;&#x76D1;&#x63A7;&#x4E0A;&#x4F20;&#x8FDB;&#x5EA6;&#x3002;</li><li><strong>&#x8BF7;&#x6C42;&#x8D85;&#x65F6;</strong>&#xFF1A;&#x4E3A;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x589E;&#x52A0;&#x8D85;&#x65F6;&#x673A;&#x5236;&#xFF0C;&#x9632;&#x6B62;&#x957F;&#x65F6;&#x95F4;&#x963B;&#x585E;&#x3002;</li></ul><p>&#x8FD9;&#x4E2A; <code>class</code> &#x5C01;&#x88C5;&#x4E86;&#x6279;&#x91CF;&#x8BF7;&#x6C42;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x5E76;&#x652F;&#x6301;&#x9650;&#x5236;&#x5E76;&#x53D1;&#x6570;&#x3002;</p>]]></content:encoded></item></channel></rss>