基于Vue3+TS的Monorepo前端项目架构设计与实现

   2023-03-08 学习力0
核心提示:写在前面你好,我是前端程序员鼓励师岩家兴!去年在另一个项目https://juejin.cn/post/7121736546000044046中,我向读者朋友们介绍了结合npm包管理工具yarn作vue3项目的monorepo架构设计。今天,在这个风和日丽阳光明媚的钱塘江畔,我心情很好,我打算再写一

写在前面

你好,我是前端程序员鼓励师岩家兴!去年在另一个项目https://juejin.cn/post/7121736546000044046中,我向读者朋友们介绍了结合npm包管理工具yarn作vue3项目的monorepo架构设计。今天,在这个风和日丽阳光明媚的钱塘江畔,我心情很好,我打算再写一篇她的姊妹篇------基于Vue3+TS的Monorepo前端项目架构设计与实现(pnpm版本)。

额,别看标题起的吓人且正经,像是在搞研究发论文一样,其实就那么点东西,炒冷饭,大体上就是把之前是yarn设计的monorepo架构项目,在新的项目里用pnpm做一次新的尝试改造,仅此而已,若有不对,供学习交流批评指正!

Vue3介绍

额,vue3是一个前端开发框架,生态系统完备,你可以把它理解成手动挡小轿车。它区别于Vue2的特性之一是,它是Composition API构造,在这之前Vue2使用的是Option API。还有一个好消息,之前Vue2使用的Object.defineProperty作数据绑定响应式,而Vue3使用了更为先进的Proxy做这件事,更为优雅了很多。Vue3中还有很多新的语法糖和写法、构建工具可以选择比较新的Vite、一些现成的开发框架去github上搜element ui、ant vue design、view ui之类的解决方案吧,一些钩子库比如说antfu大佬的@vueuse之类的。

这部分知识就介绍到这里,具体的你如果看得进去文档就去官网翻文档去github下源码看,你如果看不进去你就掘金上买点掘金大佬写的掘金小册吧,我看了下Vue2、Vue3好多都有的,买之前建议你看下评价读下章节再买,这个不支持七天无理由退款的。

Typescript介绍

Typescript是JavaScript的超集,介绍完毕!

这部分知识介绍到这里,如果你看得进去文档建议你去看MDN的Javascript、EcmaScript文档,以及微软公司的Typescript文档;看不进去推荐你去掘金上买掘金大佬写的掘金小册,其它友商的价格虚高,我觉得掘金小册的价格还行,嗯。

推荐的Vue开箱即用项目

这里推荐我的好朋友极客恰恰老师的Vue3开箱即用项目,该项目基于vue3+ElementPlus+Typescript+Vite搭建一套通用的后台管理模板;并基于常见业务场景,抽象出常见功能组件;包括动态菜单,菜单权限、登录、主题切换、国际化、个人中心、表单页、列表页、复制文本、二维码分享等等

地址是:https://github.com/GeekQiaQia/vue3.0-template-admin

开源不易,且fork且star且珍惜,因为是开源的嘛,所以如果你有什么好的想法和实现,也欢迎你去提PR去提ISSUES帮助项目变得更好更强大。

推荐的node版本管理工具

因为你工作不可能说你只开发一个项目,然后很多项目node版本又不一样,难道是要卸载再重装吧,直接用nvm吧,具体的请百度自行安装。

推荐的npm包管理工具

因为你工作不可能说你只开发一个项目就被裁了,然后很多个项目不同负责人的包管理工具又千奇百怪,直接用pnpm吧,因为安装快、全局Store加hard link管理、支持monorepo等。

pnpm的workspace实操

第一步,先初始化一个项目

pnpm init

第二步,创建pnpm-workspace.yaml

这里分为两个方向,请结合第一张图看,第一部分是Web应用程序,它可能一个项目有很多个端和平台,所以放到applications目录,还有一个是公共的组件啊样式啊资源啊钩子函数啊工具包啊都放到packages下统一维护。

这里为了便于展示,我把node_modules暂时设置不展示,读者可以清楚看到层级分明的前端项目解决方案

第三步:各大配置文件

