Monorepo架构: 项目管理模式对比与考量

微前端 前置知识2--- monorepo架构 我们采用的是微前端一个主应用,和多个子应用,我们肯定不会一个一个去install安装依赖,太傻了,我们采用monorepo 架构 一次install 即可安装完成。第一步需要安装pnpmpnpm内置了对单个代码仓库包含多个软件包的支持,是monorepo架构模式的不二速选。 阅读详情

关于 monorepo 相关概念及项目管理模式

  • 在软件开发中,尤其是前端项目,我们会涉及到不同的项目管理模式,这里先介绍几个重要的概念
  • “monorepo”是当前较为热门的一种项目管理方式,虽然很多人可能听说过,但可能在实际项目中以不同的形式接触过它

单体应用架构(monolithic)

  • 单体应用架构是在一个项目中使用 git init 来初始化项目的所有代码。
  • 这种模式的优点是代码管理成本低、代码能见度高,无需额外的学习成本,发布简单,链路便捷
  • 然而,其缺点也很明显,代码量大会导致调试和构建效率显著下降。例如模板组件库项目,如果要分离出基础组件,就需要添加多个 tsconfig.ts 配置文件,而且无法跨项目使用,代码耦合度高

多仓库管理模式(multirepo)

  • “multi”在英文里有“多”的意思,多仓库管理模式就是采用多个仓库来管理项目。
  • 前端项目用一个 git 仓库,后端项目用另一个 git 仓库,可以使用 git subtree 或者 git submodule 进行操作
  • 不过,这种模式不太流行,原因主要有两点:
    • 一方面,git subtree 和 git submodule 命令相对复杂,而前端开发者可能更关注业务本身而非复杂的命令操作
    • 另一方面,使用 git submodule 时,如果其他伙伴更新了代码,自己有时可能会忘记更新,从而导致代码冲突或出现问题

1 ) 多仓库管理模式也有其优点:

  • 便于代码复用,模块和组件相对独立,开发调试效率高
  • 人员编排分工更加明确
  • 能提高研发人员抽取公共代码的思维能力
  • 源代码访问权限设置更加灵活,可以根据仓库设置其他人员的读写权限

2 ) 但它也存在一些缺点:

  • 模块划分力度不容易把握,有些仓库代码量少,管理起来不方便
  • 存在共同引用的版本问题,管理方式与常规开发方式有出入,会导致重复安装项目依赖的多个版本,构建配置无法复用,模块体量大时发布成本急剧上升

monorepo 管理模式

  • monorepo 是在一个仓库里管理项目的多个模块,这些模块还可进一步细分
  • 例如在一个项目中创建一个 git 仓库,然后安装 packageA、packageB、packageC 并使用它们的不同功能模块。这种模式具有以下特点:
    • 利用 bit 管理所有仓库中的代码,bit 命令相对通用,适用于前端和服务端项目。
    • 不像 git submodule 那样有多个 submodule 库需要管理,对于较大的项目,只需在一个仓库里拉取所有代码并调整部分模块即可。
  • 不过,monorepo 也有不足之处:
    • 如果没有对应权限,可能影响其他开发者的功能或模块
    • 需要针对不同的 package 单独发布,需要学习 monorepo 的管理方式。而且它更多地存在于前端项目中

项目拆分考量

  • 当考虑是否将项目拆分为多仓库时,有几个关键因素:
    • 如果项目中有核心代码不希望所有开发人员看到,需要进行代码隔离,就适合使用多仓库管理。
    • 当项目出现扩展功能或与现有功能完全不相干时,也需要用另一个仓库来管理。

