当前位置:首页 > VUE

vue2.0源码实现

2026-02-20 15:34:30VUE

Vue 2.0 核心实现原理

Vue 2.0 的核心实现基于响应式系统、虚拟DOM和模板编译。以下是关键实现要点:

响应式系统 通过 Object.defineProperty 实现数据劫持,在 getter 中收集依赖(Watcher),在 setter 中触发更新。每个组件实例对应一个 Watcher 实例,负责监听数据变化并触发重新渲染。

虚拟DOM与Diff算法 Vue 使用虚拟DOM提高渲染效率,通过比较新旧虚拟DOM树的差异(Diff算法),最小化真实DOM操作。核心Diff策略是同层级比较,通过双指针优化对比过程。

模板编译 模板通过编译器转换为渲染函数,经历以下阶段:

  1. 解析器将模板转换为AST(抽象语法树)
  2. 优化器标记静态节点
  3. 代码生成器将AST转换为渲染函数代码

简易实现示例

以下是简化版的响应式系统实现代码:

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm;
    this.exp = exp;
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    Dep.target = this;
    const value = this.vm[this.exp];
    Dep.target = null;
    return value;
  }
  update() {
    this.cb.call(this.vm);
  }
}

function observe(data) {
  if (!data || typeof data !== 'object') return;
  Object.keys(data).forEach(key => {
    defineReactive(data, key, data[key]);
  });
}

function defineReactive(obj, key, val) {
  const dep = new Dep();
  observe(val);
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get() {
      if (Dep.target) dep.addSub(Dep.target);
      return val;
    },
    set(newVal) {
      if (val === newVal) return;
      val = newVal;
      dep.notify();
    }
  });
}

生命周期钩子实现

Vue 生命周期通过调用预定义的钩子函数实现,核心流程如下:

function callHook(vm, hook) {
  const handlers = vm.$options[hook];
  if (handlers) {
    handlers.forEach(handler => handler.call(vm));
  }
}

// 组件初始化时依次调用
callHook(vm, 'beforeCreate');
initState(vm);
callHook(vm, 'created');
mountComponent();
callHook(vm, 'beforeMount');
// ...挂载完成
callHook(vm, 'mounted');

组件系统实现

组件系统基于原型继承实现复用:

vue2.0源码实现

function createComponent(Ctor, data, context, children) {
  const baseCtor = context.$options._base;
  if (typeof Ctor === 'object') {
    Ctor = baseCtor.extend(Ctor);
  }
  // 安装组件钩子
  installComponentHooks(data);
  // 返回vnode
  return new VNode(
    `vue-component-${Ctor.cid}`,
    data, undefined, undefined, undefined, context,
    { Ctor, children }
  );
}

以上实现展示了Vue 2.0的核心机制,实际源码还包含更多优化和边界情况处理。完整实现可参考官方仓库的src/core目录。

标签: 源码
分享给朋友:

相关文章

vue指令实现源码

vue指令实现源码

以下是 Vue 指令实现的源码解析,主要分为核心实现逻辑和常见指令示例: Vue 指令核心实现 Vue 的指令系统通过 directives 模块实现,核心代码位于 src/core/vdom/mo…

js sort源码实现

js sort源码实现

JavaScript 的 Array.prototype.sort 方法在 V8 引擎中的实现会根据数组类型和长度选择不同的排序算法,主要分为以下情况: 小数组(长度 ≤ 10) 使用插入排序(Ins…

如何看java源码

如何看java源码

阅读Java源码的方法 下载JDK源码 从Oracle官网或OpenJDK仓库获取JDK源码包。Oracle JDK安装后,源码通常位于src.zip;OpenJDK可直接通过Git克隆仓库: gi…

java 如何修改源码

java 如何修改源码

修改 Java 源码的步骤 获取源码 从官方渠道下载 Java Development Kit (JDK) 的源码包。OpenJDK 是开源的,可以通过其官方网站或 GitHub 仓库获取。 配置开…

如何查看java的源码

如何查看java的源码

查看Java源码的方法 使用IDE直接查看 大多数集成开发环境(IDE)如IntelliJ IDEA、Eclipse都内置了反编译工具或源码关联功能。在IDE中按住Ctrl键(或Command键)并点…

uniapp项目源码

uniapp项目源码

uniapp项目源码获取方式 官方示例与模板 在uniapp官方GitHub仓库或DCloud官网中,提供多个开源项目模板,涵盖基础框架、UI组件库和完整应用案例。通过下载或克隆这些模板可快速启动项目…