mermaid-js / mermaid-cli

Command line tool for the Mermaid library
MIT License
2.2k stars 207 forks source link

perf: skip inlining fonts #699

Open aloisklink opened 3 weeks ago

aloisklink commented 3 weeks ago

:bookmark_tabs: Summary

Currently, when we run yarn to build the dist/index.html, we're inlining all the JavaScript, CSS, and FontAwesome/KaTeX fonts into one massive dist/index.html file.

However, this isn't very efficient, since the fonts are stored in the dist/index.html file as base64, which adds a lot of storage and parsing time.

Disabling this makes the code about 10% faster for me (tests run in 110s instead of 120s), and the size on the bundle went from 4MiB to 3.5MiB.

:straight_ruler: Design Decisions

We were previously using the vite-plugin-singlefile tool, since Puppeteer can't import ESM JavaScript modules, which the @mermaid-js/mermaid-zenuml package is.

However, I wrote a super tiny Vite plugin to output all JavaScript in the IIFE format (and changed index.html to import the file as an IFFE), and it all seems to work fine!

npm pack output

Before

One massive dist/index.html file that is 4.8 MB!

npm notice
npm notice šŸ“¦  @mermaid-js/mermaid-cli@10.9.1
npm notice === Tarball Contents ===
npm notice 1.1kB   LICENSE
npm notice 7.3kB   README.md
npm notice 64B     dist-types/src/cli.d.ts
npm notice 103B    dist-types/src/cli.d.ts.map
npm notice 4.8kB   dist-types/src/index.d.ts
npm notice 774B    dist-types/src/index.d.ts.map
npm notice 747.9kB dist/assets/fa-brands-400-a3b98177.svg
npm notice 144.7kB dist/assets/fa-regular-400-be0a0849.svg
npm notice 919.0kB dist/assets/fa-solid-900-9674eb1b.svg
npm notice 4.8MB   dist/index.html
npm notice 1.6kB   package.json
npm notice 177B    src/cli.js
npm notice 20.0kB  src/index.js
npm notice === Tarball Details ===
npm notice name:          @mermaid-js/mermaid-cli
npm notice version:       10.9.1
npm notice filename:      mermaid-js-mermaid-cli-10.9.1.tgz
npm notice package size:  3.0 MB
npm notice unpacked size: 6.6 MB
npm notice shasum:        1b4be5539206db506c264a6c3162dc51ec6e0ff2
npm notice integrity:     sha512-SEo2XQtMVWP+A[...]oMt2vBpx+ZGZw==
npm notice total files:   13
npm notice

After

