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) {
|
||||
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];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
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);
|
||||
});
|
||||
|
||||
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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue