Monorepo+federation+defineAsyncComponent构建一栈式主分前端架构

构建一栈式主分前端架构,结合 Monorepo、Federation 和 defineAsyncComponent 是一种现代且高效的开发模式,特别适用于大型项目或微前端架构。

以下是如何将这些技术结合起来实现这一架构的详细步骤:

1. Monorepo(单仓库多包管理)

定义: Monorepo 是一种将多个相关的代码库存储在一个单一的版本控制系统中的方法。它允许你更方便地管理和协调多个项目的依赖关系和版本更新。

工具选择:
•Lerna:用于管理多个 npm 包。
•Yarn Workspaces 或 npm workspaces:用于处理多个包之间的依赖关系。(我选的是pnpm,虽然我觉得pnpm这个词打起来最费劲,但我在.zshrc里面给它设置成了p)
•Nx:不仅支持包管理,还提供了丰富的工具链来优化构建和测试流程。
优点:
•统一的代码风格和配置。
•更容易进行跨项目依赖管理。
•提高了团队协作效率,减少了重复工作。

用Monorepo关键的地方有两个:

1)配置package.json里面的”scripts”,根据调试和打包的组合配置参数。

2)配置dependencies,将共用的部分放到项目根,不过这一点没有上面那条那么重要,属于优化。

  1. Federation(模块联邦)

定义: 模块联邦允许多个独立的应用程序或微前端共享模块,而不需要通过传统的打包方式。实现步骤:
•设置主机应用(Host App):
•使用 Webpack 5 的 ModuleFederationPlugin 配置远程模块。
•示例配置: new ModuleFederationPlugin({
name: ‘hostApp’,
filename: ‘remoteEntry.js’,
remotes: {
remoteApp: ‘remoteApp@http://localhost:3001/remoteEntry.js’,
},
shared: [‘react’, ‘react-dom’],
});

•设置远程应用(Remote App):
•同样使用 ModuleFederationPlugin 暴露模块。
•示例配置: new ModuleFederationPlugin({
name: ‘remoteApp’,
filename: ‘remoteEntry.js’,
exposes: {
‘./Button’: ‘./src/Button’,
},
shared: [‘react’, ‘react-dom’],
});

优点:
•独立部署和开发。
•模块级别的共享,减少冗余代码。
•动态加载远程模块,提升性能。

当然,我用的是vue,上面是钉钉ai助理给的代码,没有仔细看。后面我会整理代码发布到github上供参考。

  1. defineAsyncComponent(异步组件)

定义:defineAsyncComponent 是 Vue 3 提供的一个 API,用于定义异步组件。它可以按需加载组件,从而优化初始加载时间和性能。实现步骤:
•在 Vue 项目中使用 defineAsyncComponent 加载远程组件。 import { defineAsyncComponent } from ‘vue’;

const RemoteButton = defineAsyncComponent(() =>
import(‘remoteApp/Button’)
);

export default {
components: {
RemoteButton,
},
};

优点:
•按需加载,减少初始加载时间。
•提升用户体验,特别是在网络条件不佳的情况下。
综合应用项目结构示例:monorepo/
├── packages/
│ ├── host-app/
│ │ ├── src/
│ │ └── webpack.config.js
│ ├── remote-app/
│ │ ├── src/
│ │ └── webpack.config.js
│ └── shared-components/
│ ├── src/
│ └── webpack.config.js
└── package.json
构建与部署
•构建:使用 Lerna 或 Nx 进行统一构建。
•部署:可以分别部署主机应用和远程应用,确保每个应用可以独立更新和维护。
总结通过结合 Monorepo、Federation 和 defineAsyncComponent,你可以创建一个高效、可扩展的一栈式主分前端架构。这种方式不仅提高了开发效率,还能有效管理和优化大型项目的复杂度。如果你有更多具体的技术问题或需要进一步的帮助,请随时告诉我!(部分内容由AI生成)

实际上,我没有采用ssr的架构,而是采用普通的vite。

实际的目录结构如下:

/apps/one-main
  package.json
/packages/one-basic
  package.json
package.json
pnpm-workspace.yaml

