Vue2源码梳理:关于vue2的源码目录设计与相关模块作用分析
2023-12-19 21:50:15
Vue @ 2.x 源码目录结构
Vue.js 的源码都在 src 目录下,其目录结构如下
1 )vue@2.6.14 以下
src
├── compiler # 编译相关
├── core # 核心代码
├── platforms # 不同平台的支持
├── server # 服务端渲染
├── sfc # .vue 文件解析
├── shared # 共享代码
- 主要围绕这个目录来进行展开
2 ) vue@2.7.0 以上
src
├── compiler # 编译相关
├── core # 核心代码
├── platforms # 不同平台的支持
├── types # 类型定义文件,用于支持TS
├── v3 # vue3中的一些核心代码
├── shared # 共享代码
├── global.d.ts # .d.ts 全局类型
- 这里我们不做伸展,看vue3.x源码更合适一些,毕竟是中间的过渡版本
核心目录解析
1 )compiler
- vue@2.0很大的改进是 virtual dom, virtual dom 的生成实际执行的是 render function
- 我们写vue代码的时候,很少去手写 render function,而是用写 template 来代替
- 其实 从 template 到 render function 相关逻辑就在这个目录中
- compiler 目录包含 Vue.js 所有编译相关的代码
- 它包括把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能
- 编译的工作可以在构建时做(借助 webpack、vue-loader等辅助插件)
- 也可以在运行时做,使用包含构建功能的 Vue.js
- 显然,编译是一项耗性能的工作,所以更推荐前者——离线编译
2 )core
- core 这这个目录,它又分为很多很多子目录
- 比如说像内置组件,keep-alive 是放在这里的
- core 目录下的 global-api目录下
- extend.js
- mixin.js
- assets.js
- use.js
- core 目录下的 instance 目录下
- events.js
- init.js
- inject.js
- lifecycle.js
- proxy.js
- render.js
- state.js
- core 目录下的 observer 目录下
- array.js
- dep.js
- scheduler.js
- traverse.js
- watcher.js
- 这些和响应式数据相关,是vue的核心
- core 目录下的 util 目录下
- debug.js
- env.js
- error.js
- lang.js
- next-tick.js
- perf.js
- props.js
- core 目录下的 vdom 目录下
- create-component.js
- create-element.js
- create-functional-component.js
- patch.js
- vnode.js
- vdom目录是vue@2.x的重大核心
3 ) platforms
- platforms 它有两个子目录,一个是web,一个是weex
- web就是我们平时开发的浏览器的程序
- weex呢是vue推出的一个类似于react-native的一个跨端的应用
- 这两个目录的存在,说明,vue既可以编译出在浏览器运行的框架
- 也可以在其他平台下,比如 weex
- 美团开源的 mpvue 也是在 platforms 下 扩展了 mp 的目录
- 在 web 目录下
- compiler 与web编译有关
- runtime 与web运行时有关
- server 与服务端渲染有关
- util web的相关工具类
- weex 目录用的不多,就不去展开
- Vue.js 是一个跨平台的 MVVM 框架,它可以跑在 web 上,也可以配合 weex 跑在 native 客户端上
- platform 是 Vue.js 的入口,2 个目录代表 2 个主要入口,分别打包成运行在 web 上和 weex 上的 Vue.js
4 ) server
- 所有跟服务端渲染的相关的代码都在这个目录下
- 2.0 推出以后,server-render 也是一个比较核心的一个功能
- Vue.js 2.0 支持了服务端渲染,所有服务端渲染相关的逻辑都在这个目录下
- 注意:这部分代码是跑在服务端的 Node.js,不要和跑在浏览器端的 Vue.js 混为一谈
- 服务端渲染主要的工作是把组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序
5 )sfc
- sfc 就是一个简单的解释器
- 通常我们开发 Vue.js 都会借助 webpack 构建, 然后通过 .vue 单文件来编写组件
- 这个目录下的代码逻辑会把 .vue 文件内容解析成一个 JavaScript 的对象
6 ) shared
- shared是一些辅助的方法,比如说像一些常量啊,一些工具方法
- 它是可以被我们的像 core 或者是 compiler等等这些和我们的platforms所有的目录共享的一些辅助方法
- Vue.js 会定义一些工具方法,这里定义的工具方法都是会被浏览器端的 Vue.js 和服务端的 Vue.js 所共享的
7 )总结
- 从 Vue.js 的目录设计可以看到,作者把功能模块拆分的非常清楚
- 相关的逻辑放在一个独立的目录下维护,并且把复用的代码也抽成一个独立目录
- 这样的目录设计让代码的阅读性和可维护性都变强,是非常值得学习和推敲的
- 这点也可以作为我们写js库的范本
- 通过模块化的方式,让这些模块之间相互引用
- 最终通过编译工具再生成一个独立的js
- vue它虽然把这些代码呢都拆成这些目录,最终也是通过rollup打包成一个单独的js
文章来源:https://blog.csdn.net/Tyro_java/article/details/135082339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!