示例项目分析及代码统计操作

  • 以 Vue 项目为例,它被拆分成了多个 package,如 core、dom、SFC(Single File Component)、SSR(Server-Side Rendering)等
  • 我们可以参考这样的公共开源项目,来判断自己的项目在多大规模和复杂度时需要进行拆分
  • 为了统计项目的代码量,可以借助 GitHub Actions 来完成。具体操作步骤如下:
    • 将项目 fork 到自己的仓库。
    • 在仓库中创建一个新的 workflow 文件。
    • 在搜索框中搜索 CLOC(Count Lines of Code),选择相应的代码复制粘贴到 workflow 文件中。
    • 将触发方式改为手动触发,属性项设置为 workflow_dispatch。
    • 保存文件并设置一个合适的名称,如 count-lines。
    • 根据需要修改代码中的输出配置,例如将结果输出到一个 CLOC.md 文件中。
    • 提交更改并手动触发 workflow 来计算代码量。
  • 通过以上操作,我们可以根据代码量来判断项目是否需要拆分
  • 一般来说,如果项目代码量还未超过 11 万行,可能无需拆分;即使有 24 万行代码,也有可能使用 monorepo 架构进行管理
  • 后续看下如何创建 monorepo 项目以及使用哪些工具来助力管理
微前端与Monorepo的架构设计 本文主要介绍如何使 Monorepo 与微前端结合使用,篇幅较长,请结合目录酌情阅读。微前端/Monorepo方案都存在很多争议,争论无意义,选择适合自己团队的方案即可。技术实战以 Micro App + pnpm 技术栈,讲解了从零搭建到项目部署的一个完整微前端项目。 阅读详情

相关推荐

手写 Element Plus:用Monorepo架构搭建Element Plus

本文介绍了 Element Plus 源码项目的目录结构及开发环境搭建,重点阐述了使用 pnpm 的 monorepo 管理模块化代码的优势和具体实现方法。通过配置 pnpm-workspace.yaml 和分层管理 TypeScript 配置文件,实现了组件库的低耦合和高效编译。此外,涵盖了幽灵依赖问题的原理及解决方案,指导从零搭建 Element Plus 项目,细化了组件、文档和测试目录结构。

m0_63752950的博客 1498

完美搭配,微前端与 Monorepo 的架构设计

前言本文主要介绍如何使 Monorepo 与微前端结合使用,篇幅较长,请结合目录酌情阅读。微前端/Monorepo方案都存在很多争议,争论无意义,选择适合自己团队的方案即可。技术实战以 Micro App + pnpm 技术栈,讲解了从零搭建到项目部署的一个完整微前端项目。了解 Monorepo 与微前端当想使用一项新的技术时,大量的重构工作会让你不得不放弃使用新技术的想法时,这时选择微前端方案,...

React_Community的博客 2541

AI驱动的智能自动化测试平台WHartTest:重塑测试流程的架构与实践

自动化测试是软件工程中保障质量、提升效率的关键实践,其核心原理在于通过脚本模拟用户操作,实现测试用例的自动执行与验证。随着人工智能技术的发展,AI Agent和RAG(检索增强生成)等技术为自动化测试带来了新的价值,能够智能生成用例、理解需求并自动修复脚本,从而显著降低对人工经验的依赖和维护成本。在实际应用场景中,AI赋能的测试平台正从需求分析、用例设计到脚本执行的全流程重塑测试工作。本文以WHartTest为例,探讨其如何利用AI Agent和RAG技术,构建从需求到可执行测试的智能闭环,为测试团队提供高

weixin_42567046的博客 283

没有那么难!10 分钟带你构建monorepo架构,前端通用自动化 CI/CD 方案

点击上方前端Q,关注公众号回复加群,加入前端Q技术交流群今天我们主要讨论3方面内容:如何搭建比较高效好用的monorepo工程前端如何基于搭建的monorepo工程实现自定义cli工具普通前端项目以及monorepo工程项目自动化cicd核心问题以及解决方案基于 pnpm-workspace + Turborepo + lerna 搭建 monorepo 的 cli 工程首先利用 pnpm 初始...

LuckyWinty的博客 1490

