vue源码入口文件实例分析

本文主要介绍了vue源码入口文件分析(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!!

看源码我个人感觉非常开心,每每看上一段,自己就充实许多,不知道你是否和我一样。

vue 源码是众多module(模块)用 rollup 工具合并而成, 从package.json 中能够看到。现在让我们从github上下载vue项目,开始我们今天的“思考”。

我下载的源码版本是:”version”: “2.5.7”,

立即学习“前端免费学习笔记(深入)”;

源码起始位置从这里可以看到

"dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev"// 从build/config.js 中找到 TARGET: web-full-dev 这是运行和编译(支持现在的浏览器,由于里面大量应用了ES6-7)后的 // Runtime+compiler development build (Browser) 'web-full-dev': {  entry: resolve('web/entry-runtime-with-compiler.js'),  dest: resolve('dist/vue.js'),  format: 'umd',  env: 'development',  alias: { he: './entity-decoder' },  banner },

登录后复制

找到了开始文件就是 “web/entry-runtime-with-compiler.js”, 然后我们一路找 Vue 对象 终于在 “instance/index.js” 中找到了:

// 这是Vue 的开始位置function Vue (options) { // 判断如果是不是生产环境,且不是通过new关键字来创建对象的话,就在控制台打印一个warning 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)}

登录后复制

看似到这里都结束了,因为我们目的就是找到开始位置,但是我有个疑问,为什么Vue需要这么多层 ?

entry-runtime-with-compiler.js->runtime/index.js->core/index.js->instance/index.js

登录后复制

当我仔细看了源码后恍然大悟,我们先看看他们这些文件都做了什么:

(1)instance/index.js

从Vue 模块命名中能看出一些端倪, instance (实例) 。

这个文件是Vue 对象的开始,同时也是Vue 原型链(prototype) 方法的集中文件

// _initinitMixin(Vue)// $set、$delete、$watchstateMixin(Vue)// $on、$once、$off、$emiteventsMixin(Vue)// _update、$forceUpdate、$destroylifecycleMixin(Vue)// $nextTick、_render、以及多个内部调用的方法renderMixin(Vue)

登录后复制

这些方法只有实例化了才能调用。

(2)core/index.js

这个文件在Instance/index.js 创建和初步加工后,再次加工。 那他主要做了什么呢? 我们不考虑运行环境

initGlobalAPI(Vue)

登录后复制

对,就调用了这个方法,很简单明了吧 — “初始化全局接口”,

让我们走进initGlobalAPI 方法

export function initGlobalAPI (Vue: GlobalAPI) { // config const configDef = {} configDef.get = () => config // 在 非生产环境,如何修改了配置文件config里面的内容会提示警告 if (process.env.NODE_ENV !== 'production') {  configDef.set = () => {   warn(    'Do not replace the Vue.config object, set inpidual fields instead.'   )  } } // 定义config 属性, 监听变化 Object.defineProperty(Vue, 'config', configDef) // exposed util methods. // NOTE: these are not considered part of the public API - avoid relying on // them unless you are aware of the risk. Vue.util = {  warn,  extend,  mergeOptions,  defineReactive } Vue.set = set Vue.delete = del Vue.nextTick = nextTick Vue.options = Object.create(null) // 给vue 创建 ASSET_TYPES 的 空对象 ASSET_TYPES.forEach(type => {  Vue.options[type + 's'] = Object.create(null) }) // this is used to identify the "base" constructor to extend all plain-object // components with in Weex's multi-instance scenarios. Vue.options._base = Vue extend(Vue.options.components, builtInComponents) // Vue.use initUse(Vue) // Vue.mixin initMixin(Vue) // Vue.extend initExtend(Vue) // Vue.component, Vue.directive, Vue.filter initAssetRegisters(Vue)}

登录后复制

这里面基本都是 静态方法,即:用 Vue. xxx 的形式调用。

(3)runtime/index.js

这里就加一些扩展和 在 Vue.prototype上添加了__patch__和$mount(挂载元素)。

// Vue.options.directives(model和show)和 Vue.options.components(Transition和TransitionGroup)extend(Vue.options.directives, platformDirectives)extend(Vue.options.components, platformComponents)// install platform patch functionVue.prototype.__patch__ = inBrowser ? patch : noop// public mount methodVue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean): Component { el = el && inBrowser ? query(el) : undefined return mountComponent(this, el, hydrating)}

登录后复制

(4)entry-runtime-with-compiler.js

就干了一件事就是重写$mount, Vue根据不同运行环境,重写不同$mount

const mount = Vue.prototype.$mountVue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean): Component { ... return mount.call(this, el, hydrating)}

登录后复制

总结:

到此我们找到了开始执行的文件,和每个文件有什么用,具体怎么做的,做了什么我会下次再写。不过我们刚开始不要太在乎每个细节,不要非得弄懂每一行代码,如果那样,真的太累了,而且可能没有勇气坚持下去。

相关推荐:

webpack多入口文件页面打包详解

以上就是vue源码入口文件实例分析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2788077.html

(0)
上一篇 2025年3月8日 18:21:42
下一篇 2025年3月8日 08:29:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Grunt针对静态文件的压缩,版本控制打包详解

    本文主要为大家带来一篇grunt针对静态文件的压缩,版本控制打包的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 在讲之前先谈谈大致步骤:安装nodejs -> 全局安装gr…

    2025年3月8日 编程技术
    200
  • vue滚动行为实例分析

    本文主要和大家介绍vue滚动行为,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 滚动行为 什么是路由的滚动行为 当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面…

    2025年3月8日
    200
  • JS中offset和匀速动实例分析

    本文主要和大家介绍javascript动画:offset和匀速动画详解(含轮播图的实现),并把实现代码做了分享,有兴趣的朋友参考下,希望能帮助到大家。 offset简介 我们知道,三大家族包括:offset/scroll/client。今天…

    2025年3月8日 编程技术
    200
  • web前端页面生成exe可执行文件实例

    在 html5的崛起、javascript要一统天下之际,有一个名为【跨平台】的技术越来越火。为什么会这么火?因为软件开发者只需一次编写程序,即可在 windows、linux、mac、ios、android 等平台运行,大大降低了程序员的…

    2025年3月8日
    200
  • Vue打包出现一些map文件怎么办?

    问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1,运行  cnpm run build  开始打包 2,会在项目目录下自动创建dist目录,打包好的文件都在其中 解决办法:去sr…

    编程技术 2025年3月8日
    200
  • js跨域请求服务实例分析

    本文主要和大家分享js跨域请求服务实例分析,希望能帮助到大家。   function getAreaPosionsSucess(data){           alert(“请求成功”);        }       function …

    编程技术 2025年3月8日
    200
  • jquery和vue对比实例分析

    很多人说jquey和vue没有什么可比的,应该和angular,react来比吧,我到觉得他们倒没有多大的可比性,都是基于mvvm思想设计的框架,无非就是实现的方式不一样,在不同场景下性能上会有一些差异。然而从jquery到vue或者说是到…

    2025年3月8日 编程技术
    200
  • node的文件批量重命名

    这次给大家带来node的文件批量重命名,node文件批量重命名的注意事项有哪些,下面就是实战案例,一起来看一下。 在一个实际需求中,需要对一批文件(如:文本、图片)进行重命名,按照数字编号。正好借此熟悉了一下node的fs文件操作,写了一个…

    2025年3月8日
    200
  • html页面中异步加载js文件方法

    一般直接引入第三方的js,如果第三方速度比较慢,会阻塞页面的渲染,用户等待的时候,会看到一片的空白,这样的用户体验不太好。因此一些不用马上运行的js,可以用异步进行加载。 加载方法有两种,如下 script 中加入 async=”async…

    编程技术 2025年3月8日
    200
  • bootstrap+jquery的文件引入报错

    这次给大家带来bootstrap+jquery的文件引入报错,bootstrap+jquery文件引入报错的注意事项有哪些,下面就是实战案例,一起来看一下。 做一个项目的时候 ,控制台总是会出现各种bug,其实不用慌张,终结起来也就几种类型…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论