Skip to content

Commit

Permalink
Fix script inline with directRenderScript (#10686)
Browse files Browse the repository at this point in the history
  • Loading branch information
bluwy authored Apr 8, 2024
1 parent 903ed31 commit fa0f593
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .changeset/sour-chairs-compare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"astro": patch
---

Prevents inlining scripts if used by other chunks when using the `experimental.directRenderScript` option
17 changes: 15 additions & 2 deletions packages/astro/src/core/build/plugins/plugin-scripts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<script src="./script.ts"></script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<script>
import './script.ts';
console.log('shared-script B');
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log('shared-scripts');
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
import A from '../components/shared-scripts/A.astro'
import B from '../components/shared-scripts/B.astro'
---

<A />
<B />
11 changes: 10 additions & 1 deletion packages/astro/test/hoisted-imports.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
});
});

0 comments on commit fa0f593

Please sign in to comment.