Skip to content

Commit 2c85df4

Browse files
committed
fix: don't emit script before qwik style element
1 parent f74286c commit 2c85df4

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

.changeset/large-turtles-write.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/core': patch
3+
---
4+
5+
fix: don't emit script before qwik style element
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { describe, it, expect, vi } from 'vitest';
2+
import { ssrCreateContainer } from './ssr-container';
3+
import { QStyle } from './qwik-copy';
4+
5+
vi.hoisted(() => {
6+
vi.stubGlobal('QWIK_LOADER_DEFAULT_MINIFIED', 'min');
7+
vi.stubGlobal('QWIK_LOADER_DEFAULT_DEBUG', 'debug');
8+
});
9+
10+
describe('SSR Container', () => {
11+
it('should not emit Qwik loader before style elements', async () => {
12+
const writer = {
13+
chunks: [] as string[],
14+
write(text: string) {
15+
this.chunks.push(text);
16+
},
17+
toString() {
18+
return this.chunks.join('');
19+
},
20+
};
21+
22+
const container = ssrCreateContainer({
23+
tagName: 'div',
24+
writer,
25+
renderOptions: {
26+
qwikLoader: 'inline', // Force inline loader
27+
},
28+
});
29+
30+
// Open container
31+
container.openContainer();
32+
// Add a large content to exceed 30KB while opening the next element
33+
const largeContent = 'x'.repeat(30 * 1024);
34+
container.openElement('div', null);
35+
container.textNode(largeContent);
36+
await container.closeElement();
37+
// Add a style element with QStyle attribute
38+
container.openElement('style', [QStyle, 'my-style-id']);
39+
container.write('.my-class { color: red; }');
40+
await container.closeElement();
41+
// Add another regular elementm
42+
container.openElement('div', null);
43+
await container.closeElement();
44+
await container.closeContainer();
45+
46+
const html = writer.toString();
47+
expect(html.indexOf('id="qwikloader"')).toBeGreaterThan(html.indexOf('my-style-id'));
48+
});
49+
});

packages/qwik/src/server/ssr-container.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,15 @@ class SSRContainer extends _SharedContainer implements ISSRContainer {
393393
constAttrs?: SsrAttrs | null,
394394
currentFile?: string | null
395395
): string | undefined {
396-
if (this.qlInclude === QwikLoaderInclude.Inline) {
396+
const isQwikStyle =
397+
isQwikStyleElement(elementName, varAttrs) || isQwikStyleElement(elementName, constAttrs);
398+
399+
if (
400+
// don't append qwik loader before qwik style elements
401+
// it will confuse the resuming, because styles are expected to be the first nodes in subtree
402+
!isQwikStyle &&
403+
this.qlInclude === QwikLoaderInclude.Inline
404+
) {
397405
if (this.$noScriptHere$ === 0 && this.size > 30 * 1024) {
398406
// We waited long enough, on slow connections the page is already partially visible
399407
this.emitQwikLoaderInline();
@@ -406,8 +414,6 @@ class SSRContainer extends _SharedContainer implements ISSRContainer {
406414

407415
let innerHTML: string | undefined = undefined;
408416
this.lastNode = null;
409-
const isQwikStyle =
410-
isQwikStyleElement(elementName, varAttrs) || isQwikStyleElement(elementName, constAttrs);
411417
if (!isQwikStyle && this.currentElementFrame) {
412418
vNodeData_incrementElementCount(this.currentElementFrame.vNodeData);
413419
}

0 commit comments

Comments
 (0)