手写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 UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
143 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
115 60
|
10天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
38 3
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
39 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
33 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
42 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
4天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
38 1
|
14天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
46 1
vue学习第一章

热门文章

最新文章