one-main作为我的主应用,one-basic作为的分应用之一,后续还会有one-beau之类的,主应用是作为门户提供最终用户访问的门面的,分应用有两个作用,提供remote-component组件以及对remote-component的单独演示,同时也方便调试。

总体上one-main和one-basic也是同构的,都是采用了https://starchart.cc/xiangshu233/vue3-vant4-mobile这个脚手架,我计划将其中的UI替换为naive-ui,我更喜欢这个简洁的风格。

简单来说,Monorepo是为了这一组代码库方便联调,Federation提供应用间(远程)组件共享,defineAsyncComponent实现动态加载(远程)组件,将远程组件参数化。最终实现的是一个有限灵活度的模板可配置电子书系统。

本方案的代码库:https://github.com/futuremeng/one-momorepo

增加一个新的Title:武汉大学出版研究院兼职研究员

武汉大学出版研究院 https://iop.whu.edu.cn/info/1401/3101.htm

姓名:孟繁永

职务:兼职研究员

研究领域:数字出版,人工智能,数字人文

研究兴趣:利用开源技术搭建低成本轻量化数字出版平台,探索以知识服务为核心目标的数据结构设计、知识加工技术和人工智能应用。

研究成果:

1. 许洁;袁小群;朱瑞;孟繁永. 基于大模型的轻量级智能出版知识服务:理论基础与实现路径[J]. 中国数字出版, 2024 ,v.2;No.2 (01) :25-35.

项目经验:

[主导]语文出版社一书一码融媒体出版平台,2020-2024

[主导]《党建》杂志期刊发行数字化平台,2020-2021

[主导]中国铁建地产集团数据中台与运营可视化,2019-2020

[主导]工商出版社工商法律法规大数据平台,2019-2020

[主导]法律出版社“微版云”数字资源管理云平台,2018-2019

[主导]中国新闻出版研究院希普思会议会展数字化运营平台,2018-2019

[主导]学习出版社《全民经典朗读范本》融媒体出版平台,2017

[主导]中国新闻出版研究院“编辑邦”出版人知识社群,2016-2017

[参与]中国少年儿童新闻出版总社中少快乐阅读平台,2012-2015

[参与]长江出版集团ERP试点,2009-2010

三星watch5开通esim(2024)

上次怎么开通有点记不准了,应该是通过手机上的联通app中的esim卡专区,下载数据即可,而且能点这里跳转到三星智能穿戴app,无缝衔接,结果今天操作不行了。

因为手表绑定换了手机号,需要先退订原来的业务,这个直接在联通app上操作即可。

可是开通就麻烦了,因为要开一号双终端,需要:

(1)抄一大堆反电信诈骗的承诺

(2)本人到场刷脸验证

(3)向柜台提供手表的EID和IMEI

当然,每个月要交10块钱是必须的。

办理完以后,柜台给了一个ESIM卡的二维码。

回来以后,点开联通app想下载数据,显示三星智能穿戴已安装但显示为“未安装”,其中温馨提示说是因为三星esim卡管理器没有安装,我搜了半天,说这个app只有三星手机才有,有人在网上寻求安装包,我没找到。但上次激活过,这次不应该不行。

于是,我直接打开三星智能穿戴,点击手表设置,移动套餐,选择我的手机号之后,貌似自动加载了一个当前手机的套餐,也同步到了手表上,可惜,这个不对,手表无法连到联通网络。继续寻找。

在三星智能穿戴app的移动套餐界面右上角三个点中,点击添加套餐,选择扫码,就是联通柜台给的那个二维码,扫完就有传输到手表的过程,等完成,手表就激活esim了。

docker安装dolphinscheduler添加数据源连接失败

2024-09-27 11:14:16 [ERROR] 2024-09-27 11:14:16.055 +0800 o.a.d.p.d.a.d.AbstractDataSourceProcessor:[130] - Check datasource connectivity for: MYSQL error
2024-09-27 11:14:16 java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

