0
Fork 0
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:
Bjorn Lu 2024-04-08 18:53:50 +08:00 committed by GitHub
parent 903ed31b2a
commit fa0f593890
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 43 additions and 3 deletions

View file

@ -0,0 +1,5 @@
---
"astro": patch
---
Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option

View file

@ -17,18 +17,31 @@ export function vitePluginScripts(internals: BuildInternals): VitePlugin {
},
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
if (
output.type === 'chunk' &&
output.facadeModuleId &&
internals.discoveredScripts.has(output.facadeModuleId) &&
!importedIds.has(output.fileName) &&
output.imports.length === 0 &&
output.dynamicImports.length === 0 &&
shouldInlineAsset(output.code, output.fileName, assetInlineLimit)
) {
internals.inlinedScripts.set(output.facadeModuleId, output.code.trim());
delete bundle[id];
delete bundle[output.fileName];
}
}
},

View file

@ -0,0 +1 @@
<script src="./script.ts"></script>

View file

@ -0,0 +1,4 @@
<script>
import './script.ts';
console.log('shared-script B');
</script>

View file

@ -0,0 +1 @@
console.log('shared-scripts');

View file

@ -0,0 +1,7 @@
---
import A from '../components/shared-scripts/A.astro'
import B from '../components/shared-scripts/B.astro'
---
<A />
<B />

View file

@ -71,12 +71,21 @@ describe('Hoisted Imports', () => {
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 $ = cheerio.load(html);
const scripts = $('script');
assert.equal(scripts.length, 1);
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);
});
});
});