2
0
Эх сурвалжийг харах

perf(app): shared terminal ghostty-web instance

adamelmore 3 долоо хоног өмнө
parent
commit
27bb82761b

+ 18 - 3
packages/app/src/components/terminal.tsx

@@ -16,6 +16,19 @@ export interface TerminalProps extends ComponentProps<"div"> {
   onConnectError?: (error: unknown) => void
   onConnectError?: (error: unknown) => void
 }
 }
 
 
+let shared: Promise<{ mod: typeof import("ghostty-web"); ghostty: Ghostty }> | undefined
+
+const loadGhostty = () => {
+  if (shared) return shared
+  shared = import("ghostty-web")
+    .then(async (mod) => ({ mod, ghostty: await mod.Ghostty.load() }))
+    .catch((err) => {
+      shared = undefined
+      throw err
+    })
+  return shared
+}
+
 type TerminalColors = {
 type TerminalColors = {
   background: string
   background: string
   foreground: string
   foreground: string
@@ -53,7 +66,6 @@ export const Terminal = (props: TerminalProps) => {
   let handleResize: () => void
   let handleResize: () => void
   let handleTextareaFocus: () => void
   let handleTextareaFocus: () => void
   let handleTextareaBlur: () => void
   let handleTextareaBlur: () => void
-  let reconnect: number | undefined
   let disposed = false
   let disposed = false
 
 
   const getTerminalColors = (): TerminalColors => {
   const getTerminalColors = (): TerminalColors => {
@@ -112,8 +124,11 @@ export const Terminal = (props: TerminalProps) => {
 
 
   onMount(() => {
   onMount(() => {
     const run = async () => {
     const run = async () => {
-      const mod = await import("ghostty-web")
-      ghostty = await mod.Ghostty.load()
+      const loaded = await loadGhostty()
+      if (disposed) return
+
+      const mod = loaded.mod
+      ghostty = loaded.ghostty
 
 
       const once = { value: false }
       const once = { value: false }