From 6207596175ad8a0e788820eb2dc4210453d0d318 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Sat, 30 Jan 2021 00:07:33 +0800 Subject: [PATCH] fix extraneous store subscription in SSR (#5929) --- CHANGELOG.md | 1 + src/compiler/compile/render_ssr/index.ts | 1 - .../_config.js | 20 +++++++++++++++++++ .../main.svelte | 5 +++++ .../store.js | 18 +++++++++++++++++ test/server-side-rendering/index.ts | 4 ++++ 6 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/_config.js create mode 100644 test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/main.svelte create mode 100644 test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/store.js diff --git a/CHANGELOG.md b/CHANGELOG.md index fffeb964be..a2b960d6b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased * Throw a parser error for `class:` directives with an empty class name ([#5858](https://github.com/sveltejs/svelte/issues/5858)) +* Fix extraneous store subscription in SSR mode ([#5883](https://github.com/sveltejs/svelte/issues/5883)) * Fix type inference for derived stores ([#5935](https://github.com/sveltejs/svelte/pull/5935)) * Make parameters of built-in animations and transitions optional ([#5936](https://github.com/sveltejs/svelte/pull/5936)) * Make `SvelteComponentDev` typings more forgiving ([#5937](https://github.com/sveltejs/svelte/pull/5937)) diff --git a/src/compiler/compile/render_ssr/index.ts b/src/compiler/compile/render_ssr/index.ts index e00e698d6f..6a46475463 100644 --- a/src/compiler/compile/render_ssr/index.ts +++ b/src/compiler/compile/render_ssr/index.ts @@ -51,7 +51,6 @@ export default function ssr( return b` ${component.compile_options.dev && b`@validate_store(${store_name}, '${store_name}');`} ${`$$unsubscribe_${store_name}`} = @subscribe(${store_name}, #value => ${name} = #value) - ${store_name}.subscribe($$value => ${name} = $$value); `; }); const reactive_store_unsubscriptions = reactive_stores.map( diff --git a/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/_config.js b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/_config.js new file mode 100644 index 0000000000..08a3435a4b --- /dev/null +++ b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/_config.js @@ -0,0 +1,20 @@ +import { store } from './store.js'; + +export default { + html: '

0

', + before_test() { + store.reset(); + }, + async test({ assert, target, component }) { + store.set(42); + + await Promise.resolve(); + + assert.htmlEqual(target.innerHTML, '

42

'); + + assert.equal(store.numberOfTimesSubscribeCalled(), 1); + }, + test_ssr({ assert }) { + assert.equal(store.numberOfTimesSubscribeCalled(), 1); + } +}; diff --git a/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/main.svelte b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/main.svelte new file mode 100644 index 0000000000..3486dedaf1 --- /dev/null +++ b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/main.svelte @@ -0,0 +1,5 @@ + + +

{$store}

diff --git a/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/store.js b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/store.js new file mode 100644 index 0000000000..3917a96b17 --- /dev/null +++ b/test/runtime/samples/reactive-assignment-in-complex-declaration-with-store-3/store.js @@ -0,0 +1,18 @@ +import { writable } from '../../../../store'; +const _store = writable(0); +let count = 0; + +export const store = { + ..._store, + subscribe(fn) { + count++; + return _store.subscribe(fn); + }, + reset() { + count = 0; + _store.set(0); + }, + numberOfTimesSubscribeCalled() { + return count; + } +}; diff --git a/test/server-side-rendering/index.ts b/test/server-side-rendering/index.ts index b87328b4fe..f44bf17ab9 100644 --- a/test/server-side-rendering/index.ts +++ b/test/server-side-rendering/index.ts @@ -201,6 +201,10 @@ describe('ssr', () => { assert.htmlEqual(html, config.html); } + if (config.test_ssr) { + config.test_ssr({ assert }); + } + if (config.after_test) config.after_test(); if (config.show) {