164 - 《手撕源码 23:docusaurus 2》
docusaurus 是 facebook 出的文档工具,Prettier、Figma Developer、Supabase、StackBliz、Gulp、Tauri、Babel、React Native 等网站都基于 Docusaurus(React 没有用)。umi 最早一段时间的文档也是用 docusaurus,umi 1 还是 0.x 有点忘了,后来才切换的 vuepress 再到 dumi。
docusaurus 提供 build、swizzle、deploy、start、serve、clear、write-translations、write-headings-ids 命令。大部分都可以见名知意,除了 swizzle。swizzle 是一套主题定制方案,可以定制主题和插件提供的各种元素,定制方式包括 wrap 和 eject,前者是包一层,后者是替换,见图 1 GIF。
build 和 start 的实现和元框架(比如 umi)差不多,包括装载配置和插件、生成临时文件和构建。临时文件会生成到 .docusaurus 目录下,包含路由、i18n 和各种元信息,插件也可以生成临时文件。构建基于 webpack,build 会做 client 和 ssr 构建然后根据路由生成 html 文件,start 只做 client 构建同时生成 index.html 给路由 fallback 使用。build 完还会额外做 handleBrokenLinks(处理死链),只针对内链,方法是针对无 protocol 的链接做路由匹配。
webpack 基于 webpack-merge 做配置合并。配置层没啥特别的,1)devtool 用 eval-cheap-module-source-map,相比 umi 的