计算机毕业设计springboot基于微信平台的二次元手办商场小程序【附源码】

选题背景: 随着二次元文化的兴起和普及,越来越多的人开始对二次元角色产生了浓厚的兴趣和喜爱。手办作为二次元文化的重要载体之一,成为了许多二次元爱好者收藏和展示的对象。然而,在传统的线下手办商场中,消费者往往面临着时间、空间和选择的限制。因此,基于微信平台的二次元手办商场小程序应运而生。 选题意义: 首先,基于微信平台的二次元手办商场小程序能够打破地域限制,使得用户可以随时随地通过手机进行购物。无论是在家中、上班途中还是旅行中,用户都能够方便地浏览和购买自己喜欢的手办,极大地提高了购物的便利性和灵活性。

拉期程序 452

FPGA矩阵键盘计算器Verilog实现与Quartus仿真全流程解析

本文详细解析了基于FPGA和Verilog的矩阵键盘计算器实现全流程,包括矩阵键盘扫描、状态机设计、算术运算逻辑及数码管显示驱动。通过Quartus仿真与Testbench测试,确保设计稳定性与准确性,适合数字逻辑设计初学者学习FPGA开发与硬件描述语言应用。

chair的专栏 743

Monorepo架构: 项目管理工具介绍、需求分析与技术选型

如何实现 monorepo,以及在项目中如何管理多个包,在进行具体项目开发前,有必要强调一个重要思维 — 全局观即看待技术方案时,要从需求角度出发,综合考量该方案能否长远满足项目或团队需求为什么要有全局观呢?如果直接拿一个项目,用特定工具创建工作区间并将其作为 monorepo 项目使用,虽直观易感受,但当技术更新时,这种思维方式就会落后若站在更高视角了解新技术、新方向,先梳理相关工具,明确哪些工具可满足需求,虽前期会花费一些时间,但后续不论遇到何种工具,都能清楚其用途。

Wang的专栏 1499

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 378

Turborepo实战指南:从零搭建现代化Monorepo

Turborepo实战指南:从零搭建现代化Monorepo 【免费下载链接】turbo Incremental bundler and build system optimized for JavaScript and TypeScript, written in Rust – including Turbopack a...

gitblog_00369的博客 743

深入理解搜索引擎——搜索评价指标

    搜索引擎,在做好query理解、索引召回以及排序模型之后,就能直接推上线了吗?答案是否定的,还需对其性能和质量进行评测。性能无非是对时间和空间的运行效率作评测,不细讲,今天讲讲搜索引擎的质量评测。通过质量评测,可根据评测结果不断的进行改进和研究,也可以验证搜索引擎在真实环境中运行时的实际效果。因此,搜索引擎的质量评测对于整个系统的研制和发展是至关重要的。     那么有哪些指标可以评估搜索引擎的结果质量呢?最广为人知的

我是药老的博客 4485

数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)

文章目录引述斯皮尔曼相关系数(spearman)定义 引述 经过之前几节的学习,我们了解并掌握了皮尔逊相关系数。在学习中我们发现,皮尔逊相关系数的使用条件相当苛刻:两组变量必须是连续数据、呈现正态分布,且两者间必须成线性关系。如果我们在数学建模中拿到一组数据无法满足以上条件,那么有没有其他的方法去判断两组变量之间的相关性呢?答案是肯定的,它就是斯皮尔曼相关系数(spearman). 斯皮尔曼相关系...

东 6万+

Monorepo与Multirepo:企业级代码管理方案全面解析

monorepo multirepo企业级包管理器

小马过河R的博客 930

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限,烦请指出~IPM变换(逆透视变换),顾名思义,即将正常透视效应消除的变换,变换结果为鸟瞰图BEV(俯视图);AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图(也是俯视),其使用的单应矩阵将四个相机转到同一个俯视坐标系。

mxdsdo09的博客 4175

Monorepo下多AI Agent协同开发:Symphony协调架构与工程实践

