FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

fix(vite): replace the browser preload helper before esbuild minifies… · NativeScript/NativeScript@9388630 · GitHub

Commit 9388630

Browse files
fix(vite): replace the browser preload helper before esbuild minifies it (#11425)
closes #11423 [skip ci]
1 parent 9b9043a commit 9388630

2 files changed

Lines changed: 28 additions & 6 deletions

File tree

‎packages/vite/helpers/dynamic-import-plugin.spec.ts‎

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, it } from 'vitest';
2-
import { transformDynamicImports } from './dynamic-import-plugin.js';
2+
import { dynamicImportPlugin, transformDynamicImports } from './dynamic-import-plugin.js';
33

44
const vitePreloadHelper = `const scriptRel = /* @__PURE__ */ (function detectScriptRel() {
55
const relList = typeof document !== "undefined" && document.createElement("link").relList;
@@ -37,4 +37,23 @@ describe('dynamic import plugin', () => {
3737
const source = 'export const value = 42;';
3838
expect(transformDynamicImports(source)).toBe(source);
3939
});
40+
41+
// Minified builds rename __vitePreload before generateBundle; the browser
42+
// helper then survived and its window.dispatchEvent masked every dynamic
43+
// import failure as "window is not defined".
44+
it('replaces the helper in renderChunk as a post plugin, ahead of esbuild minification', () => {
45+
const plugin = dynamicImportPlugin() as any;
46+
expect(plugin.enforce).toBe('post');
47+
expect(plugin.generateBundle).toBeUndefined();
48+
const result = plugin.renderChunk(`${vitePreloadHelper}\nconst page = () => __vitePreload(() => import('./page.js'), []);`);
49+
expect(result.code).not.toContain('document');
50+
expect(result.code).toContain("import('~/page.js')");
51+
});
52+
53+
it('returns null from renderChunk when nothing changes, including on already-transformed code', () => {
54+
const plugin = dynamicImportPlugin() as any;
55+
expect(plugin.renderChunk('export const value = 42;')).toBeNull();
56+
const once = transformDynamicImports(`${vitePreloadHelper}\nexport const page = () => __vitePreload(() => import('./page.js'), []);`);
57+
expect(plugin.renderChunk(once)).toBeNull();
58+
});
4059
});

‎packages/vite/helpers/dynamic-import-plugin.ts‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,18 @@ export function transformDynamicImports(code: string) {
6262
// Fix NativeScript dynamic imports by transforming paths and simplifying __vitePreload.
6363
// Vite still emits its browser preload helper when modulePreload is disabled:
6464
// https://github.com/vitejs/vite/issues/13952
65+
// Runs in renderChunk as a post plugin: user post plugins precede Vite's
66+
// esbuild minifier, so `__vitePreload` is still named when we look for it.
6567
export function dynamicImportPlugin() {
6668
return {
6769
name: 'nativescript-dynamic-import-fix',
68-
generateBundle(_options, bundle) {
69-
for (const chunk of Object.values(bundle) as any) {
70-
if (chunk.type === 'chunk') {
71-
chunk.code = transformDynamicImports(chunk.code);
72-
}
70+
enforce: 'post' as const,
71+
renderChunk(code: string) {
72+
const transformed = transformDynamicImports(code);
73+
if (transformed === code) {
74+
return null;
7375
}
76+
return { code: transformed, map: null };
7477
},
7578
};
7679
}

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL