mirror of
https://github.com/withastro/astro.git
synced 2025-02-17 22:44:24 -05:00
Fix script inline with directRenderScript (#10686)
This commit is contained in:
parent
903ed31b2a
commit
fa0f593890
7 changed files with 43 additions and 3 deletions
5
.changeset/sour-chairs-compare.md
Normal file
5
.changeset/sour-chairs-compare.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
"astro": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option
|
|
@ -17,18 +17,31 @@ export function vitePluginScripts(internals: BuildInternals): VitePlugin {
|
||||||
},
|
},
|
||||||
|
|
||||||
async generateBundle(_options, bundle) {
|
async generateBundle(_options, bundle) {
|
||||||
for (const [id, output] of Object.entries(bundle)) {
|
const outputs = Object.values(bundle);
|
||||||
|
|
||||||
|
// Track ids that are imported by chunks so we don't inline scripts that are imported
|
||||||
|
const importedIds = new Set<string>();
|
||||||
|
for (const output of outputs) {
|
||||||
|
if (output.type === 'chunk') {
|
||||||
|
for (const id of output.imports) {
|
||||||
|
importedIds.add(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const output of outputs) {
|
||||||
// Try to inline scripts that don't import anything as is within the inline limit
|
// Try to inline scripts that don't import anything as is within the inline limit
|
||||||
if (
|
if (
|
||||||
output.type === 'chunk' &&
|
output.type === 'chunk' &&
|
||||||
output.facadeModuleId &&
|
output.facadeModuleId &&
|
||||||
internals.discoveredScripts.has(output.facadeModuleId) &&
|
internals.discoveredScripts.has(output.facadeModuleId) &&
|
||||||
|
!importedIds.has(output.fileName) &&
|
||||||
output.imports.length === 0 &&
|
output.imports.length === 0 &&
|
||||||
output.dynamicImports.length === 0 &&
|
output.dynamicImports.length === 0 &&
|
||||||
shouldInlineAsset(output.code, output.fileName, assetInlineLimit)
|
shouldInlineAsset(output.code, output.fileName, assetInlineLimit)
|
||||||
) {
|
) {
|
||||||
internals.inlinedScripts.set(output.facadeModuleId, output.code.trim());
|
internals.inlinedScripts.set(output.facadeModuleId, output.code.trim());
|
||||||
delete bundle[id];
|
delete bundle[output.fileName];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
1
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro
vendored
Normal file
1
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/A.astro
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<script src="./script.ts"></script>
|
4
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro
vendored
Normal file
4
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/B.astro
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<script>
|
||||||
|
import './script.ts';
|
||||||
|
console.log('shared-script B');
|
||||||
|
</script>
|
1
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts
vendored
Normal file
1
packages/astro/test/fixtures/hoisted-imports/src/components/shared-scripts/script.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log('shared-scripts');
|
7
packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro
vendored
Normal file
7
packages/astro/test/fixtures/hoisted-imports/src/pages/no-inline-if-shared.astro
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
import A from '../components/shared-scripts/A.astro'
|
||||||
|
import B from '../components/shared-scripts/B.astro'
|
||||||
|
---
|
||||||
|
|
||||||
|
<A />
|
||||||
|
<B />
|
|
@ -71,12 +71,21 @@ describe('Hoisted Imports', () => {
|
||||||
assert.equal($('script').length, 1);
|
assert.equal($('script').length, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('inlines if script is larger than vite.assetInlineLimit: 100', async () => {
|
it('does not inline if script is larger than vite.assetInlineLimit: 100', async () => {
|
||||||
const html = await fixture.readFile('/no-inline/index.html');
|
const html = await fixture.readFile('/no-inline/index.html');
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html);
|
||||||
const scripts = $('script');
|
const scripts = $('script');
|
||||||
assert.equal(scripts.length, 1);
|
assert.equal(scripts.length, 1);
|
||||||
assert.ok(scripts[0].attribs.src);
|
assert.ok(scripts[0].attribs.src);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not inline if script it has shared chunks', async () => {
|
||||||
|
const html = await fixture.readFile('/no-inline-if-shared/index.html');
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
const scripts = $('script');
|
||||||
|
assert.equal(scripts.length, 2);
|
||||||
|
assert.ok(scripts[0].attribs.src);
|
||||||
|
assert.ok(scripts[1].attribs.src);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue