目為例的安裝配置與源碼定制)
Minami JSDoc 文檔主題深度指南以 async 項(xiàng)目為例的安裝配置與源碼定制【免費(fèi)下載鏈接】asyncAsync utilities for node and the browser項(xiàng)目地址: https://gitcode.com/gh_mirrors/as/async導(dǎo)讀本文圍繞 async 項(xiàng)目中內(nèi)置的 JSDoc 文檔主題Minami位于 support/jsdoc/theme/README.md展開系統(tǒng)講解其安裝方式、命令行用法、package.json與.jsdoc.json雙入口配置并結(jié)合 async 倉(cāng)庫(kù)的 support/jsdoc/jsdoc.json、support/jsdoc/theme/publish.js 等真實(shí)文件深入剖析主題生成文檔的底層流程與 async 對(duì)該主題的定制擴(kuò)展。讀完本文你將能獨(dú)立搭建一套具備響應(yīng)式布局、側(cè)邊導(dǎo)航、內(nèi)置搜索能力的 JSDoc 3 文檔站點(diǎn)并理解如何為這類主題編寫后處理腳本與 JSDoc 插件。一、Minami 是什么Minami 是一個(gè)為 JSDoc 3 設(shè)計(jì)的簡(jiǎn)潔、響應(yīng)式的文檔模板主題。它并不像默認(rèn)主題那樣追求信息堆砌而是通過清晰的分區(qū)與留白讓 API 文檔在桌面端與移動(dòng)端都能保持良好的可讀性。在 async 倉(cāng)庫(kù)中它被用作文檔站點(diǎn)的渲染引擎——倉(cāng)庫(kù)docs/v3、docs/v2目錄下的全部 HTML 文檔例如 docs/v3/queue.js.html都是由它生成的產(chǎn)物。技術(shù)棧主題本身基于三個(gè)開源組件構(gòu)建Taffy Database 庫(kù)JSDoc 生成的 doclet 數(shù)據(jù)是一個(gè) TAFFY 數(shù)據(jù)庫(kù)對(duì)象Minami 的publish.js直接用它做符號(hào)類、模塊、函數(shù)等的查詢與分組Underscore Template 庫(kù)JSDoc 3 的模板引擎基于 Underscore 模板語法tmpl目錄下的模板文件如 layout.tmpl、container.tmpl都使用?js ?形式的模板指令渲染 doclet 數(shù)據(jù)Montserrat 與 Helvetica Neue 字體頁面標(biāo)題采用 Montserrat 字體正文使用 Helvetica Neue 字體棧相關(guān) woff/eot/ttf 字體文件已內(nèi)置于 support/jsdoc/theme/static/fonts并在 layout.tmpl 中通過 Google Fonts 加載配合styles/下的 CSSjsdoc-default.css呈現(xiàn)最終視覺效果。二、安裝與基礎(chǔ)使用作為 npm 依賴安裝在任意項(xiàng)目的開發(fā)依賴中安裝 Minami$ npm install --save-dev minami作為模板目錄克隆Minami 的另一種接入方式是直接把主題克隆到 JSDoc 的模板目錄然后通過-t參數(shù)指定主題路徑運(yùn)行 JSDoc$ jsdoc entry-file.js -t path/to/minami在 async 倉(cāng)庫(kù)中主題沒有以node_modules/minami的形態(tài)存在而是被整體內(nèi)聯(lián)進(jìn)了倉(cāng)庫(kù)的support/jsdoc/theme目錄。這一點(diǎn)從 support/jsdoc/jsdoc.json 的template: support/jsdoc/theme配置可以確認(rèn)含義與-t path/to/minami完全相同opts.template就是告訴 JSDoc 用哪個(gè)目錄下的模板來渲染文檔。命令直接指定也可以不寫配置文件直接在命令行使用-t$ jsdoc lib/index.js -t support/jsdoc/theme三、在項(xiàng)目中接入文檔構(gòu)建腳本Minami 官方推薦通過兩條配置把文檔生成集成進(jìn)日常開發(fā)1.package.json中添加 generate 腳本在項(xiàng)目的package.json文件中添加腳本scripts: { generate-docs: node_modules/.bin/jsdoc --configure .jsdoc.json --verbose }async 倉(cāng)庫(kù)實(shí)際采用的正是這種模式但腳本名與配置文件路徑不同見 package.jsonscripts: { jsdoc: jsdoc -c ./support/jsdoc/jsdoc.json node support/jsdoc/jsdoc-fix-html.js }可以觀察到async 在原生 JSDoc 命令之后又串聯(lián)了node support/jsdoc/jsdoc-fix-html.js這一后處理步驟用來對(duì)生成的 HTML 做二次修復(fù)詳見本文第七、八節(jié)這是 Minami 主題在真實(shí)項(xiàng)目中的典型落地方式。2..jsdoc.json中聲明模板在 JSDoc 配置文件的opts節(jié)點(diǎn)中通過template指定主題opts: { template: node_modules/minami }注意官方示例中的script鍵在package.json中實(shí)際應(yīng)為scripts復(fù)數(shù)這是原文檔中的筆誤async 倉(cāng)庫(kù)自身的 package.json 使用的是正確寫法。配置中的--verbose用于在生成時(shí)輸出更詳細(xì)的日志方便排查 doclet 解析問題。四、完整 JSDoc 配置示例解析Minami 官方文檔給出了一份可直接使用的完整.jsdoc.json配置原文如下{ tags: { allowUnknownTags: true, dictionaries: [jsdoc] }, source: { include: [lib, package.json, README.md], includePattern: .js$, excludePattern: (node_modules/|docs) }, plugins: [ plugins/markdown ], templates: { cleverLinks: false, monospaceLinks: true }, opts: { destination: ./docs/, encoding: utf8, private: true, recurse: true, template: ./node_modules/minami } }各配置項(xiàng)的作用如下配置節(jié)鍵作用tagsallowUnknownTags允許使用 JSDoc 標(biāo)準(zhǔn)之外的自定義標(biāo)簽避免解析報(bào)錯(cuò)tagsdictionaries指定標(biāo)簽字典[jsdoc]表示只啟用 JSDoc 官方字典還可組合closure以支持 Closure Compiler 類型注解sourceinclude需要掃描解析的文件/目錄列表這里包含lib、package.json與README.mdsourceincludePattern只處理符合該正則的文件.js$即僅包含.js文件sourceexcludePattern排除符合該正則的路徑(node_modules/|docs)表示跳過依賴目錄與已有文檔目錄plugins—加載 JSDoc 官方 markdown 插件使注釋中的 Markdown 能被渲染為 HTMLtemplatescleverLinksfalse時(shí)link的渲染依賴下面的monospaceLinkstemplatesmonospaceLinkstrue表示鏈接用等寬字體渲染optsdestination文檔輸出目錄即./docs/optsencoding源文件編碼utf8保證中文注釋等非 ASCII 內(nèi)容不亂碼optsprivatetrue時(shí)連private標(biāo)注的符號(hào)也會(huì)被輸出optsrecurse遞歸掃描include指定的目錄optstemplate使用的主題路徑async 項(xiàng)目中的真實(shí)配置對(duì)照將上述示例與 async 的實(shí)際配置 support/jsdoc/jsdoc.json 對(duì)照可以看到項(xiàng)目化配置的差異{ tags: { allowUnknownTags: true, dictionaries: [jsdoc] }, source: { include: [ ./lib ] }, plugins: [plugins/markdown, ./jsdoc-import-path-plugin], opts: { readme: intro.md, template: support/jsdoc/theme, encoding: utf8, destination: ./docs/v3, recurse: true }, templates: { cleverLinks: false } }關(guān)鍵差異source.include只指向./lib——async 的全部 API 實(shí)現(xiàn)都位于 lib 目錄掃描它即可覆蓋所有 docletplugins在官方 markdown 插件之外額外注冊(cè)了倉(cāng)庫(kù)自研的 jsdoc-import-path-plugin.js見第八節(jié)opts.readme指向 intro.mdMinami 的主題 mainpage.tmpl 會(huì)將該 Markdown 渲染進(jìn)首頁opts.destination指向./docs/v3與倉(cāng)庫(kù)中 docs/v3 目錄對(duì)應(yīng)相鄰的 docs/v2 則由 v2.6.2 版本生成兩者通過 layout.tmpl 頂部的版本下拉菜單互相跳轉(zhuǎn)。五、主題渲染流程讀懂 publish.jsMinami 作為 JSDoc 主題真正決定文檔怎么生成的是入口文件 support/jsdoc/theme/publish.js。它導(dǎo)出publish(taffyData, opts, tutorials)函數(shù)JSDoc 在完成源碼解析后會(huì)調(diào)用它。整個(gè)流程可分為六個(gè)階段1. 模板與輸出目錄初始化const templatePath path.normalize(opts.template); view new template.Template( path.join(templatePath, tmpl) );主題通過opts.template找到模板目錄并加載其中的tmpl子目錄作為模板根view.layout默認(rèn)使用 layout.tmpl除非在配置里指定了自定義layoutFile。2. doclet 數(shù)據(jù)預(yù)處理data helper.prune(data)剔除無意義符號(hào)data.sort(longname, version, since)對(duì)符號(hào)排序隨后對(duì)每個(gè) doclet 做三件事解析example中的caption標(biāo)題與代碼正文publish.js將see中的#anchor哈希轉(zhuǎn)換為真實(shí)鏈接hashToLink收集 doclet 的meta.path meta.filename建立源文件清單供生成高亮源碼頁使用。3. 版本化輸出目錄與靜態(tài)資源復(fù)制const packageInfo ( find({kind: package}) || [] ) [0]; if (packageInfo packageInfo.name) { outdir path.join( outdir, packageInfo.name, (packageInfo.version || ) ); }從 doclet 中查找package類型符號(hào)來自package.json并把輸出目錄拼接為destination/包名/版本號(hào)。接著主題會(huì)把 static 目錄中的字體、CSS、prettify 腳本遞歸復(fù)制到輸出目錄若配置了templates.default.staticFiles.include用戶自定義的靜態(tài)文件也會(huì)被一并復(fù)制publish.js。4. 源碼高亮與搜索數(shù)據(jù)生成若templates.default.outputSourceFiles不為false默認(rèn)輸出則調(diào)用generateSourceFiles把每個(gè)源碼文件渲染為帶行號(hào)的 prettify 高亮頁面async 的docs/v3/apply.js.html等即為此產(chǎn)物writeSearchDatapublish.js在輸出目錄下創(chuàng)建data/子目錄把全部函數(shù)名含別名寫入methodNames.json、全部源碼文件名寫入sourceFiles.json并統(tǒng)一按字母序排序。async 倉(cāng)庫(kù)中這兩個(gè)文件的真實(shí)產(chǎn)物可見于 docs/v3/data/methodNames.json 與 docs/v3/data/sourceFiles.json。5. 導(dǎo)航側(cè)邊欄構(gòu)建buildNavpublish.js按 Classes、Modules、Externals、Events、Namespaces、Mixins、Tutorials、Interfaces、Globals 的順序用buildMemberNav生成nav變量的 HTML 字符串其中每個(gè)模塊條目下會(huì)進(jìn)一步列出其方法ul classmethods并注入視圖view.nav。此外attachModuleSymbolspublish.js會(huì)把與模塊同名、且模塊導(dǎo)出的類或函數(shù)掛到對(duì)應(yīng)模塊下例如 async 的module:async頁面會(huì)直接展示其導(dǎo)出的全部工具函數(shù)簽名。6. 頁面渲染最后主題按類型分發(fā)渲染container.tmpl是各類頁面的公共骨架container.tmpl其中mainpage/package類型走 mainpage.tmpl把opts.readme渲染為首頁source類型走 source.tmpl輸出 prettify 源碼頁其余類型module/class/function 等走方法模板 method.tmpl依次渲染簽名、描述、參數(shù)表params.tmpl、返回值returns.tmpl、示例、異常等區(qū)塊全局頁與各模塊頁最終分別輸出為index.html、global.html及l(fā)ongname.html。渲染后通過helper.resolveLinks(html)把{link foo}解析為真實(shí)a鏈接再以u(píng)tf8寫入輸出目錄。六、生成產(chǎn)物與構(gòu)建入口文檔產(chǎn)物結(jié)構(gòu)主題的靜態(tài)資源與生成邏輯共同決定了輸出站點(diǎn)形態(tài)。以 docs/v3 為例可見如下產(chǎn)物index.html/docs.html首頁與聚合文檔頁module-*.html按模塊分組的 API 頁面如module-ControlFlow.html方法名.js.html每個(gè)源碼文件的高亮閱讀頁如 docs/v3/each.js.htmldata/methodNames.json與data/sourceFiles.json供前端搜索索引使用的數(shù)據(jù)scripts/async.js、scripts/jsdoc-custom.js隨站點(diǎn)分發(fā)的運(yùn)行時(shí)腳本與主題自定義搜索腳本styles/、fonts/、img/主題靜態(tài)資源與項(xiàng)目 logo。通過 Makefile 一鍵生成async 的 Makefile 把完整流程固化成了doc目標(biāo)doc: jsdoc -c ./support/jsdoc/jsdoc.json node support/jsdoc/jsdoc-fix-html.js即先按support/jsdoc/jsdoc.json調(diào)用 JSDoc Minami 主題生成原始 HTML再運(yùn)行 jsdoc-fix-html.js 對(duì)產(chǎn)物做結(jié)構(gòu)化修復(fù)最終得到docs/v3下可直接靜態(tài)托管的完整站點(diǎn)。這與 package.json 中的npm run jsdoc腳本等價(jià)。七、async 對(duì) Minami 的定制后處理與搜索增強(qiáng)單純使用 Minami 主題只能獲得開箱即用的靜態(tài)文檔async 通過三個(gè)附加腳本把它改造成了帶聚合導(dǎo)航與實(shí)時(shí)搜索的站點(diǎn)。1. 搜索欄jsdoc-custom.jsjsdoc-custom.js 是部署在文檔站點(diǎn)上的前端腳本它基于 typeahead.js 的 Bloodhound 引擎實(shí)現(xiàn)三路搜索Methods從./data/methodNames.json預(yù)取全部方法名matchSubstrs把每個(gè)方法名切分為全部子串作為分詞 token從而支持輸入任意片段即命中Files從./data/sourceFiles.json預(yù)取源碼文件名同樣做子串匹配Issues可選遠(yuǎn)程搜索項(xiàng)目 Issue選中后跳轉(zhuǎn)對(duì)應(yīng) Issue 頁面。命中 Methods 時(shí)腳本會(huì)根據(jù)當(dāng)前頁面跳轉(zhuǎn)到docs.html#方法名并平滑滾動(dòng)定位命中 Files 時(shí)跳轉(zhuǎn)到對(duì)應(yīng).html源碼頁。搜索框本體定義在 layout.tmpl 的導(dǎo)航欄中搜索樣式則由 jsdoc-default.css 控制。2. 頁面結(jié)構(gòu)修復(fù)jsdoc-fix-html.jsjsdoc-fix-html.js 是一個(gè)基于 cheerio 的 Node 后處理腳本它利用 async 自身的async.eachSeries、async.waterfall編排任務(wù)算是用 async 構(gòu)建 async 文檔的典型案例主要完成合并偽模塊combineFakeModules把各module-*.html頁面的#main-container內(nèi)容合并進(jìn)主模塊頁生成聚合的docs.html導(dǎo)航重構(gòu)fixToc將側(cè)邊欄改為指向同一份docs.html的錨點(diǎn)鏈接scrollSpyFix把所有方法條目攤平進(jìn)一個(gè)ul使其適配 Bootstrap scroll-spy 滾動(dòng)監(jiān)聽文本修正applyPreCheerioFixes把 JSDoc 內(nèi)部用的ControlFlow修正為頁面展示的Control Flow并替換返回類型中的模塊前綴鏈接文本資源同步把構(gòu)建產(chǎn)物dist/async.js、主題腳本、logo 與 favicon 復(fù)制進(jìn)文檔目錄并在所有頁面底部追加統(tǒng)一的 footer。3. 導(dǎo)入路徑注入插件jsdoc-import-path-plugin.jsjsdoc-import-path-plugin.js 是一個(gè) JSDoc 插件通過handlers.jsdocCommentFound在解析注釋時(shí)自動(dòng)在文檔頭部注入 ES module 導(dǎo)入示例import each from async/each;它利用path.parse(e.filename).name取模塊名非index模塊都會(huì)注入對(duì)應(yīng)async/模塊名的導(dǎo)入代碼塊使文檔中的每個(gè)方法示例都能被讀者直接復(fù)制運(yùn)行顯著提升了 API 文檔的實(shí)戰(zhàn)可用性。八、許可協(xié)議Minami 主題依據(jù) Apache 2.0 許可發(fā)布許可文本見主題目錄下的 support/jsdoc/theme/LICENSE。需要區(qū)分的是主題的許可是 Apache 2.0而 async 項(xiàng)目主體package.json 與倉(cāng)庫(kù)根目錄 LICENSE采用的是 MIT 許可兩者互不影響。結(jié)語Minami 主題為 JSDoc 3 提供了簡(jiǎn)潔、響應(yīng)式的文檔渲染能力而 async 倉(cāng)庫(kù)則示范了如何把它從開箱即用的模板演進(jìn)為帶搜索、聚合導(dǎo)航與導(dǎo)入示例的生產(chǎn)級(jí)文檔站點(diǎn)配置入口在 support/jsdoc/jsdoc.json渲染內(nèi)核在 support/jsdoc/theme/publish.js增強(qiáng)層則由 jsdoc-custom.js、jsdoc-fix-html.js 與 jsdoc-import-path-plugin.js 共同承擔(dān)。參考這套組合你可以為自己的庫(kù)快速搭建同樣水準(zhǔn)的 API 文檔也可以按需替換tmpl/模板或擴(kuò)展publish.js打造專屬主題?!久赓M(fèi)下載鏈接】asyncAsync utilities for node and the browser項(xiàng)目地址: https://gitcode.com/gh_mirrors/as/async創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考