在软件工程领域,Monorepo(单一代码仓库)架构因其高效的代码共享和统一的依赖管理,已成为大型前端和基础设施项目的流行选择。其核心原理是将多个相关项目或包集中管理,但这也带来了构建测试复杂、影响范围难以预估的挑战。随着AI辅助开发进入深水区,从单一AI编码助手到多AI Agent协同完成复杂项目的跃迁,协调成本呈指数级上升。通过引入Symphony协调层,可以构建一套基于规则引擎和状态机的指挥体系,实现任务的智能解析、分发与上下文管理。该技术方案能有效解决代码冲突与上下文割裂问题,其价值在于将AI Ag

weixin_30856725的博客 398

从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景

本文围绕SAP PI AEX配置中ABAP后端系统与AEX的连接问题,梳理了关键概念和技术脉络。重点指出基于ABAP 6.20及更高版本的业务系统内置了本地集成引擎(Local Integration Engine),负责与AEX的消息交互。配置要点包括:1)在SM59中创建HTTP类型RFC目标连接AEX;2)配置SAP_PROXY_ESR供设计时代理生成;3)通过SXMB_ADM设置业务系统角色为应用系统;4)确保SLD注册和SICF服务激活。文章特别强调运行时代理消息传递与设计时代理生成的区分,以及H

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 99

RK3588更新NPU驱动的方法

想要在 RK3588 上跑一下 deepseek 的大模型,发现目前的内核提供的 NPU 驱动比较低,无法支持新的大模型,所以需要更新一下我们的 NPU 驱动本次更新的NPU驱动仅适用于RK3588和RK3676系列。

荻夜的博客 2152

Cargo工具链与Workspace多项目管理:从实践到架构思考

Cargo workspace是Rust工程化成熟度的重要体现。它通过统一的依赖管理、高效的构建复用、灵活的发布策略,为大型项目提供了坚实的基础设施。掌握workspace不仅需要理解其机制,更需要在实践中培养模块化设计的直觉——何时拆分、何时合并、如何平衡灵活性与复杂度,这些都是需要持续打磨的工程艺术。对于追求卓越的Rust开发者而言,深入理解workspace是迈向架构师之路的必经之途。

2401_89231019的博客 1391

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Markmap思维导图引擎:架构设计与高级应用深度解析

在当今信息爆炸的时代,可视化思维工具已成为开发者和技术团队提升效率的重要武器。Markmap作为一款基于纯文本构建思维导图的开源引擎,以其独特的技术架构和卓越的性能表现,为开发者提供了一套完整的思维可视化解决方案。本文将从技术架构、核心模块设计、性能优化策略到高级应用场景,全方位解析这个优秀开源项目的设计哲学。 ## 技术架构深度解析:Monorepo下的模块化设计 Markmap采用现代化的

gitblog_00892的博客 477

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Workspace多项目管理深度实践

Workspace是Cargo为大型项目和单体仓库(monorepo)架构提供的强大组织机制。它允许在单个仓库中管理多个相关的crate,共享依赖版本、统一构建配置,同时保持各个crate的独立性。深入理解workspace的设计哲学和最佳实践,是构建可扩展Rust项目的关键能力。

cat9733的博客 750

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

企业级中后台管理系统前端架构设计:从单体到模块化的演进之路

不要一开始就追求完美的架构设计,而应该:从简单的单体应用开始按需引入模块化逐步拆分微前端持续重构优化企业级中后台系统的前端架构设计是一个持续演进的过程。随着技术的发展和新需求的不断涌现,我们需要保持架构的灵活性和前瞻性。低代码平台的深度集成AI辅助的开发模式Serverless前端的应用更加智能的自动化测试提升开发效率、保障系统稳定、支持业务创新。希望本文能为你的中后台系统架构设计提供有价值的参考。

fineday 887

游戏 DLSS 不更新也能换新:DLSS Swapper 完整上手

