Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/calm-computed-secrets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: avoid serializing computed values by default.
2 changes: 1 addition & 1 deletion packages/qwik/src/core/reactive-primitives/signal-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const createComputedSignal = <T>(
return new ComputedSignalImpl<T>(
options?.container || null,
qrl as ComputeQRL<T>,
getComputedSignalFlags(options?.serializationStrategy || 'always'),
getComputedSignalFlags(options?.serializationStrategy || 'never'),
options
);
};
Expand Down
38 changes: 24 additions & 14 deletions packages/qwik/src/core/shared/serdes/serdes.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -607,35 +607,40 @@ describe('shared-serialization', () => {
const clean = createComputed$(() => foo.value + 2, { serializationStrategy: 'always' });
const never = createComputed$(() => foo.value + 3, { serializationStrategy: 'never' });
const always = createComputed$(() => foo.value + 4, { serializationStrategy: 'always' });
const defaultStrategy = createComputed$(() => foo.value + 5);
const noSer = createComputed$(() => noSerialize({ foo }));
// note that this won't subscribe because we're not setting up the context
// do not read `dirty` to keep it dirty
expect(clean.value).toBe(2);
expect(never.value).toBe(3);
expect(always.value).toBe(4);
const objs = await serialize(dirty, clean, never, always, noSer);
expect(defaultStrategy.value).toBe(5);
const objs = await serialize(dirty, clean, never, always, defaultStrategy, noSer);
expect(_dumpState(objs)).toMatchInlineSnapshot(`
"
0 ComputedSignal [
QRL "6#1#-2"
QRL "7#1#-2"
]
1 ComputedSignal [
QRL "6#2#-3"
QRL "7#2#-3"
Constant undefined
{number} 2
]
2 ComputedSignal [
QRL "6#3#-4"
QRL "7#3#-4"
]
3 ComputedSignal [
QRL "6#4#-5"
QRL "7#4#-5"
Constant undefined
{number} 4
]
4 ComputedSignal [
QRL "6#5#-6"
QRL "7#5#-6"
]
5 Signal [
5 ComputedSignal [
QRL "7#6#-7"
]
6 Signal [
{number} 0
EffectSubscriptionNoData [
RootRef 1
Expand All @@ -649,14 +654,19 @@ describe('shared-serialization', () => {
RootRef 3
Constant '.'
]
EffectSubscriptionNoData [
RootRef 4
Constant '.'
]
]
6 {string} "mock-chunk"
7 {string} "describe_describe_it_dirty_createComputed_ahnh0V4rf6g"
8 {string} "describe_describe_it_clean_createComputed_0ZTfN4iJ0tg"
9 {string} "describe_describe_it_never_createComputed_1HbLed7JXyo"
10 {string} "describe_describe_it_always_createComputed_4nMmgHlUOog"
11 {string} "describe_describe_it_noSer_createComputed_pXwl00hYYQQ"
(454 chars)"
7 {string} "mock-chunk"
8 {string} "describe_describe_it_dirty_createComputed_ahnh0V4rf6g"
9 {string} "describe_describe_it_clean_createComputed_0ZTfN4iJ0tg"
10 {string} "describe_describe_it_never_createComputed_1HbLed7JXyo"
11 {string} "describe_describe_it_always_createComputed_4nMmgHlUOog"
12 {string} "describe_describe_it_defaultStrategy_createComputed_i9O7shypysA"
13 {string} "describe_describe_it_noSer_createComputed_pXwl00hYYQQ"
(552 chars)"
`);
});
it(title(TypeIds.SerializerSignal), async () => {
Expand Down
4 changes: 2 additions & 2 deletions packages/qwik/src/core/shared/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ export interface QContainerElement extends Element {
* value during SSR.
*
* - `never`: The value is never serialized. When the component is resumed, the value will be
* recalculated when it is first read.
* - `always`: The value is always serialized. This is the default.
* recalculated when it is first read. This is the default for computed signals.
* - `always`: The value is always serialized. This is the default for async signals.
*
* **IMPORTANT**: When you use `never`, your serialized HTML is smaller, but the recalculation will
* trigger subscriptions, meaning that other signals using this signal will recalculate, even if
Expand Down
Loading