wip(ssr): reduce reactivity overhead during ssr

This commit is contained in:
Evan You
2020-01-24 11:39:52 -05:00
parent cee36ad028
commit 25a0d4a65f
7 changed files with 50 additions and 21 deletions

View File

@@ -56,6 +56,10 @@ export function computed<T>(
// expose effect so computed can be stopped
effect: runner,
get value() {
if (__SSR__) {
return getter()
}
if (dirty) {
value = runner()
dirty = false

View File

@@ -1,4 +1,4 @@
import { isObject, toRawType } from '@vue/shared'
import { isObject, toRawType, EMPTY_OBJ } from '@vue/shared'
import {
mutableHandlers,
readonlyHandlers,
@@ -117,9 +117,15 @@ function createReactiveObject(
if (!canObserve(target)) {
return target
}
const handlers = collectionTypes.has(target.constructor)
? collectionHandlers
: baseHandlers
const handlers = __SSR__
? // disable reactivity in SSR.
// NOTE: a potential caveat here is isReactive check may return different
// values on nested values on client/server. This should be very rare but
// we should keep an eye on this.
EMPTY_OBJ
: collectionTypes.has(target.constructor)
? collectionHandlers
: baseHandlers
observed = new Proxy(target, handlers)
toProxy.set(target, observed)
toRaw.set(observed, target)

View File

@@ -36,6 +36,14 @@ export function ref(raw?: unknown) {
return raw
}
raw = convert(raw)
if (__SSR__) {
return {
_isRef: true,
value: raw
}
}
const r = {
_isRef: true,
get value() {
@@ -58,7 +66,7 @@ export function ref(raw?: unknown) {
export function toRefs<T extends object>(
object: T
): { [K in keyof T]: Ref<T[K]> } {
if (__DEV__ && !isReactive(object)) {
if (__DEV__ && !__SSR__ && !isReactive(object)) {
console.warn(`toRefs() expects a reactive object but received a plain one.`)
}
const ret: any = {}