You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在 src/core/index.js 中,引入了 'src/core/instance/index' 中的 Vue,并初始化了 Vue 中的一些全局 API
importVuefrom'./instance/index'initGlobalAPI(Vue)// 初始化全局 APIObject.defineProperty(Vue.prototype,'$isServer',{get: isServerRendering})Object.defineProperty(Vue.prototype,'$ssrContext',{get(){/* istanbul ignore next */returnthis.$vnode&&this.$vnode.ssrContext}})//...
在 src/core/instance/index.js 中,终于找到了 Vue 的定义。
functionVue(options){if(process.env.NODE_ENV!=='production'&&!(thisinstanceofVue)){warn('Vue is a constructor and should be called with the `new` keyword')}this._init(options)}
Vue 的庐山真面目
Vue 项目 web 版中,有 runtime only 版本和 runtime compiler 版
runtime only
runtime only 比较轻量,只包含Vue.js运行时的代码,需要我们借助 vue-loader 进行编译,把 template 编译成 render函数。
比如:
runtime compiler
包含了编译的代码的版本,体积比较大,加之编译时会损耗一定性能,所以尽可能采取不带编译的版本,在离线时进行编译。
这里我们来看看
Vue.js
编译出来的runtime compiler
版本的文件, 入口文件为src/platforms/web/entry-runtime-with-compiler.js
可以看到这一句
我们往下挖,看看 Vue 到底怎么来的
在
src/core/index.js
中,引入了'src/core/instance/index'
中的 Vue,并初始化了 Vue 中的一些全局 API在
src/core/instance/index.js
中,终于找到了 Vue 的定义。可以看到,这里的 Vue 实际上就是一个函数(类),但是为什么不用 class 定义呢?
往下看会发现:
这个文件引入了许多外部的方法,给 Vue 这个类添加静态方法。
使用函数定义类可以使代码拆分到多个文件,有利于代码维护。
Vue 源码构建:
package.json
里,我们可以找到 build 的命令在
build.js
中,需要导入一些配置,对配置进行一些处理,然后根据配置进行构建这里我们看一下导入的配置:
从
scripts/config.js
导出了配置这里获取了
builds
这个对象的键,将这个数组 map 遍历,将每个键传给genConfig 函数
,genConfig 函数
的作用是: 将 builds 配置转换成 rollup( Vue 的打包工具 ) 所需的配置格式。builds 这个配置对象保存的就是各个版本的配置,这里截取一个键值看看:
这里在处理路径时,为了能够跨平台,用了
resolve
方法,将路径用 path.resolve 处理成绝对路径。这里的 resolve 方法简单包装了一层
以上述的
entry
为例:web/entry-runtime.js
的前缀web
,如果在alias
的键中,则按原路径解析为绝对路径,否则就将路径解析到上一层的绝对路径。The text was updated successfully, but these errors were encountered: