Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Load a Prism grammar only when a blob names it

1b8675b19e70346d6d02d5fc0c10538f50bf94b2 · Keenan Nemetz · 9d ago · parent 11720250

Load a Prism grammar only when a blob names it

The worker imported prism-languages.min.js — every grammar Prism ships — on
every code page. That is 546 KB to evaluate before the first token, and a page
showing one Go file paid it for all 293 components.

Each component is now vendored as its own file, and prism-manifest.js maps a
language name to the files that define it in dependency order. The worker
starts with Prism's core and the manifest and imports a language's files the
first time a job names it, remembering what it has run so a file is never
imported twice. A Go blob loads 30 KB instead of 564 KB; a .tsx blob, the
widest common entry at 8 files, loads 49 KB.

The manifest also carries the components that register no language of their
own but change one: css-extras, js-extras, js-templates, php-extras, xml-doc.
Each is placed after the grammar it rewrites and included in the entries that
inherit it, so a language that extends javascript now gets js-extras' arrow
and maybe-class-name tokens too. The old bundle's order handed those to some
inheriting languages and not others; nothing loses a token.

scripts/vendor-prism.py writes the grammars and the manifest, and --check
compares them byte for byte with cdnjs. TestPrismLanguagesAreVendored,
TestPrismGrammarsMatchTheManifest and TestPrismWorkerLoadsGrammarsOnDemand
hold the server's extension table, the vendored set and the worker's lazy
import together.

docs/operations.md +3−3

@@ -202,9 +202,9 @@ the linked sections explain each in full.
202 202 - **Compression is already here.** Forge pages, hosted sites, the stylesheet,
203 203 scripts and source blobs are gzipped when the client asks for it, so a proxy in
204 204 front should not compress them again: double compression costs CPU and hides
205 the `ETag` revalidation that keeps the 545 KB Prism bundle to one download per
206 browser. Archives, LFS objects, Git responses and ranged downloads are passed
207 through untouched.
205 the `ETag` revalidation that keeps the shared scripts and each Prism grammar to
206 one download per browser. Archives, LFS objects, Git responses and ranged
207 downloads are passed through untouched.
208 208 - **SSH firewalled.** The SSH listener is the only write transport and the only
209 209 place an account is authenticated. Expose it to the people who push, not to the
210 210 internet at large, and leave it on a port other than 22 unless you also run