源码采用TypeScript重写
为了提升代码的可维护性,源码都使用TypeScript编写,大型项目项目的开发都推荐使用类型化的语言
使用Monorepo管理项目结构
使用一个项目管理多个包,把不同的功能放到不同的package中进行管理,这样每个功能模块都划分的比较明确,模块之间的依赖关系也很明确,并且每个模块都能单独发布、测试及使用
- 首先是以complier开头的包,都是跟编译相关的包
- core是和平台无关的编译器
- dom是浏览器平台下的编译器依赖于complier-core
- sfc是single file component单文件组件,依赖于complier-core和complier-dom
- ssr是服务端渲染编译器,依赖于complier-dom
- reactivity是数据响应式系统,可以独立使用
- runtime开头的文件夹是运行时编译器
- core是平台无关的运行时
- -dom是针对浏览器的运行时,处理原生DOM的API及事件等
- -test是为测试写的轻量级的运行时,渲染出来的DOM树是js对象,所以可以运行在所有的js环境里,可以用来测试渲染是否正确,还可以用于序列化DOM、触发DOM事件以及记录某次更新中的DOM操作
- server-renderer是用于服务端渲染
- shared是vue内部使用的公共API
- size-check是一个私有的包不会发布到npm,作用是在treeshiking后检查包的大小
- template-explorer在浏览器里运行的实时编译组件,输出render函数,readme里提供访问地址
- vue提供完整版vue依赖于compile和runtime
不同构建版本
不再构建umd模块化方式,umd模块化方式会让代码有更多的冗余,要支持多种模块化的方式。把cjs、esm、(IIF)自执行分别打包到了不同的文件中
- 在package/vue中包含了所有构建版本
-
cjs是commonjs版本的vue,都是完整版的vue,包含运行时和编译器,prod版是压缩版是生产版本
- vue.cjs.js
- vue.cjs.prod.js
-
global全局,可以直接通过script标签来导入,导入js后会增加一个全局的vue对象,vue.global是完整版的vue,包含编译器和运行时。vue.runtime.global是只包含运行时的构建版本
- vue.global.js
- vue.global.prod.js
- vue.runtime.global.js
- vue.runtime.global.prod.js
-
browser版本是浏览器的原生模块化的方式,在浏览器中可以直接使用type="module"的方式直接导入这些模块。vue.esm-browser是完整版包括运行时和编译器,vue.runtime.esm-browser只包含运行时
- vue.esm-browser.js
- vue.esm-browser.prod.js
- vue.runtime.esm-browser.js
- vue.runtime.esm-browser.prod.js
-
bundler没有打包所有代码,配合打包工具来使用,都是用esm模块化方式,内部通过import导入了runtime-core。vue.esm-bundler是完整版的,内部导入了runtime-compiler,使用脚手架创建的项目默认导入的是vue.runtime.esm-bundler,只导入了运行时,是vue的最小版本,在项目开发完毕后只会打包使用到的代码,可以让vue的体积更小
- vue.esm-bundler.js
- vue.runtime.esm-bundler.js