看下docker-dolphinscheduler-api-1容器的日志中发现以上失败,通过检索发现,可以把驱动包放在lib/plugin/task/sql目录下,但是,这个目录在哪里却是个问题,后来查看源代码(https://github.com/apache/dolphinscheduler/blob/3.1.0/dolphinscheduler-api/src/main/docker/Dockerfile),确定ENV DOLPHINSCHEDULER_HOME /opt/dolphinscheduler,那么进入容器的/opt/dolphinscheduler这个目录确实能看到libs子目录,其中已经有一些连接器了,只不过那些就是官方所说的符合开源协议的已经内置的,像mysql的就不符合apache的开源协议,所以只能自己往里放,可是为什么官方文档里没有提到呢?

我是搜到了https://www.bookstack.cn/read/dolphinscheduler-3.1.0-zh/7667e5f48166e75f.md,这个来自官方的早期镜像版:

我们以 MySQL 为例,如果你想要使用 MySQL 数据源,你需要先在 mysql maven 仓库 中下载对应版本的 JDBC 驱动,将其移入 api-server/libs 以及 worker-server/libs 文件夹中,最后重启 api-server 和 worker-server 服务,即可使用 MySQL 数据源。如果你使用容器启动 DolphinScheduler,同样也是将 JDBC 驱动挂载放到以上两个服务的对应路径下后,重启驱动即可。

查看对应版本的官方文档却找不到对应的章节。

目前,以3.2.2版本来说,需要放连接器的容器包括:

docker-dolphinscheduler-api-1

docker-dolphinscheduler-worker-1

docker-dolphinscheduler-alert-1

以docker desktop操作说明,找到这两个容器,点击容器名进入容器,切换到Files,/opt/dolphinscheduler/libs,右键import,选择mysql-connector-j-8.2.0.jar,然后重启以上三个容器就可以了。

开放式小区计划

这个计划失败了,也成功了。

推墙没有成功,但至少门开放了。如果小区没有了院墙,世界会更美一些吧,至于大家担心的小区内道路有车通行影响安全,实际上不会比现在更差,本来也没有实现人车分流,反而,如果小区没有了围墙,车可以很快并入公共路网,小区内的汽车转圈更少。当然,这个愿景恐怕在十年内实现不了。

小区有三个门,一个东北门,是大门,进出机动车和行人,一个是东南门,是消防通道,里面和外面长期被堵,恐怕消防车很难通行,另一个是西门,长期锁闭,以前还可以通行非机动车,疫情三年之后,加焊了栏杆,只能过人了。

三个门的行人通道都是常锁的,据说是为了防止附近其他小区的人穿行,尽管我也觉得我们小区在附近算环境稍微好一点的,但也不至于自以为是高端社区,搞成封闭的。

在一段时间的努力之后,人们已经习惯于不再刷卡开门,门变成了可以直接推开的,三个都是。具体什么方式暂且保密,有一个有趣的可以提一下,消防门那里经过了长期的反复较量,有人在门磁上贴胶带缠绳子,有人就弄下来,最终,那里就不用刷卡了。规矩是人定的,事在人为。

另外一个是我们的单元门,为了防止流窜人员的理由一样站不住脚,能挡风就行了,完全没有锁上,快递上不去。最终,那个门也锁不住了。

6月,我错过的日子又找回来了

这个暑假很热,孩子们放假了,但没法出去晃,整日在家里,除了看孩子,最主要的工作是研究AI,最大的投资是买了一台二十多万的存储。

等过完了暑假,来到了9月,开始给客户做服务器迁移,却又把日子退回到了6月,因为习惯了本地的有代理环境,突然远程到客户的服务器上去部署环境,发现连最基本的docker装起来都费劲了。

查了一下才知道,是因为6月和AI,造成整个docker源挂了,甚至连国内的镜像站也都关闭了。服务器上用代理终究不是个很好的办法,于是找了半天,终于找到一个可用的镜像地址。

如此下去,国内的IT还真是要回到手推车的年代吧。

坚果R2连接三星watch5手表方法(2024)

之前费了很大劲绑定的,看了很多教程,以至于最后怎么连接的都搞不清楚了。因为手机摔坏了,换了一个手机,当然,还是坚果R2。

习惯性的先装上谷歌框架,按照原来收藏的信息,怎么都连不上。看到了https://help.wearosbox.com/faq/device/samsung.html收到启发,删掉谷歌框架,只安装了:

(1)wear os中国版(在中国的应用市场上安装就是中国版)

(2)三星智能穿戴

(3)三星健康

接下来是连接步骤:

(1)装好了之后,直接打开“三星智能穿戴”连接手表,如果提示手表需要重置,则在手表的设置中选择重置,手表重启(这个时间可能要几分钟)后,手机上的“正在扫描要添加的设备”就能看到手表型号,点击以后开始蓝牙配对,手机和手表都点击确认即可。

(2)接下来一系列确认。

(3)有一个自动备份手表的步骤,看似不能跳过,先点下一步,然后拒绝就行了,当然,如果用三星的换机助手备份一下也没有问题。

(4)然后接下来又是一系列确认,然后开始配置,估计有几分钟的时间。

(5)这样就好了。

估计是三星的app升级了,重新对接了wear os中国版,消除了bug,以至于以前的折腾终于可以免去,但如果按照了谷歌框架反而会造成上面链接提到的判断“该手机无法支持”等。

(6)最后,不要删除wear os,删除了三星智能穿戴的连接也就断了。如果你以为它已经没用,把它删掉了,那就去三星智能穿戴解绑,重新连接。

另外提一句,如果直接打开wear os,不点击三星的连接,而选择第二个wear os连接手表,虽然手表设置环节不能完成,但是这时候三星健康是可以连接上手表的,手表因为停在设置状态不可用,则可以通过重启后长按logo进入“独立使用模式”,但这个时候三星健康依然能同步,相当于跳过了三星智能穿戴,只是这个链接不稳定,而且不能通过手机app设置手表,所以还是按标准三步流程连接吧。

最后的最后,解决一下将手表步数同步到微信运动。

(1)安装谷歌框架,以在google play中去安装“健康平台”这个app,或者直接找到app安装包。参考https://www.bilibili.com/read/cv25382423/?jump_opus=1,这个app是装在手表上的,手机上看不到。

(2)然后打开这个链接https://ecommerce.samsungassistant.cn/index.html#/jd/activity/748/0

(3)“点击开启插件”,只有这样能找到这个插件,接下来是授权。这个虽然叫插件,但在手机的应用程序权限管理中可以看到,可以把自启动和第三方启动打开。

(4)授权时有可能失败,可以重新打开“三星健康”的设置“三星健康设置”中的应用程序,这时应该可以看到这个插件了,点击能确认权限。

需要说明的是,以上方法并没有让我能够确认微信运动能够获得同步的步数,用最新版的三星健康app的时候甚至有报错通知,我把版本降到了Samsung Health_6.23.0.047_APKPure.apk,不报错了,但依然无法同步,我问过三星客服,想给她要最新的插件,她说不能提供。最终在手机重启也或者是等待了一段时间之后,微信可以同步步数了。

另外一个就是三星健康监测功能,这个最主要的是提供心电图,心率在三星健康中就有,不需要单独装这个,心电图在中国版默认是用不了的。简单来说,就是先在手机上安装某个伴侣软件,具体操作可以看https://www.lxtend.com/miscs/SHM_MOD_Installation_and_Setup_Guide,也可以参考https://help.wearosbox.com/faq/device/samsung.html#%E4%B8%89%E6%98%9F%E5%81%A5%E5%BA%B7%E7%9B%91%E6%B5%8B 来操作,不过按照app中的说明一步一步走问题也不大,只是大部分人第一次搞不一定熟悉它的逻辑。

如何在nginx中将laravel配置到二级目录

    # 此处配置二级目录站点
    location /sso {
        rewrite /sso/(.*)$ /sso/index.php?=$1 last; break;
        location ~ \.php$ {   
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php80:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME /www/one/one-api-sso-ywcbs/public/index.php; 
        }
    }

参考:如何使用一个域名配置多个Laravel项目?

以前一直没有找到一个可用的配置,导致laravel一直挂在根目录,其他前端项目反而都要用二级目录,终于找到一个配置可用了。可怜我对nginx的了解还是不够多。

以上配置中,php80:9000是来自docker的php80,如果用的其他的php部署方式,请按指定方式配置该项即可。