Lots of small dist/asserts/* font files that take up less space overall.

npm notice
npm notice šŸ“¦  @mermaid-js/mermaid-cli@10.9.1
npm notice === Tarball Contents ===
npm notice 1.1kB   LICENSE
npm notice 7.3kB   README.md
npm notice 64B     dist-types/src/cli.d.ts
npm notice 103B    dist-types/src/cli.d.ts.map
npm notice 4.8kB   dist-types/src/index.d.ts
npm notice 774B    dist-types/src/index.d.ts.map
npm notice 76.7kB  dist/assets/fa-brands-400-8ea87917.woff2
npm notice 747.9kB dist/assets/fa-brands-400-a3b98177.svg
npm notice 134.0kB dist/assets/fa-brands-400-cda59d6e.ttf
npm notice 134.3kB dist/assets/fa-brands-400-e4299464.eot
npm notice 90.0kB  dist/assets/fa-brands-400-f9217f66.woff
npm notice 34.0kB  dist/assets/fa-regular-400-79d08806.eot
npm notice 144.7kB dist/assets/fa-regular-400-be0a0849.svg
npm notice 16.3kB  dist/assets/fa-regular-400-cb9e9e69.woff
npm notice 13.2kB  dist/assets/fa-regular-400-e42a8844.woff2
npm notice 33.7kB  dist/assets/fa-regular-400-e8711bbb.ttf
npm notice 101.6kB dist/assets/fa-solid-900-3f6d3488.woff
npm notice 203.0kB dist/assets/fa-solid-900-373c04fd.eot
npm notice 919.0kB dist/assets/fa-solid-900-9674eb1b.svg
npm notice 78.3kB  dist/assets/fa-solid-900-9834b82a.woff2
npm notice 202.7kB dist/assets/fa-solid-900-af639750.ttf
npm notice 1.4MB   dist/assets/index-594c3b64.js
npm notice 28.1kB  dist/assets/KaTeX_AMS-Regular-0cdd387c.woff2
npm notice 33.5kB  dist/assets/KaTeX_AMS-Regular-30da91e8.woff
npm notice 63.6kB  dist/assets/KaTeX_AMS-Regular-68534840.ttf
npm notice 7.7kB   dist/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff
npm notice 12.4kB  dist/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf
npm notice 6.9kB   dist/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2
npm notice 6.9kB   dist/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2
npm notice 7.7kB   dist/assets/KaTeX_Caligraphic-Regular-3398dd02.woff
npm notice 12.3kB  dist/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf
npm notice 13.3kB  dist/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff
npm notice 19.6kB  dist/assets/KaTeX_Fraktur-Bold-9163df9c.ttf
npm notice 11.3kB  dist/assets/KaTeX_Fraktur-Bold-74444efd.woff2
npm notice 19.6kB  dist/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf
npm notice 13.2kB  dist/assets/KaTeX_Fraktur-Regular-5e28753b.woff
npm notice 11.3kB  dist/assets/KaTeX_Fraktur-Regular-51814d27.woff2
npm notice 25.3kB  dist/assets/KaTeX_Main-Bold-0f60d1b8.woff2
npm notice 51.3kB  dist/assets/KaTeX_Main-Bold-138ac28d.ttf
npm notice 29.9kB  dist/assets/KaTeX_Main-Bold-c76c5d69.woff
npm notice 33.0kB  dist/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf
npm notice 16.8kB  dist/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2
npm notice 19.4kB  dist/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff
npm notice 33.6kB  dist/assets/KaTeX_Main-Italic-0d85ae7c.ttf
npm notice 17.0kB  dist/assets/KaTeX_Main-Italic-97479ca6.woff2
npm notice 19.7kB  dist/assets/KaTeX_Main-Italic-f1d6ef86.woff
npm notice 26.3kB  dist/assets/KaTeX_Main-Regular-c2342cd8.woff2
npm notice 30.8kB  dist/assets/KaTeX_Main-Regular-c6368d87.woff
npm notice 53.6kB  dist/assets/KaTeX_Main-Regular-d0332f52.ttf
npm notice 18.7kB  dist/assets/KaTeX_Math-BoldItalic-850c0af5.woff
npm notice 16.4kB  dist/assets/KaTeX_Math-BoldItalic-dc47344d.woff2
npm notice 31.2kB  dist/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf
npm notice 16.4kB  dist/assets/KaTeX_Math-Italic-7af58c5e.woff2
npm notice 18.7kB  dist/assets/KaTeX_Math-Italic-8a8d2445.woff
npm notice 31.3kB  dist/assets/KaTeX_Math-Italic-08ce98e5.ttf
npm notice 24.5kB  dist/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf
npm notice 12.2kB  dist/assets/KaTeX_SansSerif-Bold-e99ae511.woff2
npm notice 14.4kB  dist/assets/KaTeX_SansSerif-Bold-ece03cfd.woff
npm notice 12.0kB  dist/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2
npm notice 14.1kB  dist/assets/KaTeX_SansSerif-Italic-91ee6750.woff
npm notice 22.4kB  dist/assets/KaTeX_SansSerif-Italic-3931dd81.ttf
npm notice 12.3kB  dist/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff
npm notice 10.3kB  dist/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2
npm notice 19.4kB  dist/assets/KaTeX_SansSerif-Regular-f36ea897.ttf
npm notice 16.6kB  dist/assets/KaTeX_Script-Regular-1c67f068.ttf
npm notice 9.6kB   dist/assets/KaTeX_Script-Regular-036d4e95.woff2
npm notice 10.6kB  dist/assets/KaTeX_Script-Regular-d96cdf2b.woff
npm notice 5.5kB   dist/assets/KaTeX_Size1-Regular-6b47c401.woff2
npm notice 12.2kB  dist/assets/KaTeX_Size1-Regular-95b6d2f1.ttf
npm notice 6.5kB   dist/assets/KaTeX_Size1-Regular-c943cc98.woff
npm notice 6.2kB   dist/assets/KaTeX_Size2-Regular-2014c523.woff
npm notice 11.5kB  dist/assets/KaTeX_Size2-Regular-a6b2099f.ttf
npm notice 5.2kB   dist/assets/KaTeX_Size2-Regular-d04c5421.woff2
npm notice 4.4kB   dist/assets/KaTeX_Size3-Regular-6ab6b62e.woff
npm notice 7.6kB   dist/assets/KaTeX_Size3-Regular-500e04d5.ttf
npm notice 6.0kB   dist/assets/KaTeX_Size4-Regular-99f9c675.woff
npm notice 4.9kB   dist/assets/KaTeX_Size4-Regular-a4af7d41.woff2
npm notice 10.4kB  dist/assets/KaTeX_Size4-Regular-c647367d.ttf
npm notice 13.6kB  dist/assets/KaTeX_Typewriter-Regular-71d517d6.woff2
npm notice 16.0kB  dist/assets/KaTeX_Typewriter-Regular-e14fed02.woff
npm notice 27.6kB  dist/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf
npm notice 140B    dist/index.html
npm notice 1.5kB   package.json
npm notice 177B    src/cli.js
npm notice 20.0kB  src/index.js
npm notice === Tarball Details ===
npm notice name:          @mermaid-js/mermaid-cli
npm notice version:       10.9.1
npm notice filename:      mermaid-js-mermaid-cli-10.9.1.tgz
npm notice package size:  2.5 MB
npm notice unpacked size: 5.4 MB
npm notice shasum:        e3269cdfbc7a64283b60ad8820c7becb719b1461
npm notice integrity:     sha512-JvuJOhfGsVLxy[...]ce9fDIZ9Ee69Q==
npm notice total files:   85
npm notice

:clipboard: Tasks

Make sure you