vue3源码分析——rollup打包monorepo

简介: 有了rollup,咋们是不是需要在打包的目录下面来搞个配置文件rollup.config.js,里面咋们写上入口,出口,打包的格式等

引言


<<往期回顾>>


1.手写vue3源码——创建项目

2.手写vue3源码——reactive, effect ,scheduler, stop

3.手写vue3源码——readonly, isReactive,isReadonly, shallowReadonly

4.手写vue3源码——ref, computed


本期咋们就先放一放源码,咋们如何打包monorepo应用,主要是源码看累了🤣🤣🤣,打包工具也是一门必须课,所有的源码请查看


效果


为了提供大家的学习兴趣,咋们先来看看效果,准备发车,请系好安全带🚗🚗🚗


bad2eca7cb7745b29797daecbd7abc4a.gif


cjs 结果预览


d02e21dfff2423b3440812da246b4fda.png


esm 结果预览


e16c3595499db6f543f9133274770470.png


声明文件预览


0ca0865230b29c49dd6850b09b867104.png


正文


vue3使用的是rollup来打包的,咋们也用rollup来打包咋们的应用,有不了解rollup的请查看官网,monorepo是多个单体仓库合并得到的,那么咋们就先来打包单个仓库,然后再来想办法怎么一键打包全部


打包shared


在我项目中,shared仓库是相当与utils函数的集合,用于对外导出一些工具函数,那么咋们可以在本目录下的package.json中安装rollup。 正当我就想在shared目录下面安装rollup插件的时候,我大脑给了个慢着的问号?


monorepo 是不是可以在跟下面安装依赖,然后子包都可以共享,基于这一特征。我毫不犹豫在根目录下面敲下了下面的命令:


pnpm add rollup -w -D
复制代码


有了rollup,咋们是不是需要在打包的目录下面来搞个配置文件rollup.config.js,里面咋们写上入口,出口,打包的格式等


// 由于咋们需要打包成cjs, ems的格式,对外导出一个函数吧
[
  {
    input: './src/index.ts',
    output: {
      file: 'dist/index.esm.js',
      format: 'esm',
    },
  },
  {
    input: './src/index.ts',
    output: {
      file: 'dist/index.cjs.js',
      format: 'cjs',
    },
  }
 ]
复制代码


然后在本目录下的package.json中加入打包的命令:


 "build": "rollup -c"
复制代码


nice, 到这了就完了,咋们试一下,结果:


ffeaa0f1f514308faaa44220d2a44f23.png


分析错误可以发现,咋们是用了ts的语法,rollup无法转换ts的语法,需要使用插件了。😉😉😉


那么rollup转换ts的插件也是有好多种,这里咋们用一个最快的那种,esbuild, rollup-plugin-esbuild


pnpm add esbuild rollup-plugin-esbuild -w -D
复制代码


关于rollup-plugin-esbuild这个插件,官方的介绍是说:


esbuild is by far one of the fastest TS/ESNext to ES6 compilers and minifier, this plugin replaces rollup-plugin-typescript2, @rollup/plugin-typescript and rollup-plugin-terser for you. 意思是说,这个插件是目前来说转换ts/esnext到es6是最快的编译和压缩,这个插件可以代替 rollup-plugin-typescript2, @rollup/plugin-typescript and rollup-plugin-terser的集合


但是如果咋们需要打包非常低版本的代码,那就请查看rollup 实战第三节 打包生产打包低版本的代码.


言归正传,那么咋们把插件用上,在配置文件上加上插件


//... 省略其他
plugins: [
      esbuild({
        target: 'node14',
      }),
    ]
复制代码


再来一次🤩🤩🤩


9b2438f8daab5c04de2e11f83079521e.png


通过结果,咋们可以看到已经打包成功了!🎉🎉🎉


但是咋们是有ts的,肯定还需要生成咋们代码的类型吧,那就使用 rollup-plugin-dts这个来生成


pnpm add rollup-plugin-dts -w -D
复制代码


rollup-plugin-dts详情请查看


// 在数组后面在加上一项,
{
    input: './src/index.ts',
    output: {
      file: 'dist/index.dts',
      format: 'esm',
    },
    plugins: [
      dts(),
    ],
  },
复制代码


然后就可以ok啦,咋们单个项目就完成了


打包多个


既然单个是这么写,那么其他的咋们是不是也可以写配置文件呢?对的,没错,可以在对应的单体项目下面写上rollup.config.js来对他们进行打包的配置


然后咋们在跟目录下面的package.json中加入一行命令:


"build": "pnpm -r --filter=./packages/** run build"
复制代码


咋们来拆分下命令


1.pnpm -r 等同于 pnpm --recursive,意思是说在工作区的每个项目中运行命令,不包括根项目,详情查看


2.--filter=./packages/**意思是说,过滤其他文件和文件夹,只使用packages下面的所有文件夹


3.run build 是 pnpm -r run build的后缀,执行package.json中的build指令,详情请查看


合起来的意思是说,依次执行packages里面所有文件夹的package.json的build命令


优化


通过上面的方式咋们就可以打包成功了,但是这里咋们还可以进行优化下,每一次打包dist结果都需要手动删除,咋们可以使用 rimraf 这个库来帮我们自动删除


pnpm add rimraf -d -W
复制代码


然后在每一个子包中修改build的命令


"build": "rimraf dist && rollup -c"
复制代码


对比vue3打包


这里可能有的人会说,vue3仓库都不是这么玩的,的确,vue3仓库的打包流程如下:


506d42e0907f75ed704561a037a2f87f.png


有兴趣的可以取看源码哈,这里给出流程图,想要使用这种方式的就自己实现哈!🎃🎃🎃

相关文章
|
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` 实现自定义组件的双向数据绑定。
|
JavaScript 开发工具 git
vue多页面开发和打包的正确姿势
前段时间做项目,技术栈是vue+webpack,主要就是官网首页加后台管理系统 根据当时情况,分析出三种方案 一个项目代码里面嵌两个spa应用(官网和后台系统) 分开两套项目源码 一套项目源码里面就一个spa应用 思考: 直接否定了一套项目源码里一个spa应用(ui样式会相互覆盖,如果没有代码规范后期比较难维护) 两套源码的话,后台可能开两个端口,然后需要用nginx反向代理可能比较麻烦,而且前端开发也比较麻烦麻烦,毕竟需要维护两个git仓库,两套git上线流程,可能会损耗很多时间。
4495 0
|
4天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
38 1
|
14天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。

热门文章

最新文章