摘要:下载去上下载运行起来使用使用打包,规范数据类型可以先用套用,读起来差不多,时间有限,毕竟只有分钟,这个就不用去看文档了入口打开我们看配置找到打开根据配置的不同会选择不同的同时在这里配置了环境有,,关于引入类型的还有
下载
去github上下载Vue
npm install npm run dev
运行起来
rollup + flowvue使用使用rollup打包,flow规范数据类型
rollup可以先用webpack套用,读起来差不多,时间有限,毕竟只有5分钟,这个就不用去看rollup文档了
入口打开package.json
我们看scripts配置
"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev", "dev:cjs": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-cjs-dev",
找到scripts/config.js
打开
根据配置TARGET的不同会选择不同的config
同时在这里配置了process.env.NODE_ENV 环境
TARGET有CommonJS,ES Modules,UMD关于js引入类型的
还有weex,ssr
"web-runtime-cjs-dev": { entry: resolve("web/entry-runtime.js"), dest: resolve("dist/vue.runtime.common.dev.js"), format: "cjs", env: "development", banner }
在alias.js下设置了别名路径
我们先介绍src/platforms
里面有web和weex 分别的web和weex入口
在web文件下是CommonJS,ES Modules,UMD关于js引入类型,server的打包入口
打开web/entry-runtime.js
引入
import Vue from "./runtime/index" export default Vue
打开./runtime/index
import Vue from "core/index" Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean ): Component { el = el && inBrowser ? query(el) : undefined return mountComponent(this, el, hydrating) } export default Vue
在vue原型上添加了mount方法
处理了devtools,没有安装提醒安装devtools
给了这句提示dev环境提示
You are running Vue in development mode. Make sure to turn on production mode when deploying for production. See more tips at https://vuejs.org/guide/deployment.html
platforms目录夹讲解完毕
core目录打开core/instance/index
映入眼前的是
function Vue (options) { if (process.env.NODE_ENV !== "production" && !(this instanceof Vue) ) { warn("Vue is a constructor and should be called with the `new` keyword") } this._init(options) } initMixin(Vue) stateMixin(Vue) eventsMixin(Vue) lifecycleMixin(Vue) renderMixin(Vue) export default Vue
先执行的是initMixin(Vue)
打开init
export function initMixin (Vue) { Vue.prototype._init = function (options?: Object) { const vm = this // a uid vm._uid = uid++ let startTag, endTag /* istanbul ignore if */ if (process.env.NODE_ENV !== "production" && config.performance && mark) { startTag = `vue-perf-start:${vm._uid}` endTag = `vue-perf-end:${vm._uid}` mark(startTag) } // a flag to avoid this being observed vm._isVue = true // 处理传入的options // merge options if (options && options._isComponent) { // optimize internal component instantiation // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. initInternalComponent(vm, options) } else { // 传入的options,默认的options一起合并挂载到vm.$options上 vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options || {}, vm ) } /* istanbul ignore else */ if (process.env.NODE_ENV !== "production") { // 代理 initProxy(vm) } else { vm._renderProxy = vm } // 生命周期 initLifecycle(vm) // emit on 事件 initEvents(vm) // 处理render vdom initRender(vm) callHook(vm, "beforeCreate") // 处理Injections initInjections(vm) // resolve injections before data/props // 双向数据绑定,监听订阅 initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, "created") /* istanbul ignore if */ if (process.env.NODE_ENV !== "production" && config.performance && mark) { vm._name = formatComponentName(vm, false) mark(endTag) measure(`vue ${vm._name} init`, startTag, endTag) } // 渲染到dom if (vm.$options.el) { vm.$mount(vm.$options.el) } } }lifecycle
打开 lifecycle
export function callHook (vm: Component, hook: string) { // disable dep collection when invoking lifecycle hooks pushTarget() //执行对象的周期函数,周期函数最后被处理成数组 const handlers = vm.$options[hook] const info = `${hook} hook` if (handlers) { for (let i = 0, j = handlers.length; i < j; i++) { invokeWithErrorHandling(handlers[i], vm, null, vm, info) } } if (vm._hasHookEvent) { vm.$emit("hook:" + hook) } popTarget()
callHook 的时候,是执行相应周期,开发者在周期函数里所写的
EventsinitEvents实现了 emit on 等方法,请参考监听者订阅者模式,这里不详解
render renderMixin函数添加了 $nextTick _render 原型对象
$nextTick会在dom跟新后立即调用
nextTick(fn, this)是一个自执行函数
_render返回的是node的js数据,还不是dom
做了Vdom
initRender函数给vm添加了_c和 $createElement用来渲染的方法
stateif (!(key in vm)) { proxy(vm, `_props`, key) }
给vue属性做代理,访问this.a可以得到this.data.a 的值
export function initState (vm: Component) { vm._watchers = [] const opts = vm.$options if (opts.props) initProps(vm, opts.props) if (opts.methods) initMethods(vm, opts.methods) if (opts.data) { initData(vm) } else { observe(vm._data = {}, true /* asRootData */) } if (opts.computed) initComputed(vm, opts.computed) if (opts.watch && opts.watch !== nativeWatch) { initWatch(vm, opts.watch) } }
给数据做监听
添加原型对象
Vue.prototype.$set = set Vue.prototype.$delete = del其他
src/compiler 做了编译处理
core/componetd 做了keep-alive
core/util 封装了通用方法
core/vdom vdom算法
以上整体架构分析完毕
附张图
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/101358.html
摘要:可以使用或来安装我用来重新尝试一次对速度表示不理想的可以尝试淘宝的不要过度依赖中可以写成放哪都行,可以写成可以写成看到这个画面,安装完成了。 初步搭建脚手架 Tips 任何不错的开源项目都有 project-cli 脚手架、我们用它生成往往能快速配制出最佳的、理想的脚手架 我通常使用 cli 生成项目骨架再在之基础上进行个人修改。 什么是 CLI 命令行界面(英语:command-li...
摘要:可以使用或来安装我用来重新尝试一次对速度表示不理想的可以尝试淘宝的不要过度依赖中可以写成放哪都行,可以写成可以写成看到这个画面,安装完成了。 初步搭建脚手架 Tips 任何不错的开源项目都有 project-cli 脚手架、我们用它生成往往能快速配制出最佳的、理想的脚手架 我通常使用 cli 生成项目骨架再在之基础上进行个人修改。 什么是 CLI 命令行界面(英语:command-li...
摘要:更多资源请文章转自月份前端资源分享的作用数组元素随机化排序算法实现学习笔记数组随机排序个变态题解析上个变态题解析下中的数字前端开发笔记本过目不忘正则表达式聊一聊前端存储那些事儿一键分享到各种写给刚入门的前端工程师的前后端交互指南物联网世界的 更多资源请Star:https://github.com/maidishike... 文章转自:https://github.com/jsfr...
阅读 3718·2021-10-11 10:59
阅读 1301·2019-08-30 15:44
阅读 3480·2019-08-29 16:39
阅读 2888·2019-08-29 16:29
阅读 1800·2019-08-29 15:24
阅读 808·2019-08-29 15:05
阅读 1264·2019-08-29 12:34
阅读 2302·2019-08-29 12:19