[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother":2815,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother":2841},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":13,"pinned":14,"draft":14,"body":15,"seo":2811,"stem":2812,"id":2813,"extension":2814},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother","其他常用模块","以下是 Node.js 中几个重要内置模块的详细介绍，涵盖事件触发器、定时器、加密、压缩、操作系统信息和实用工具。","技能小册",[12],"nodejs","2020-03-27",false,{"type":16,"value":17,"toc":2768},"minimark",[18,21,24,34,51,58,287,293,300,306,356,363,367,411,415,428,492,499,502,607,614,639,653,695,706,713,718,725,728,844,848,851,942,946,949,1243,1247,1250,1412,1416,1430,1502,1509,1514,1518,1523,1683,1691,1814,1818,1845,1849,1852,1859,1864,1975,1978,2059,2065,2070,2077,2080,2233,2240,2250,2374,2381,2394,2487,2497,2504,2513,2645,2649,2667,2670,2761,2764],[19,20,8],"h1",{"id":8},[22,23,9],"p",{},[25,26,28,29,33],"h2",{"id":27},"一事件触发器events","一、事件触发器（",[30,31,32],"code",{},"events","）",[22,35,36,38,39,42,43,46,47,50],{},[30,37,32],{}," 模块是 Node.js 实现「事件驱动」架构的核心，许多内置模块（如 ",[30,40,41],{},"http.Server","、",[30,44,45],{},"stream","）都继承自 ",[30,48,49],{},"EventEmitter","。",[52,53,55,56],"h3",{"id":54},"_1-自定义事件与继承-eventemitter","1. 自定义事件与继承 ",[30,57,49],{},[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","const EventEmitter = require(\"events\");\n\nclass MyEmitter extends EventEmitter {}\n\nconst myEmitter = new MyEmitter();\nmyEmitter.on(\"event\", (arg1, arg2) => {\n    console.log(\"事件触发\", arg1, arg2);\n});\nmyEmitter.emit(\"event\", \"hello\", \"world\");\n","js","",[30,66,67,108,115,133,138,158,202,236,246],{"__ignoreMap":64},[68,69,72,76,80,84,88,92,96,99,101,104],"span",{"class":70,"line":71},"line",1,[68,73,75],{"class":74},"sbsja","const",[68,77,79],{"class":78},"s_hVV"," EventEmitter",[68,81,83],{"class":82},"smGrS"," =",[68,85,87],{"class":86},"sGLFI"," require",[68,89,91],{"class":90},"su5hD","(",[68,93,95],{"class":94},"sjJ54","\"",[68,97,32],{"class":98},"s_sjI",[68,100,95],{"class":94},[68,102,103],{"class":90},")",[68,105,107],{"class":106},"sP7_E",";\n",[68,109,111],{"class":70,"line":110},2,[68,112,114],{"emptyLinePlaceholder":113},true,"\n",[68,116,118,121,125,128,130],{"class":70,"line":117},3,[68,119,120],{"class":74},"class",[68,122,124],{"class":123},"sbgvK"," MyEmitter",[68,126,127],{"class":74}," extends",[68,129,79],{"class":123},[68,131,132],{"class":106}," {}\n",[68,134,136],{"class":70,"line":135},4,[68,137,114],{"emptyLinePlaceholder":113},[68,139,141,143,146,148,151,153,156],{"class":70,"line":140},5,[68,142,75],{"class":74},[68,144,145],{"class":78}," myEmitter",[68,147,83],{"class":82},[68,149,150],{"class":82}," new",[68,152,124],{"class":86},[68,154,155],{"class":90},"()",[68,157,107],{"class":106},[68,159,161,164,167,170,172,174,177,179,182,185,189,191,194,196,199],{"class":70,"line":160},6,[68,162,163],{"class":90},"myEmitter",[68,165,166],{"class":106},".",[68,168,169],{"class":86},"on",[68,171,91],{"class":90},[68,173,95],{"class":94},[68,175,176],{"class":98},"event",[68,178,95],{"class":94},[68,180,181],{"class":106},",",[68,183,184],{"class":106}," (",[68,186,188],{"class":187},"s99_P","arg1",[68,190,181],{"class":106},[68,192,193],{"class":187}," arg2",[68,195,103],{"class":106},[68,197,198],{"class":74}," =>",[68,200,201],{"class":106}," {\n",[68,203,205,208,210,213,216,218,221,223,225,228,230,232,234],{"class":70,"line":204},7,[68,206,207],{"class":90},"    console",[68,209,166],{"class":106},[68,211,212],{"class":86},"log",[68,214,91],{"class":215},"skxfh",[68,217,95],{"class":94},[68,219,220],{"class":98},"事件触发",[68,222,95],{"class":94},[68,224,181],{"class":106},[68,226,227],{"class":90}," arg1",[68,229,181],{"class":106},[68,231,193],{"class":90},[68,233,103],{"class":215},[68,235,107],{"class":106},[68,237,239,242,244],{"class":70,"line":238},8,[68,240,241],{"class":106},"}",[68,243,103],{"class":90},[68,245,107],{"class":106},[68,247,249,251,253,256,258,260,262,264,266,269,272,274,276,278,281,283,285],{"class":70,"line":248},9,[68,250,163],{"class":90},[68,252,166],{"class":106},[68,254,255],{"class":86},"emit",[68,257,91],{"class":90},[68,259,95],{"class":94},[68,261,176],{"class":98},[68,263,95],{"class":94},[68,265,181],{"class":106},[68,267,268],{"class":94}," \"",[68,270,271],{"class":98},"hello",[68,273,95],{"class":94},[68,275,181],{"class":106},[68,277,268],{"class":94},[68,279,280],{"class":98},"world",[68,282,95],{"class":94},[68,284,103],{"class":90},[68,286,107],{"class":106},[22,288,289,290,292],{},"也可以直接使用 ",[30,291,49],{}," 实例，不必要继承。",[52,294,296,297],{"id":295},"_2-内存管理setmaxlisteners","2. 内存管理：",[30,298,299],{},"setMaxListeners",[22,301,302,303,305],{},"默认情况下，为同一个事件添加超过 10 个监听器会触发警告（防止内存泄漏）。可通过 ",[30,304,299],{}," 调整限制：",[59,307,309],{"className":61,"code":308,"language":63,"meta":64,"style":64},"myEmitter.setMaxListeners(20);\nconsole.log(myEmitter.getMaxListeners()); \u002F\u002F 20\n",[30,310,311,329],{"__ignoreMap":64},[68,312,313,315,317,319,321,325,327],{"class":70,"line":71},[68,314,163],{"class":90},[68,316,166],{"class":106},[68,318,299],{"class":86},[68,320,91],{"class":90},[68,322,324],{"class":323},"srdBf","20",[68,326,103],{"class":90},[68,328,107],{"class":106},[68,330,331,334,336,338,341,343,346,349,352],{"class":70,"line":110},[68,332,333],{"class":90},"console",[68,335,166],{"class":106},[68,337,212],{"class":86},[68,339,340],{"class":90},"(myEmitter",[68,342,166],{"class":106},[68,344,345],{"class":86},"getMaxListeners",[68,347,348],{"class":90},"())",[68,350,351],{"class":106},";",[68,353,355],{"class":354},"sutJx"," \u002F\u002F 20\n",[22,357,358,359,362],{},"若要彻底移除警告，可设为 ",[30,360,361],{},"0","（不推荐）。",[52,364,366],{"id":365},"_3-其他常用方法","3. 其他常用方法",[368,369,370,377,383,393,399,405],"ul",{},[371,372,373,376],"li",{},[30,374,375],{},"once(event, listener)","：只执行一次后自动移除。",[371,378,379,382],{},[30,380,381],{},"prependListener","：将监听器添加到数组头部。",[371,384,385,388,389,392],{},[30,386,387],{},"removeListener"," \u002F ",[30,390,391],{},"off","：移除特定监听器。",[371,394,395,398],{},[30,396,397],{},"removeAllListeners([event])","：移除所有监听器。",[371,400,401,404],{},[30,402,403],{},"listenerCount(event)","：获取监听器数量。",[371,406,407,410],{},[30,408,409],{},"eventNames()","：返回已注册事件名称数组。",[52,412,414],{"id":413},"_4-错误处理","4. 错误处理",[22,416,417,418,420,421,424,425,427],{},"如果 ",[30,419,49],{}," 实例发生错误且没有监听 ",[30,422,423],{},"'error'"," 事件，Node.js 会抛出异常并打印堆栈。因此建议始终监听 ",[30,426,423],{}," 事件。",[59,429,431],{"className":61,"code":430,"language":63,"meta":64,"style":64},"myEmitter.on(\"error\", err => {\n    console.error(\"发生错误:\", err);\n});\n",[30,432,433,459,484],{"__ignoreMap":64},[68,434,435,437,439,441,443,445,448,450,452,455,457],{"class":70,"line":71},[68,436,163],{"class":90},[68,438,166],{"class":106},[68,440,169],{"class":86},[68,442,91],{"class":90},[68,444,95],{"class":94},[68,446,447],{"class":98},"error",[68,449,95],{"class":94},[68,451,181],{"class":106},[68,453,454],{"class":187}," err",[68,456,198],{"class":74},[68,458,201],{"class":106},[68,460,461,463,465,467,469,471,474,476,478,480,482],{"class":70,"line":110},[68,462,207],{"class":90},[68,464,166],{"class":106},[68,466,447],{"class":86},[68,468,91],{"class":215},[68,470,95],{"class":94},[68,472,473],{"class":98},"发生错误:",[68,475,95],{"class":94},[68,477,181],{"class":106},[68,479,454],{"class":90},[68,481,103],{"class":215},[68,483,107],{"class":106},[68,485,486,488,490],{"class":70,"line":117},[68,487,241],{"class":106},[68,489,103],{"class":90},[68,491,107],{"class":106},[25,493,495,496,33],{"id":494},"二定时器timer","二、定时器（",[30,497,498],{},"timer",[22,500,501],{},"Node.js 的定时器与浏览器类似，但实现上基于 libuv 的事件循环，具有一些差异。",[503,504,505,527],"table",{},[506,507,508],"thead",{},[509,510,511,515,518,521,524],"tr",{},[512,513,514],"th",{},"方法",[512,516,517],{},"描述",[512,519,520],{},"执行时机",[512,522,523],{},"精度",[512,525,526],{},"长时间延迟影响",[528,529,530,550,569,588],"tbody",{},[509,531,532,538,541,544,547],{},[533,534,535],"td",{},[30,536,537],{},"setTimeout",[533,539,540],{},"延迟执行一次",[533,542,543],{},"在 timers 阶段（可能受其他回调阻塞）",[533,545,546],{},"4ms 以内（嵌套调用）",[533,548,549],{},"可能延迟",[509,551,552,557,560,563,566],{},[533,553,554],{},[30,555,556],{},"setInterval",[533,558,559],{},"周期性执行",[533,561,562],{},"每个周期尝试在 timers 阶段执行",[533,564,565],{},"同上",[533,567,568],{},"累积偏移",[509,570,571,576,579,582,585],{},[533,572,573],{},[30,574,575],{},"setImmediate",[533,577,578],{},"尽快执行一次",[533,580,581],{},"在 check 阶段（poll 阶段之后）",[533,583,584],{},"较高",[533,586,587],{},"几乎不受影响",[509,589,590,595,598,601,604],{},[533,591,592],{},[30,593,594],{},"process.nextTick",[533,596,597],{},"尽快执行",[533,599,600],{},"在当前阶段结束后、下个阶段开始前",[533,602,603],{},"最高",[533,605,606],{},"会阻塞事件循环",[22,608,609,613],{},[610,611,612],"strong",{},"重要区别","：",[368,615,616,631],{},[371,617,618,620,621,624,625,627,628,630],{},[30,619,575],{}," 与 ",[30,622,623],{},"setTimeout(fn, 0)","：在 I\u002FO 循环中，",[30,626,575],{}," 总是先执行；在顶层模块中，顺序取决于性能（通常 ",[30,629,537],{}," 可能随机先执行）。",[371,632,633,635,636,638],{},[30,634,594],{}," 优先级最高，会递归导致 I\u002FO 饥饿，官方推荐使用 ",[30,637,575],{}," 或重构。",[22,640,641,613,644,42,647,42,650,50],{},[610,642,643],{},"取消定时器",[30,645,646],{},"clearTimeout",[30,648,649],{},"clearInterval",[30,651,652],{},"clearImmediate",[59,654,656],{"className":61,"code":655,"language":63,"meta":64,"style":64},"const timeoutId = setTimeout(() => {}, 1000);\nclearTimeout(timeoutId);\n",[30,657,658,686],{"__ignoreMap":64},[68,659,660,662,665,667,670,672,674,676,679,682,684],{"class":70,"line":71},[68,661,75],{"class":74},[68,663,664],{"class":78}," timeoutId",[68,666,83],{"class":82},[68,668,669],{"class":86}," setTimeout",[68,671,91],{"class":90},[68,673,155],{"class":106},[68,675,198],{"class":74},[68,677,678],{"class":106}," {},",[68,680,681],{"class":323}," 1000",[68,683,103],{"class":90},[68,685,107],{"class":106},[68,687,688,690,693],{"class":70,"line":110},[68,689,646],{"class":86},[68,691,692],{"class":90},"(timeoutId)",[68,694,107],{"class":106},[22,696,697,613,700,702,703,705],{},[610,698,699],{},"注意",[30,701,556],{}," 可能因回调执行时间长而导致积压（下一次调用之前未完成），建议使用递归 ",[30,704,537],{}," 实现精确间隔。",[25,707,709,710,33],{"id":708},"三加密crypto","三、加密（",[30,711,712],{},"crypto",[22,714,715,717],{},[30,716,712],{}," 模块提供加密功能，包含哈希、HMAC、对称\u002F非对称加密及随机数生成。",[52,719,721,722,33],{"id":720},"_1-哈希createhash","1. 哈希（",[30,723,724],{},"createHash",[22,726,727],{},"哈希算法（MD5、SHA-256 等）将任意长度数据转换为固定长度摘要，不可逆。",[59,729,731],{"className":61,"code":730,"language":63,"meta":64,"style":64},"const crypto = require(\"crypto\");\n\nconst hash = crypto.createHash(\"sha256\");\nhash.update(\"some data\");\nconsole.log(hash.digest(\"hex\")); \u002F\u002F 十六进制字符串\n",[30,732,733,756,760,788,811],{"__ignoreMap":64},[68,734,735,737,740,742,744,746,748,750,752,754],{"class":70,"line":71},[68,736,75],{"class":74},[68,738,739],{"class":78}," crypto",[68,741,83],{"class":82},[68,743,87],{"class":86},[68,745,91],{"class":90},[68,747,95],{"class":94},[68,749,712],{"class":98},[68,751,95],{"class":94},[68,753,103],{"class":90},[68,755,107],{"class":106},[68,757,758],{"class":70,"line":110},[68,759,114],{"emptyLinePlaceholder":113},[68,761,762,764,767,769,771,773,775,777,779,782,784,786],{"class":70,"line":117},[68,763,75],{"class":74},[68,765,766],{"class":78}," hash",[68,768,83],{"class":82},[68,770,739],{"class":90},[68,772,166],{"class":106},[68,774,724],{"class":86},[68,776,91],{"class":90},[68,778,95],{"class":94},[68,780,781],{"class":98},"sha256",[68,783,95],{"class":94},[68,785,103],{"class":90},[68,787,107],{"class":106},[68,789,790,793,795,798,800,802,805,807,809],{"class":70,"line":135},[68,791,792],{"class":90},"hash",[68,794,166],{"class":106},[68,796,797],{"class":86},"update",[68,799,91],{"class":90},[68,801,95],{"class":94},[68,803,804],{"class":98},"some data",[68,806,95],{"class":94},[68,808,103],{"class":90},[68,810,107],{"class":106},[68,812,813,815,817,819,822,824,827,829,831,834,836,839,841],{"class":70,"line":140},[68,814,333],{"class":90},[68,816,166],{"class":106},[68,818,212],{"class":86},[68,820,821],{"class":90},"(hash",[68,823,166],{"class":106},[68,825,826],{"class":86},"digest",[68,828,91],{"class":90},[68,830,95],{"class":94},[68,832,833],{"class":98},"hex",[68,835,95],{"class":94},[68,837,838],{"class":90},"))",[68,840,351],{"class":106},[68,842,843],{"class":354}," \u002F\u002F 十六进制字符串\n",[52,845,847],{"id":846},"_2-hmac基于哈希的消息认证码","2. HMAC（基于哈希的消息认证码）",[22,849,850],{},"HMAC 需要密钥，用于验证消息完整性和真实性。",[59,852,854],{"className":61,"code":853,"language":63,"meta":64,"style":64},"const hmac = crypto.createHmac(\"sha256\", \"secret-key\");\nhmac.update(\"message\");\nconsole.log(hmac.digest(\"hex\"));\n",[30,855,856,893,915],{"__ignoreMap":64},[68,857,858,860,863,865,867,869,872,874,876,878,880,882,884,887,889,891],{"class":70,"line":71},[68,859,75],{"class":74},[68,861,862],{"class":78}," hmac",[68,864,83],{"class":82},[68,866,739],{"class":90},[68,868,166],{"class":106},[68,870,871],{"class":86},"createHmac",[68,873,91],{"class":90},[68,875,95],{"class":94},[68,877,781],{"class":98},[68,879,95],{"class":94},[68,881,181],{"class":106},[68,883,268],{"class":94},[68,885,886],{"class":98},"secret-key",[68,888,95],{"class":94},[68,890,103],{"class":90},[68,892,107],{"class":106},[68,894,895,898,900,902,904,906,909,911,913],{"class":70,"line":110},[68,896,897],{"class":90},"hmac",[68,899,166],{"class":106},[68,901,797],{"class":86},[68,903,91],{"class":90},[68,905,95],{"class":94},[68,907,908],{"class":98},"message",[68,910,95],{"class":94},[68,912,103],{"class":90},[68,914,107],{"class":106},[68,916,917,919,921,923,926,928,930,932,934,936,938,940],{"class":70,"line":117},[68,918,333],{"class":90},[68,920,166],{"class":106},[68,922,212],{"class":86},[68,924,925],{"class":90},"(hmac",[68,927,166],{"class":106},[68,929,826],{"class":86},[68,931,91],{"class":90},[68,933,95],{"class":94},[68,935,833],{"class":98},[68,937,95],{"class":94},[68,939,838],{"class":90},[68,941,107],{"class":106},[52,943,945],{"id":944},"_3-对称加密","3. 对称加密",[22,947,948],{},"使用相同密钥加密和解密，如 AES。",[59,950,952],{"className":61,"code":951,"language":63,"meta":64,"style":64},"const algorithm = \"aes-256-cbc\";\nconst key = crypto.randomBytes(32);\nconst iv = crypto.randomBytes(16);\n\nconst cipher = crypto.createCipheriv(algorithm, key, iv);\nlet encrypted = cipher.update(\"plain text\", \"utf8\", \"hex\");\nencrypted += cipher.final(\"hex\");\n\nconst decipher = crypto.createDecipheriv(algorithm, key, iv);\nlet decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\nconsole.log(decrypted); \u002F\u002F 'plain text'\n",[30,953,954,972,997,1021,1025,1055,1102,1129,1133,1161,1200,1226],{"__ignoreMap":64},[68,955,956,958,961,963,965,968,970],{"class":70,"line":71},[68,957,75],{"class":74},[68,959,960],{"class":78}," algorithm",[68,962,83],{"class":82},[68,964,268],{"class":94},[68,966,967],{"class":98},"aes-256-cbc",[68,969,95],{"class":94},[68,971,107],{"class":106},[68,973,974,976,979,981,983,985,988,990,993,995],{"class":70,"line":110},[68,975,75],{"class":74},[68,977,978],{"class":78}," key",[68,980,83],{"class":82},[68,982,739],{"class":90},[68,984,166],{"class":106},[68,986,987],{"class":86},"randomBytes",[68,989,91],{"class":90},[68,991,992],{"class":323},"32",[68,994,103],{"class":90},[68,996,107],{"class":106},[68,998,999,1001,1004,1006,1008,1010,1012,1014,1017,1019],{"class":70,"line":117},[68,1000,75],{"class":74},[68,1002,1003],{"class":78}," iv",[68,1005,83],{"class":82},[68,1007,739],{"class":90},[68,1009,166],{"class":106},[68,1011,987],{"class":86},[68,1013,91],{"class":90},[68,1015,1016],{"class":323},"16",[68,1018,103],{"class":90},[68,1020,107],{"class":106},[68,1022,1023],{"class":70,"line":135},[68,1024,114],{"emptyLinePlaceholder":113},[68,1026,1027,1029,1032,1034,1036,1038,1041,1044,1046,1048,1050,1053],{"class":70,"line":140},[68,1028,75],{"class":74},[68,1030,1031],{"class":78}," cipher",[68,1033,83],{"class":82},[68,1035,739],{"class":90},[68,1037,166],{"class":106},[68,1039,1040],{"class":86},"createCipheriv",[68,1042,1043],{"class":90},"(algorithm",[68,1045,181],{"class":106},[68,1047,978],{"class":90},[68,1049,181],{"class":106},[68,1051,1052],{"class":90}," iv)",[68,1054,107],{"class":106},[68,1056,1057,1060,1063,1066,1068,1070,1072,1074,1076,1079,1081,1083,1085,1088,1090,1092,1094,1096,1098,1100],{"class":70,"line":160},[68,1058,1059],{"class":74},"let",[68,1061,1062],{"class":90}," encrypted ",[68,1064,1065],{"class":82},"=",[68,1067,1031],{"class":90},[68,1069,166],{"class":106},[68,1071,797],{"class":86},[68,1073,91],{"class":90},[68,1075,95],{"class":94},[68,1077,1078],{"class":98},"plain text",[68,1080,95],{"class":94},[68,1082,181],{"class":106},[68,1084,268],{"class":94},[68,1086,1087],{"class":98},"utf8",[68,1089,95],{"class":94},[68,1091,181],{"class":106},[68,1093,268],{"class":94},[68,1095,833],{"class":98},[68,1097,95],{"class":94},[68,1099,103],{"class":90},[68,1101,107],{"class":106},[68,1103,1104,1107,1110,1112,1114,1117,1119,1121,1123,1125,1127],{"class":70,"line":204},[68,1105,1106],{"class":90},"encrypted ",[68,1108,1109],{"class":82},"+=",[68,1111,1031],{"class":90},[68,1113,166],{"class":106},[68,1115,1116],{"class":86},"final",[68,1118,91],{"class":90},[68,1120,95],{"class":94},[68,1122,833],{"class":98},[68,1124,95],{"class":94},[68,1126,103],{"class":90},[68,1128,107],{"class":106},[68,1130,1131],{"class":70,"line":238},[68,1132,114],{"emptyLinePlaceholder":113},[68,1134,1135,1137,1140,1142,1144,1146,1149,1151,1153,1155,1157,1159],{"class":70,"line":248},[68,1136,75],{"class":74},[68,1138,1139],{"class":78}," decipher",[68,1141,83],{"class":82},[68,1143,739],{"class":90},[68,1145,166],{"class":106},[68,1147,1148],{"class":86},"createDecipheriv",[68,1150,1043],{"class":90},[68,1152,181],{"class":106},[68,1154,978],{"class":90},[68,1156,181],{"class":106},[68,1158,1052],{"class":90},[68,1160,107],{"class":106},[68,1162,1164,1166,1169,1171,1173,1175,1177,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198],{"class":70,"line":1163},10,[68,1165,1059],{"class":74},[68,1167,1168],{"class":90}," decrypted ",[68,1170,1065],{"class":82},[68,1172,1139],{"class":90},[68,1174,166],{"class":106},[68,1176,797],{"class":86},[68,1178,1179],{"class":90},"(encrypted",[68,1181,181],{"class":106},[68,1183,268],{"class":94},[68,1185,833],{"class":98},[68,1187,95],{"class":94},[68,1189,181],{"class":106},[68,1191,268],{"class":94},[68,1193,1087],{"class":98},[68,1195,95],{"class":94},[68,1197,103],{"class":90},[68,1199,107],{"class":106},[68,1201,1203,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224],{"class":70,"line":1202},11,[68,1204,1205],{"class":90},"decrypted ",[68,1207,1109],{"class":82},[68,1209,1139],{"class":90},[68,1211,166],{"class":106},[68,1213,1116],{"class":86},[68,1215,91],{"class":90},[68,1217,95],{"class":94},[68,1219,1087],{"class":98},[68,1221,95],{"class":94},[68,1223,103],{"class":90},[68,1225,107],{"class":106},[68,1227,1229,1231,1233,1235,1238,1240],{"class":70,"line":1228},12,[68,1230,333],{"class":90},[68,1232,166],{"class":106},[68,1234,212],{"class":86},[68,1236,1237],{"class":90},"(decrypted)",[68,1239,351],{"class":106},[68,1241,1242],{"class":354}," \u002F\u002F 'plain text'\n",[52,1244,1246],{"id":1245},"_4-非对称加密rsa","4. 非对称加密（RSA）",[22,1248,1249],{},"使用公钥加密，私钥解密。",[59,1251,1253],{"className":61,"code":1252,"language":63,"meta":64,"style":64},"const { publicKey, privateKey } = crypto.generateKeyPairSync(\"rsa\", {\n    modulusLength: 2048,\n});\n\nconst encrypted = crypto.publicEncrypt(publicKey, Buffer.from(\"secret\"));\nconst decrypted = crypto.privateDecrypt(privateKey, encrypted);\nconsole.log(decrypted.toString()); \u002F\u002F 'secret'\n",[30,1254,1255,1295,1309,1317,1321,1363,1389],{"__ignoreMap":64},[68,1256,1257,1259,1262,1265,1267,1270,1273,1275,1277,1279,1282,1284,1286,1289,1291,1293],{"class":70,"line":71},[68,1258,75],{"class":74},[68,1260,1261],{"class":106}," {",[68,1263,1264],{"class":78}," publicKey",[68,1266,181],{"class":106},[68,1268,1269],{"class":78}," privateKey",[68,1271,1272],{"class":106}," }",[68,1274,83],{"class":82},[68,1276,739],{"class":90},[68,1278,166],{"class":106},[68,1280,1281],{"class":86},"generateKeyPairSync",[68,1283,91],{"class":90},[68,1285,95],{"class":94},[68,1287,1288],{"class":98},"rsa",[68,1290,95],{"class":94},[68,1292,181],{"class":106},[68,1294,201],{"class":106},[68,1296,1297,1300,1303,1306],{"class":70,"line":110},[68,1298,1299],{"class":215},"    modulusLength",[68,1301,1302],{"class":106},":",[68,1304,1305],{"class":323}," 2048",[68,1307,1308],{"class":106},",\n",[68,1310,1311,1313,1315],{"class":70,"line":117},[68,1312,241],{"class":106},[68,1314,103],{"class":90},[68,1316,107],{"class":106},[68,1318,1319],{"class":70,"line":135},[68,1320,114],{"emptyLinePlaceholder":113},[68,1322,1323,1325,1328,1330,1332,1334,1337,1340,1342,1345,1347,1350,1352,1354,1357,1359,1361],{"class":70,"line":140},[68,1324,75],{"class":74},[68,1326,1327],{"class":78}," encrypted",[68,1329,83],{"class":82},[68,1331,739],{"class":90},[68,1333,166],{"class":106},[68,1335,1336],{"class":86},"publicEncrypt",[68,1338,1339],{"class":90},"(publicKey",[68,1341,181],{"class":106},[68,1343,1344],{"class":90}," Buffer",[68,1346,166],{"class":106},[68,1348,1349],{"class":86},"from",[68,1351,91],{"class":90},[68,1353,95],{"class":94},[68,1355,1356],{"class":98},"secret",[68,1358,95],{"class":94},[68,1360,838],{"class":90},[68,1362,107],{"class":106},[68,1364,1365,1367,1370,1372,1374,1376,1379,1382,1384,1387],{"class":70,"line":160},[68,1366,75],{"class":74},[68,1368,1369],{"class":78}," decrypted",[68,1371,83],{"class":82},[68,1373,739],{"class":90},[68,1375,166],{"class":106},[68,1377,1378],{"class":86},"privateDecrypt",[68,1380,1381],{"class":90},"(privateKey",[68,1383,181],{"class":106},[68,1385,1386],{"class":90}," encrypted)",[68,1388,107],{"class":106},[68,1390,1391,1393,1395,1397,1400,1402,1405,1407,1409],{"class":70,"line":204},[68,1392,333],{"class":90},[68,1394,166],{"class":106},[68,1396,212],{"class":86},[68,1398,1399],{"class":90},"(decrypted",[68,1401,166],{"class":106},[68,1403,1404],{"class":86},"toString",[68,1406,348],{"class":90},[68,1408,351],{"class":106},[68,1410,1411],{"class":354}," \u002F\u002F 'secret'\n",[52,1413,1415],{"id":1414},"_5-随机数生成","5. 随机数生成",[368,1417,1418,1424],{},[371,1419,1420,1423],{},[30,1421,1422],{},"crypto.randomBytes(size)","：生成安全的伪随机字节。",[371,1425,1426,1429],{},[30,1427,1428],{},"crypto.randomInt(min, max)","：生成随机整数。",[59,1431,1433],{"className":61,"code":1432,"language":63,"meta":64,"style":64},"crypto.randomBytes(16, (err, buf) => {\n    console.log(buf.toString(\"hex\"));\n});\n",[30,1434,1435,1465,1494],{"__ignoreMap":64},[68,1436,1437,1439,1441,1443,1445,1447,1449,1451,1454,1456,1459,1461,1463],{"class":70,"line":71},[68,1438,712],{"class":90},[68,1440,166],{"class":106},[68,1442,987],{"class":86},[68,1444,91],{"class":90},[68,1446,1016],{"class":323},[68,1448,181],{"class":106},[68,1450,184],{"class":106},[68,1452,1453],{"class":187},"err",[68,1455,181],{"class":106},[68,1457,1458],{"class":187}," buf",[68,1460,103],{"class":106},[68,1462,198],{"class":74},[68,1464,201],{"class":106},[68,1466,1467,1469,1471,1473,1475,1478,1480,1482,1484,1486,1488,1490,1492],{"class":70,"line":110},[68,1468,207],{"class":90},[68,1470,166],{"class":106},[68,1472,212],{"class":86},[68,1474,91],{"class":215},[68,1476,1477],{"class":90},"buf",[68,1479,166],{"class":106},[68,1481,1404],{"class":86},[68,1483,91],{"class":215},[68,1485,95],{"class":94},[68,1487,833],{"class":98},[68,1489,95],{"class":94},[68,1491,838],{"class":215},[68,1493,107],{"class":106},[68,1495,1496,1498,1500],{"class":70,"line":117},[68,1497,241],{"class":106},[68,1499,103],{"class":90},[68,1501,107],{"class":106},[25,1503,1505,1506,33],{"id":1504},"四压缩zlib","四、压缩（",[30,1507,1508],{},"zlib",[22,1510,1511,1513],{},[30,1512,1508],{}," 模块提供 gzip、deflate、brotli 等压缩算法。",[52,1515,1517],{"id":1516},"_1-压缩与解压gzip-示例","1. 压缩与解压（gzip 示例）",[22,1519,1520,613],{},[610,1521,1522],{},"回调风格",[59,1524,1526],{"className":61,"code":1525,"language":63,"meta":64,"style":64},"const zlib = require(\"zlib\");\nconst fs = require(\"fs\");\n\nconst gzip = zlib.createGzip();\nconst inp = fs.createReadStream(\"input.txt\");\nconst out = fs.createWriteStream(\"input.txt.gz\");\n\ninp.pipe(gzip).pipe(out);\n",[30,1527,1528,1551,1575,1579,1599,1628,1657,1661],{"__ignoreMap":64},[68,1529,1530,1532,1535,1537,1539,1541,1543,1545,1547,1549],{"class":70,"line":71},[68,1531,75],{"class":74},[68,1533,1534],{"class":78}," zlib",[68,1536,83],{"class":82},[68,1538,87],{"class":86},[68,1540,91],{"class":90},[68,1542,95],{"class":94},[68,1544,1508],{"class":98},[68,1546,95],{"class":94},[68,1548,103],{"class":90},[68,1550,107],{"class":106},[68,1552,1553,1555,1558,1560,1562,1564,1566,1569,1571,1573],{"class":70,"line":110},[68,1554,75],{"class":74},[68,1556,1557],{"class":78}," fs",[68,1559,83],{"class":82},[68,1561,87],{"class":86},[68,1563,91],{"class":90},[68,1565,95],{"class":94},[68,1567,1568],{"class":98},"fs",[68,1570,95],{"class":94},[68,1572,103],{"class":90},[68,1574,107],{"class":106},[68,1576,1577],{"class":70,"line":117},[68,1578,114],{"emptyLinePlaceholder":113},[68,1580,1581,1583,1586,1588,1590,1592,1595,1597],{"class":70,"line":135},[68,1582,75],{"class":74},[68,1584,1585],{"class":78}," gzip",[68,1587,83],{"class":82},[68,1589,1534],{"class":90},[68,1591,166],{"class":106},[68,1593,1594],{"class":86},"createGzip",[68,1596,155],{"class":90},[68,1598,107],{"class":106},[68,1600,1601,1603,1606,1608,1610,1612,1615,1617,1619,1622,1624,1626],{"class":70,"line":140},[68,1602,75],{"class":74},[68,1604,1605],{"class":78}," inp",[68,1607,83],{"class":82},[68,1609,1557],{"class":90},[68,1611,166],{"class":106},[68,1613,1614],{"class":86},"createReadStream",[68,1616,91],{"class":90},[68,1618,95],{"class":94},[68,1620,1621],{"class":98},"input.txt",[68,1623,95],{"class":94},[68,1625,103],{"class":90},[68,1627,107],{"class":106},[68,1629,1630,1632,1635,1637,1639,1641,1644,1646,1648,1651,1653,1655],{"class":70,"line":160},[68,1631,75],{"class":74},[68,1633,1634],{"class":78}," out",[68,1636,83],{"class":82},[68,1638,1557],{"class":90},[68,1640,166],{"class":106},[68,1642,1643],{"class":86},"createWriteStream",[68,1645,91],{"class":90},[68,1647,95],{"class":94},[68,1649,1650],{"class":98},"input.txt.gz",[68,1652,95],{"class":94},[68,1654,103],{"class":90},[68,1656,107],{"class":106},[68,1658,1659],{"class":70,"line":204},[68,1660,114],{"emptyLinePlaceholder":113},[68,1662,1663,1666,1668,1671,1674,1676,1678,1681],{"class":70,"line":238},[68,1664,1665],{"class":90},"inp",[68,1667,166],{"class":106},[68,1669,1670],{"class":86},"pipe",[68,1672,1673],{"class":90},"(gzip)",[68,1675,166],{"class":106},[68,1677,1670],{"class":86},[68,1679,1680],{"class":90},"(out)",[68,1682,107],{"class":106},[22,1684,1685,613],{},[610,1686,1687,1688,33],{},"Promise 风格（",[30,1689,1690],{},"zlib.promises",[59,1692,1694],{"className":61,"code":1693,"language":63,"meta":64,"style":64},"const { promisify } = require(\"util\");\nconst gzip = promisify(zlib.gzip);\n\nasync function compress(data) {\n    const compressed = await gzip(data);\n    console.log(compressed);\n}\n",[30,1695,1696,1724,1744,1748,1768,1792,1809],{"__ignoreMap":64},[68,1697,1698,1700,1702,1705,1707,1709,1711,1713,1715,1718,1720,1722],{"class":70,"line":71},[68,1699,75],{"class":74},[68,1701,1261],{"class":106},[68,1703,1704],{"class":78}," promisify",[68,1706,1272],{"class":106},[68,1708,83],{"class":82},[68,1710,87],{"class":86},[68,1712,91],{"class":90},[68,1714,95],{"class":94},[68,1716,1717],{"class":98},"util",[68,1719,95],{"class":94},[68,1721,103],{"class":90},[68,1723,107],{"class":106},[68,1725,1726,1728,1730,1732,1734,1737,1739,1742],{"class":70,"line":110},[68,1727,75],{"class":74},[68,1729,1585],{"class":78},[68,1731,83],{"class":82},[68,1733,1704],{"class":86},[68,1735,1736],{"class":90},"(zlib",[68,1738,166],{"class":106},[68,1740,1741],{"class":90},"gzip)",[68,1743,107],{"class":106},[68,1745,1746],{"class":70,"line":117},[68,1747,114],{"emptyLinePlaceholder":113},[68,1749,1750,1753,1756,1759,1761,1764,1766],{"class":70,"line":135},[68,1751,1752],{"class":74},"async",[68,1754,1755],{"class":74}," function",[68,1757,1758],{"class":86}," compress",[68,1760,91],{"class":106},[68,1762,1763],{"class":187},"data",[68,1765,103],{"class":106},[68,1767,201],{"class":106},[68,1769,1770,1773,1776,1778,1782,1784,1786,1788,1790],{"class":70,"line":140},[68,1771,1772],{"class":74},"    const",[68,1774,1775],{"class":78}," compressed",[68,1777,83],{"class":82},[68,1779,1781],{"class":1780},"sVHd0"," await",[68,1783,1585],{"class":86},[68,1785,91],{"class":215},[68,1787,1763],{"class":90},[68,1789,103],{"class":215},[68,1791,107],{"class":106},[68,1793,1794,1796,1798,1800,1802,1805,1807],{"class":70,"line":160},[68,1795,207],{"class":90},[68,1797,166],{"class":106},[68,1799,212],{"class":86},[68,1801,91],{"class":215},[68,1803,1804],{"class":90},"compressed",[68,1806,103],{"class":215},[68,1808,107],{"class":106},[68,1810,1811],{"class":70,"line":204},[68,1812,1813],{"class":106},"}\n",[52,1815,1817],{"id":1816},"_2-常用方法","2. 常用方法",[368,1819,1820,1828,1836],{},[371,1821,1822,388,1825],{},[30,1823,1824],{},"zlib.gzip(buf, callback)",[30,1826,1827],{},"gunzip",[371,1829,1830,388,1833],{},[30,1831,1832],{},"zlib.deflate",[30,1834,1835],{},"inflate",[371,1837,1838,388,1841,1844],{},[30,1839,1840],{},"zlib.brotliCompress",[30,1842,1843],{},"brotliDecompress","（Node.js 11.7+）",[52,1846,1848],{"id":1847},"_3-内存与性能","3. 内存与性能",[22,1850,1851],{},"压缩和解压是 CPU 密集型操作，建议在流中使用，避免一次性处理大文件。",[25,1853,1855,1856,33],{"id":1854},"五操作系统信息os","五、操作系统信息（",[30,1857,1858],{},"os",[22,1860,1861,1863],{},[30,1862,1858],{}," 模块提供操作系统级别的系统信息。",[503,1865,1866,1874],{},[506,1867,1868],{},[509,1869,1870,1872],{},[512,1871,514],{},[512,1873,517],{},[528,1875,1876,1886,1899,1909,1919,1936,1955,1965],{},[509,1877,1878,1883],{},[533,1879,1880],{},[30,1881,1882],{},"os.cpus()",[533,1884,1885],{},"返回每个 CPU 核心的信息（型号、速度、时间）",[509,1887,1888,1896],{},[533,1889,1890,388,1893],{},[30,1891,1892],{},"os.totalmem()",[30,1894,1895],{},"os.freemem()",[533,1897,1898],{},"总内存 \u002F 空闲内存（字节）",[509,1900,1901,1906],{},[533,1902,1903],{},[30,1904,1905],{},"os.networkInterfaces()",[533,1907,1908],{},"网络接口信息（IPv4\u002FIPv6、MAC 地址等）",[509,1910,1911,1916],{},[533,1912,1913],{},[30,1914,1915],{},"os.loadavg()",[533,1917,1918],{},"系统负载平均值（1, 5, 15 分钟）",[509,1920,1921,1926],{},[533,1922,1923],{},[30,1924,1925],{},"os.EOL",[533,1927,1928,1929,1932,1933,33],{},"操作系统行结束符（",[30,1930,1931],{},"\\n"," 或 ",[30,1934,1935],{},"\\r\\n",[509,1937,1938,1943],{},[533,1939,1940],{},[30,1941,1942],{},"os.platform()",[533,1944,1945,1946,42,1949,42,1952,33],{},"操作系统平台（",[30,1947,1948],{},"'linux'",[30,1950,1951],{},"'win32'",[30,1953,1954],{},"'darwin'",[509,1956,1957,1962],{},[533,1958,1959],{},[30,1960,1961],{},"os.homedir()",[533,1963,1964],{},"当前用户的主目录",[509,1966,1967,1972],{},[533,1968,1969],{},[30,1970,1971],{},"os.uptime()",[533,1973,1974],{},"系统运行时间（秒）",[22,1976,1977],{},"示例：获取 CPU 核心数以优化子进程数量",[59,1979,1981],{"className":61,"code":1980,"language":63,"meta":64,"style":64},"const os = require(\"os\");\nconst cpus = os.cpus().length;\nconsole.log(`CPU 核心数: ${cpus}`);\n",[30,1982,1983,2006,2031],{"__ignoreMap":64},[68,1984,1985,1987,1990,1992,1994,1996,1998,2000,2002,2004],{"class":70,"line":71},[68,1986,75],{"class":74},[68,1988,1989],{"class":78}," os",[68,1991,83],{"class":82},[68,1993,87],{"class":86},[68,1995,91],{"class":90},[68,1997,95],{"class":94},[68,1999,1858],{"class":98},[68,2001,95],{"class":94},[68,2003,103],{"class":90},[68,2005,107],{"class":106},[68,2007,2008,2010,2013,2015,2017,2019,2022,2024,2026,2029],{"class":70,"line":110},[68,2009,75],{"class":74},[68,2011,2012],{"class":78}," cpus",[68,2014,83],{"class":82},[68,2016,1989],{"class":90},[68,2018,166],{"class":106},[68,2020,2021],{"class":86},"cpus",[68,2023,155],{"class":90},[68,2025,166],{"class":106},[68,2027,2028],{"class":78},"length",[68,2030,107],{"class":106},[68,2032,2033,2035,2037,2039,2041,2044,2047,2050,2052,2055,2057],{"class":70,"line":117},[68,2034,333],{"class":90},[68,2036,166],{"class":106},[68,2038,212],{"class":86},[68,2040,91],{"class":90},[68,2042,2043],{"class":94},"`",[68,2045,2046],{"class":98},"CPU 核心数: ",[68,2048,2049],{"class":94},"${",[68,2051,2021],{"class":90},[68,2053,2054],{"class":94},"}`",[68,2056,103],{"class":90},[68,2058,107],{"class":106},[25,2060,2062,2063,33],{"id":2061},"六实用工具util","六、实用工具（",[30,2064,1717],{},[22,2066,2067,2069],{},[30,2068,1717],{}," 模块提供多种实用函数，帮助调试、类型转换和回调 Promise 化。",[52,2071,2073,2074],{"id":2072},"_1-utilpromisify","1. ",[30,2075,2076],{},"util.promisify",[22,2078,2079],{},"将遵循 Node.js 错误优先回调风格的函数转为返回 Promise 的函数。",[59,2081,2083],{"className":61,"code":2082,"language":63,"meta":64,"style":64},"const util = require(\"util\");\nconst fs = require(\"fs\");\n\nconst readFile = util.promisify(fs.readFile);\nreadFile(\".\u002Ffile.txt\", \"utf8\")\n    .then(data => console.log(data))\n    .catch(err => console.error(err));\n",[30,2084,2085,2108,2130,2134,2160,2185,2209],{"__ignoreMap":64},[68,2086,2087,2089,2092,2094,2096,2098,2100,2102,2104,2106],{"class":70,"line":71},[68,2088,75],{"class":74},[68,2090,2091],{"class":78}," util",[68,2093,83],{"class":82},[68,2095,87],{"class":86},[68,2097,91],{"class":90},[68,2099,95],{"class":94},[68,2101,1717],{"class":98},[68,2103,95],{"class":94},[68,2105,103],{"class":90},[68,2107,107],{"class":106},[68,2109,2110,2112,2114,2116,2118,2120,2122,2124,2126,2128],{"class":70,"line":110},[68,2111,75],{"class":74},[68,2113,1557],{"class":78},[68,2115,83],{"class":82},[68,2117,87],{"class":86},[68,2119,91],{"class":90},[68,2121,95],{"class":94},[68,2123,1568],{"class":98},[68,2125,95],{"class":94},[68,2127,103],{"class":90},[68,2129,107],{"class":106},[68,2131,2132],{"class":70,"line":117},[68,2133,114],{"emptyLinePlaceholder":113},[68,2135,2136,2138,2141,2143,2145,2147,2150,2153,2155,2158],{"class":70,"line":135},[68,2137,75],{"class":74},[68,2139,2140],{"class":78}," readFile",[68,2142,83],{"class":82},[68,2144,2091],{"class":90},[68,2146,166],{"class":106},[68,2148,2149],{"class":86},"promisify",[68,2151,2152],{"class":90},"(fs",[68,2154,166],{"class":106},[68,2156,2157],{"class":90},"readFile)",[68,2159,107],{"class":106},[68,2161,2162,2165,2167,2169,2172,2174,2176,2178,2180,2182],{"class":70,"line":140},[68,2163,2164],{"class":86},"readFile",[68,2166,91],{"class":90},[68,2168,95],{"class":94},[68,2170,2171],{"class":98},".\u002Ffile.txt",[68,2173,95],{"class":94},[68,2175,181],{"class":106},[68,2177,268],{"class":94},[68,2179,1087],{"class":98},[68,2181,95],{"class":94},[68,2183,2184],{"class":90},")\n",[68,2186,2187,2190,2193,2195,2197,2199,2202,2204,2206],{"class":70,"line":160},[68,2188,2189],{"class":106},"    .",[68,2191,2192],{"class":86},"then",[68,2194,91],{"class":90},[68,2196,1763],{"class":187},[68,2198,198],{"class":74},[68,2200,2201],{"class":90}," console",[68,2203,166],{"class":106},[68,2205,212],{"class":86},[68,2207,2208],{"class":90},"(data))\n",[68,2210,2211,2213,2216,2218,2220,2222,2224,2226,2228,2231],{"class":70,"line":204},[68,2212,2189],{"class":106},[68,2214,2215],{"class":86},"catch",[68,2217,91],{"class":90},[68,2219,1453],{"class":187},[68,2221,198],{"class":74},[68,2223,2201],{"class":90},[68,2225,166],{"class":106},[68,2227,447],{"class":86},[68,2229,2230],{"class":90},"(err))",[68,2232,107],{"class":106},[52,2234,2236,2237],{"id":2235},"_2-utiltypes","2. ",[30,2238,2239],{},"util.types",[22,2241,2242,2243,1932,2246,2249],{},"提供一系列类型检查方法（比 ",[30,2244,2245],{},"typeof",[30,2247,2248],{},"instanceof"," 更可靠）。",[59,2251,2253],{"className":61,"code":2252,"language":63,"meta":64,"style":64},"const { types } = require(\"util\");\nconsole.log(types.isDate(new Date())); \u002F\u002F true\nconsole.log(types.isMap(new Map())); \u002F\u002F true\nconsole.log(types.isPromise(Promise.resolve())); \u002F\u002F true\n",[30,2254,2255,2282,2314,2342],{"__ignoreMap":64},[68,2256,2257,2259,2261,2264,2266,2268,2270,2272,2274,2276,2278,2280],{"class":70,"line":71},[68,2258,75],{"class":74},[68,2260,1261],{"class":106},[68,2262,2263],{"class":78}," types",[68,2265,1272],{"class":106},[68,2267,83],{"class":82},[68,2269,87],{"class":86},[68,2271,91],{"class":90},[68,2273,95],{"class":94},[68,2275,1717],{"class":98},[68,2277,95],{"class":94},[68,2279,103],{"class":90},[68,2281,107],{"class":106},[68,2283,2284,2286,2288,2290,2293,2295,2298,2300,2303,2306,2309,2311],{"class":70,"line":110},[68,2285,333],{"class":90},[68,2287,166],{"class":106},[68,2289,212],{"class":86},[68,2291,2292],{"class":90},"(types",[68,2294,166],{"class":106},[68,2296,2297],{"class":86},"isDate",[68,2299,91],{"class":90},[68,2301,2302],{"class":82},"new",[68,2304,2305],{"class":86}," Date",[68,2307,2308],{"class":90},"()))",[68,2310,351],{"class":106},[68,2312,2313],{"class":354}," \u002F\u002F true\n",[68,2315,2316,2318,2320,2322,2324,2326,2329,2331,2333,2336,2338,2340],{"class":70,"line":117},[68,2317,333],{"class":90},[68,2319,166],{"class":106},[68,2321,212],{"class":86},[68,2323,2292],{"class":90},[68,2325,166],{"class":106},[68,2327,2328],{"class":86},"isMap",[68,2330,91],{"class":90},[68,2332,2302],{"class":82},[68,2334,2335],{"class":86}," Map",[68,2337,2308],{"class":90},[68,2339,351],{"class":106},[68,2341,2313],{"class":354},[68,2343,2344,2346,2348,2350,2352,2354,2357,2359,2363,2365,2368,2370,2372],{"class":70,"line":135},[68,2345,333],{"class":90},[68,2347,166],{"class":106},[68,2349,212],{"class":86},[68,2351,2292],{"class":90},[68,2353,166],{"class":106},[68,2355,2356],{"class":86},"isPromise",[68,2358,91],{"class":90},[68,2360,2362],{"class":2361},"sZMiF","Promise",[68,2364,166],{"class":106},[68,2366,2367],{"class":86},"resolve",[68,2369,2308],{"class":90},[68,2371,351],{"class":106},[68,2373,2313],{"class":354},[52,2375,2377,2378],{"id":2376},"_3-utilinspect","3. ",[30,2379,2380],{},"util.inspect",[22,2382,2383,2384,42,2387,42,2390,2393],{},"将对象格式化为字符串，用于调试。可通过 ",[30,2385,2386],{},"depth",[30,2388,2389],{},"colors",[30,2391,2392],{},"showHidden"," 等选项控制。",[59,2395,2397],{"className":61,"code":2396,"language":63,"meta":64,"style":64},"const obj = { a: 1, b: { c: 2 } };\nconsole.log(util.inspect(obj, { depth: 1, colors: true }));\n",[30,2398,2399,2440],{"__ignoreMap":64},[68,2400,2401,2403,2406,2408,2410,2413,2415,2418,2420,2423,2425,2427,2430,2432,2435,2437],{"class":70,"line":71},[68,2402,75],{"class":74},[68,2404,2405],{"class":78}," obj",[68,2407,83],{"class":82},[68,2409,1261],{"class":106},[68,2411,2412],{"class":215}," a",[68,2414,1302],{"class":106},[68,2416,2417],{"class":323}," 1",[68,2419,181],{"class":106},[68,2421,2422],{"class":215}," b",[68,2424,1302],{"class":106},[68,2426,1261],{"class":106},[68,2428,2429],{"class":215}," c",[68,2431,1302],{"class":106},[68,2433,2434],{"class":323}," 2",[68,2436,1272],{"class":106},[68,2438,2439],{"class":106}," };\n",[68,2441,2442,2444,2446,2448,2451,2453,2456,2459,2461,2463,2466,2468,2470,2472,2475,2477,2481,2483,2485],{"class":70,"line":110},[68,2443,333],{"class":90},[68,2445,166],{"class":106},[68,2447,212],{"class":86},[68,2449,2450],{"class":90},"(util",[68,2452,166],{"class":106},[68,2454,2455],{"class":86},"inspect",[68,2457,2458],{"class":90},"(obj",[68,2460,181],{"class":106},[68,2462,1261],{"class":106},[68,2464,2465],{"class":215}," depth",[68,2467,1302],{"class":106},[68,2469,2417],{"class":323},[68,2471,181],{"class":106},[68,2473,2474],{"class":215}," colors",[68,2476,1302],{"class":106},[68,2478,2480],{"class":2479},"syTEX"," true",[68,2482,1272],{"class":106},[68,2484,838],{"class":90},[68,2486,107],{"class":106},[22,2488,2489,2490,2492,2493,2496],{},"Node.js 在内部使用 ",[30,2491,2380],{}," 实现 ",[30,2494,2495],{},"console.log"," 的对象展示。",[52,2498,2500,2501],{"id":2499},"_4-utilcallbackify","4. ",[30,2502,2503],{},"util.callbackify",[22,2505,2506,2507,2509,2510,2512],{},"将 ",[30,2508,1752],{}," 函数（或返回 Promise 的函数）转换为错误优先的回调风格函数（与 ",[30,2511,2149],{}," 相反）。",[59,2514,2516],{"className":61,"code":2515,"language":63,"meta":64,"style":64},"const { callbackify } = require(\"util\");\n\nasync function asyncFn() {\n    return \"hello\";\n}\nconst callbackFn = callbackify(asyncFn);\ncallbackFn((err, ret) => {\n    console.log(ret); \u002F\u002F 'hello'\n});\n",[30,2517,2518,2545,2549,2562,2575,2579,2595,2617,2637],{"__ignoreMap":64},[68,2519,2520,2522,2524,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":70,"line":71},[68,2521,75],{"class":74},[68,2523,1261],{"class":106},[68,2525,2526],{"class":78}," callbackify",[68,2528,1272],{"class":106},[68,2530,83],{"class":82},[68,2532,87],{"class":86},[68,2534,91],{"class":90},[68,2536,95],{"class":94},[68,2538,1717],{"class":98},[68,2540,95],{"class":94},[68,2542,103],{"class":90},[68,2544,107],{"class":106},[68,2546,2547],{"class":70,"line":110},[68,2548,114],{"emptyLinePlaceholder":113},[68,2550,2551,2553,2555,2558,2560],{"class":70,"line":117},[68,2552,1752],{"class":74},[68,2554,1755],{"class":74},[68,2556,2557],{"class":86}," asyncFn",[68,2559,155],{"class":106},[68,2561,201],{"class":106},[68,2563,2564,2567,2569,2571,2573],{"class":70,"line":135},[68,2565,2566],{"class":1780},"    return",[68,2568,268],{"class":94},[68,2570,271],{"class":98},[68,2572,95],{"class":94},[68,2574,107],{"class":106},[68,2576,2577],{"class":70,"line":140},[68,2578,1813],{"class":106},[68,2580,2581,2583,2586,2588,2590,2593],{"class":70,"line":160},[68,2582,75],{"class":74},[68,2584,2585],{"class":78}," callbackFn",[68,2587,83],{"class":82},[68,2589,2526],{"class":86},[68,2591,2592],{"class":90},"(asyncFn)",[68,2594,107],{"class":106},[68,2596,2597,2600,2602,2604,2606,2608,2611,2613,2615],{"class":70,"line":204},[68,2598,2599],{"class":86},"callbackFn",[68,2601,91],{"class":90},[68,2603,91],{"class":106},[68,2605,1453],{"class":187},[68,2607,181],{"class":106},[68,2609,2610],{"class":187}," ret",[68,2612,103],{"class":106},[68,2614,198],{"class":74},[68,2616,201],{"class":106},[68,2618,2619,2621,2623,2625,2627,2630,2632,2634],{"class":70,"line":238},[68,2620,207],{"class":90},[68,2622,166],{"class":106},[68,2624,212],{"class":86},[68,2626,91],{"class":215},[68,2628,2629],{"class":90},"ret",[68,2631,103],{"class":215},[68,2633,351],{"class":106},[68,2635,2636],{"class":354}," \u002F\u002F 'hello'\n",[68,2638,2639,2641,2643],{"class":70,"line":248},[68,2640,241],{"class":106},[68,2642,103],{"class":90},[68,2644,107],{"class":106},[52,2646,2648],{"id":2647},"_5-其他","5. 其他",[368,2650,2651,2661],{},[371,2652,2653,2656,2657,2660],{},[30,2654,2655],{},"util.format(format, [...args])","：类似 ",[30,2658,2659],{},"printf"," 的字符串格式化。",[371,2662,2663,2666],{},[30,2664,2665],{},"util.deprecate(fn, msg)","：标记方法已弃用，调用时会打印警告。",[25,2668,2669],{"id":2669},"总结",[503,2671,2672,2685],{},[506,2673,2674],{},[509,2675,2676,2679,2682],{},[512,2677,2678],{},"模块",[512,2680,2681],{},"核心用途",[512,2683,2684],{},"常用场景",[528,2686,2687,2701,2713,2725,2737,2749],{},[509,2688,2689,2693,2696],{},[533,2690,2691],{},[30,2692,32],{},[533,2694,2695],{},"实现事件驱动架构",[533,2697,2698,2699],{},"自定义事件、继承 ",[30,2700,49],{},[509,2702,2703,2707,2710],{},[533,2704,2705],{},[30,2706,498],{},[533,2708,2709],{},"调度异步执行",[533,2711,2712],{},"延迟、周期性、尽快执行",[509,2714,2715,2719,2722],{},[533,2716,2717],{},[30,2718,712],{},[533,2720,2721],{},"加密与安全",[533,2723,2724],{},"哈希、HMAC、对称\u002F非对称加密、随机数",[509,2726,2727,2731,2734],{},[533,2728,2729],{},[30,2730,1508],{},[533,2732,2733],{},"数据压缩",[533,2735,2736],{},"文件压缩、HTTP 传输压缩",[509,2738,2739,2743,2746],{},[533,2740,2741],{},[30,2742,1858],{},[533,2744,2745],{},"获取系统信息",[533,2747,2748],{},"性能调优、资源监控",[509,2750,2751,2755,2758],{},[533,2752,2753],{},[30,2754,1717],{},[533,2756,2757],{},"通用工具",[533,2759,2760],{},"回调转 Promise、类型检查、调试打印",[22,2762,2763],{},"这些模块构成了 Node.js 生态的重要基础，熟练掌握可以大幅提升开发效率和程序健壮性。",[2765,2766,2767],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":64,"searchDepth":110,"depth":110,"links":2769},[2770,2779,2781,2790,2796,2798,2810],{"id":27,"depth":110,"text":2771,"children":2772},"一、事件触发器（events）",[2773,2775,2777,2778],{"id":54,"depth":117,"text":2774},"1. 自定义事件与继承 EventEmitter",{"id":295,"depth":117,"text":2776},"2. 内存管理：setMaxListeners",{"id":365,"depth":117,"text":366},{"id":413,"depth":117,"text":414},{"id":494,"depth":110,"text":2780},"二、定时器（timer）",{"id":708,"depth":110,"text":2782,"children":2783},"三、加密（crypto）",[2784,2786,2787,2788,2789],{"id":720,"depth":117,"text":2785},"1. 哈希（createHash）",{"id":846,"depth":117,"text":847},{"id":944,"depth":117,"text":945},{"id":1245,"depth":117,"text":1246},{"id":1414,"depth":117,"text":1415},{"id":1504,"depth":110,"text":2791,"children":2792},"四、压缩（zlib）",[2793,2794,2795],{"id":1516,"depth":117,"text":1517},{"id":1816,"depth":117,"text":1817},{"id":1847,"depth":117,"text":1848},{"id":1854,"depth":110,"text":2797},"五、操作系统信息（os）",{"id":2061,"depth":110,"text":2799,"children":2800},"六、实用工具（util）",[2801,2803,2805,2807,2809],{"id":2072,"depth":117,"text":2802},"1. util.promisify",{"id":2235,"depth":117,"text":2804},"2. util.types",{"id":2376,"depth":117,"text":2806},"3. util.inspect",{"id":2499,"depth":117,"text":2808},"4. util.callbackify",{"id":2647,"depth":117,"text":2648},{"id":2669,"depth":110,"text":2669},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fother","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fother.md","md",{"items":2816},[2817,2821,2825,2829,2833,2837],{"path":2818,"title":2819,"description":2820,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Ffs","文件系统","Node.js 的 fs 模块提供了与文件系统交互的 API，几乎涵盖了所有标准文件操作。它支持三种风格的 API：同步、回调式异步 和 Promise 式异步。下面详细介绍这些 API 的选择策略、流式读写、文件监视以及常用操作。",{"path":2822,"title":2823,"description":2824,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer","缓冲区","Buffer 是 Node.js 全局对象，用于处理二进制数据流（如文件、网络数据）。在 ES6 引入 TypedArray 之前，Buffer 是 Node.js 处理二进制的主要方式；现在 Buffer 实现了 Uint8Arra…",{"path":2826,"title":2827,"description":2828,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fpath","路径处理","path 模块提供了用于处理和转换文件路径的实用工具。它是 Node.js 核心模块，无需安装即可直接使用。由于不同操作系统（Windows、Linux、macOS）的路径分隔符不同（Windows 使用反斜杠 \\，POSIX 使用正…",{"path":2830,"title":2831,"description":2832,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fprocess","进程与子进程","Node.js 在单个进程中运行，但通过 process 对象、child_process 模块及 worker_threads 模块提供了对进程的精细控制以及多进程\u002F多线程能力。下面从三个方面展开。",{"path":2834,"title":2835,"description":2836,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp","网络编程","Node.js 提供了丰富的内置模块，用于构建网络应用。下面从 HTTP\u002FHTTPS、WebSocket、TCP\u002FUDP 以及 DNS 解析四个方面进行深入介绍。",{"path":2838,"title":2839,"description":2840,"category":10,"score":160},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fstream","流","流是 Node.js 中处理有序数据的抽象接口，用于以连续方式异步读取或写入数据。它们特别适合处理大文件、网络通信或任何可能无限产生的数据。Node.js 内置的 stream 模块提供了四种基本流类型，以及用于组合和错误处理的工具函数。",{"series":2842,"title":2843,"items":2844,"index":117,"prev":2858,"next":2859},"booklet\u002Fend\u002Fnodejs\u002Fcore","core",[2845,2847,2849,2851,2852,2854,2856],{"path":2822,"title":2823,"date":2846,"pinned":14},"2025-01-30",{"path":2818,"title":2819,"date":2848,"pinned":14},"2026-06-04",{"path":2834,"title":2835,"date":2850,"pinned":14},"2023-01-27",{"path":7,"title":8,"date":13,"pinned":14},{"path":2826,"title":2827,"date":2853,"pinned":14},"2024-03-14",{"path":2830,"title":2831,"date":2855,"pinned":14},"2023-11-10",{"path":2838,"title":2839,"date":2857,"pinned":14},"2022-05-03",{"path":2834,"title":2835,"date":2850,"pinned":14},{"path":2826,"title":2827,"date":2853,"pinned":14}]