diff --git a/.gitignore b/.gitignore
index 370a6eddbc0..1ee765a0db6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,4 +16,3 @@ packages/vue-server-renderer/build.js
packages/vue-server-renderer/server-plugin.js
packages/vue-server-renderer/client-plugin.js
packages/vue-template-compiler/build.js
-.vscode
diff --git a/.vscode/bookmarks.json b/.vscode/bookmarks.json
new file mode 100644
index 00000000000..549cf01f480
--- /dev/null
+++ b/.vscode/bookmarks.json
@@ -0,0 +1,404 @@
+{
+ "files": [
+ {
+ "path": "scripts/config.js",
+ "bookmarks": [
+ {
+ "line": 27,
+ "column": 38,
+ "label": "vue源码入口resolve处理"
+ },
+ {
+ "line": 127,
+ "column": 19,
+ "label": "vue源码入口配置"
+ },
+ {
+ "line": 272,
+ "column": 20,
+ "label": ""
+ }
+ ]
+ },
+ {
+ "path": "src/platforms/web/entry-runtime-with-compiler.js",
+ "bookmarks": [
+ {
+ "line": 18,
+ "column": 27,
+ "label": "$mount,解决 template 和 render 同时存在时执行优先级的问题"
+ },
+ {
+ "line": 100,
+ "column": 40,
+ "label": "调用 src\\platforms\\web\\runtime\\index.js 中的 $mount 方法"
+ }
+ ]
+ },
+ {
+ "path": "src/core/util/env.js",
+ "bookmarks": [
+ {
+ "line": 5,
+ "column": 31,
+ "label": "浏览器环境判断工具函数"
+ }
+ ]
+ },
+ {
+ "path": "src/core/index.js",
+ "bookmarks": [
+ {
+ "line": 6,
+ "column": 10,
+ "label": "给Vue构造函数挂载静态方法"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/index.js",
+ "bookmarks": [
+ {
+ "line": 9,
+ "column": 24,
+ "label": "Vue构造函数出处,实例成员初始化"
+ }
+ ]
+ },
+ {
+ "path": "src/core/global-api/index.js",
+ "bookmarks": [
+ {
+ "line": 20,
+ "column": 48,
+ "label": "Vue静态成员的初始化"
+ },
+ {
+ "line": 64,
+ "column": 35,
+ "label": "Vue.options开始初始化位置"
+ }
+ ]
+ },
+ {
+ "path": "src/shared/util.js",
+ "bookmarks": [
+ {
+ "line": 0,
+ "column": 11,
+ "label": "该文件的工具函数值得学习!"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/init.js",
+ "bookmarks": [
+ {
+ "line": 19,
+ "column": 53,
+ "label": "Vue.prototype._init方法"
+ },
+ {
+ "line": 42,
+ "column": 24,
+ "label": "子组件初始化过程中的 配置合并"
+ },
+ {
+ "line": 80,
+ "column": 32,
+ "label": "beforeCreate 生命周期钩子触发位置"
+ },
+ {
+ "line": 89,
+ "column": 27,
+ "label": "created 生命周期钩子触发位置"
+ },
+ {
+ "line": 102,
+ "column": 31,
+ "label": "调用 vm.$mount 将用户传入的 el 属性替换渲染为真实 DOM"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/state.js",
+ "bookmarks": [
+ {
+ "line": 40,
+ "column": 7,
+ "label": "props和data,this.XXX属性返回值的源头"
+ },
+ {
+ "line": 51,
+ "column": 43,
+ "label": "初始化 vm 的 _props, methods, _data, computed, watch,并把它们挂载到 vm 实例上,相关属性做响应式处理"
+ }
+ ]
+ },
+ {
+ "path": "src/core/observer/index.js",
+ "bookmarks": [
+ {
+ "line": 39,
+ "column": 23,
+ "label": "Observer 类"
+ },
+ {
+ "line": 143,
+ "column": 77,
+ "label": "响应式处理入口"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/lifecycle.js",
+ "bookmarks": [
+ {
+ "line": 46,
+ "column": 29,
+ "label": "$children、$parent、$root、$refs属性赋值出处"
+ },
+ {
+ "line": 67,
+ "column": 72,
+ "label": "Vue.prototype._update 方法定义出处"
+ },
+ {
+ "line": 72,
+ "column": 41,
+ "label": "vm._vnode 表示绑定在当前 vm 实例上的 VNode 实例"
+ },
+ {
+ "line": 138,
+ "column": 33,
+ "label": "beforeDestroy 生命周期钩子触发位置"
+ },
+ {
+ "line": 168,
+ "column": 29,
+ "label": "destroyed 生命周期钩子触发位置"
+ },
+ {
+ "line": 184,
+ "column": 32,
+ "label": "mountComponent 函数定义出处"
+ },
+ {
+ "line": 195,
+ "column": 77,
+ "label": "在 runtime-only 版本的Vue中使用template属性报错的出处"
+ },
+ {
+ "line": 204,
+ "column": 13,
+ "label": "Failed to mount component 报错出处"
+ },
+ {
+ "line": 211,
+ "column": 29,
+ "label": "beforeMount 生命周期钩子触发位置"
+ },
+ {
+ "line": 238,
+ "column": 41,
+ "label": "调用 vm._update 将 vm._render 返回的 VNode 实例转换成真实 DOM "
+ },
+ {
+ "line": 249,
+ "column": 42,
+ "label": "Watcher实例首次被创建的位置"
+ },
+ {
+ "line": 256,
+ "column": 36,
+ "label": "beforeUpdate 生命周期钩子触发位置"
+ },
+ {
+ "line": 269,
+ "column": 27,
+ "label": "mounted 生命周期钩子触发位置1"
+ },
+ {
+ "line": 379,
+ "column": 29,
+ "label": "activated 生命周期钩子触发位置"
+ },
+ {
+ "line": 395,
+ "column": 31,
+ "label": "deactivated 生命周期钩子触发位置"
+ },
+ {
+ "line": 400,
+ "column": 56,
+ "label": "callHook:执行生命周期的函数定义位置"
+ },
+ {
+ "line": 408,
+ "column": 62,
+ "label": "生命周期钩子内部的 this 指向,在这里被处理"
+ }
+ ]
+ },
+ {
+ "path": "src/core/observer/watcher.js",
+ "bookmarks": [
+ {
+ "line": 120,
+ "column": 20,
+ "label": "watcher被作为 Dep.target 的执行代码"
+ }
+ ]
+ },
+ {
+ "path": "src/core/vdom/patch.js",
+ "bookmarks": [
+ {
+ "line": 155,
+ "column": 22,
+ "label": "createElm 的作用是通过虚拟节点创建真实的 DOM 并插入到它的父节点中"
+ },
+ {
+ "line": 189,
+ "column": 57,
+ "label": "Unknown custom element报错出处"
+ },
+ {
+ "line": 277,
+ "column": 44,
+ "label": "组件实例DOM被插入到页面的处理时机"
+ },
+ {
+ "line": 287,
+ "column": 54,
+ "label": "invokeInsertHook 用以验证父子组件关系 mounted 生命周期钩子“先子后父”顺序"
+ },
+ {
+ "line": 350,
+ "column": 65,
+ "label": "createChildren 遍历子虚拟节点,递归调用 createElm"
+ },
+ {
+ "line": 570,
+ "column": 42,
+ "label": "用户使用v-for时,绑定的VNode实例包含相同key报错的出处"
+ },
+ {
+ "line": 685,
+ "column": 53,
+ "label": ""
+ },
+ {
+ "line": 824,
+ "column": 66,
+ "label": "vm._update中的核心 patch 函数出处"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/render.js",
+ "bookmarks": [
+ {
+ "line": 22,
+ "column": 59,
+ "label": "vm.$vnode 表示当前 Vue 实例的父 VNode 实例,所以它为 Null 则表示当前是根 Vue 的实例"
+ },
+ {
+ "line": 36,
+ "column": 73,
+ "label": "传入用户手写的 render 函数中的 h 函数出处"
+ },
+ {
+ "line": 105,
+ "column": 61,
+ "label": "调用 render 函数生成 Vnode 实例,该过程会进行渲染 watcher 的“依赖收集”操作"
+ }
+ ]
+ },
+ {
+ "path": "src/core/observer/scheduler.js",
+ "bookmarks": [
+ {
+ "line": 168,
+ "column": 29,
+ "label": "updated 生命周期钩子触发位置"
+ }
+ ]
+ },
+ {
+ "path": "src/core/vdom/create-component.js",
+ "bookmarks": [
+ {
+ "line": 36,
+ "column": 29,
+ "label": "定义在组件VNode实例patch期间触发的钩子函数集合"
+ },
+ {
+ "line": 73,
+ "column": 44,
+ "label": "mounted 生命周期钩子触发位置2"
+ },
+ {
+ "line": 118,
+ "column": 33,
+ "label": "createComponent 函数定义出处"
+ }
+ ]
+ },
+ {
+ "path": "src/core/global-api/extend.js",
+ "bookmarks": [
+ {
+ "line": 60,
+ "column": 50,
+ "label": "Vue中关于js组合继承的用法"
+ },
+ {
+ "line": 68,
+ "column": 22,
+ "label": "子组件定义过程中的 配置合并"
+ }
+ ]
+ },
+ {
+ "path": "src/core/util/options.js",
+ "bookmarks": [
+ {
+ "line": 132,
+ "column": 52,
+ "label": "子组件实例的 data 属性必须是函数,否则会报错出处"
+ },
+ {
+ "line": 312,
+ "column": 9,
+ "label": "Do not use built-in or reserved HTML elements as component 报错出处"
+ },
+ {
+ "line": 418,
+ "column": 30,
+ "label": "mergeOptions函数出处"
+ }
+ ]
+ },
+ {
+ "path": "src/core/vdom/create-element.js",
+ "bookmarks": [
+ {
+ "line": 149,
+ "column": 57,
+ "label": "调用 createComponent 创建组件 VNode 实例位置"
+ }
+ ]
+ },
+ {
+ "path": "src/core/instance/proxy.js",
+ "bookmarks": [
+ {
+ "line": 15,
+ "column": 43,
+ "label": "Property or method is not defined 错误出处"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000000..797132c287d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+ // 设置不检查 JavaScript 的语法问题,防止 flow 报错
+ "javascript.validate.enable": false,
+ "commentTranslate.source": "Bing",
+ "liveServer.settings.port": 5501
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 64f795e8971..3e355cc8f43 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,77 @@