最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vite2.0项目的类mono-repo实践(一仓库多项目,独立打包)

    正文概述 掘金(暴雨先生)   2021-06-26   939

    需求

    需求是在一个月之内上线一个公司内部使用的管理平台,包含前台网站和管理后台网站。

    实现

    由于两个网站有很多相似的地方,出于开发速度、复用、维护性的考虑,就把它们放在了一个git仓库。

    目录结构

    前台项目:customer(简化名)
    管理后台:admin(简化名)

    |-- project
        |-- vite.config.admin.ts
        |-- vite.config.ts
        |-- app
        |   |-- admin
        |   |   |-- App.vue
        |   |   |-- index.html
        |   |   |-- main.ts
        |   |   |-- public
        |   |       |-- favicon.ico
        |   |-- customer
        |       |-- App.vue
        |       |-- index.html
        |       |-- main.ts
        |       |-- public
        |           |-- favicon.ico
        |-- env
        |   |-- admin
        |   |   |-- .env
        |   |   |-- .env.development
        |   |   |-- .env.production
        |   |   |-- .env.test
        |   |-- customer
        |       |-- .env
        |       |-- .env.development
        |       |-- .env.production
        |       |-- .env.test
        |-- src
        |   |-- api
        |   |   |-- common.ts
        |   |   |-- admin
        |   |   |-- customer
        |   |   |-- sys
        |   |-- components
        |   |   |-- common
        |   |   |-- admin
        |   |   |-- customer
        |   |-- style
        |   |   |-- useClass.ts
        |   |-- hooks
        |   |-- layouts
        |   |   |-- admin
        |   |   |-- content
        |   |   |-- customer
        |   |   |-- menu
        |   |-- router
        |   |   |-- index.ts
        |   |   |-- types.ts
        |   |   |-- guard
        |   |   |-- menus
        |   |   |   |-- index.ts
        |   |   |   |-- admin
        |   |   |   |-- customer
        |   |   |-- routes
        |   |       |-- common.ts
        |   |       |-- admin
        |   |       |-- customer
        |   |-- views
        |       |-- admin
        |       |-- customer
        |       |-- sys
        |           |-- error
        |           |-- login
        |               |-- Login.vue
    
    

    vite配置

    package.json

    主要是scripts的配置,如下:
    通过--config来指定配置文件。本仓库前台项目是默认项目,直接用vite脚手架生成的默认配置(即vite.config.ts)。

    "scripts": {
        "dev": "vite",
        "test": "vite --mode test",
        "build": "vite build",
        "serve": "vite preview",
    
        "admin": "vite --config vite.config.admin.ts",
        "atest": "vite --mode test --config vite.config.admin.ts",
        "build:admin": "vite build --config vite.config.admin.ts",
        "serve:admin": "vite preview --config vite.config.admin.ts",
      },
    

    vite.config*.ts

    为了兼容两个项目,vite配置需要修改的地方如下:

    1. 入口
    2. 环境变量目录
    3. 打包输出目录
    customer的vite.config.ts:
    export default ({ mode, command }: ConfigEnv): UserConfig => {
      const env = loadEnv(mode, pathResolve('env/customer/'))
      return {
        root: pathResolve('app/customer'),//1. 修改入口,默认是项目根目录下的index.html
        base: env.VITE_PUBLIC_PATH,
        envDir: pathResolve('env/customer/'),//2. 修改环境变量入口,默认是根目录下的env目录
        build: {
          outDir: pathResolve('dist'),//3. 修改打包输出,默认是root文件夹下面的dist目录,比如/app/customer/dist
          emptyOutDir: true
        },
      }
    }
    
    admin的vite.config.admin.ts:
    export default ({ mode, command }: ConfigEnv): UserConfig => {
      const env = loadEnv(mode, pathResolve('env/admin/'))
      return {
        root: pathResolve('app/admin'),
        base: env.VITE_PUBLIC_PATH,
        envDir: pathResolve('env/admin/'),
        build: {
          outDir: pathResolve('dist-admin'),
          emptyOutDir: true
        },
      }
    }
    

    经过上面的配置,就能独立的跑起来两个项目了。

    一些实践

    区分项目

    在项目中如何区分运行的是哪个项目呢?可以通过import.meta.env.VITE_GLOBAL_APP_NAME
    当然env里面的变量是可以在env目录中自定义的,比如:

    # env/admin/.env
    VITE_GLOBAL_APP_NAME = ADMIN
    
    # env/customer/.env
    VITE_GLOBAL_APP_NAME = CUSTOMER
    

    条件导入路由表

    两个项目的路由表是不一样的,条件导入如下:

    if (import.meta.env.VITE_GLOBAL_APP_NAME === AppNameEnum.CUSTOMER) {
      routesModule = import.meta.globEager('./routes/customer/index.ts');
    } else {
      routesModule = import.meta.globEager('./routes/admin/index.ts');
    }
    

    css类名

    对于各自私有的类名可通过如下方法生成:

    import { AppNameEnum } from '@/enums/appEnum';
    
    export const prefixMap = {
      [AppNameEnum.CUSTOMER]: 'customer',
      [AppNameEnum.ADMIN]: 'admin'
    };
    
    export function useClass(scope: string) {
      const prefix = prefixMap[import.meta.env.VITE_GLOBAL_APP_NAME];
      return `${prefix}-${scope}`;
    }
    

    总结

    本实践相对于mono-repo还是有不少缺点的,比如:不能独立的版本管理;两个项目共用一个package.json,造成依赖冗余...
    建议大型项目使用lerna来生生成和管理mono-repo。


    起源地下载网 » Vite2.0项目的类mono-repo实践(一仓库多项目,独立打包)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元