rabow——umi-qiankun微服务框架企业实践(3)

目录结构解析

这里不赘述umi的相关内容。只讲rabowl框架新增重要的目录结构

rabowl
---- libraries
      ---- rbui
            ---- src
                ---- components
      ---- rbutils
          ---- es
          ---- lib
          ---- src
---- packages
      ---- App1
      ---- App2
      ……
      ---- config.json
---- rabowl
    ---- src
    ---- bin
---- src
    ---- app.ts
---- .umirc
---- tsconfig.json
---- .gitignore

项目结构

20211011102327.png

主目录

主目录也是主应用的项目目录,主要使用umijs的框架。

  • .umirc文件
    项目配置还是在.umirc。对于@umi-qiankun的配置,大家可以去umi官网查看。
    这里只说明一下我改动的地方
export default defineConfig({
...
 chainWebpack(config: any) {
    config.module
      .rule('js')
      .test(/\.(js|mjs|jsx|ts|tsx)$/)
      .include.add(
        path.join(__dirname, 'libraries', 'rbui', 'src', 'components'),
      )
      .end()
      .exclude.add(/node_modules/)
      .end()
      .use('babel-loader');
  },
  alias: {
    '@rbui': path.join(__dirname, 'libraries', 'rbui', 'src', 'components'),
    '@rbutils': path.join(__dirname, 'libraries', 'rbutils', 'es'),
  },
 qiankun: {
    master: {
      // 注册子应用信息
       apps: [{
            name: 'App1', // 唯一 id
            entry: isDev ? 'http://localhost:8001' : '/webs/app1/index.html', // html entry
          },],
    },
  },
...
}

chainWebpack的配置是为了让webpack能正确的将引入的公共组件库rbui中的组件打包到项目中。
alias可以让项目中使用公共组件库rbui和公共配置库rbutils
其他子应用中也有这样的配置。

  • src/app.ts
    主应用的主代码都在src目录下,主应用和子应用的通信可以在app.ts文件中配置useQiankunStateForSlave。例如:
import './index.less';
import './mixin.less';

import { useState } from 'react';
import { getGlobalInfo } from './services';
import { useMount, usePersistFn } from 'ahooks';

export function useQiankunStateForSlave() {
  const [globalState, setGlobalState] = useState({ config: undefined });
  const setGlobaConfig = usePersistFn((state: any) => {
    setGlobalState({ ...globalState, ...state });
  });
  useMount(() => {
     getGlobalInfo().then(async (currentUser: any) => {
       setGlobaConfig({ currentUser });
    });
  });

  return {
    globalState,
    setGlobaConfig,
  };
}

注意一定要将setGlobalState封装后再传给子应用,否则子应用无法将参数传给主应用。

  • tsconfig.json
    为了让ts能正常的解析rbuirbutils 需要为他们配置一下
{
...
  "paths": {
      "@/*": ["src/*"],
      "@@/*": ["src/.umi/*"],
      "@rbui/*": ["./libraries/rbui/src/components/*"],
      "@rbui": ["./libraries/rbui/src/components/"],
      "@rbutils/*": ["./libraries/rbutils/es/*"],
      "@rbutils": ["./libraries/rbutils/es/"]
    },
..
}

这一点其他子应用中也类似。

  • .gitignore
    这里是关于git的配置。通过项目结构我们可以清除,在git库管理上,主应用、rabowl 命令、rbuirbuitls项目都是在主git库中的。
    而其他子应用应该有自己的git库,主应用不能管理他们的代码。所以在主应用的.gitignore需要将子应用排除掉。
/packages/App1/**
#不能使用
# /packages

每次新增子应用都需要在这里注册一下。
如果是通过rabowl命令rabowl cca --app xxx新建的话会自动注册
因为我们需要使用packages目录下的config.json。所以不能直接屏蔽整个packages目录。

注意:.eslintrc.js和stylelintrc.js 整个项目最好只有一个,子应用不要配置。但是tsconfig.json最好都配置

rabowl 目录

这里是rabowl命令行工具的项目
rabowl工具如下

指令:
  cca          (create-clid-app) 创建子应用
    Options:
        --app <appName>          要创建的子应用名称 
        --targetDir <targetDir>  子应用所在目录,默认是 ./packages 
 
  clean        删除子应用或者删除文件文件夹
    Options:
        --app <appName>          要删除的子应用名称 
        --name <fileName>        要删除的文件或文件夹 
        --targetDir <targetDir>  子应用所在目录,默认是 ./packages
        
  cm           (create model) 生成 dva model 文件
    Options:
        --name <name>  生成文件名称或路径,以当前路径为基准 
        --demo <demo>  是否需要实例数据 1 为是 0 为否 非必填

  crf          (create react function component) 生成 react 函数组件文件 包含 index.tsx index.less
    Options:
        --name <name>  生成文件名称或路径,以当前路径为基准 

  crc          (create react class component) 生成 react 类组件文件 包含 index.tsx index.less
    Options:
        --name <name>  生成文件名称或路径,以当前路径为基准

  clear        删除所有应用的依赖 node_modules 文件夹

  init         初始化项目,会根据packages目录下的 config.json 使用 git clone 所有子应用到对应的目录下

  ready        初始化项目,会根据packages目录下的 config.json 使用 git clone 所有子应用到对应的目录下,不给应用安装依赖。

  gitadd       针对所有应用的修改 执行 git add .

  gitcommit    针对所有应用的修改 执行 git commit
    Options:
        --m <msg>      代码提交信息 

  gitpush      针对所有应用的修改 执行 git push

  gitpull      针对所有应用 执行 git pull
  
  gitcheckout  针对指定的应用 执行 git checkout
    Options:
        --app <app>        app 目录名称,不指定就是主应用 
        --branch <branch>  需要切换的目标分支 
        
  gitlog       针对指定的应用 执行 git log
    Options:
         --app <app>    app 目录名称,不指定就是主应用 

rabowl命令的使用方法,后续文章会介绍。这里说一下rabowl目录结构。
源码在rabowl/src下,所有命令注册在index.ts里面,功能在其他ts文件中。使用者可以根据自己的需要对函数进行修改。修改完成后必须打包才能生效。可以在rabowl目录下执行npm run build打包;或者在主目录下执行npm run build:cli

libraries目录

libraries目录下是公共组件rbui项目和公共配置rbutils项目,属于公共目录,可以对整个项目进行统一配置和减少重复开发。

  • rbui 项目公共组件库采用 umi 框架开发。如果直接启动项目,可以在项目中开发基础组件,其他子项目中通过相对路径引用组件。组件都在src/components目录下。开发完成的组件可以在src/components/index.ts里面注册。如果不在这里注册,引用的时候就需要指定具体的目录。例如:

// 如果在 src/components/index.ts 注册了组件
export { default as Icon } from './Icon';
// App1 
import { Icon } from '@rbui'

// 如果没有注册组件
// App1 
import Icon from '@rbui/Icon'

  • rbutils 是公共配置提供者。暴露一些公共参数给所有的应用使用,当你需要修改某些配置或公共参数时就不需要每个项目都去改了。参数都写在src下可以写在不同的文件中最后注册在src/index.ts里面。添加了新的参数后,需要打包才能让其他应用使用。可以在当前应用下使用npm run build 或者在主应用下使用npm run build:utils
    如果是构建阶段需要使用公共参数请使用相对路径../../libraries/rbutils/lib/index引用。如果是组件中使用公共参数,直接用@rbutils来引用

packages目录

packages下是所有的子应用

  • config.json管理子应用的状态
 //packages/config.json
[
 {
  "name": "App1",  // 应用名称 也是子应用的文件夹名称 大驼峰
  "version": "1.0.0", // 版本号,没有实际作用
  "git": "http://xxx.xxx.xx/app1.git", // git 库地址
  "gitName": "app1", // 对应git 库名称
  "active": true, // 是否启用,如果active为false,那么在 rabowl ready时将不会被下载
  "branch": "V1.0.0" // git 分支
 }
]

以上参数,除了version 其他都是必须的。
特别注意:
active 字段如果为false 那么 使用rabowl的命令行都不会去操作这个子应用,包括代码保存和提交,初始化应用,打包,启动应用等。但是你可以自己配置相关的命令行。

  • 子应用们
    每个子应用单独一个文件夹,可以通过rabowl的命令yarn rabowl cca --app AppName来生成子应用。
    每个子应用都是使用的umi框架并在.umirc.ts中配置了qiankunslaver属性
      export default defineConfig({
        ...
        chainWebpack(config: any) {
          config.module
            .rule('js')
            .test(/\.(js|mjs|jsx|ts|tsx)$/)
            .include.add(path.join(__dirname, '..', '..', 'libraries', 'rbui', 'src', 'components'))
            .end()
            .exclude.add(/node_modules/)
            .end()
            .use('babel-loader');
        },
        qiankun: {
          slave: {},
        },
       ...
        alias: {
          '@rbui': path.join(__dirname, '..', '..', 'libraries', 'rbui', 'src', 'components'),
          '@rbutils': path.join(__dirname, '..', '..', 'libraries', 'rbutils', 'es'),
        },
       ...
        outputPath: '../../dist/webs/app1',
        publicPath: './',
       ...
      });
       

outputPath配置之后,所有子应用在打包后,静态文件都会打包到主应用下的dist文件夹下。这样和主应用的 qiankun配置对应上,部署的时候可以一起部署,节省了部署的时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容