eslint作语法规约

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
  },
  plugins: ['prettier'],
  extends: ['@antfu', 'plugin:prettier/recommended', 'eslint-config-prettier', 'prettier'],
  rules: {
    // 生产环境不允许打出log
    'no-console': process.env.NODE_ENV === 'production' ? 2 : 0,
    // 关闭catch捕获的err要处理
    'n/handle-callback-err': 0,
    // 关闭未使用的ts变量声明
    '@typescript-eslint/no-unused-vars': 0,
    // 关闭vue不用有重复的key
    'vue/no-dupe-keys': 0,
    // 关闭没有声明emits
    'vue/require-explicit-emits': 0,
    // 关闭变量在上级作用域定义
    'vue/no-template-shadow': 0,
    'vue/valid-v-slot': 0,
  },
}

editorconfig抹平编辑器差异

[*.{js,jsx,ts,tsx,vue}]
# 缩进使用空格
indent_style = space
# 缩进2个字符
indent_size = 2
# 行结尾使用 lf !!!!
end_of_line = lf
# 删除行尾空格
trim_trailing_whitespace = true
# 文件结尾添加一个空行
insert_final_newline = true
# 行最大长度
max_line_length = 120

prettier作书写规范

module.exports = {
  printWidth: 120,
  tabWidth: 2,
  useTabs: false,
  semi: false,
  singleQuote: true,
  quoteProps: 'as-needed',
  bracketSpacing: true,
  jsxSingleQuote: true,
  arrowParens: 'always',
  endOfLine: 'lf',
  htmlWhitespaceSensitivity: 'ignore',
  overrides: [
    {
      files: '*.json',
      options: {
        printWidth: 200,
      },
    },
  ],
}

第四步:配置git提交钩子

执行楼下命令

pnpm install -wD commitizen cz-conventional-changelog

pnpm install -wD @commitlint/cli @commitlint/config-conventional husky

commitlint.config.js作提交规范约束、集合husky钩子触发。

module.exports = {
  extends: ['@commitlint/config-conventional'],
  // 自定义提交消息规则
  rules: {
    'body-leading-blank': [2, 'always'],
    'footer-leading-blank': [1, 'always'],
    'header-max-length': [2, 'always', 108],
    'subject-empty': [2, 'never'],
    'type-empty': [2, 'never'],
    'type-enum': [
      2,
      'always',

      // Git提交的信息,开头可引用以下这些类型
      [
        // 功能方面的提交
        'feat',

        // Bug方面的提交
        'fix',

        // 性能方面的提交
        'perf',

        // 针对代码样式的提交(不是CSS样式)
        'style',

        // 文档方面的提交
        'docs',

        // 数据方面的提交
        'data',

        // 测试方面的提交
        'test',

        // 重构方面的提交
        'refactor',

        // 编译打包方面的提交
        'build',

        // 持续集成方面的提交
        'ci',

        // 持续部署方面的提交
        'cd',

        // 数据库方面的提交
        'db',

        // 其他修改,比如构建流程,依赖管理
        'chore',

        // 回滚方面的提交
        'revert',

        // 工作流方面的提交
        'workflow',

        // 定义TS类型方面的提交
        'types',

        // 配置方面的提交
        'config',

        // 优化方面的提交
        'refine',

        // 清除废弃多余无用代码文件的提交
        'clean',

        // 整理代码及文件方面的提交
        'organize',

        // 依赖管理方面的提交
        'dependency',
        // 分支合并方面的提交
        'merge',
      ],
    ],
  },
}

需要把这些写到根目录的package.json文件

第五步:润 润 润!

人和项目有一个能跑就好,我试试把项目跑起来

成功!教程就介绍到这里,若有那部分不理解的,欢迎通过羽雀相关信息找到我!

pnpm workspace相关命令

额,为了便于读者理解,我这边直接代入一个具体的包做讲解,你在使用的时候只要注意下改成你自己的包就好。

  • pnpm install @ataola/zjt -w: 将zjt包安装到项目根目录
  • pnpm install @ataola/zjt -wD: 将zjt包安装到项目根目录的devDependencies
  • pnpm install axios --filter @ataola/run: 将axios包安装到ataola名下的润包,其中--filter可以简写-F
  • pnpm build --filter @ataola/run: 构建ataola名下的润包
  • pnpm build --filter "./applications/**" :构建applications下所有的包
  • pnpm install @ataola/run -r --filter @ataola/project: 将ataola名下的润包安装包ataola名下的project包下

最后