游戏里的画质组件还停在两年前的版本,画面发软,发行商却迟迟不发补丁——这是 DLSS 玩家最常见的憋屈。DLSS Swapper 是应对它的开源工具:直接替换游戏目录里的 DLSS、FSR、XeSS dll,把版本升到更新或回退到更稳的档位,全程不用等游戏本体更新。 ## 它到底能做什么、不能做什么? 先把边界摊开说,避免白折腾: - 它**不能**给不支持 DLSS 的游戏凭空加上 DLS

gitblog_00537的博客 140

LobeHub多智能体协作架构深度解析:构建企业级AI团队操作系统

LobeHub是一个开源的多智能体协作平台,采用现代化技术栈构建,为企业级AI应用提供了完整的解决方案。作为"首席智能体运营官",LobeHub通过创新的架构设计解决了传统AI应用中智能体孤立、上下文缺失和手动切换的痛点。 ## 🔧 技术架构概览与核心设计理念 LobeHub采用微内核架构设计,将系统划分为清晰的责任边界。前端基于Next.js构建,采用混合路由策略:Next.js App

gitblog_00777的博客 413

**用Vue3+TS+Node解锁全栈开发新体验 —— fullstack-blog**

用Vue3+TS+Node解锁全栈开发新体验 —— fullstack-blog 在技术日新月异的时代,全栈开发技能成为每一个前端工程师所追求的目标之一。今天,我要向大家推荐一款集前沿技术和优秀架构于一身的开源项目——fullstack-blog,这不仅是一个功能完备的个人博客系统,更是一套精良的学习资源库,带你领略全栈的魅力所在。 项目简介 fullstack-blog是一款由Vue3、Typ...

gitblog_00356的博客 525

Jasna 视频马赛克修复完整教程:GPU 加速修复全链路,1080p 整片提速 3.6 倍

Jasna 是一款免费开源、GPU 加速的视频马赛克修复工具:从解码、检测、修复到编码,整条链路都压在显卡上完成,1080p 整片修复相比同类工具快约 3.6 倍。如果你手里有带马赛克的视频或图片,想在不买新硬件的前提下修出能看的画面,这篇 Jasna 安装配置与调优教程就是为你写的——读完就能在自己的显卡上跑通第一个修复任务,并知道显存不够时该动哪个参数。 ## 30 秒选定修复模型:三条规则

gitblog_00003的博客 290

自定义 Cargo 命令:扩展 Rust 工具链的力量

自定义 Cargo 命令是 Rust 工具链设计中最具远见的特性之一。通过这个机制,Cargo 不再是一个功能固定的单体工具,而是演变成了一个可扩展的平台。任何开发者都能够编写独立的工具,只要遵循简单的命名约定,就能无缝集成到 Cargo 生态中。这种插件化架构不仅体现了开放性,更是对 Unix 哲学"做好一件事"的完美践行——Cargo 负责项目管理的核心,而各种特定领域的需求则由社区贡献的自定义命令承载。自定义命令的存在降低了 Cargo 本身的复杂度,避免了功能蔓延。

2501_94047260的博客 387

fast-stable-diffusion 完整指南:5 分钟在 Colab 跑通 Stable Diffusion,附 DreamBooth 微调

fast-stable-diffusion 是一套面向 Google Colab 的 Stable Diffusion 部署 notebook,把 A1111 WebUI、ComfyUI 和 DreamBooth 训练三件事,压缩成"从上到下逐格运行"的三步。它专门解决免费/Pro Colab 上从零搭环境慢、依赖互相冲突、模型要反复下载的痛点。适合想不用本地 GPU、低成本快速出图或微调主体的初

gitblog_00352的博客 486
上一篇: 数据结构与算法之数组: LeetCode 905. 按奇偶排序数组 (Ts版)
下一篇: Monorepo架构: 项目管理工具介绍、需求分析与技术选型
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值