1"use strict";(self.webpackChunkhomepage=self.webpackChunkhomepage||[]).push([[8996],{2643:function(n,s,a){a.r(s),a.d(s,{Head:function(){return v},default:function(){return _}});var t=a(5676),p=a(758);function e(n){const s=Object.assign({p:"p",strong:"strong",h2:"h2",ol:"ol",li:"li",a:"a",h3:"h3",span:"span",img:"img"},(0,t.R)(),n.components);return p.createElement(p.Fragment,null,p.createElement(s.p,null,"å¼åå¾åæ¥éå·¥å
·æ¶éå°äºè¿æ ·ä¸ä¸ªé®é¢ï¼å¨æ¥éä¹åï¼ç¨æ·éè¦å
对å¾åæä»¶è¿è¡ç´¢å¼æä½ï¼åå°å°è°ç¨å¯æ§è¡æä»¶å¹¶ä¸ºæ¯å¼ å¾åçæç¹å¾å¼ãç´¢å¼æä½æéçæ¶é´ä¸å¾åçæ°éå大å°åæ£ç¸å
³ï¼ç¬è
为大约 50000 å¼ å¾çï¼çº¦ 170GBï¼çæç¹å¾å¼ï¼éè¦è±è´¹å°è¿ 90 åéçæ¶é´ãå¨è¿ç§æ
åµä¸ï¼å¦ææ¸²æå¨ä»ä¹ä¹ä¸å±ç¤ºï¼å¡å¨é£éï¼ç¨æ·é¾å
ä¼é常ç¦è ââ åå°æ¯å¦è¿å¨è¿è¡ï¼ææ¯ä¸æ¯å¡æ»äºï¼"),"\n",p.createElement(s.p,null,"é£ä¹éæ±ä¹å°±æäºäºï¼æ£å¦æ¬æçæ é¢æè¿°ï¼æä»¬éè¦",p.createElement(s.strong,null,"å°åå°è¿è¡çæ¥å¿å®æ¶æ¨éå°æ¸²æå¨"),"ï¼è¿æ ·ç¨æ·ä¾¿è½çå°ç´¢å¼æä½çè¿åº¦ï¼å®ä¸å¿æ¥ã"),"\n",p.createElement(s.h2,null,"ææ¯èæ¯"),"\n",p.createElement(s.p,null,"伿å¨ç¥ï¼ä¸ä¸ª Electron åºç¨åä¸ºäº Renderer 渲æå¨å Main 主è¿ç¨ä¸¤ç«¯ã渲æå¨è´è´£å¯¹å®¢ä¾§çå±ç¤ºï¼æ£å¦æä»¬è®¿é®çææç½é¡µä¸æ ·ï¼æ¯ HTMLãCSSãJavaScript çéåï¼æ æ³è°ç¨ Node ææ¯è®¿é®å®¿ä¸»æºæä»¶çãè主è¿ç¨åå
·å¤ææå¡ç«¯åºç¨çæ§è´¨ï¼è½å¤è°ç¨ Node ææ¯ä¸å®¿ä¸»æºäº¤äºçã"),"\n",p.createElement(s.p,null,"ç»¼ä¸æè¿°ï¼ä¸ºäºå®ç°æä»¬çç®æ ï¼å¨èå便¬¡è¦å®ç°è¿äºäºæ
ï¼"),"\n",p.createElement(s.ol,null,"\n",p.createElement(s.li,null,"渲æå¨æ¥æ¶ç¨æ·ç´¢å¼æä½ç请æ±ï¼å°è¯·æ±åéè³ä¸»è¿ç¨ã"),"\n",p.createElement(s.li,null,"主è¿ç¨æ¥æ¶å°è¯·æ±ï¼è°ç¨å¯æ§è¡æä»¶å¼å§çæå¾åç¹å¾å¼ã"),"\n",p.createElement(s.li,null,"主è¿ç¨å°äº§ççæ¥å¿ä¿¡æ¯å®æ¶æ¨éç»æ¸²æå¨ã"),"\n",p.createElement(s.li,null,"渲æå¨æ¥æ¶å°æ¥å¿ä¿¡æ¯ï¼å¹¶åç¨æ·å±ç¤ºã"),"\n"),"\n",p.createElement(s.h2,null,"éæ±å®ç°"),"\n",p.createElement(s.p,null,"æ ¹æ®åæçåæï¼å¯¹",p.createElement(s.a,{href:"https://www.electronjs.org/zh/docs/latest/tutorial/ipc"},"è¿ç¨é´éä¿¡ï¼Inter-Process Communicationï¼IPCï¼"),"è½åç使ç¨å°ä¼æ¯å®ç°éæ±çå
³é®ã"),"\n",p.createElement(s.p,null,"å®ç°çå
·ä½æ¹æ¡éµå¾ª Electron æ¨èçå®å
¨è®¾ç½®å³ä¸ä¸æé离ãä¸é¢çå
容å设æ¨å¯¹",p.createElement(s.a,{href:"https://www.electronjs.org/zh/docs/latest/tutorial/process-model#preload-%E8%84%9A%E6%9C%AC"},"é¢å è½½å¨"),"æä¸å®çäºè§£ã"),"\n",p.createElement(s.h3,null,"渲æå¨å°è¯·æ±åéè³ä¸»è¿ç¨"),"\n",p.createElement(s.p,null,"渲æå¨åé请æ±è³ä¸»è¿ç¨æ¯",p.createElement(s.strong,null,"渲æå¨å°ä¸»è¿ç¨çååéä¿¡"),"ï¼å
·ä½çå®ç°åæä¸ä¸ªæ¥éª¤ï¼"),"\n",p.createElement(s.ol,null,"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"主è¿ç¨éè¿ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">ipcMain.on()</code>'}})," çå¬è¯·æ±ã"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// main/background.ts</span>\n<span class="token keyword">import</span> <span class="token punctuation">{</span> ipcMain <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"electron"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">export</span> <span class="token keyword">enum</span> Events <span class="token punctuation">{</span>\n <span class="token constant">UPDATE_INDEX</span> <span class="token operator">=</span> <span class="token string">"events:updateIndex"</span><span class="token punctuation">,</span>\n<span class="token punctuation">}</span>\n\nipcMain<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>Events<span class="token punctuation">.</span><span class="token constant">UPDATE_INDEX</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>_<span class="token punctuation">,</span> args<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token comment">// todo: execute binary</span>\n<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n"),"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"é¢å è½½å¨å渲æå¨æ´é² ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">ipcRenderer.send()</code>'}})," æ¹æ³ã"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// main/preload.ts</span>\n<span class="token keyword">
1import</span> <span class="token punctuation">{</span> ipcRenderer<span class="token punctuation">,</span> contextBridge <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"electron"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">const</span> ipc <span class="token operator">=</span> <span class="token punctuation">{</span>\n <span class="token function-variable function">send</span><span class="token operator">:</span> <span class="token punctuation">(</span>channel<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token operator">...</span>args<span class="token operator">:</span> <span class="token builtin">unknown</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n ipcRenderer<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>channel<span class="token punctuation">,</span> <span class="token operator">...</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token comment">// ç±äº Electron çå®å
¨æºå¶ï¼æ¨ä¸è½ç´æ¥æ´é² `ipcRenderer` 以åä¸é¢çæ¹æ³</span>\n <span class="token comment">// é误çä¾åï¼</span>\n <span class="token comment">// send: ipcRenderer.send,</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span>\n\ncontextBridge<span class="token punctuation">.</span><span class="token function">exposeInMainWorld</span><span class="token punctuation">(</span><span class="token string">"ipc"</span><span class="token punctuation">,</span> ipc<span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n<span class="token keyword">export</span> <span class="token keyword">type</span> <span class="token class-name"><span class="token constant">IPC</span></span> <span class="token operator">=</span> <span class="token keyword">typeof</span> ipc<span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.p,null,"让 TypeScript æ´å¥½å°ä¸ºæ¨å·¥ä½ï¼å«å¿äºå°ç±»å ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">IPC</code>'}})," æ´é²ç» ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">Window</code>'}})," 对象ï¼"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// renderer/preload.d.ts</span>\n<span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> <span class="token constant">IPC</span> <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"path/to/main/preload"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">declare</span> global <span class="token punctuation">{</span>\n <span class="token keyword">interface</span> <span class="token class-name">Window</span> <span class="token punctuation">{</span>\n ipc<span class="token operator">:</span> <span class="token constant">IPC</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span></code></pre></div>'}}),"\n"),"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"渲æå¨å®ç°è°ç¨é¢å è½½å¨æ´é²çæ¹æ³ã"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="tsx"><pre class="language-tsx"><code class="language-tsx"><span class="token comment">// renderer/path/to/component-trigger.tsx</span>\n<span class="token keyword">
1import</span> <span class="token punctuation">{</span> Events <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"path/to/main/background"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> <span class="token function-variable function">onUpdateIndex</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n window<span class="token punctuation">.</span>ipc<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>Events<span class="token punctuation">.</span><span class="token constant">UPDATE_INDEX</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">;</span>\n\n <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span><span class="token punctuation">></span></span><span class="token punctuation">{</span><span class="token comment">/* component details */</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span><span class="token punctuation">></span></span><span class="token punctuation">;</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.p,null,"åå¨åéçå°æ¹ç¼å触åé»è¾ï¼å³å¯å°è¯·æ±åéè³ä¸»è¿ç¨ã"),"\n"),"\n"),"\n",p.createElement(s.h3,null,"主è¿ç¨è°ç¨å¯æ§è¡æä»¶"),"\n",p.createElement(s.p,null,"æ¥çï¼è®©æä»¬æ¥å®å主è¿ç¨çé»è¾ï¼å¨æ¥æ¶å°è¯·æ±åï¼å»è°ç¨æ¬å°ç坿§è¡æä»¶ã"),"\n",p.createElement(s.p,null,"å¨ Node ç¯å¢ä¸ï¼æä»¬å¯ä»¥æ¾èæå ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">child_process</code>'}})," 帮å¿ã",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">child_process.exec()</code>'}})," ä¼çå¾
æ§è¡ç»æåå°ç»æä¸å¹¶è¿åï¼ä¸æ»¡è¶³æä»¬çéè¦ï¼",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">child_process.spawn()</code>'}})," éç¨äºä»¶ç嬿ºå¶ï¼å¯ä»¥åºå¯¹å®æ¶è¾åºæ¥å¿çæ
æ¯ï¼æ»¡è¶³æä»¬çéè¦ã"),"\n",p.createElement(s.p,null,"åºäº ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">child_process.spawn()</code>'}})," ç¼å代ç å¦ä¸ï¼"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// main/background.ts</span>\n<span class="token keyword">import</span> <span class="token punctuation">{</span> spawn <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"child_process"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">const</span> <span class="token function-variable function">runSpawn</span> <span class="token operator">=</span> <span class="token punctuation">(</span>cmd<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> args<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> process <span class="token operator">=</span> <span class="token function">spawn</span><span class="token punctuation">(</span>cmd<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span>stdout<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"data"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token comment">// todo: on receive stdout data</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span>stderr<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"data"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token comment">// todo: on receive stderr data</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"close"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>code<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token comment">// todo: on receive close signal</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span>\n\nipcMain<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>Events<span class="token punctuation">.</span><span class="token constant">UPDATE_INDEX</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>_<span class="token punctuation">,</span> args<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token function">runSpawn</span><span class="token punctuation">(</span><span class="token string">"path/to/binary"</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"--update-index"</span><span class="token punctuation">,</span> <span class="token string">"--rest-args"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.h3,null,"主è¿ç¨å®æ¶æ¨éæ¥å¿ä¿¡æ¯ç»æ¸²æå¨"),"\n",p.createElement(s.p,null,"å½äºä»¶çå¬å¨è§¦åæ¶ï¼å渲æå¨å鿥å¿ä¿¡æ¯ï¼è¿æ¯",p.createElement(s.strong,null,"主è¿ç¨å°æ¸²æå¨çååéä¿¡"),"ï¼å
·ä½çå®ç°åæ ·åæä¸ä¸ªæ¥éª¤ï¼"),"\n",p.createElement(s.ol,null,"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"主è¿ç¨éè¿ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">browserWindow.webContents.send()</code>'}})," åéä¿¡æ¯ã"),"\n",p.createElement(s.p,null,"å®ååé¢ç ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">runSpawn()</code>'}})," æ¹æ³ï¼"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// main/background.ts</span>\n<span class="token keyword">
1import</span> iconv <span class="token keyword">from</span> <span class="token string">"iconv-lite"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">export</span> <span class="token keyword">enum</span> SpawnEvents <span class="token punctuation">{</span>\n <span class="token constant">SPAWN_STARTED</span> <span class="token operator">=</span> <span class="token string">"spawn:started"</span><span class="token punctuation">,</span>\n <span class="token constant">SPAWN_STDOUT</span> <span class="token operator">=</span> <span class="token string">"spawn:stdout"</span><span class="token punctuation">,</span>\n <span class="token constant">SPAWN_STDERR</span> <span class="token operator">=</span> <span class="token string">"spawn:stderr"</span><span class="token punctuation">,</span>\n <span class="token constant">SPAWN_FINISHED</span> <span class="token operator">=</span> <span class="token string">"spawn:finished"</span><span class="token punctuation">,</span>\n<span class="token punctuation">}</span>\n\n<span class="token comment">// Compatible with default command line encoding `cp936` on Windows platform</span>\n<span class="token keyword">const</span> iconvDecoding <span class="token operator">=</span> process<span class="token punctuation">.</span>platform <span class="token operator">===</span> <span class="token string">"win32"</span> <span class="token operator">?</span> <span class="token string">"cp936"</span> <span class="token operator">:</span> <span class="token string">"utf-8"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">const</span> <span class="token function-variable function">runSpawn</span> <span class="token operator">=</span> <span class="token punctuation">(</span>cmd<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> args<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> process <span class="token operator">=</span> <span class="token function">spawn</span><span class="token punctuation">(</span>cmd<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>\n browserWindow<span class="token punctuation">.</span>webContents<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STARTED</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span>stdout<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"data"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n browserWindow<span class="token punctuation">.</span>webContents<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STDOUT</span><span class="token punctuation">,</span>\n iconv<span class="token punctuation">.</span><span class="token function">
1decode</span><span class="token punctuation">(</span>Buffer<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token string">"binary"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> iconvDecoding<span class="token punctuation">)</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span>stderr<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"data"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n browserWindow<span class="token punctuation">.</span>webContents<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STDERR</span><span class="token punctuation">,</span>\n iconv<span class="token punctuation">.</span><span class="token function">
1decode</span><span class="token punctuation">(</span>Buffer<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token string">"binary"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> iconvDecoding<span class="token punctuation">)</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n process<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"close"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>code<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n browserWindow<span class="token punctuation">.</span>webContents<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_FINISHED</span><span class="token punctuation">,</span> code <span class="token operator">??</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.p,null,"ç¹å«çï¼å¨ Windows 端ï¼ç±äºå½ä»¤è¡å·¥å
·é»è®¤éç¨ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">cp936</code>'}})," ç¼ç ï¼å¨è¾åºä¸ææ¶ä¼åºç°ä¹±ç çç°è±¡ãå æ¤ï¼å¨ä¸é¢çå®ç°ä¸ï¼ç¬è
使ç¨äº ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">iconv-lite</code>'}})," 对æ åè¾åºãæ åé误è¿è¡äºéæ°è§£ç ã"),"\n"),"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"é¢å è½½å¨å渲æå¨æ´é² ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">ipcRenderer.on()</code>'}})," æ¹æ³ã"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ts"><pre class="language-ts"><code class="language-ts"><span class="token comment">// main/preload.ts</span>\n<span class="token keyword">import</span> <span class="token punctuation">{</span> <span class="token keyword">type</span> <span class="token class-name">IpcRendererEvent</span> <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"electron"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">const</span> ipc <span class="token operator">=</span> <span class="token punctuation">{</span>\n <span class="token function-variable function">on</span><span class="token operator">:</span> <span class="token punctuation">(</span>channel<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token function-variable function">func</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token operator">:</span> <span class="token builtin">unknown</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> <span class="token function-variable function">subscription</span> <span class="token operator">=</span> <span class="token punctuation">(</span>_event<span class="token operator">:</span> IpcRendererEvent<span class="token punctuation">,</span> <span class="token operator">...</span>args<span class="token operator">:</span> <span class="token builtin">unknown</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span>
1\n <span class="token function">func</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span>\n ipcRenderer<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>channel<span class="token punctuation">,</span> subscription<span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n ipcRenderer<span class="token punctuation">.</span><span class="token function">removeListener</span><span class="token punctuation">(</span>channel<span class="token punctuation">,</span> subscription<span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.p,null,"å
¶è¿å弿¯æ¸
é¤çå¬å¨çæ¹æ³ï¼å¯ä»¥é
å ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">React.useEffect()</code>'}})," 使ç¨ã"),"\n"),"\n",p.createElement(s.li,null,"\n",p.createElement(s.p,null,"渲æå¨å®ç°è°ç¨é¢å è½½å¨æ´é²çæ¹æ³ã"),"\n",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="tsx"><pre class="language-tsx"><code class="language-tsx"><span class="token comment">// renderer/path/to/component-listener.tsx</span>\n<span class="token keyword">import</span> <span class="token punctuation">{</span> useEffect<span class="token punctuation">,</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react"</span><span class="token punctuation">;</span>\n<span class="token keyword">import</span> <span class="token punctuation">{</span> SpawnEvents <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"path/to/main/background"</span><span class="token punctuation">;</span>\n\n<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> <span class="token punctuation">[</span>loading<span class="token punctuation">,</span> setLoading<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator"><</span><span class="token builtin">boolean</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token keyword">const</span> <span class="token punctuation">[</span>stdout<span class="token punctuation">,</span> setStdout<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator"><</span><span class="token builtin">string</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token keyword">const</span> <span class="token punctuation">[</span>stderr<span class="token punctuation">,</span> setStderr<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator"><</span><span class="token builtin">string</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n <span class="token function">useEffect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">const</span> cleanupSpawnStarted <span class="token operator">=</span> window<span class="token punctuation">.</span>ipc<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STARTED</span><span class="token punctuation">,</span>
1\n <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token function">setLoading</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token keyword">const</span> cleanupSpawnStdout <span class="token operator">=</span> window<span class="token punctuation">.</span>ipc<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STDOUT</span><span class="token punctuation">,</span>\n <span class="token punctuation">(</span>data<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token function">setStdout</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token keyword">const</span> cleanupSpawnStderr <span class="token operator">=</span> window<span class="token punctuation">.</span>ipc<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_STDERR</span><span class="token punctuation">,</span>\n <span class="token punctuation">(</span>data<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token comment">// setStderr(data);</span>\n <span class="token function">setStderr</span><span class="token punctuation">(</span><span class="token punctuation">(</span>prev<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token keyword">return</span> <span class="token punctuation">(</span>data <span class="token operator">+</span> <span class="token string">"\\n"</span> <span class="token operator">+</span> prev<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token keyword">const</span> cleanupSpawnFinished <span class="token operator">=</span> window<span class="token punctuation">.</span>ipc<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>\n SpawnEvents<span class="token punctuation">.</span><span class="token constant">SPAWN_FINISHED</span><span class="token punctuation">,</span>\n <span class="token punctuation">(</span>code<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
1\n <span class="token function">setLoading</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span>\n <span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>\n <span class="token function">cleanupSpawnStarted</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token function">cleanupSpawnStdout</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token function">cleanupSpawnStderr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token function">cleanupSpawnFinished</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">;</span>\n <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>\n\n <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span><span class="token punctuation">></span></span><span class="token punctuation">{</span><span class="token comment">/* component details */</span><span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span><span class="token punctuation">></span></span><span class="token punctuation">;</span>\n<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div>'}}),"\n",p.createElement(s.p,null,"ä¸è¬æ¥è¯´ï¼å¯æ§è¡æä»¶ä¼å°æ¥å¿ä¿¡æ¯éå®åè³ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">stderr</code>'}})," æ åé误ï¼è¿è¡çæç»ç»æéå®åè³ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">stdout</code>'}})," æ åè¾åºã卿¬æä¸ï¼æä»¬éè¦å±ç¤ºçæ¯ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">stderr</code>'}})," çå
容ã"),"\n",p.createElement(s.p,null,"å¦ææ¸²æå¨è¿éè¦å¯¹ ",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">stdout</code>'}})," çç»æè¿è¡ä¸ä¸æ¥å¤çï¼åæ ·å¯ä»¥å¨å¯¹åºçç»ä»¶ä¸æ·»å çå¬å¨ï¼",p.createElement(s.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">window.ipc.on(SpawnEvents.SPAWN_STDOUT, (data: string) => {})</code>'}}),"ã"),"\n"),"\n"),"\n",p.createElement(s.h3,null,"渲æå¨å±ç¤ºæ¥æ¶å°çæ¥å¿ä¿¡æ¯"),"\n",p.createElement(s.p,null,"ç°å¨ï¼ææçé¾è·¯é½å·²ç»æéï¼æ¥æ¶ç¼å代ç åªåçç»æ¶å§ï¼"),"\n",p.createElement(s.img,{src:"/static/44cdc55b11bdb279f47ae8319fbf6e93/real-time-execution-log.gif",alt:"宿¶å±ç¤ºæ¥å¿ä¿¡æ¯"}))}var o=function(n){void 0===n&&(n={});const{wrapper:s}=Object.assign({},(0,t.R)(),n.components);return s?p.createElement(s,n,p.createElement(e,n)):e(n)},c=a(5643),l=a(9182),u=a.n(l),i=a(2838),k=a.n(i),r=a(4579),d=a.n(r),g=a(2030),m=a(7531),f=a(1099),E=a(4490),w=a(3625),y=a(5672),h=a(1579);u().extend(d()),u().extend(k());const S={a:n=>{let{href:s="",children:a}=n;const t=!(null!=s&&s.startsWith("#")),e=t?s:`#${encodeURIComponent(s.slice(1))}`;return p.createElement("a",{href:e,target:t?"_blank":void 0,rel:"noreferrer"},a)},img:n=>{const{alt:s="The author is too lazy to give an alt",src:a,...t}=n;return p.createElement("a",{href:a,"data-fancybox":"gallery","data-caption":s},p.createElement("img",Object.assign({src:a,alt:s},t)))},Card:m.A,Link:g.Link,HintText:f.A},b=n=>{var s;let{children:a,data:e}=n;const{mdx:{fields:{isDraft:o},frontmatter:{title:l,date:i,updated:k,categories:r,tags:d,timeliness:m}}}=e,f=p.useRef(null),E=u().utc(i).tz("Asia/Shanghai"),b=k?u().utc(k).tz("Asia/Shanghai"):E,[v,_]=p.useState(null),x=null!==v?v.diff(b,"days"):null,T="number"==typeof m?m:365,I=null!==x&&T>=0&&x>=T;return p.useEffect(()=>{p.startTransition(()=>_(u()().tz("Asia/Shanghai")))},[]),p.useEffect(()=>{var n;const s=null===(n=f.current)||void 0===n?void 0:n.querySelectorAll("a.gatsby-resp-image-link");
1return null==s||s.forEach(n=>{const s=n.children.item(1);n.setAttribute("data-fancybox","gallery"),n.setAttribute("data-caption",s.alt)}),c.lX.bind("[data-fancybox]",{on:{initLayout:n=>{var s,a;null===(s=n.getContainer())||void 0===s||s.setAttribute("theme",null!==(a=document.documentElement.dataset.theme)&&void 0!==a?a:"light")}}}),()=>c.lX.unbind("[data-fancybox]")},[]),(0,h.A)(f),p.createElement("div",{className:"mx-auto flex max-w-xl flex-col gap-y-12"},p.createElement("div",{className:"flex flex-col gap-4"},(null==r?void 0:r.length)&&p.createElement(g.Link,{to:`/categories/${encodeURIComponent(r[0])}`,className:"w-fit rounded bg-background-lighter px-3 py-2 leading-normal transition-opacity hover:opacity-75"},p.createElement("span",{className:`cursor-pointer bg-gradient-to-tr from-0% via-40% to-90% bg-clip-text text-lg font-bold leading-none text-transparent ${null!==(s=y.Y[r[0]])&&void 0!==s?s:""}`},r[0])),p.createElement("h1",{className:"text-3xl font-bold"},l),p.createElement("div",{className:"item-secondary flex flex-col gap-2 lg:flex-row"},i&&p.createElement("span",{title:`馿¬¡åå¸äºï¼${E.format("YYYY-MM-DD HH:mm:ss [UTC+8]")}\næåæ´æ°äºï¼${b.format("YYYY-MM-DD HH:mm:ss [UTC+8]")}`},E.format("MM æ DD æ¥ YYYY å¹´")),(null==d?void 0:d.length)&&p.createElement("div",{className:"flex flex-1 flex-wrap gap-2 lg:before:content-['â¢']"},d.map(n=>p.createElement(w.A,{key:n,name:n,className:"item-secondary item-selectable"}))))),p.createElement("article",{ref:f,className:"heti post-entry"},o&&p.createElement("blockquote",{className:"!border-red-400"},"è¿æ¯ä¸ç¯",p.createElement("strong",null,"å°æªæ£å¼åå¸"),"çå客ï¼å 容å¯è½æä¸å®åæåå¨çº°æ¼ï¼å»ºè®®æ¨ä»ç»è¯ä¼°æç« çå¯é æ§ã"),I&&null!==x&&p.createElement("blockquote",{className:"!border-orange-400"},"è¿æ¯ä¸ç¯",p.createElement("strong",null,"æåæ´æ°äº ",x," 天å"),"çå客ï¼å 容å¯è½éçæ¶é´çæ¨ç§»èåå¾ä¸åéç¨ï¼å»ºè®®æ¨ä»ç»è¯ä¼°æç« çæææ§ã"),p.createElement(t.x,{components:S},a)))},v=n=>{let{data:s}=n;return p.createElement(E.A,{title:String(s.mdx.frontmatter.title)})};function _(n){return p.createElement(b,n,p.createElement(o,n))}}}]); 2//# sourceMappingURL=component---src-templates-post-tsx-content-file-path-blog-posts-electron-real-time-print-execution-log-mdx-2661816b933944e0c926.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.