]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: depend on scheduler directly in core instead of injecting via createRenderer
authorEvan You <yyx990803@gmail.com>
Fri, 21 Sep 2018 17:34:00 +0000 (13:34 -0400)
committerEvan You <yyx990803@gmail.com>
Fri, 21 Sep 2018 17:34:00 +0000 (13:34 -0400)
.vscode/settings.json
packages/core/package.json
packages/core/src/component.ts
packages/core/src/componentWatch.ts
packages/core/src/createRenderer.ts
packages/core/src/index.ts
packages/observer/README.md
packages/observer/__tests__/collections/Map.spec.ts
packages/observer/src/collectionHandlers.ts
packages/renderer-dom/package.json
packages/renderer-dom/src/index.ts

index 25fa6215fdd332935998f5a4b2293e98665581de..dcd05e74f421b3ed45bba908034f2f507064d1bb 100644 (file)
@@ -1,3 +1,29 @@
 {
-  "typescript.tsdk": "node_modules/typescript/lib"
+  "typescript.tsdk": "node_modules/typescript/lib",
+  "cSpell.enabledLanguageIds": [
+    "asciidoc",
+    "c",
+    "cpp",
+    "csharp",
+    "css",
+    "go",
+    "handlebars",
+    "html",
+    "jade",
+    "javascriptreact",
+    "json",
+    "latex",
+    "less",
+    "markdown",
+    "php",
+    "plaintext",
+    "pub",
+    "python",
+    "restructuredtext",
+    "rust",
+    "scss",
+    "text",
+    "typescriptreact",
+    "yml"
+  ]
 }
index 29e9e0867b206913feb151712903ed2e0287e2d3..17d243c29a4f472aeeb5519e08a5c59baecc7643 100644 (file)
@@ -20,6 +20,7 @@
   },
   "homepage": "https://github.com/vuejs/vue/tree/dev/packages/core#readme",
   "dependencies": {
-    "@vue/observer": "3.0.0-alpha.1"
+    "@vue/observer": "3.0.0-alpha.1",
+    "@vue/scheduler": "3.0.0-alpha.1"
   }
 }
index 865c992e8d1a1416b5e4ff977d9c72938ef52349..09650c99328f6f8f910eb06f1b79d8f1507d62d8 100644 (file)
@@ -8,6 +8,7 @@ import {
 } from './componentOptions'
 import { setupWatcher } from './componentWatch'
 import { Autorun, DebuggerEvent, ComputedGetter } from '@vue/observer'
+import { nextTick } from '@vue/scheduler'
 
 type Flatten<T> = { [K in keyof T]: T[K] }
 
@@ -70,7 +71,6 @@ export class Component {
   public $options: any
   public $proxy: any = null
   public $forceUpdate: (() => void) | null = null
-  public $nextTick: ((fn: () => void) => Promise<any>) | null = null
 
   public _rawData: Data | null = null
   public _computedGetters: Record<string, ComputedGetter> | null = null
@@ -91,6 +91,10 @@ export class Component {
     }
   }
 