感谢阅读,因为之前也写过类似的,所以一些细节请参见她的姊妹篇https://juejin.cn/post/7121736546000044046

简单地说下优点:高可复用!逻辑思路简洁明了,公共的抽离出来便于单独维护升级。

这里简单地讲下我的偷懒吧,我不高兴打那么长的字母,我给它阉割了一些字母,具体的如下:

这样子比如你要运行一个项目pnpm pl:dev就好了,少打了好多个字母可以摸鱼了,2333333333。

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • vue3+TS 自定义指令:长按触发绑定的函数
    vue3+TS 自定义指令:长按触发绑定的函数而然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢。编写自定义指令时遇到的几个难点1.自定义指令的类型在ts中写任何东西都要考虑到类型的问题,自定义指令的类型问题依然存
    03-08
  • Vue生命周期 vue生命周期几个阶段
    Vue生命周期 vue生命周期几个阶段
    官网解释一、Vue的生命周期Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom - 渲染、更新 - 渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。Vue2生命周期:1.beforeCreate(创建前)数据观测和初始化事件还未开始,此时 dat
    03-08
  • vue 中安装并使用echart
    vue 中安装并使用echart
    本文为博主原创,转载请注明出处:1.安装echart 依赖:  安装命令: npm install echarts --save  在vscode 的终端窗口进行执行,如图所示:   执行完之后,查看 项目中的echart 版本依赖是否添加成功:  package-lock.json 中有具体的echart 依赖
    03-08
  • day04-Vue01
    day04-Vue01
    Vue011.Vue是什么?Vue(读音/vju:/,类似于view)是一个前端框架,依据构建用户界面Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或者项目整合支持和其他类库结合使用开发复杂的单页应用非常方便Vue是Vue.js的简称官网:Vue.js - 渐进式 JavaScr
    03-08
  • Vue + Element 自定义上传封面组件
    Vue + Element 自定义上传封面组件
    前一段时间做项目,频繁使用到上传图片组件,而且只上传一个封面,于是想着自定义一个图片封面上传组件。先来看一下效果:                      第一张图片是上传之前,第二张图片是上传成功后,第3张图片是鼠标放上去之后的效果! 首先整理需
    03-08
  • 基于ZR.VUE 前端的改造,页面刷新报错
     问题描述:前后端分离开发,分开部署. 页面刷新 直接报404 错误的解决办法提示:  先在 .env.development 中 配置 VUE_APP_BASE_API , 将 '/' 替换为 后端地址 'http://localhost:8888/'如果是对应的发布的正式环境,也要修改  .env.production 的VUE_APP_
    03-08
  • Vue3 企业级优雅实战 - 组件库框架 - 9 实现组
    上文搭建了组件库 cli 的基础架子,实现了创建组件时的用户交互,但遗留了 cli/src/command/create-component.ts 中的 createNewComponent 函数,该函数要实现的功能就是上文开篇提到的 —— 创建一个组件的完整步骤。本文咱们就依次实现那些步骤。(友情提示
    03-08
  • vue-3 this概念
    一、this概念官方是这样说的:在 setup()内部,this 不会是该活跃实例的引用因为 setup() 是在解析其它组件选项之前被调用的,所以 setup() 内部的 this 的行为与其它选项中的 this 完全不同这在和其它选项式 API 一起使用 setup() 时可能会导致混淆啥意思呢
    03-08
  • vue3和百度地图关键字检索 定位 点击定位
    vue3和百度地图关键字检索 定位 点击定位
    效果图在index.html中引入百度地图开放平台  去申请你的ak 非常的简单可以自己百度 一下!-- 这个用官网给的有好多警告 更具百度的把 https://api.map.baidu.com/getscript?v=2.0ak=xxxxxxxxxxxxxxxxxxxxx 换为这个就没有那么多 报错了 --scripttype="text/j
    03-08
  • Vue集成lodop插件实现打印功能 vue打印console
    Vue集成lodop插件实现打印功能 vue打印console
    目录VUE简单使用lodop1.创建LodopFuncs.js文件2.在打印功能vue页面引入LodopFuncs3.执行打印方法4.打印接口函数官网样例说明5.完整页面示例VUE 集成LODOP插件打印Lodop、C-Lodop使用说明及样例http://www.lodop.net/LodopDemo.htmlVUE简单使用lodop1.创建Lodo
    03-08
点击排行