mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 18:34:02 +00:00
loadBundledJson's callers passed a literal JSON import as a Node fallback, which made the production build emit a JavaScript copy of every pack beside the JSON the browser fetches. The loader now reads file: URLs itself under Node (through process.getBuiltinModule, synchronously, as promptly as the cached import it replaces), and the callers pass only the URL. On a Node too old to provide getBuiltinModule it says that Node 24.14 or newer is needed. dist/ drops from 54 MB to 42 MB. A test keeps app code from importing a pack as a module. Co-Authored-By: Claude Opus 5.5 <[email protected]>
45 lines
1.9 KiB
JavaScript
45 lines
1.9 KiB
JavaScript
/**
|
|
* @file Load a JSON file shipped beside the source modules.
|
|
*
|
|
* The browser fetches the file from `url` — a `new URL('./….json',
|
|
* import.meta.url)` written in the calling module, which Vite serves as-is in
|
|
* dev and emits as an asset in the production build. Under Node (node:test)
|
|
* that URL is a `file:` URL, which `fetch` cannot read, so the file is read
|
|
* from disk instead.
|
|
*
|
|
* Nothing here imports the JSON as a module. A JSON-attributed import cannot
|
|
* serve the browser (the Vite dev server answers it with a JavaScript module,
|
|
* which the browser rejects), and a literal `import('./….json')` makes the
|
|
* production build emit a JavaScript copy of every pack that the browser
|
|
* never loads.
|
|
*
|
|
* @module data/bundledJson
|
|
*/
|
|
|
|
/**
|
|
* @param {URL} url - Resolved against the calling module's `import.meta.url`.
|
|
* @param {{signal?: AbortSignal}} [options]
|
|
* @returns {Promise<any>} The parsed JSON.
|
|
*/
|
|
export async function loadBundledJson(url, { signal } = {}) {
|
|
signal?.throwIfAborted();
|
|
if (url.protocol === 'file:') {
|
|
// Node's built-in, reached without an import, so the browser build never
|
|
// bundles or rewrites it; only Node, reading `file:` URLs, gets here. The
|
|
// read is synchronous so the result settles as promptly as the cached
|
|
// module import it replaces; callers already memoize each pack.
|
|
const getBuiltinModule = globalThis.process?.getBuiltinModule;
|
|
if (typeof getBuiltinModule !== 'function')
|
|
throw new Error(
|
|
`God's Eye View needs Node 24.14 or newer to read ${url.pathname.split('/').pop()} (running ${globalThis.process?.version ?? 'an unknown runtime'})`,
|
|
);
|
|
const { readFileSync } = getBuiltinModule('node:fs');
|
|
return JSON.parse(readFileSync(url, 'utf8'));
|
|
}
|
|
const response = await fetch(url, { signal });
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP ${response.status} for ${url.pathname}`);
|
|
}
|
|
return response.json();
|
|
}
|