Skip to content

Commit

Permalink
perf: reduce bundle size (closes #1607) (#1689)
Browse files Browse the repository at this point in the history
  • Loading branch information
aarnphm authored Jan 1, 2025
1 parent e3162f7 commit 2e6a675
Show file tree
Hide file tree
Showing 11 changed files with 94 additions and 578 deletions.
2 changes: 1 addition & 1 deletion docs/advanced/making plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ export const ContentPage: QuartzEmitterPlugin = () => {
const allFiles = content.map((c) => c[1].data)
for (const [tree, file] of content) {
const slug = canonicalizeServer(file.data.slug!)
const externalResources = pageResources(slug, resources)
const externalResources = pageResources(slug, file.data, resources)
const componentData: QuartzComponentProps = {
fileData: file.data,
externalResources,
Expand Down
599 changes: 52 additions & 547 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@
"mdast-util-find-and-replace": "^3.0.1",
"mdast-util-to-hast": "^13.2.0",
"mdast-util-to-string": "^4.0.0",
"mermaid": "^11.4.1",
"micromorph": "^0.4.5",
"pixi.js": "^8.6.6",
"preact": "^10.25.4",
Expand Down
1 change: 1 addition & 0 deletions quartz/components/Head.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ export default (() => {
<link rel="stylesheet" href={googleFontHref(cfg.theme)} />
</>
)}
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossOrigin={"anonymous"} />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{/* OG/Twitter meta tags */}
<meta name="og:site_name" content={cfg.pageTitle}></meta>
Expand Down
33 changes: 26 additions & 7 deletions quartz/components/renderPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import { visit } from "unist-util-visit"
import { Root, Element, ElementContent } from "hast"
import { GlobalConfiguration } from "../cfg"
import { i18n } from "../i18n"
// @ts-ignore
import mermaidScript from "./scripts/mermaid.inline"
import mermaidStyle from "./styles/mermaid.inline.scss"
import { QuartzPluginData } from "../plugins/vfile"

interface RenderComponents {
head: QuartzComponent
Expand All @@ -23,12 +27,13 @@ interface RenderComponents {
const headerRegex = new RegExp(/h[1-6]/)
export function pageResources(
baseDir: FullSlug | RelativeURL,
fileData: QuartzPluginData,
staticResources: StaticResources,
): StaticResources {
const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json")
const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())`

return {
const resources: StaticResources = {
css: [
{
content: joinSegments(baseDir, "index.css"),
Expand All @@ -48,14 +53,28 @@ export function pageResources(
script: contentIndexScript,
},
...staticResources.js,
{
src: joinSegments(baseDir, "postscript.js"),
loadTime: "afterDOMReady",
moduleType: "module",
contentType: "external",
},
],
}

if (fileData.hasMermaidDiagram) {
resources.js.push({
script: mermaidScript,
loadTime: "afterDOMReady",
moduleType: "module",
contentType: "inline",
})
resources.css.push({ content: mermaidStyle, inline: true })
}

// NOTE: we have to put this last to make sure spa.inline.ts is the last item.
resources.js.push({
src: joinSegments(baseDir, "postscript.js"),
loadTime: "afterDOMReady",
moduleType: "module",
contentType: "external",
})

return resources
}

export function renderPage(
Expand Down
8 changes: 7 additions & 1 deletion quartz/components/scripts/mermaid.inline.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { removeAllChildren } from "./util"
import mermaid from "mermaid"

interface Position {
x: number
Expand Down Expand Up @@ -144,6 +143,7 @@ const cssVars = [
"--codeFont",
] as const

let mermaidImport = undefined
document.addEventListener("nav", async () => {
const center = document.querySelector(".center") as HTMLElement
const nodes = center.querySelectorAll("code.mermaid") as NodeListOf<HTMLElement>
Expand All @@ -157,6 +157,12 @@ document.addEventListener("nav", async () => {
{} as Record<(typeof cssVars)[number], string>,
)

mermaidImport ||= await import(
//@ts-ignore
"https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.4.0/mermaid.esm.min.mjs"
)
const mermaid = mermaidImport.default

const darkMode = document.documentElement.getAttribute("saved-theme") === "dark"
mermaid.initialize({
startOnLoad: false,
Expand Down
2 changes: 1 addition & 1 deletion quartz/plugins/emitters/404.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ export const NotFoundPage: QuartzEmitterPlugin = () => {

const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`)
const path = url.pathname as FullSlug
const externalResources = pageResources(path, resources)
const notFound = i18n(cfg.locale).pages.error.title
const [tree, vfile] = defaultProcessedContent({
slug,
text: notFound,
description: notFound,
frontmatter: { title: notFound, tags: [] },
})
const externalResources = pageResources(path, vfile.data, resources)
const componentData: QuartzComponentProps = {
ctx,
fileData: vfile.data,
Expand Down
2 changes: 1 addition & 1 deletion quartz/plugins/emitters/contentPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export const ContentPage: QuartzEmitterPlugin<Partial<FullPageLayout>> = (userOp
containsIndex = true
}

const externalResources = pageResources(pathToRoot(slug), resources)
const externalResources = pageResources(pathToRoot(slug), file.data, resources)
const componentData: QuartzComponentProps = {
ctx,
fileData: file.data,
Expand Down
2 changes: 1 addition & 1 deletion quartz/plugins/emitters/folderPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ export const FolderPage: QuartzEmitterPlugin<Partial<FolderPageOptions>> = (user

for (const folder of folders) {
const slug = joinSegments(folder, "index") as FullSlug
const externalResources = pageResources(pathToRoot(slug), resources)
const [tree, file] = folderDescriptions[folder]
const externalResources = pageResources(pathToRoot(slug), file.data, resources)
const componentData: QuartzComponentProps = {
ctx,
fileData: file.data,
Expand Down
2 changes: 1 addition & 1 deletion quartz/plugins/emitters/tagPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ export const TagPage: QuartzEmitterPlugin<Partial<TagPageOptions>> = (userOpts)

for (const tag of tags) {
const slug = joinSegments("tags", tag) as FullSlug
const externalResources = pageResources(pathToRoot(slug), resources)
const [tree, file] = tagDescriptions[tag]
const externalResources = pageResources(pathToRoot(slug), file.data, resources)
const componentData: QuartzComponentProps = {
ctx,
fileData: file.data,
Expand Down
20 changes: 3 additions & 17 deletions quartz/plugins/transformers/ofm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ import { JSResource, CSSResource } from "../../util/resources"
import calloutScript from "../../components/scripts/callout.inline.ts"
// @ts-ignore
import checkboxScript from "../../components/scripts/checkbox.inline.ts"
// @ts-ignore
import mermaidExtensionScript from "../../components/scripts/mermaid.inline.ts"
import mermaidStyle from "../../components/styles/mermaid.inline.scss"
import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path"
import { toHast } from "mdast-util-to-hast"
import { toHtml } from "hast-util-to-html"
Expand Down Expand Up @@ -513,9 +510,10 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>>

if (opts.mermaid) {
plugins.push(() => {
return (tree: Root, _file) => {
return (tree: Root, file) => {
visit(tree, "code", (node: Code) => {
if (node.lang === "mermaid") {
file.data.hasMermaidDiagram = true
node.data = {
hProperties: {
className: ["mermaid"],
Expand Down Expand Up @@ -813,19 +811,6 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>>
})
}

if (opts.mermaid) {
js.push({
script: mermaidExtensionScript,
loadTime: "afterDOMReady",
moduleType: "module",
contentType: "inline",
})
css.push({
content: mermaidStyle,
inline: true,
})
}

return { js, css }
},
}
Expand All @@ -835,5 +820,6 @@ declare module "vfile" {
interface DataMap {
blocks: Record<string, Element>
htmlAst: HtmlRoot
hasMermaidDiagram: boolean | undefined
}
}

0 comments on commit 2e6a675

Please sign in to comment.