vue3 源码学习,实现一个 mini-vue(一):搭建框架雏形

简介: vue3 源码学习,实现一个 mini-vue(一):搭建框架雏形

前言

本系列文章旨在通过学习阅读解析 vue3 源码,来实现并产出一个 精简版的 vue

小励志一下:阅读源码的过程会是痛苦的,但这一步总是要迈出去的,如果我们能咬牙坚持到最后,回过头会发现,其实我们已经走出去了很远很远。就酱,Here we go!

1. 搭建 mini-vue 项目基本结构

  1. 创建 mini-vue 文件夹
  2. 通过 VSCode 打开
  3. 在终端中,通过
npm init -y

创建 package.json 模块

  1. 创建 packages 文件夹,作为:核心代码 区域
  2. 创建 packages/vue 文件夹:打包测试实例项目整体入口模块
  3. 创建 packages/shared 文件夹:共享公共方法模块
  4. 创建 packages/compiler-core 文件夹:编译器核心模块
  5. 创建 packages/compiler-dom 文件夹:浏览器部分编译器模块
  6. 创建 packages/reactivity 文件夹:响应性模块
  7. 创建 packages/runtime-core 文件夹:运行时核心模块
  8. 创建 packages/runtime-dom 文件夹:浏览器部分运行时模块
  9. 在每个模块下面创建 /src/index.tsREADME.md 文件

README.md 内容示例:

# reactivity

响应性核心

2. 导入 TS 配置

想要在项目中使用 ts 构建(这里我使用的 ts 版本为 4.7.4),那么首先我们在项目中创建对应的 tsconfig.json 配置文件。

  1. 在项目根目录中,创建 tsconfig.json 文件。
  2. tsconfig.json 文件指定编译项目所需的 入口文件编译器 配置
  3. 也可以通过以下指令来生成 包含默认配置tsconfig.json 文件:
// 需要先安装  typescript
npm install -g typescript@4.7.4

// 生成默认配置
tsc -init
  1. tsconfig.json 中指定如下配置:
// https://www.typescriptlang.org/tsconfig,也可以使用 tsc -init 生成默认的 tsconfig.json 文件进行属性查找
{
  // 编辑器配置
  "compilerOptions": {
    // 根目录
    "rootDir": ".",
    // 严格模式标志
    "strict": true,
    // 指定类型脚本如何从给定的模块说明符查找文件。
    "moduleResolution": "node",
    // https://www.typescriptlang.org/tsconfig#esModuleInterop
    "esModuleInterop": true,
    // JS 语言版本
    "target": "es5",
    // 允许未读取局部变量
    "noUnusedLocals": false,
    // 允许未读取的参数
    "noUnusedParameters": false,
    // 允许解析 json
    "resolveJsonModule": true,
    // 支持语法迭代:https://www.typescriptlang.org/tsconfig#downlevelIteration
    "downlevelIteration": true,
    // 允许使用隐式的 any 类型(这样有助于我们简化 ts 的复杂度,从而更加专注于逻辑本身)
    "noImplicitAny": false,
    // 模块化
    "module": "esnext",
    // 转换为 JavaScript 时从 TypeScript 文件中删除所有注释。
    "removeComments": false,
    // 禁用 sourceMap
    "sourceMap": false,
    // https://www.typescriptlang.org/tsconfig#lib
    "lib": ["esnext", "dom"],
  },
  // 入口
  "include": ["packages/*/src"]
}

3. 引入代码格式化工具: Prettier 让代码结构更加规范

这里没有引入 eslint 因为 mini-vue 这并不是一个开源的代码仓库,所以我们无需专门导入 eslint 增加项目的额外复杂度,只需要导入 prettier 帮助我们控制代码格式即可。

  1. VScode 扩展中,安装 prettier 辅助插件

    image.png

  2. 在项目根目录下,创建 .prettierrc.js 文件:
module.exports = {
    // 结尾无分号
    semi: false,
    // 全部使用单引号
    singleQuote: true,
    // 每行长度为 80
    printWidth: 80,
    // 不添加尾随 , 号
    trailingComma: 'none',
    // 省略箭头函数括号
    arrowParens: 'avoid'
};

4. 模块打包器:rollup

rollup 是一个模块打包器,和 [webpack](https://webpack.docschina.org/concepts/) 一样可以将 JavaScript 打包为指定的模块。

但是不同的是,对于 webpack 而言,它在打包的时候会产生许多 冗余的代码,这样的一种情况在我们开发大型项目的时候没有什么影响,但是如果我们是开发一个 的时候,那么这些冗余的代码就会大大增加库体积,这就不好美好了。

所以说我们需要一个 小而美 的模块打包器,这就是 rollup

Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。

rollup

我们可以在项目根目录下,创建 rollup.config.js 文件作为 rollup 的配置文件(就像 webpack.config.js 一样 ):

import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import typescript from '@rollup/plugin-typescript'

/**
 * 默认导出一个数组,数组的每一个对象都是一个单独的导出文件配置,详细可查:https://www.rollupjs.com/guide/big-list-of-options
 */
export default [
    {
        // 入口文件
        input: 'packages/vue/src/index.ts',
        // 打包出口
        output: [
            // 导出 iife 模式的包
            {
                // 开启 SourceMap
                sourcemap: true,
                // 导出的文件地址
                file: './packages/vue/dist/vue.js',
                // 生成的包格式:一个自动执行的功能,适合作为<script>标签
                format: 'iife',
                // 变量名
                name: 'Vue'
            }
        ],
        // 插件
        plugins: [
            // ts 支持
            typescript({
                sourceMap: true
            }),
            // 模块导入的路径补全
            resolve(),
            // 将 CommonJS 模块转换为 ES2015
            commonjs()
        ]
    }
]

安装插件依赖

npm i @rollup/plugin-commonjs@22.0.1 rollup/plugin-node-resolve@13.3.0 rollup/plugin-typescript@8.3.4 -D

npm i tslib@2.4.0 typescript@4.7.4 -D

package.json 中新增一个 scripts

"build": "rollup -c -w"

随便在 packages/vue/src/idnex.ts 中导出个变量,再执行 npm run build,出现下图结果即说明打包成功。

image.png

5. 配置路径映射

tsconfig.json 中添加如下代码:

{
    // 编辑器配置
    "compilerOptions": {
        ...
        // 设置快捷导入
        "baseUrl": ".",
        "paths": {
            "@vue/*": ["packages/*/src"]
        }
    }
}

6. 总结

这一章应该是比较简单,只是搭建了框架雏形,并且对项目进行了结构和配置上的初始化。

做完了这些之后,接下来我们终于可以开始 源码的阅读模块的实现了,嗨起来!😍

相关文章
|
1月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
131 64
|
1月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
112 60
|
5天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
25 3
|
1月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
35 8
|
1月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
32 1
|
1月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
39 1
|
1月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
缓存 监控 JavaScript
Vue.js 框架下的性能优化策略与实践
Vue.js 框架下的性能优化策略与实践
|
1月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
1月前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
78 7

热门文章

最新文章