[{"data":1,"prerenderedAt":2008},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fgulp-basics":3,"docs-all":1829},{"id":4,"title":5,"body":6,"category":1814,"date":1815,"description":1816,"draft":1817,"extension":1818,"meta":1819,"navigation":147,"path":1820,"seo":1821,"source":1822,"stem":1823,"tags":1824,"__hash__":1828},"docs\u002Fdocs\u002Fgulp-basics.md","Gulp 4 任务与文件流",{"type":7,"value":8,"toc":1805},"minimark",[9,13,17,21,74,89,322,325,344,348,362,432,435,438,716,730,734,741,1243,1272,1275,1381,1388,1393,1396,1572,1589,1592,1751,1766,1769,1772,1801],[10,11,5],"h1",{"id":12},"gulp-4-任务与文件流",[14,15,16],"p",{},"课程使用 Gulp 4.0.2。以下是独立工具环境中的 CommonJS 配置片段，用于记录任务和流的处理方式；不附带 Node 工程。插件名称保留课程版本语境，未声明为当前版本兼容组合。",[18,19,20],"h2",{"id":20},"安装与任务入口",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-sh shiki shiki-themes github-light github-dark","npm install --save-dev gulp@4 gulp-cli\nnpx gulp\nnpx gulp copyScripts\n","sh","",[29,30,31,54,63],"code",{"__ignoreMap":27},[32,33,36,40,44,48,51],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"sScJk","npm",[32,41,43],{"class":42},"sZZnC"," install",[32,45,47],{"class":46},"sj4cs"," --save-dev",[32,49,50],{"class":42}," gulp@4",[32,52,53],{"class":42}," gulp-cli\n",[32,55,57,60],{"class":34,"line":56},2,[32,58,59],{"class":38},"npx",[32,61,62],{"class":42}," gulp\n",[32,64,66,68,71],{"class":34,"line":65},3,[32,67,59],{"class":38},[32,69,70],{"class":42}," gulp",[32,72,73],{"class":42}," copyScripts\n",[14,75,76,77,80,81,84,85,88],{},"原课使用全局 ",[29,78,79],{},"gulp-cli","；局部安装后也可以通过 npx 调用。默认读取 ",[29,82,83],{},"gulpfile.js","，默认任务名为 ",[29,86,87],{},"default","。",[22,90,94],{"className":91,"code":92,"language":93,"meta":27,"style":27},"language-js shiki shiki-themes github-light github-dark","const { src, dest, series, parallel } = require('gulp');\n\nfunction ready(done) {\n  console.log('任务开始');\n  done();\n}\nfunction copyScripts() {\n  return src('js\u002F**\u002F*.js').pipe(dest('dist\u002Fjs'));\n}\nfunction copyStyles() {\n  return src('css\u002F**\u002F*.css').pipe(dest('dist\u002Fcss'));\n}\nexports.copyScripts = copyScripts;\nexports.default = series(ready, parallel(copyScripts, copyStyles));\n","js",[29,95,96,143,149,166,182,191,197,208,240,245,255,282,287,301],{"__ignoreMap":27},[32,97,98,102,106,109,112,115,117,120,122,125,128,131,134,137,140],{"class":34,"line":35},[32,99,101],{"class":100},"szBVR","const",[32,103,105],{"class":104},"sVt8B"," { ",[32,107,108],{"class":46},"src",[32,110,111],{"class":104},", ",[32,113,114],{"class":46},"dest",[32,116,111],{"class":104},[32,118,119],{"class":46},"series",[32,121,111],{"class":104},[32,123,124],{"class":46},"parallel",[32,126,127],{"class":104}," } ",[32,129,130],{"class":100},"=",[32,132,133],{"class":38}," require",[32,135,136],{"class":104},"(",[32,138,139],{"class":42},"'gulp'",[32,141,142],{"class":104},");\n",[32,144,145],{"class":34,"line":56},[32,146,148],{"emptyLinePlaceholder":147},true,"\n",[32,150,151,154,157,159,163],{"class":34,"line":65},[32,152,153],{"class":100},"function",[32,155,156],{"class":38}," ready",[32,158,136],{"class":104},[32,160,162],{"class":161},"s4XuR","done",[32,164,165],{"class":104},") {\n",[32,167,169,172,175,177,180],{"class":34,"line":168},4,[32,170,171],{"class":104},"  console.",[32,173,174],{"class":38},"log",[32,176,136],{"class":104},[32,178,179],{"class":42},"'任务开始'",[32,181,142],{"class":104},[32,183,185,188],{"class":34,"line":184},5,[32,186,187],{"class":38},"  done",[32,189,190],{"class":104},"();\n",[32,192,194],{"class":34,"line":193},6,[32,195,196],{"class":104},"}\n",[32,198,200,202,205],{"class":34,"line":199},7,[32,201,153],{"class":100},[32,203,204],{"class":38}," copyScripts",[32,206,207],{"class":104},"() {\n",[32,209,211,214,217,219,222,225,228,230,232,234,237],{"class":34,"line":210},8,[32,212,213],{"class":100},"  return",[32,215,216],{"class":38}," src",[32,218,136],{"class":104},[32,220,221],{"class":42},"'js\u002F**\u002F*.js'",[32,223,224],{"class":104},").",[32,226,227],{"class":38},"pipe",[32,229,136],{"class":104},[32,231,114],{"class":38},[32,233,136],{"class":104},[32,235,236],{"class":42},"'dist\u002Fjs'",[32,238,239],{"class":104},"));\n",[32,241,243],{"class":34,"line":242},9,[32,244,196],{"class":104},[32,246,248,250,253],{"class":34,"line":247},10,[32,249,153],{"class":100},[32,251,252],{"class":38}," copyStyles",[32,254,207],{"class":104},[32,256,258,260,262,264,267,269,271,273,275,277,280],{"class":34,"line":257},11,[32,259,213],{"class":100},[32,261,216],{"class":38},[32,263,136],{"class":104},[32,265,266],{"class":42},"'css\u002F**\u002F*.css'",[32,268,224],{"class":104},[32,270,227],{"class":38},[32,272,136],{"class":104},[32,274,114],{"class":38},[32,276,136],{"class":104},[32,278,279],{"class":42},"'dist\u002Fcss'",[32,281,239],{"class":104},[32,283,285],{"class":34,"line":284},12,[32,286,196],{"class":104},[32,288,290,293,296,298],{"class":34,"line":289},13,[32,291,292],{"class":46},"exports",[32,294,295],{"class":104},".copyScripts ",[32,297,130],{"class":100},[32,299,300],{"class":104}," copyScripts;\n",[32,302,304,306,309,311,314,317,319],{"class":34,"line":303},14,[32,305,292],{"class":46},[32,307,308],{"class":104},".default ",[32,310,130],{"class":100},[32,312,313],{"class":38}," series",[32,315,316],{"class":104},"(ready, ",[32,318,124],{"class":38},[32,320,321],{"class":104},"(copyScripts, copyStyles));\n",[14,323,324],{},"任务必须让 Gulp 知道何时结束，例如返回 stream、Promise，或调用完成回调。流任务要 return；否则后续组合与监听可能无法正确等待。",[326,327,328,335,341],"ul",{},[329,330,331,334],"li",{},[29,332,333],{},"series(a, b)","：a 完成后再运行 b。",[329,336,337,340],{},[29,338,339],{},"parallel(a, b)","：并发运行；任务间不能有未表达的数据依赖。",[329,342,343],{},"失败通过返回流的 error 或 Promise 拒绝等方式上报，不要吞掉错误后假装完成。",[18,345,347],{"id":346},"srcpipedest","src、pipe、dest",[14,349,350,353,354,357,358,361],{},[29,351,352],{},"src(glob)"," 读取匹配文件为文件对象流，",[29,355,356],{},".pipe(transform)"," 连接处理步骤，",[29,359,360],{},".pipe(dest(directory))"," 写入目录并继续输出文件流。",[363,364,365,378],"table",{},[366,367,368],"thead",{},[369,370,371,375],"tr",{},[372,373,374],"th",{},"glob",[372,376,377],{},"含义",[379,380,381,392,402,412,422],"tbody",{},[369,382,383,389],{},[384,385,386],"td",{},[29,387,388],{},"a.js",[384,390,391],{},"单文件",[369,393,394,399],{},[384,395,396],{},[29,397,398],{},"js\u002F*.js",[384,400,401],{},"当前目录下的 JS",[369,403,404,409],{},[384,405,406],{},[29,407,408],{},"js\u002F**\u002F*.js",[384,410,411],{},"目录及子目录中的 JS",[369,413,414,419],{},[384,415,416],{},[29,417,418],{},"['a.js', 'b.js']",[384,420,421],{},"多个匹配模式",[369,423,424,429],{},[384,425,426],{},[29,427,428],{},"['js\u002F**\u002F*.js', '!js\u002Fbuild.js']",[384,430,431],{},"包含匹配并排除一个文件",[18,433,434],{"id":434},"压缩与重命名",[14,436,437],{},"源课以 jQuery、Bootstrap 作为压缩输入，整理后使用通用的自有文件名，第三方库源码不随文档复制。下面涉及的包需在独立练习环境已有对应依赖。",[22,439,441],{"className":91,"code":440,"language":93,"meta":27,"style":27},"const { src, dest, series, parallel } = require('gulp');\nconst uglify = require('gulp-uglify');\nconst minifyCss = require('gulp-minify-css');\nconst rename = require('gulp-rename');\n\nfunction scripts() {\n  return src('js\u002Fapp.js')\n    .pipe(uglify())\n    .pipe(rename({ suffix: '.min' }))\n    .pipe(dest('dist\u002Fjs'));\n}\nfunction styles() {\n  return src('css\u002Fapp.css')\n    .pipe(minifyCss())\n    .pipe(rename({ suffix: '.min' }))\n    .pipe(dest('dist\u002Fcss'));\n}\nexports.serial = series(scripts, styles);\nexports.concurrent = parallel(scripts, styles);\n",[29,442,443,475,494,512,530,534,543,557,572,592,608,612,621,634,647,664,681,686,701],{"__ignoreMap":27},[32,444,445,447,449,451,453,455,457,459,461,463,465,467,469,471,473],{"class":34,"line":35},[32,446,101],{"class":100},[32,448,105],{"class":104},[32,450,108],{"class":46},[32,452,111],{"class":104},[32,454,114],{"class":46},[32,456,111],{"class":104},[32,458,119],{"class":46},[32,460,111],{"class":104},[32,462,124],{"class":46},[32,464,127],{"class":104},[32,466,130],{"class":100},[32,468,133],{"class":38},[32,470,136],{"class":104},[32,472,139],{"class":42},[32,474,142],{"class":104},[32,476,477,479,482,485,487,489,492],{"class":34,"line":56},[32,478,101],{"class":100},[32,480,481],{"class":46}," uglify",[32,483,484],{"class":100}," =",[32,486,133],{"class":38},[32,488,136],{"class":104},[32,490,491],{"class":42},"'gulp-uglify'",[32,493,142],{"class":104},[32,495,496,498,501,503,505,507,510],{"class":34,"line":65},[32,497,101],{"class":100},[32,499,500],{"class":46}," minifyCss",[32,502,484],{"class":100},[32,504,133],{"class":38},[32,506,136],{"class":104},[32,508,509],{"class":42},"'gulp-minify-css'",[32,511,142],{"class":104},[32,513,514,516,519,521,523,525,528],{"class":34,"line":168},[32,515,101],{"class":100},[32,517,518],{"class":46}," rename",[32,520,484],{"class":100},[32,522,133],{"class":38},[32,524,136],{"class":104},[32,526,527],{"class":42},"'gulp-rename'",[32,529,142],{"class":104},[32,531,532],{"class":34,"line":184},[32,533,148],{"emptyLinePlaceholder":147},[32,535,536,538,541],{"class":34,"line":193},[32,537,153],{"class":100},[32,539,540],{"class":38}," scripts",[32,542,207],{"class":104},[32,544,545,547,549,551,554],{"class":34,"line":199},[32,546,213],{"class":100},[32,548,216],{"class":38},[32,550,136],{"class":104},[32,552,553],{"class":42},"'js\u002Fapp.js'",[32,555,556],{"class":104},")\n",[32,558,559,562,564,566,569],{"class":34,"line":210},[32,560,561],{"class":104},"    .",[32,563,227],{"class":38},[32,565,136],{"class":104},[32,567,568],{"class":38},"uglify",[32,570,571],{"class":104},"())\n",[32,573,574,576,578,580,583,586,589],{"class":34,"line":242},[32,575,561],{"class":104},[32,577,227],{"class":38},[32,579,136],{"class":104},[32,581,582],{"class":38},"rename",[32,584,585],{"class":104},"({ suffix: ",[32,587,588],{"class":42},"'.min'",[32,590,591],{"class":104}," }))\n",[32,593,594,596,598,600,602,604,606],{"class":34,"line":247},[32,595,561],{"class":104},[32,597,227],{"class":38},[32,599,136],{"class":104},[32,601,114],{"class":38},[32,603,136],{"class":104},[32,605,236],{"class":42},[32,607,239],{"class":104},[32,609,610],{"class":34,"line":257},[32,611,196],{"class":104},[32,613,614,616,619],{"class":34,"line":284},[32,615,153],{"class":100},[32,617,618],{"class":38}," styles",[32,620,207],{"class":104},[32,622,623,625,627,629,632],{"class":34,"line":289},[32,624,213],{"class":100},[32,626,216],{"class":38},[32,628,136],{"class":104},[32,630,631],{"class":42},"'css\u002Fapp.css'",[32,633,556],{"class":104},[32,635,636,638,640,642,645],{"class":34,"line":303},[32,637,561],{"class":104},[32,639,227],{"class":38},[32,641,136],{"class":104},[32,643,644],{"class":38},"minifyCss",[32,646,571],{"class":104},[32,648,650,652,654,656,658,660,662],{"class":34,"line":649},15,[32,651,561],{"class":104},[32,653,227],{"class":38},[32,655,136],{"class":104},[32,657,582],{"class":38},[32,659,585],{"class":104},[32,661,588],{"class":42},[32,663,591],{"class":104},[32,665,667,669,671,673,675,677,679],{"class":34,"line":666},16,[32,668,561],{"class":104},[32,670,227],{"class":38},[32,672,136],{"class":104},[32,674,114],{"class":38},[32,676,136],{"class":104},[32,678,279],{"class":42},[32,680,239],{"class":104},[32,682,684],{"class":34,"line":683},17,[32,685,196],{"class":104},[32,687,689,691,694,696,698],{"class":34,"line":688},18,[32,690,292],{"class":46},[32,692,693],{"class":104},".serial ",[32,695,130],{"class":100},[32,697,313],{"class":38},[32,699,700],{"class":104},"(scripts, styles);\n",[32,702,704,706,709,711,714],{"class":34,"line":703},19,[32,705,292],{"class":46},[32,707,708],{"class":104},".concurrent ",[32,710,130],{"class":100},[32,712,713],{"class":38}," parallel",[32,715,700],{"class":104},[14,717,718,719,722,723,722,726,729],{},"原依赖包含 ",[29,720,721],{},"gulp-uglify@3","、",[29,724,725],{},"gulp-minify-css@1",[29,727,728],{},"gulp-rename@2","。这些是旧课插件记录，不建议据此直接给现有项目安装一组无版本约束的插件。",[18,731,733],{"id":732},"转译合并与资源处理","转译、合并与资源处理",[14,735,736,737,740],{},"保留课程的 JS、CSS、HTML、图片四条任务链。图片任务在原 ",[29,738,739],{},"allTask"," 中未被包含，以下将它一并纳入，避免示例 HTML 中的图片输出遗漏。",[22,742,744],{"className":91,"code":743,"language":93,"meta":27,"style":27},"const { src, dest, parallel } = require('gulp');\nconst babel = require('gulp-babel');\nconst uglify = require('gulp-uglify');\nconst concat = require('gulp-concat');\nconst rename = require('gulp-rename');\nconst less = require('gulp-less');\nconst minifyCss = require('gulp-minify-css');\nconst minifyHtml = require('gulp-minify-html');\nconst imagemin = require('gulp-imagemin');\n\nfunction scripts() {\n  return src('es6\u002F*.js')\n    .pipe(babel())\n    .pipe(src('js\u002F*.js'))\n    .pipe(concat('app.js'))\n    .pipe(uglify())\n    .pipe(rename({ suffix: '.min' }))\n    .pipe(dest('dist\u002Fsrc\u002Fjs'));\n}\nfunction styles() {\n  return src('index.less')\n    .pipe(less())\n    .pipe(minifyCss())\n    .pipe(rename({ suffix: '.min' }))\n    .pipe(dest('dist\u002Fsrc\u002Fcss'));\n}\nfunction images() {\n  return src('images\u002F*').pipe(imagemin()).pipe(dest('dist\u002Fsrc\u002Fimages'));\n}\nfunction html() {\n  return src('index.html').pipe(minifyHtml()).pipe(dest('dist\u002Fsrc'));\n}\nexports.allTask = parallel(scripts, styles, images, html);\n",[29,745,746,774,792,808,826,842,860,876,894,912,916,924,937,950,968,986,998,1014,1031,1035,1044,1058,1072,1085,1102,1120,1125,1135,1172,1177,1187,1223,1228],{"__ignoreMap":27},[32,747,748,750,752,754,756,758,760,762,764,766,768,770,772],{"class":34,"line":35},[32,749,101],{"class":100},[32,751,105],{"class":104},[32,753,108],{"class":46},[32,755,111],{"class":104},[32,757,114],{"class":46},[32,759,111],{"class":104},[32,761,124],{"class":46},[32,763,127],{"class":104},[32,765,130],{"class":100},[32,767,133],{"class":38},[32,769,136],{"class":104},[32,771,139],{"class":42},[32,773,142],{"class":104},[32,775,776,778,781,783,785,787,790],{"class":34,"line":56},[32,777,101],{"class":100},[32,779,780],{"class":46}," babel",[32,782,484],{"class":100},[32,784,133],{"class":38},[32,786,136],{"class":104},[32,788,789],{"class":42},"'gulp-babel'",[32,791,142],{"class":104},[32,793,794,796,798,800,802,804,806],{"class":34,"line":65},[32,795,101],{"class":100},[32,797,481],{"class":46},[32,799,484],{"class":100},[32,801,133],{"class":38},[32,803,136],{"class":104},[32,805,491],{"class":42},[32,807,142],{"class":104},[32,809,810,812,815,817,819,821,824],{"class":34,"line":168},[32,811,101],{"class":100},[32,813,814],{"class":46}," concat",[32,816,484],{"class":100},[32,818,133],{"class":38},[32,820,136],{"class":104},[32,822,823],{"class":42},"'gulp-concat'",[32,825,142],{"class":104},[32,827,828,830,832,834,836,838,840],{"class":34,"line":184},[32,829,101],{"class":100},[32,831,518],{"class":46},[32,833,484],{"class":100},[32,835,133],{"class":38},[32,837,136],{"class":104},[32,839,527],{"class":42},[32,841,142],{"class":104},[32,843,844,846,849,851,853,855,858],{"class":34,"line":193},[32,845,101],{"class":100},[32,847,848],{"class":46}," less",[32,850,484],{"class":100},[32,852,133],{"class":38},[32,854,136],{"class":104},[32,856,857],{"class":42},"'gulp-less'",[32,859,142],{"class":104},[32,861,862,864,866,868,870,872,874],{"class":34,"line":199},[32,863,101],{"class":100},[32,865,500],{"class":46},[32,867,484],{"class":100},[32,869,133],{"class":38},[32,871,136],{"class":104},[32,873,509],{"class":42},[32,875,142],{"class":104},[32,877,878,880,883,885,887,889,892],{"class":34,"line":210},[32,879,101],{"class":100},[32,881,882],{"class":46}," minifyHtml",[32,884,484],{"class":100},[32,886,133],{"class":38},[32,888,136],{"class":104},[32,890,891],{"class":42},"'gulp-minify-html'",[32,893,142],{"class":104},[32,895,896,898,901,903,905,907,910],{"class":34,"line":242},[32,897,101],{"class":100},[32,899,900],{"class":46}," imagemin",[32,902,484],{"class":100},[32,904,133],{"class":38},[32,906,136],{"class":104},[32,908,909],{"class":42},"'gulp-imagemin'",[32,911,142],{"class":104},[32,913,914],{"class":34,"line":247},[32,915,148],{"emptyLinePlaceholder":147},[32,917,918,920,922],{"class":34,"line":257},[32,919,153],{"class":100},[32,921,540],{"class":38},[32,923,207],{"class":104},[32,925,926,928,930,932,935],{"class":34,"line":284},[32,927,213],{"class":100},[32,929,216],{"class":38},[32,931,136],{"class":104},[32,933,934],{"class":42},"'es6\u002F*.js'",[32,936,556],{"class":104},[32,938,939,941,943,945,948],{"class":34,"line":289},[32,940,561],{"class":104},[32,942,227],{"class":38},[32,944,136],{"class":104},[32,946,947],{"class":38},"babel",[32,949,571],{"class":104},[32,951,952,954,956,958,960,962,965],{"class":34,"line":303},[32,953,561],{"class":104},[32,955,227],{"class":38},[32,957,136],{"class":104},[32,959,108],{"class":38},[32,961,136],{"class":104},[32,963,964],{"class":42},"'js\u002F*.js'",[32,966,967],{"class":104},"))\n",[32,969,970,972,974,976,979,981,984],{"class":34,"line":649},[32,971,561],{"class":104},[32,973,227],{"class":38},[32,975,136],{"class":104},[32,977,978],{"class":38},"concat",[32,980,136],{"class":104},[32,982,983],{"class":42},"'app.js'",[32,985,967],{"class":104},[32,987,988,990,992,994,996],{"class":34,"line":666},[32,989,561],{"class":104},[32,991,227],{"class":38},[32,993,136],{"class":104},[32,995,568],{"class":38},[32,997,571],{"class":104},[32,999,1000,1002,1004,1006,1008,1010,1012],{"class":34,"line":683},[32,1001,561],{"class":104},[32,1003,227],{"class":38},[32,1005,136],{"class":104},[32,1007,582],{"class":38},[32,1009,585],{"class":104},[32,1011,588],{"class":42},[32,1013,591],{"class":104},[32,1015,1016,1018,1020,1022,1024,1026,1029],{"class":34,"line":688},[32,1017,561],{"class":104},[32,1019,227],{"class":38},[32,1021,136],{"class":104},[32,1023,114],{"class":38},[32,1025,136],{"class":104},[32,1027,1028],{"class":42},"'dist\u002Fsrc\u002Fjs'",[32,1030,239],{"class":104},[32,1032,1033],{"class":34,"line":703},[32,1034,196],{"class":104},[32,1036,1038,1040,1042],{"class":34,"line":1037},20,[32,1039,153],{"class":100},[32,1041,618],{"class":38},[32,1043,207],{"class":104},[32,1045,1047,1049,1051,1053,1056],{"class":34,"line":1046},21,[32,1048,213],{"class":100},[32,1050,216],{"class":38},[32,1052,136],{"class":104},[32,1054,1055],{"class":42},"'index.less'",[32,1057,556],{"class":104},[32,1059,1061,1063,1065,1067,1070],{"class":34,"line":1060},22,[32,1062,561],{"class":104},[32,1064,227],{"class":38},[32,1066,136],{"class":104},[32,1068,1069],{"class":38},"less",[32,1071,571],{"class":104},[32,1073,1075,1077,1079,1081,1083],{"class":34,"line":1074},23,[32,1076,561],{"class":104},[32,1078,227],{"class":38},[32,1080,136],{"class":104},[32,1082,644],{"class":38},[32,1084,571],{"class":104},[32,1086,1088,1090,1092,1094,1096,1098,1100],{"class":34,"line":1087},24,[32,1089,561],{"class":104},[32,1091,227],{"class":38},[32,1093,136],{"class":104},[32,1095,582],{"class":38},[32,1097,585],{"class":104},[32,1099,588],{"class":42},[32,1101,591],{"class":104},[32,1103,1105,1107,1109,1111,1113,1115,1118],{"class":34,"line":1104},25,[32,1106,561],{"class":104},[32,1108,227],{"class":38},[32,1110,136],{"class":104},[32,1112,114],{"class":38},[32,1114,136],{"class":104},[32,1116,1117],{"class":42},"'dist\u002Fsrc\u002Fcss'",[32,1119,239],{"class":104},[32,1121,1123],{"class":34,"line":1122},26,[32,1124,196],{"class":104},[32,1126,1128,1130,1133],{"class":34,"line":1127},27,[32,1129,153],{"class":100},[32,1131,1132],{"class":38}," images",[32,1134,207],{"class":104},[32,1136,1138,1140,1142,1144,1147,1149,1151,1153,1156,1159,1161,1163,1165,1167,1170],{"class":34,"line":1137},28,[32,1139,213],{"class":100},[32,1141,216],{"class":38},[32,1143,136],{"class":104},[32,1145,1146],{"class":42},"'images\u002F*'",[32,1148,224],{"class":104},[32,1150,227],{"class":38},[32,1152,136],{"class":104},[32,1154,1155],{"class":38},"imagemin",[32,1157,1158],{"class":104},"()).",[32,1160,227],{"class":38},[32,1162,136],{"class":104},[32,1164,114],{"class":38},[32,1166,136],{"class":104},[32,1168,1169],{"class":42},"'dist\u002Fsrc\u002Fimages'",[32,1171,239],{"class":104},[32,1173,1175],{"class":34,"line":1174},29,[32,1176,196],{"class":104},[32,1178,1180,1182,1185],{"class":34,"line":1179},30,[32,1181,153],{"class":100},[32,1183,1184],{"class":38}," html",[32,1186,207],{"class":104},[32,1188,1190,1192,1194,1196,1199,1201,1203,1205,1208,1210,1212,1214,1216,1218,1221],{"class":34,"line":1189},31,[32,1191,213],{"class":100},[32,1193,216],{"class":38},[32,1195,136],{"class":104},[32,1197,1198],{"class":42},"'index.html'",[32,1200,224],{"class":104},[32,1202,227],{"class":38},[32,1204,136],{"class":104},[32,1206,1207],{"class":38},"minifyHtml",[32,1209,1158],{"class":104},[32,1211,227],{"class":38},[32,1213,136],{"class":104},[32,1215,114],{"class":38},[32,1217,136],{"class":104},[32,1219,1220],{"class":42},"'dist\u002Fsrc'",[32,1222,239],{"class":104},[32,1224,1226],{"class":34,"line":1225},32,[32,1227,196],{"class":104},[32,1229,1231,1233,1236,1238,1240],{"class":34,"line":1230},33,[32,1232,292],{"class":46},[32,1234,1235],{"class":104},".allTask ",[32,1237,130],{"class":100},[32,1239,713],{"class":38},[32,1241,1242],{"class":104},"(scripts, styles, images, html);\n",[14,1244,1245,1246,722,1249,722,1252,722,1255,722,1258,1261,1262,1265,1266,1271],{},"原配置对应 ",[29,1247,1248],{},"gulp-babel@8",[29,1250,1251],{},"gulp-concat@2",[29,1253,1254],{},"gulp-less@4",[29,1256,1257],{},"gulp-imagemin@7",[29,1259,1260],{},"gulp-minify-html@1","。Babel 规则来自同目录 ",[29,1263,1264],{},".babelrc","，见 ",[1267,1268,1270],"a",{"href":1269},"\u002Fdocs\u002Fbabel-basics","Babel","。图片插件可能包含原生或平台相关依赖，本次只保留代码，不安装它们。",[14,1273,1274],{},"HTML 输入的引用要与输出布局一致，例如：",[22,1276,1280],{"className":1277,"code":1278,"language":1279,"meta":27,"style":27},"language-html shiki shiki-themes github-light github-dark","\u003Clink rel=\"stylesheet\" href=\"css\u002Findex.min.css\">\n\u003Cul>\u003Cli>\u003Cimg src=\"images\u002F1.jpg\" alt=\"示例图片\">\u003Cp>标题1\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\n\u003Cscript src=\"js\u002Fapp.min.js\">\u003C\u002Fscript>\n","html",[29,1281,1282,1310,1361],{"__ignoreMap":27},[32,1283,1284,1287,1291,1294,1296,1299,1302,1304,1307],{"class":34,"line":35},[32,1285,1286],{"class":104},"\u003C",[32,1288,1290],{"class":1289},"s9eBZ","link",[32,1292,1293],{"class":38}," rel",[32,1295,130],{"class":104},[32,1297,1298],{"class":42},"\"stylesheet\"",[32,1300,1301],{"class":38}," href",[32,1303,130],{"class":104},[32,1305,1306],{"class":42},"\"css\u002Findex.min.css\"",[32,1308,1309],{"class":104},">\n",[32,1311,1312,1314,1316,1319,1321,1323,1326,1328,1330,1333,1336,1338,1341,1343,1345,1348,1350,1353,1355,1357,1359],{"class":34,"line":56},[32,1313,1286],{"class":104},[32,1315,326],{"class":1289},[32,1317,1318],{"class":104},">\u003C",[32,1320,329],{"class":1289},[32,1322,1318],{"class":104},[32,1324,1325],{"class":1289},"img",[32,1327,216],{"class":38},[32,1329,130],{"class":104},[32,1331,1332],{"class":42},"\"images\u002F1.jpg\"",[32,1334,1335],{"class":38}," alt",[32,1337,130],{"class":104},[32,1339,1340],{"class":42},"\"示例图片\"",[32,1342,1318],{"class":104},[32,1344,14],{"class":1289},[32,1346,1347],{"class":104},">标题1\u003C\u002F",[32,1349,14],{"class":1289},[32,1351,1352],{"class":104},">\u003C\u002F",[32,1354,329],{"class":1289},[32,1356,1352],{"class":104},[32,1358,326],{"class":1289},[32,1360,1309],{"class":104},[32,1362,1363,1365,1368,1370,1372,1375,1377,1379],{"class":34,"line":65},[32,1364,1286],{"class":104},[32,1366,1367],{"class":1289},"script",[32,1369,216],{"class":38},[32,1371,130],{"class":104},[32,1373,1374],{"class":42},"\"js\u002Fapp.min.js\"",[32,1376,1352],{"class":104},[32,1378,1367],{"class":1289},[32,1380,1309],{"class":104},[14,1382,1383,1384,1387],{},"这段只说明输出相对路径，",[29,1385,1386],{},"1.jpg"," 代表独立练习者提供的素材。原重复列表页面合并为一项；任务不负责自动改写所有 HTML 引用。",[14,1389,1390,1392],{},[29,1391,978],{}," 是文件拼接，不会像模块打包器那样解析依赖图。原练习把多个同名声明的课堂文件混在一起，实际组合时需避免全局冲突；带 import\u002Fexport 的应用应交给模块打包器处理。",[18,1394,1395],{"id":1395},"向流中添加文件与分阶段输出",[22,1397,1399],{"className":91,"code":1398,"language":93,"meta":27,"style":27},"const { src, dest } = require('gulp');\nconst babel = require('gulp-babel');\nconst uglify = require('gulp-uglify');\n\nfunction stages() {\n  return src('es6\u002F*.js')\n    .pipe(babel())\n    .pipe(dest('dist\u002Fes5'))\n    .pipe(src('js\u002F*.js'))\n    .pipe(uglify())\n    .pipe(dest('dist\u002Fmin'));\n}\nexports.stages = stages;\n",[29,1400,1401,1425,1441,1457,1461,1470,1482,1494,1511,1527,1539,1556,1560],{"__ignoreMap":27},[32,1402,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423],{"class":34,"line":35},[32,1404,101],{"class":100},[32,1406,105],{"class":104},[32,1408,108],{"class":46},[32,1410,111],{"class":104},[32,1412,114],{"class":46},[32,1414,127],{"class":104},[32,1416,130],{"class":100},[32,1418,133],{"class":38},[32,1420,136],{"class":104},[32,1422,139],{"class":42},[32,1424,142],{"class":104},[32,1426,1427,1429,1431,1433,1435,1437,1439],{"class":34,"line":56},[32,1428,101],{"class":100},[32,1430,780],{"class":46},[32,1432,484],{"class":100},[32,1434,133],{"class":38},[32,1436,136],{"class":104},[32,1438,789],{"class":42},[32,1440,142],{"class":104},[32,1442,1443,1445,1447,1449,1451,1453,1455],{"class":34,"line":65},[32,1444,101],{"class":100},[32,1446,481],{"class":46},[32,1448,484],{"class":100},[32,1450,133],{"class":38},[32,1452,136],{"class":104},[32,1454,491],{"class":42},[32,1456,142],{"class":104},[32,1458,1459],{"class":34,"line":168},[32,1460,148],{"emptyLinePlaceholder":147},[32,1462,1463,1465,1468],{"class":34,"line":184},[32,1464,153],{"class":100},[32,1466,1467],{"class":38}," stages",[32,1469,207],{"class":104},[32,1471,1472,1474,1476,1478,1480],{"class":34,"line":193},[32,1473,213],{"class":100},[32,1475,216],{"class":38},[32,1477,136],{"class":104},[32,1479,934],{"class":42},[32,1481,556],{"class":104},[32,1483,1484,1486,1488,1490,1492],{"class":34,"line":199},[32,1485,561],{"class":104},[32,1487,227],{"class":38},[32,1489,136],{"class":104},[32,1491,947],{"class":38},[32,1493,571],{"class":104},[32,1495,1496,1498,1500,1502,1504,1506,1509],{"class":34,"line":210},[32,1497,561],{"class":104},[32,1499,227],{"class":38},[32,1501,136],{"class":104},[32,1503,114],{"class":38},[32,1505,136],{"class":104},[32,1507,1508],{"class":42},"'dist\u002Fes5'",[32,1510,967],{"class":104},[32,1512,1513,1515,1517,1519,1521,1523,1525],{"class":34,"line":242},[32,1514,561],{"class":104},[32,1516,227],{"class":38},[32,1518,136],{"class":104},[32,1520,108],{"class":38},[32,1522,136],{"class":104},[32,1524,964],{"class":42},[32,1526,967],{"class":104},[32,1528,1529,1531,1533,1535,1537],{"class":34,"line":247},[32,1530,561],{"class":104},[32,1532,227],{"class":38},[32,1534,136],{"class":104},[32,1536,568],{"class":38},[32,1538,571],{"class":104},[32,1540,1541,1543,1545,1547,1549,1551,1554],{"class":34,"line":257},[32,1542,561],{"class":104},[32,1544,227],{"class":38},[32,1546,136],{"class":104},[32,1548,114],{"class":38},[32,1550,136],{"class":104},[32,1552,1553],{"class":42},"'dist\u002Fmin'",[32,1555,239],{"class":104},[32,1557,1558],{"class":34,"line":284},[32,1559,196],{"class":104},[32,1561,1562,1564,1567,1569],{"class":34,"line":289},[32,1563,292],{"class":46},[32,1565,1566],{"class":104},".stages ",[32,1568,130],{"class":100},[32,1570,1571],{"class":104}," stages;\n",[14,1573,1574,1575,1578,1579,1582,1583,88],{},"中途 ",[29,1576,1577],{},"src()"," 加入的文件只经过后续步骤；原流文件也继续流动。",[29,1580,1581],{},"dest()"," 写文件后继续传递，不会清空原流。同名文件汇入相同目录可能覆盖，输入模式重叠还可能重复处理。",[1267,1584,1588],{"href":1585,"rel":1586},"https:\u002F\u002Fgulpjs.com\u002Fdocs\u002Fen\u002Fgetting-started\u002Fworking-with-files\u002F",[1587],"nofollow","Gulp 文件流文档",[18,1590,1591],{"id":1591},"文件监听",[22,1593,1595],{"className":91,"code":1594,"language":93,"meta":27,"style":27},"const { src, dest, watch } = require('gulp');\n\nfunction copy() {\n  return src('js\u002F**\u002F*.js').pipe(dest('dist\u002Fjs'));\n}\nfunction dev() {\n  return watch('js\u002F**\u002F*.js', {\n    ignoreInitial: false,\n    events: ['add', 'change', 'unlink'],\n    delay: 500\n  }, copy);\n}\nexports.dev = dev;\n",[29,1596,1597,1626,1630,1639,1663,1667,1676,1690,1701,1722,1730,1735,1739],{"__ignoreMap":27},[32,1598,1599,1601,1603,1605,1607,1609,1611,1614,1616,1618,1620,1622,1624],{"class":34,"line":35},[32,1600,101],{"class":100},[32,1602,105],{"class":104},[32,1604,108],{"class":46},[32,1606,111],{"class":104},[32,1608,114],{"class":46},[32,1610,111],{"class":104},[32,1612,1613],{"class":46},"watch",[32,1615,127],{"class":104},[32,1617,130],{"class":100},[32,1619,133],{"class":38},[32,1621,136],{"class":104},[32,1623,139],{"class":42},[32,1625,142],{"class":104},[32,1627,1628],{"class":34,"line":56},[32,1629,148],{"emptyLinePlaceholder":147},[32,1631,1632,1634,1637],{"class":34,"line":65},[32,1633,153],{"class":100},[32,1635,1636],{"class":38}," copy",[32,1638,207],{"class":104},[32,1640,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661],{"class":34,"line":168},[32,1642,213],{"class":100},[32,1644,216],{"class":38},[32,1646,136],{"class":104},[32,1648,221],{"class":42},[32,1650,224],{"class":104},[32,1652,227],{"class":38},[32,1654,136],{"class":104},[32,1656,114],{"class":38},[32,1658,136],{"class":104},[32,1660,236],{"class":42},[32,1662,239],{"class":104},[32,1664,1665],{"class":34,"line":184},[32,1666,196],{"class":104},[32,1668,1669,1671,1674],{"class":34,"line":193},[32,1670,153],{"class":100},[32,1672,1673],{"class":38}," dev",[32,1675,207],{"class":104},[32,1677,1678,1680,1683,1685,1687],{"class":34,"line":199},[32,1679,213],{"class":100},[32,1681,1682],{"class":38}," watch",[32,1684,136],{"class":104},[32,1686,221],{"class":42},[32,1688,1689],{"class":104},", {\n",[32,1691,1692,1695,1698],{"class":34,"line":210},[32,1693,1694],{"class":104},"    ignoreInitial: ",[32,1696,1697],{"class":46},"false",[32,1699,1700],{"class":104},",\n",[32,1702,1703,1706,1709,1711,1714,1716,1719],{"class":34,"line":242},[32,1704,1705],{"class":104},"    events: [",[32,1707,1708],{"class":42},"'add'",[32,1710,111],{"class":104},[32,1712,1713],{"class":42},"'change'",[32,1715,111],{"class":104},[32,1717,1718],{"class":42},"'unlink'",[32,1720,1721],{"class":104},"],\n",[32,1723,1724,1727],{"class":34,"line":247},[32,1725,1726],{"class":104},"    delay: ",[32,1728,1729],{"class":46},"500\n",[32,1731,1732],{"class":34,"line":257},[32,1733,1734],{"class":104},"  }, copy);\n",[32,1736,1737],{"class":34,"line":284},[32,1738,196],{"class":104},[32,1740,1741,1743,1746,1748],{"class":34,"line":289},[32,1742,292],{"class":46},[32,1744,1745],{"class":104},".dev ",[32,1747,130],{"class":100},[32,1749,1750],{"class":104}," dev;\n",[14,1752,1753,1756,1757,1760,1761,88],{},[29,1754,1755],{},"ignoreInitial: false"," 初次就运行任务；",[29,1758,1759],{},"delay"," 是事件后的等待时间。默认监听 add\u002Fchange\u002Funlink，其他可选事件包括 addDir、unlinkDir、ready、error、all；all 不包括 ready 和 error。任务必须报告完成，监听器才能按规则安排后续运行。",[1267,1762,1765],{"href":1763,"rel":1764},"https:\u002F\u002Fgulpjs.com\u002Fdocs\u002Fen\u002Fgetting-started\u002Fwatching-files\u002F",[1587],"Gulp 文件监听文档",[14,1767,1768],{},"监听删除事件不等于自动删除输出文件；上面的复制任务仅更新仍匹配的文件。",[18,1770,1771],{"id":1771},"来源记录",[326,1773,1774,1780,1786,1792,1798],{},[329,1775,1776,1779],{},[29,1777,1778],{},"005_less_gulp\u002Fcode\u002F03_gulp\u002Fgulpfile.js"," 与 README：默认任务、JS\u002FCSS 压缩、串并行。",[329,1781,1782,1785],{},[29,1783,1784],{},"006_webpack\u002Fcode\u002F01_gulp\u002Fgulpfile.js"," 与 README：Babel、拼接、Less、HTML、图片、分阶段输出、监听。",[329,1787,1788,1791],{},[29,1789,1790],{},"006_webpack\u002Fcode\u002F01_gulp\u002Findex.html","：合并重复列表，保留资源路径关系。",[329,1793,1794,1797],{},[29,1795,1796],{},"007_webpack\u002Fcode\u002Freadme.md"," Gulp 复习：并入对应章节。",[329,1799,1800],{},"原第三方库、图片素材、构建结果和包锁不迁入；完整工程依赖仅用于确认片段所处版本。",[1802,1803,1804],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":27,"searchDepth":65,"depth":65,"links":1806},[1807,1808,1809,1810,1811,1812,1813],{"id":20,"depth":56,"text":20},{"id":346,"depth":56,"text":347},{"id":434,"depth":56,"text":434},{"id":732,"depth":56,"text":733},{"id":1395,"depth":56,"text":1395},{"id":1591,"depth":56,"text":1591},{"id":1771,"depth":56,"text":1771},"toolchain","2023-04-26","Gulp 任务完成信号、串并行组合、文件流、资源处理、分阶段输出和文件监听。",false,"md",{},"\u002Fdocs\u002Fgulp-basics",{"title":5,"description":1816},"尚学堂 ES6 课程 005_less_gulp、006_webpack、007_webpack 学习笔记与代码","docs\u002Fgulp-basics",[1825,1826,1827],"javascript","nodejs","notes","_3NwjcOljmwE8sZtDFnD2BMluDfnDF1UynZvHJxlSyQ",[1830,1837,1843,1848,1853,1862,1872,1879,1885,1895,1902,1911,1916,1923,1928,1934,1940,1947,1954,1961,1968,1974,1980,1985,1987,1992,1997,2002],{"path":1269,"title":1831,"description":1832,"date":1833,"category":1814,"tags":1834},"Babel 转译基础与构建集成","Babel 7 的 CLI、preset、plugin、目标环境以及 Gulp、Webpack 和 JSX 转译配置摘录。","2026-09-09",[1825,1835,1836,1827],"es6","webpack",{"path":1838,"title":1839,"description":1840,"date":1833,"category":1841,"tags":1842},"\u002Fdocs\u002Fes6-arrays-objects","ES6 数组与对象扩展","展开运算符、Array.from、Object.assign、属性描述符与图片预加载示例。","fundamentals",[1825,1835,1827],{"path":1844,"title":1845,"description":1846,"date":1833,"category":1841,"tags":1847},"\u002Fdocs\u002Fes6-basics","ES6 基础：作用域、解构与模板字符串","从课程示例整理 let、const、暂时性死区、全局对象、数组与对象解构及模板字符串。",[1825,1835,1827],{"path":1849,"title":1850,"description":1851,"date":1833,"category":1841,"tags":1852},"\u002Fdocs\u002Fjs-promise-async","Promise、Generator 与 async\u002Fawait","从回调到 Promise 链、组合方法、Generator 执行与 async 错误处理的课程示例整理。",[1825,1835,1827],{"path":1854,"title":1855,"description":1856,"date":1857,"category":1814,"tags":1858},"\u002Fdocs\u002Flinux-commands-cheatsheet","Linux 常用命令与权限管理速查","cp\u002Fmv\u002Frm、目录导航、查找、压缩、网络等基础命令速查，以及 chmod\u002Fchown 的数字与符号写法、常用组合和 WSL 下的坑。","2026-05-28",[1859,1860,1861],"linux","wsl2","cheatsheet",{"path":1863,"title":1864,"description":1865,"date":1866,"category":1867,"tags":1868},"\u002Fdocs\u002Ffrontend-coding-standards","前端团队编码规范","HTML \u002F CSS \u002F JavaScript 三端统一的团队编码约定，含缩进、命名、语法与禁用项，可直接作为 Code Review 依据。","2025-12-17","standards",[1279,1869,1825,1835,1870,1871],"css","best-practice","guide",{"path":1873,"title":1874,"description":1875,"date":1876,"category":1814,"tags":1877},"\u002Fdocs\u002Fwindows-mklink","Windows mklink 符号链接用法","mklink 各参数区别与实用场景：目录联接、符号链接与硬链接的选择。","2024-12-18",[1878,1861],"windows",{"path":1880,"title":1881,"description":1882,"date":1883,"category":1814,"tags":1884},"\u002Fdocs\u002Frandom-color-utils","JS 随机颜色生成方法","几种生成随机 RGB \u002F HEX 颜色的实现方式与各自适用场景。","2024-12-11",[1825,1861],{"path":1886,"title":1887,"description":1888,"date":1889,"category":1890,"tags":1891},"\u002Fdocs\u002Fcanvas-vs-svg","Canvas 与 SVG 绘图方案选型","对比 Canvas 与 SVG 两种绘图方案的优缺点与适用场景，给出选型判断依据。","2024-12-09","visualization",[1892,1893,1894,1870],"canvas","svg","performance",{"path":1896,"title":1897,"description":1898,"date":1899,"category":1814,"tags":1900},"\u002Fdocs\u002Ffree-commercial-fonts","免费可商用字体整理","整理思源黑体、思源宋体等可商用中文字体，规避字体版权风险。","2024-11-03",[1901,1869,1827],"font",{"path":1903,"title":1904,"description":1905,"date":1899,"category":1906,"tags":1907},"\u002Fdocs\u002Finterview-browser-network","浏览器与网络考点","从输入 URL 到页面呈现的完整链路，涵盖渲染流程、回流重绘、HTTP 报文与状态码、跨域同源策略与常见攻击方式。","interview",[1908,1909,1910,1894,1827],"browser","http","network",{"path":1912,"title":1913,"description":1914,"date":1899,"category":1906,"tags":1915},"\u002Fdocs\u002Finterview-css-layout","CSS 与布局考点","em 与 rem 的区别、移动端三种适配方案对比、viewport 标准设置与 REM 布局的媒体查询实现。",[1869,1279,1870,1827],{"path":1917,"title":1918,"description":1919,"date":1899,"category":1906,"tags":1920},"\u002Fdocs\u002Finterview-framework-tooling","框架与工程化考点","React diff 与 setState 机制、Redux 核心组成、Vue 常考清单，以及 Webpack、Vite、Git 的面试要点。",[1921,1825,1836,1922,1827],"vue","vite",{"path":1924,"title":1925,"description":1926,"date":1899,"category":1906,"tags":1927},"\u002Fdocs\u002Finterview-javascript-core","JavaScript 核心考点","数据类型、this 绑定、闭包、原型链、异步与数组方法，前端面试中 JS 部分的高频考点与代码示例。",[1825,1835,1827],{"path":1929,"title":1930,"description":1931,"date":1899,"category":1841,"tags":1932},"\u002Fdocs\u002Fjs-module-systems","JavaScript 模块化方案","梳理 CommonJS、AMD、ES Module 等模块化方案的差异与使用方式。",[1825,1933,1835,1827],"module-system",{"path":1935,"title":1936,"description":1937,"date":1899,"category":1841,"tags":1938},"\u002Fdocs\u002Fwebsocket-basics","WebSocket 基础","WebSocket 全双工通信协议的事件、方法与基本用法整理。",[1939,1910,1825,1827],"websocket",{"path":1941,"title":1942,"description":1943,"date":1944,"category":1814,"tags":1945},"\u002Fdocs\u002Fmarkdown-syntax","Markdown 语法速查","Markdown 标题、强调、列表、区块引用、代码、表格、转义与 Mermaid 图表语法整理。","2024-10-18",[1946,1861,1827],"markdown",{"path":1948,"title":1949,"description":1950,"date":1951,"category":1890,"tags":1952},"\u002Fdocs\u002Fgojs-getting-started","GoJS 入门实战","从引入方式、画布初始化到节点模板与数据绑定，一份可直接上手的 GoJS 流程图开发笔记。","2024-08-22",[1953,1825,1827],"gojs",{"path":1955,"title":1956,"description":1957,"date":1958,"category":1890,"tags":1959},"\u002Fdocs\u002Fecharts-options-notes","ECharts 配置项速查","整理 ECharts 常用 option 配置：数据格式、坐标轴、图例与交互项的实际用法。","2024-08-09",[1960,1825,1861],"echarts",{"path":1962,"title":1963,"description":1964,"date":1965,"category":1814,"tags":1966},"\u002Fdocs\u002Fyarn-npm-install-errors","yarn \u002F npm 安装报错处理","yarn 引擎版本不兼容时的 ignore-engines 绕过、Windows 刷新 DNS 解析缓存、npm 缓存清理与校验。","2024-08-06",[39,1826,1878,1967],"troubleshooting",{"path":1969,"title":1970,"description":1971,"date":1972,"category":1890,"tags":1973},"\u002Fdocs\u002Fgojs-grid-panel","GoJS 网格面板用法","Diagram.grid 默认网格与网格捕捉、单元格尺寸定制，用 LineH\u002FLineV\u002FBarH\u002FBarV 自定义网格样式，以及把 Grid 面板当作节点元素使用。","2024-07-01",[1953,1825,1827],{"path":1975,"title":1976,"description":1977,"date":1978,"category":1841,"tags":1979},"\u002Fdocs\u002Fhttp-status-codes","HTTP 响应状态码详解","按 1xx 到 5xx 分类梳理 HTTP 状态码的含义与典型使用场景。","2024-06-27",[1909,1910,1861],{"path":1981,"title":1982,"description":1983,"date":1815,"category":1841,"tags":1984},"\u002Fdocs\u002Fes6-functions-classes","ES6 函数与 Class","默认参数、rest、箭头函数的 this、Class 方法、访问器、静态成员与继承。",[1825,1835,1827],{"path":1820,"title":5,"description":1816,"date":1815,"category":1814,"tags":1986},[1825,1826,1827],{"path":1988,"title":1989,"description":1990,"date":1815,"category":1841,"tags":1991},"\u002Fdocs\u002Fjs-proxy-reflect","Proxy 与 Reflect 入门","通过属性读取和赋值示例理解 Proxy、Reflect、receiver 与拦截限制。",[1825,1835,1827],{"path":1993,"title":1994,"description":1995,"date":1815,"category":1814,"tags":1996},"\u002Fdocs\u002Fless-basics","Less 语法与编译笔记","变量、嵌套、混合、extend、导入、内置函数和递归生成列的课程示例。",[1869,1827,1861],{"path":1998,"title":1999,"description":2000,"date":1815,"category":1814,"tags":2001},"\u002Fdocs\u002Fwebpack-basics","Webpack 4 配置与开发服务器笔记","课程中的入口出口、loader、plugin、source map、开发代理以及 React 环境配置片段。",[1836,1825,1826,1827],{"path":2003,"title":2004,"description":2005,"date":2006,"category":1841,"tags":2007},"\u002Fdocs\u002Fhtml-basics","HTML 基础笔记","HTML 语法规范、常用标签、表格、表单、Canvas 入门与 JavaScript 输出方式速查。","2022-06-10",[1279,1827,1861],1789635934409]