feat(experimental): partial rebuilds (#716)
This commit is contained in:
		@@ -14,6 +14,7 @@ import { googleFontHref, joinStyles } from "../../util/theme"
 | 
			
		||||
import { Features, transform } from "lightningcss"
 | 
			
		||||
import { transform as transpile } from "esbuild"
 | 
			
		||||
import { write } from "./helpers"
 | 
			
		||||
import DepGraph from "../../depgraph"
 | 
			
		||||
 | 
			
		||||
type ComponentResources = {
 | 
			
		||||
  css: string[]
 | 
			
		||||
@@ -149,9 +150,10 @@ function addGlobalPageResources(
 | 
			
		||||
      loadTime: "afterDOMReady",
 | 
			
		||||
      contentType: "inline",
 | 
			
		||||
      script: `
 | 
			
		||||
        const socket = new WebSocket('${wsUrl}')
 | 
			
		||||
        socket.addEventListener('message', () => document.location.reload())
 | 
			
		||||
      `,
 | 
			
		||||
          const socket = new WebSocket('${wsUrl}')
 | 
			
		||||
          // reload(true) ensures resources like images and scripts are fetched again in firefox
 | 
			
		||||
          socket.addEventListener('message', () => document.location.reload(true))
 | 
			
		||||
        `,
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -171,6 +173,24 @@ export const ComponentResources: QuartzEmitterPlugin<Options> = (opts?: Partial<
 | 
			
		||||
    getQuartzComponents() {
 | 
			
		||||
      return []
 | 
			
		||||
    },
 | 
			
		||||
    async getDependencyGraph(ctx, content, _resources) {
 | 
			
		||||
      // This emitter adds static resources to the `resources` parameter. One
 | 
			
		||||
      // important resource this emitter adds is the code to start a websocket
 | 
			
		||||
      // connection and listen to rebuild messages, which triggers a page reload.
 | 
			
		||||
      // The resources parameter with the reload logic is later used by the
 | 
			
		||||
      // ContentPage emitter while creating the final html page. In order for
 | 
			
		||||
      // the reload logic to be included, and so for partial rebuilds to work,
 | 
			
		||||
      // we need to run this emitter for all markdown files.
 | 
			
		||||
      const graph = new DepGraph<FilePath>()
 | 
			
		||||
 | 
			
		||||
      for (const [_tree, file] of content) {
 | 
			
		||||
        const sourcePath = file.data.filePath!
 | 
			
		||||
        const slug = file.data.slug!
 | 
			
		||||
        graph.addEdge(sourcePath, joinSegments(ctx.argv.output, slug + ".html") as FilePath)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return graph
 | 
			
		||||
    },
 | 
			
		||||
    async emit(ctx, _content, resources): Promise<FilePath[]> {
 | 
			
		||||
      const promises: Promise<FilePath>[] = []
 | 
			
		||||
      const cfg = ctx.cfg.configuration
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user