手写vue3源码——创建项目

简介: 在根目录下面新增 packages, 然后在里面分别建立 pkg1 和 pkg2, pkg1 和 pkg2 是单独的两个包,用两个包来方便测试,分别给两个包进行 init操作生成对应的package.json文件

引言


在前面的文章中,分析了vue3的响应式数据原理、vue组件初始化流程、vue组件更新流程等文章,有人说学习源码的最好方式,就是把别人的思路理解到来,自己手动敲一遍。那咋们就来手动敲一敲,并且把整个过程记录下来,给有需要的有缘人😃😃😃


初始化项目


vue3源码采用的是pnpm + monorepo的方式来创建仓库的。那咋也学习下,用pnpm + monorepo的方式来创建一个自己的源码库


init


使用 pnpm init 来初始化项目

然后改动下package.json的内容如下:


// 包管理器使用pnpm
"packageManager": "pnpm@7.1.0", 
// 跟目录为private,不需要发布
 "private": true,


增加pnpm-workspace.yaml 来使项目是一个monorope的项目,并且里面增加内容如下:


packages:
  - 'packages/*'


packages


在根目录下面新增 packages, 然后在里面分别建立 pkg1 和 pkg2, pkg1 和 pkg2 是单独的两个包,用两个包来方便测试,分别给两个包进行 init操作生成对应的package.json文件


给主包安装依赖


vue3项目使用typescript语法, jest来进行测试,所以在workspace跟目录下安装主要的依赖


// 安装ts 和对应的类型检查库
pnpm add typescript @types/node -w -D 
// 安装jest 和对应的类型库
pnpm add jest @types/jest -w -D


pnpm add xxxx -w -D 的意思是使用pnpm 在workspace的跟目录下面安装依赖,不会安装到packages中,但是咋们在packages中也是可以使用的,这是由于node解析文件的策略,优先需要同级下面的node_modules,然后在向上找,找到就用,如果一直到磁盘最顶端都没有,那就直接error


pkg1


在pkg1中,建立 index.ts, 并且向外导出一个函数,供其他模块使用


/**
 * 测试模块1的方法add
 * @param a 
 * @param b 
 * @returns 
 */
export function add(a, b) {
  return a + b;
}


接下来把pkg1里面的package.json 修改成如下:


"main": "index.ts",


pkg2


在pkg2中使用pkg1的add函数,需要在pkg2的package.json安装pkg1的依赖如下:


"dependencies": {
    "pkg1": "workspace:pkg1@*"
  }


请思考🧐:自己写了依赖,咋们能使用成功么?


答案: 肯定是不行的,咋们还需要 在当前目录下面进行 pnpm install 把依赖给他安装进来


效果如下:


a6c9ae847a6772879f601e8ca864396c.png


安装好依赖了,咋们该使用了,就在当前建立一个test文件夹,然后使用 jest来进行测试吧


在 test 文件夹下面建立一个 monorepo.spec.ts 文件,方便进行测试


import { add } from 'pkg1'
test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});


然后在在根目录的package.json 脚本命令


"scripts": {
    "test": "jest"
  },


请思考🧐: 这里 在根目录下面直接 pnpm run test 能测试成功吗? 如果不能请思考理由


结果肯定是有问题的:


24edbeb0ecb61cb661e143467ee96dbb.png


解决问题


在上面报错中,咋们会发现,jest 是不能直接运行 ts的。那就往这个方面去解决问题


遇到这种问题,那就该去官网里面找解决方法的时候了 https://jestjs.io/zh-Hans/docs/getting-started


在这里会发现有两种方案来进行解决:


1.使用babel

2.使用 ts-jest


babel


pnpm install --save-dev @babel/preset-typescript  -w


你需要添加@babel/preset-typescript的预设到babel.config.js.


module.exports = {
  presets: [
    ['@babel/preset-env', {targets: {node: 'current'}}],
    '@babel/preset-typescript',
  ],
};


不过,在配合使用TypeScript与Babel时,仍然有一些 注意事项 。 因为Babel对Typescrip的支持是纯编译形式(无类型校验),因此Jest在运行测试时不会对它们进行类型检查。 如果需要类型校验,可以改用ts-jest,也可以单独运行TypeScript编译器 tsc (或作为构建过程的一部分)。


ts-jest


咋们这里用了ts,并且需要类型检查,那就重点来说这种方式


1.在根目录下面安装ts-jest


pnpm add ts-jest -D -w


2.在tsconfig.json 中添加如下类型:


 "types": ["jest"]


3.在当前目录中执行命令,创建对应的jest的配置文件


npx ts-jest config:init


然后就会生成一个jest.config.js的文件


最好在进行pnpm run test 就可以成功啦!


02fce93b8e6712750adc490e69f66f15.png


NO B B, SHOW ME CODE

相关文章
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
525 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
239 1
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
405 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
276 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
454 1
|
4月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
268 0
|
5月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
142 0
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
323 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
301 137
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
810 0