Revert "Inline define:var styles rendered after the head"

This reverts commit 65e2b71b80.
This commit is contained in:
Matthew Phillips 2022-06-27 09:08:40 -04:00
parent 65e2b71b80
commit c8dda94125
4 changed files with 4 additions and 48 deletions

View file

@ -183,26 +183,7 @@ export async function renderComponent(
} }
if (Component && (Component as any).isAstroComponentFactory) { if (Component && (Component as any).isAstroComponentFactory) {
async function * renderAstroComponentInline(): AsyncGenerator<string, void, undefined> { return renderToIterable(result, Component as any, _props, slots);
let iterable = await renderToIterable(result, Component as any, _props, slots);
// If this component added any define:vars styles and the head has already been
// sent out, we need to include those inline.
if(result.styles.size && alreadyHeadRenderedResults.has(result)) {
let styles = Array.from(result.styles);
result.styles.clear();
for(const style of styles) {
if('define:vars' in style.props) {
// We only want to render the property value and not the full stylesheet
// which is bundled in the head.
style.children = '';
yield markHTMLString(renderElement('style', style));
}
}
}
yield * iterable;
}
return renderAstroComponentInline();
} }
if (!Component && !_props['client:only']) { if (!Component && !_props['client:only']) {
@ -427,7 +408,6 @@ If you're still stuck, please open an issue on GitHub or join us at https://astr
island.children = `${html ?? ''}${template}`; island.children = `${html ?? ''}${template}`;
// Scripts to prepend
let prescriptType: PrescriptType = needsHydrationScript let prescriptType: PrescriptType = needsHydrationScript
? 'both' ? 'both'
: needsDirectiveScript : needsDirectiveScript
@ -435,7 +415,7 @@ If you're still stuck, please open an issue on GitHub or join us at https://astr
: null; : null;
let prescripts = getPrescripts(prescriptType, hydration.directive); let prescripts = getPrescripts(prescriptType, hydration.directive);
return markHTMLString(prestyles + prescripts + renderElement('astro-island', island, false)); return markHTMLString(prescripts + renderElement('astro-island', island, false));
} }
/** Create the Astro.fetchContent() runtime function. */ /** Create the Astro.fetchContent() runtime function. */
@ -739,8 +719,6 @@ export async function renderHead(result: SSRResult): Promise<string> {
const styles = Array.from(result.styles) const styles = Array.from(result.styles)
.filter(uniqueElements) .filter(uniqueElements)
.map((style) => renderElement('style', style)); .map((style) => renderElement('style', style));
// Clear result.styles so that any new styles added will be inlined.
result.styles.clear();
const scripts = Array.from(result.scripts) const scripts = Array.from(result.scripts)
.filter(uniqueElements) .filter(uniqueElements)
.map((script, i) => { .map((script, i) => {

View file

@ -22,7 +22,7 @@ describe('Directives', async () => {
const html = await fixture.readFile('/define-vars/index.html'); const html = await fixture.readFile('/define-vars/index.html');
const $ = cheerio.load(html); const $ = cheerio.load(html);
expect($('style')).to.have.lengthOf(2); expect($('style')).to.have.lengthOf(1);
expect($('style').toString()).to.include('--bg: white;'); expect($('style').toString()).to.include('--bg: white;');
expect($('style').toString()).to.include('--fg: black;'); expect($('style').toString()).to.include('--fg: black;');
@ -31,18 +31,9 @@ describe('Directives', async () => {
.split(' ') .split(' ')
.find((name) => /^astro-[A-Za-z0-9-]+/.test(name)); .find((name) => /^astro-[A-Za-z0-9-]+/.test(name));
expect($($('style').get(0)).toString().replace(/\s+/g, '')).to.equal( expect($('style').toString().replace(/\s+/g, '')).to.equal(
`<style>.${scopedClass}{--bg:white;--fg:black;}body{background:var(--bg);color:var(--fg)}</style>` `<style>.${scopedClass}{--bg:white;--fg:black;}body{background:var(--bg);color:var(--fg)}</style>`
); );
const scopedTitleClass = $('.title')
.attr('class')
.split(' ')
.find((name) => /^astro-[A-Za-z0-9-]+/.test(name));
expect($($('style').get(1)).toString().replace(/\s+/g, '')).to.equal(
`<style>.${scopedTitleClass}{--textColor:red;}</style>`
);
}); });
it('set:html', async () => { it('set:html', async () => {

View file

@ -1,10 +0,0 @@
---
const textColor = 'red'
---
<h1 class="title">hello there</h1>
<style define:vars={{textColor: textColor}}>
.title {
color: var(--textColor);
}
</style>

View file

@ -1,5 +1,4 @@
--- ---
import Title from "../components/Title.astro"
let foo = 'bar' let foo = 'bar'
let bg = 'white' let bg = 'white'
let fg = 'black' let fg = 'black'
@ -18,7 +17,5 @@ let fg = 'black'
<script id="inline" define:vars={{ foo }}> <script id="inline" define:vars={{ foo }}>
console.log(foo); console.log(foo);
</script> </script>
<Title />
</body> </body>
</html> </html>