feat(css): 自托管 KaTeX CSS 与 woff2 字体

服务端 katex-rs 只输出 HTML span,字体/排版靠配套 CSS。从 npm 包 katex
0.16.x 的 dist/ 拷贝 katex.min.css + woff2 字体(省去 woff/ttf)到 public/katex/,
CSS 用相对 url(fonts/) 引用故两者须同级。

- libs/package.json: katex ^0.16.22 作 workspace 根 devDependency
- Makefile: 新增 katex-css target,接入 build/build-linux/dev;clean 清 public/katex
- Dioxus.toml: [web.resource]/[web.resource.dev] style 列表注册 /katex/katex.min.css
- .gitignore: public/katex 作构建产物忽略(同 highlight.css 等)

make katex-css 验证通过:23KB CSS + 20 个 woff2 字体就位。
This commit is contained in:
xfy 2026-07-16 14:15:20 +08:00
parent 84f6223c68
commit 218533402b
5 changed files with 37 additions and 4 deletions

1
.gitignore vendored
View File

@ -8,6 +8,7 @@
others/ others/
public/style.css public/style.css
public/highlight.css public/highlight.css
public/katex
public/tiptap public/tiptap
public/codemirror public/codemirror
public/lightbox public/lightbox

View File

@ -10,9 +10,9 @@ title = "Yggdrasil - Dioxus SSR"
watch_path = ["src", "Cargo.toml"] watch_path = ["src", "Cargo.toml"]
[web.resource] [web.resource]
style = ["/style.css", "/highlight.css", "/tiptap/editor.css", "/lightbox/lightbox.css", "/yggdrasil-core/yggdrasil-core.css", "/xterm/terminal.css"] style = ["/style.css", "/highlight.css", "/katex/katex.min.css", "/tiptap/editor.css", "/lightbox/lightbox.css", "/yggdrasil-core/yggdrasil-core.css", "/xterm/terminal.css"]
script = ["/tiptap/editor.js", "/codemirror/editor.js", "/lightbox/lightbox.js", "/yggdrasil-core/yggdrasil-core.js", "/xterm/terminal.js"] script = ["/tiptap/editor.js", "/codemirror/editor.js", "/lightbox/lightbox.js", "/yggdrasil-core/yggdrasil-core.js", "/xterm/terminal.js"]
[web.resource.dev] [web.resource.dev]
style = ["/style.css", "/highlight.css", "/tiptap/editor.css", "/lightbox/lightbox.css", "/yggdrasil-core/yggdrasil-core.css", "/xterm/terminal.css"] style = ["/style.css", "/highlight.css", "/katex/katex.min.css", "/tiptap/editor.css", "/lightbox/lightbox.css", "/yggdrasil-core/yggdrasil-core.css", "/xterm/terminal.css"]
script = ["/tiptap/editor.js", "/codemirror/editor.js", "/lightbox/lightbox.js", "/yggdrasil-core/yggdrasil-core.js", "/xterm/terminal.js"] script = ["/tiptap/editor.js", "/codemirror/editor.js", "/lightbox/lightbox.js", "/yggdrasil-core/yggdrasil-core.js", "/xterm/terminal.js"]

View File

@ -1,9 +1,10 @@
.PHONY: dev build build-linux build-freebsd freebsd-sysroot docker docker-amd64 docker-apple docker-multiarch css css-watch clean build-libs build-editor build-codemirror build-lightbox build-core build-xterm highlight-css test doc doc-open start lint fix restore-webp .PHONY: dev build build-linux build-freebsd freebsd-sysroot docker docker-amd64 docker-apple docker-multiarch css css-watch clean build-libs build-editor build-codemirror build-lightbox build-core build-xterm highlight-css katex-css test doc doc-open start lint fix restore-webp
build: build:
@cd libs && pnpm install --frozen-lockfile @cd libs && pnpm install --frozen-lockfile
@$(MAKE) build-libs @$(MAKE) build-libs
@$(MAKE) highlight-css @$(MAKE) highlight-css
@$(MAKE) katex-css
@tailwindcss -i input.css -o public/style.css --minify @tailwindcss -i input.css -o public/style.css --minify
@$(MAKE) doc @$(MAKE) doc
@dx build --release --debug-symbols=false @dx build --release --debug-symbols=false
@ -13,6 +14,7 @@ build-linux:
@cd libs && pnpm install --frozen-lockfile @cd libs && pnpm install --frozen-lockfile
@$(MAKE) build-libs @$(MAKE) build-libs
@$(MAKE) highlight-css @$(MAKE) highlight-css
@$(MAKE) katex-css
@tailwindcss -i input.css -o public/style.css --minify @tailwindcss -i input.css -o public/style.css --minify
@dx build @client --release --debug-symbols=false --wasm-js-cfg false @dx build @client --release --debug-symbols=false --wasm-js-cfg false
@dx build @server --release --debug-symbols=false --target x86_64-unknown-linux-musl --wasm-js-cfg false --features server @dx build @server --release --debug-symbols=false --target x86_64-unknown-linux-musl --wasm-js-cfg false --features server
@ -82,6 +84,17 @@ restore-webp:
highlight-css: highlight-css:
@cargo run --bin generate_highlight_css @cargo run --bin generate_highlight_css
# 把 npm 包 katex 的 dist/ 拷贝到 public/katex/(服务端 katex-rs 不打包 CSS
# KaTeX 的 katex.min.css 用相对 URL 引 fonts/,故 fonts/ 必须与 CSS 同级。
# 只拷 woff2现代浏览器全支持省去 woff/ttf ~70% 字体体积)。
# katex 作为 libs/ workspace 根 devDependencypnpm install 后在 libs/node_modules/katex/。
katex-css:
@echo "Copying KaTeX CSS + woff2 fonts to public/katex/..."
@mkdir -p public/katex/fonts
@cp libs/node_modules/katex/dist/katex.min.css public/katex/katex.min.css
@cp libs/node_modules/katex/dist/fonts/*.woff2 public/katex/fonts/
@echo "KaTeX CSS ready at public/katex/"
# 并行构建全部 libs/ 子项目pnpm -r 拓扑顺序,无相互依赖则并发)。 # 并行构建全部 libs/ 子项目pnpm -r 拓扑顺序,无相互依赖则并发)。
# 依赖安装由调用方负责build/build-linux 用 pnpm install --frozen-lockfile # 依赖安装由调用方负责build/build-linux 用 pnpm install --frozen-lockfile
# dev 假设 node_modules 已存在)。 # dev 假设 node_modules 已存在)。
@ -95,7 +108,7 @@ build-lightbox: ; @cd libs && pnpm --filter @yggdrasil/lightbox run build
build-core: ; @cd libs && pnpm --filter @yggdrasil/core run build build-core: ; @cd libs && pnpm --filter @yggdrasil/core run build
build-xterm: ; @cd libs && pnpm --filter @yggdrasil/xterm-terminal run build build-xterm: ; @cd libs && pnpm --filter @yggdrasil/xterm-terminal run build
dev: build-libs highlight-css dev: build-libs highlight-css katex-css
@echo "Cleaning static/..." @echo "Cleaning static/..."
@rm -rf static/ @rm -rf static/
@echo "Building CSS..." @echo "Building CSS..."
@ -188,6 +201,7 @@ docker-multiarch:
clean: clean:
@cargo clean @cargo clean
@rm -f public/style.css public/highlight.css @rm -f public/style.css public/highlight.css
@rm -rf public/katex
@rm -rf public/doc @rm -rf public/doc
@rm -rf uploads/.cache @rm -rf uploads/.cache
@rm -rf libs/node_modules libs/*/node_modules @rm -rf libs/node_modules libs/*/node_modules

View File

@ -12,6 +12,7 @@
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.5.3", "@biomejs/biome": "^2.5.3",
"happy-dom": "^20.10.6", "happy-dom": "^20.10.6",
"katex": "^0.16.22",
"typescript": "^7.0.2", "typescript": "^7.0.2",
"vite": "^8.1.3", "vite": "^8.1.3",
"vitest": "^4.1.10" "vitest": "^4.1.10"

17
libs/pnpm-lock.yaml generated
View File

@ -14,6 +14,9 @@ importers:
happy-dom: happy-dom:
specifier: ^20.10.6 specifier: ^20.10.6
version: 20.10.6 version: 20.10.6
katex:
specifier: ^0.16.22
version: 0.16.47
typescript: typescript:
specifier: ^7.0.2 specifier: ^7.0.2
version: 7.0.2 version: 7.0.2
@ -755,6 +758,10 @@ packages:
codemirror@6.0.2: codemirror@6.0.2:
resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==}
commander@8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
convert-source-map@2.0.0: convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
@ -808,6 +815,10 @@ packages:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
katex@0.16.47:
resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==}
hasBin: true
lightningcss-android-arm64@1.32.0: lightningcss-android-arm64@1.32.0:
resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
@ -1695,6 +1706,8 @@ snapshots:
'@codemirror/state': 6.7.1 '@codemirror/state': 6.7.1
'@codemirror/view': 6.43.6 '@codemirror/view': 6.43.6
commander@8.3.0: {}
convert-source-map@2.0.0: {} convert-source-map@2.0.0: {}
crelt@1.0.7: {} crelt@1.0.7: {}
@ -1739,6 +1752,10 @@ snapshots:
highlight.js@11.11.1: {} highlight.js@11.11.1: {}
katex@0.16.47:
dependencies:
commander: 8.3.0
lightningcss-android-arm64@1.32.0: lightningcss-android-arm64@1.32.0:
optional: true optional: true