+  $nextTick(fn: () => any): Promise<any> {
+    return nextTick(fn)
+  }
+
   $watch(
     this: MountedComponent,
     keyOrFn: string | (() => any),
index c18ff9ad0b1ac9bd80a23ea229e9866802c07b63..fe33c3f821d200e5b3d7fa176cbc5aedcd7a4987 100644 (file)
@@ -1,6 +1,7 @@
 import { MountedComponent } from './component'
 import { ComponentWatchOptions } from './componentOptions'
 import { autorun, stop } from '@vue/observer'
+import { queueJob } from '@vue/scheduler'
 
 export function initializeWatch(
   instance: MountedComponent,
@@ -40,8 +41,9 @@ export function setupWatcher(
 
   const runner = autorun(rawGetter, {
     scheduler: () => {
-      // defer watch callback using the scheduler injected defer.
-      instance._queueJob(applyCb)
+      // defer watch callback using the scheduler so that multiple mutations
+      // result in one call only.
+      queueJob(applyCb)
     }
   })
 
index ca4962ca3f442fe68574d68a08adb7b2928f14c1..b01f9750e562f16d455d309c5d6f10d6c67f7875 100644 (file)
@@ -1,4 +1,5 @@
 import { autorun, stop } from '@vue/observer'
+import { queueJob } from '@vue/scheduler'
 import { VNodeFlags, ChildrenFlags } from './flags'
 import { EMPTY_OBJ, isReservedProp } from './utils'
 import {
@@ -56,10 +57,6 @@ interface PatchDataFunction {
 }
 
 interface RendererOptions {
-  scheduler: {
-    nextTick: (fn: () => void) => Promise<any>
-    queueJob: (fn: () => void, postFlushJob?: () => void) => void
-  }
   nodeOps: NodeOps
   patchData: PatchDataFunction
   teardownVNode?: (vnode: VNode) => void
@@ -71,7 +68,6 @@ interface RendererOptions {
 // renderer alongside an actual renderer.
 export function createRenderer(options: RendererOptions) {
   const {
-    scheduler: { queueJob, nextTick },
     nodeOps: {
       createElement: platformCreateElement,
       createText: platformCreateText,
@@ -1189,10 +1185,6 @@ export function createRenderer(options: RendererOptions) {
       (__COMPAT__ && (parentVNode.children as MountedComponent)) ||
       createComponentInstance(parentVNode, Component, parentComponent)
 
-    // renderer-injected scheduler methods
-    instance.$nextTick = nextTick
-    instance._queueJob = queueJob
-
     const queueUpdate = (instance.$forceUpdate = () => {
       queueJob(instance._updateHandle, flushHooks)
     })
@@ -1318,6 +1310,9 @@ export function createRenderer(options: RendererOptions) {
       }
     }
     flushHooks()
+    return vnode && vnode.flags & VNodeFlags.COMPONENT_STATEFUL
+      ? (vnode.children as MountedComponent).$proxy
+      : null
   }
 
   return { render }
index 6cd5decc6af4b14d12359e6075875499e2aac27d..e838d8063a099ebe7ca2260f9a2b76d48af2b338 100644 (file)
@@ -10,6 +10,9 @@ export const Component = InternalComponent as ComponentClass
 // observer api
 export * from '@vue/observer'
 
+// scheduler api
+export { nextTick } from '@vue/scheduler'
+
 // internal api
 export { createComponentInstance } from './componentUtils'
 
index db173a913b81a797d6c3396517e4cf1a0a189229..30e92587b85f643f3cae603b080f0d564526b4dc 100644 (file)
@@ -11,3 +11,8 @@ The implementation of this module is inspired by the following prior art in the
 - [Meteor Tracker](https://docs.meteor.com/api/tracker.html)
 - [nx-js/observer-util](https://github.com/nx-js/observer-util)
 - [salesforce/observable-membrane](https://github.com/salesforce/observable-membrane)
+
+
+## Caveats
+
+- Built-in objects are not observed except for `Map`, `WeakMap`, `Set` and `WeakSet`.
index 20f97874de3a882b505da682b6daa5736297a05d..52e4a91d2eef30dcdc47942b494d4316a018dccb 100644 (file)
@@ -235,5 +235,15 @@ describe('observer/collections', () => {
       observed.get('key').a = 2
       expect(dummy).toBe(2)
     })
+
+    it('should observe iterated values (forEach)', () => {})
+
+    it('should observe iterated values (values)', () => {})
+
+    it('should observe iterated values (keys)', () => {})
+
+    it('should observe iterated values (entries)', () => {})
+
+    it('should observe iterated values (for...of)', () => {})
   })
 })
index 3946faf67166a6b363bb8e3ecd80dd5cd9e45595..48cb7dd72ef649cf60894d255b831533f084fe5b 100644 (file)
@@ -158,6 +158,7 @@ const immutableInstrumentations: any = {
     const target = unwrap(this)
     const proto: any = Reflect.getPrototypeOf(target)
     track(target, OperationTypes.ITERATE)
+    // TODO values retrived from iterations should also be observables
     return proto[method].apply(target, args)
   }
 })
index d4402b5c5346a302f861ca6eeb68c490bd21465c..b5a33ed94ac964442404276e740e5f4ae5167d32 100644 (file)
@@ -25,7 +25,6 @@
   },
   "homepage": "https://github.com/vuejs/vue/tree/dev/packages/renderer-dom#readme",
   "dependencies": {
-    "@vue/core": "3.0.0-alpha.1",
-    "@vue/scheduler": "3.0.0-alpha.1"
+    "@vue/core": "3.0.0-alpha.1"
   }
 }
index e1057c3f6a863db7bdaab9e680e64ff24ac1f090..7d5bd4659ca2ea7b021f7a85054acdaa1488ca01 100644 (file)
@@ -1,15 +1,9 @@
 import { createRenderer, VNode } from '@vue/core'
-import { queueJob, nextTick } from '@vue/scheduler'
-
 import { nodeOps } from './nodeOps'
 import { patchData } from './patchData'
 import { teardownVNode } from './teardownVNode'
 
 const { render: _render } = createRenderer({
-  scheduler: {
-    queueJob,
-    nextTick
-  },
   nodeOps,
   patchData,
   teardownVNode
@@ -18,9 +12,6 @@ const { render: _render } = createRenderer({
 type publicRender = (node: VNode | null, container: HTMLElement) => void
 export const render = _render as publicRender
 
-// nextTick from scheduler
-export { nextTick } from '@vue/scheduler'
-
 // re-export everything from core
-// h, Component, observer API, flags & types
+// h, Component, observer API, nextTick, flags & types
 export * from '@vue/core'