Vue3.x源码组织方式的变化 | 8月更文挑战

201 阅读3分钟

源码采用TypeScript重写

为了提升代码的可维护性,源码都使用TypeScript编写,大型项目项目的开发都推荐使用类型化的语言

使用Monorepo管理项目结构

使用一个项目管理多个包,把不同的功能放到不同的package中进行管理,这样每个功能模块都划分的比较明确,模块之间的依赖关系也很明确,并且每个模块都能单独发布、测试及使用

monorepo.png

  • 首先是以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中包含了所有构建版本

vue.png

  • 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