基于 KONOS 编写一个部门级的前端框架

news2025/1/20 12:03:10

01 什么是 konos

现在对于前端框架的定义越来越广泛了,在前端工程化中的某一个环节的特定方案,都可泛称为一个前端框架。

konos 是一个插件化的前端框架基座,如果你对 umi 有所了解的话,可以把它当作一个没有任何功能的 umi core 基座。

konos 提供了一些简单的接口,方便用户扩展和编写 cli 服务。

比如想写一个 'yarn create app' 用于初始化项目的话,只需要:

然后执行 'npx konos init cli' 就可以完成一个和用户交互后生成脚手架的工作。

02 为什么会有 konos

这个需求最初来自灵犀开发平台的灵蜂框架需求,它需要将部分模块通过产物包的方式提供给用户,而部分模块以源码的方式提供,然后需要在开发的时候将所有的模块串通,因为不同模块之间存在业务关联和鉴权。

所以再编写这个框架的时候,我就想这么特殊的需求,放到 alita 里面不是很合理,而且和业务性关联性太强了,最终可能需要将这个框架交付到业务开发人员的手里维护。

就需要这个框架的可扩展性极强,上手难度极低。所以将核心的功能抽离成 konos,将业务性绑定的放到脚手架本地的 scripts 中,但是同时将他映射为本地的可执行命令。(这个不在本次的分享内容中)

03 如何使用

初始化一个框架

根据提示输入框架的名称,这里以 hj 举例:

这就完成了一个 hj 框架,你可以使用 hj xxx 的命令来启动对应的 cli 服务,比如内置的 hj inits config,可以在当前项目生成 hj 框架的配置文件。

以下举几个例子来展示如何基于 konos 编写一个部门级别的前端框架:

> 未说明的文件,都是生成的脚手架已经自带的文件

增加需要的配置参数

src/config/schema.ts

可能你刚开始不知道需要加什么配置,你可以在你需要的时候再回来添加,这里我为了后续描述的连续性,先在这里全部列出了,我这次需要使用的配置。

将构建后的产物包发布到云端

因为部分模块是以产物包的方式提供给用户,所以就需要一个上传和下载的云端,如果有服务器提供,你可以根据上传和下载的接口来完成这个流程,我这里为了演示方便,就用 npmjs 作为我的云端。

这个要考虑到对接的模块是以什么框架构建的,但是正常的产物包是放在 'dist' 或者 'build',所以我们默认去找这两个目录,当然也提供配置给用户指定,就是上面添加的 'outputPath':

找到构建产物包之后,其实很简单,只要新建一个 'package.json',然后使用 'npm publish' 就可以把包发布到 npm 上。

新建文件 src/commands/publish.ts

将云端上的包下载到本地

前面说到上传非常简单,只需要执行 'npm publish' 就可以,那下载是不是只要执行 'npm install' 就可以呢?

其实这要看和我们的需求是否符合了,'npm install' 会将子包放到 'node_modules' 文件夹下,然后所安装的模块也需要编写在项目的 package.json 文件中,但是这个包显然与我们正在开发的项目无关,并且放到 'node_modules' 之后也很“难”找到,当然通过包名查找也不是很难,但是如果后续还需要预览,做文件代理显然是一个大问题。

所以我们需要编写一个特定的 'npm install' 来完成我们的需求,这要求我们对于 npm 的执行有一定的了解,这里不做过多的展开。简而言之就是下载-解压的过程。

npm 除了根据 package.json 执行 'install' 之外还可以使用通过执行 'npm pack repo@version' 将指定的包下载到本地文件,当然了,需要注意的是下载的执行目录要避免是一个 npm 包,因为 'npm pack' 也用来将当前项目做一个打包压缩,你可以简单的理解为执行 'npm publish' 的时候,其实是先执行了 'pack' 再上传。

你可以在任意空文件夹下尝试一下,比如执行 'npm pack xiaohuoni@0.0.1',将会在当前文件夹下得到 'xiaohuoni-0.0.1.tgz' 文件,然后使用解压工具打开它就能得到和 'npm install xiaohuoni@0.0.1' 一样的内容,只是存放路径不一样而已。

因此我们需要做的只是简单的解压文件操作,将文件解压到它对应的包名的目录下,使用 linux 命令就可以完成:

由于 linux 命令在 window 上需要打开 git 提供的命令行工具才能正确执行,所以我们使用 node 包 'tar' 来完成。

为了加快每次执行安装的过程,我们可以加一个简易的缓存机制,如果本地已经存在对应的 'tgz' 包,就使用本地的包而不再从 npm 上下载。

关于需要指定安装的模块,我们通过增加一个配置 'dependencies' 来完成:

dependencies 使用和 package.json 中的 dependencies 配置一致,这对于前端人员来说,零理解成本。

比如配置:

上面我们提到文件将被解压到对应包名的目录下,比如 '@lingxi-assets/demo' 默认的解压路径是 '/build/demo',模块相互之间存在关联性,所以这个文件结构,可能会遇到需要灵活配置的时候,因此我们增加一个配置 'paths' 用来指定包名对应的解压路径。

如配置:

'@lingxi-assets/demo' 最终会被解压到 '/build/hello' 目录。

新建文件 src/commands/install.ts

本地预览构建产物

至此这个需求就都完成了,下面,我再举一个前端框架常见的需求举例,我们再框架构建之后,总会在本地打开,看看构建产物是否都正确生成,不管构建环节的脚本和测试做的多么完善,这也算是一种人工的兜底行为,我们常用的就是 'cd build && serve' 这会在本地 3000 端口启动一个 server 服务,能代理映射到 build 目录,因此我们可以方便的访问 'build/index.html' 文件来验证产物。

但是常常遇到一个问题,本地开发使用 proxy 作为代理,中转了请求,但是在 build 之后 proxy 可能就无效了,因此我们现在的需求就是,在 build 之后,如何继续使用 proxy 配置。

其实我们可以简单的写一个命令,如 'hj preview'。其实就是一个 express 中间件,需要的数据,我们可以通过增加两个配置 'proxy' 'nginx'来指定。

如配置:

根据上面的配置,我们就可以实现,当访问首页的时候,自动代理到 'demo' 目录,当请求以 '/server' 开头的路径会被中转到目标服务器,所以只要 proxy 配置与开发时使用的 proxy 配置一致,nginx 配置与部署时使用的 nginx 对应,就可以在本地更好的还原云端的部署情况。这在调试验证的时候,非常好用。

新建文件 src/commands/preview.ts

04 文件结构

不知道细心的你有没有发现,上面实现的三个功能,每个功能实现代码行数都没超过 100 行,其中还包括空行和必要的模版代码。这在使用 konos 之前是比较难做到的,毕竟简单的 cli 的命令行配置也要写不少的代码。

另外文件其实可以放在任意的目录下,模版脚手架为了逻辑上能更好的管理项目,因此区分了 'commands' 'config' 'generators' 'inits' 这几个文件夹,你可以完全按照你的个人喜好来重新组织文件结构,只需要最终在 'src/preset.ts' 文件中,使用上你编写的文件即可。

05 结语

假如把 'umi' 'alita' 'fish-x' 这样的通用框架称为公司级前端框架的话,那基于 konos 的产物,就是部门级的前端框架了,它拥有更高的客制化和超高的纯净度,但同时也代表着它没有附带任何的功能实现,每一步要做什么都需要开发者自己实现,所以如果是常规的前端需求,最好还是选用公司级的前端框架,毕竟框架给的足够多。不过好在 konos 开发人员仅仅需要掌握一点点的 node 和 express 知识。当然你也可以把部门级框架当作公司级框架的功能补充,以 konos 的灵活性完全可以兼容所有的前端框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ单机环境部署

文章目录 1. 前置条件2. 下载源码3. 编译源码4. Rocket MQ启动JVM参数配置5. 启动RocketMQ6. 安装DashBoard7. 测试RocketMQ9. 查看dashboard情况 不太懂RocketMQ基本概念的看我 这篇博客 1. 前置条件 (看我这篇博客,注意版本要改成3.2.*,m…

神经网络:Zero2Hero 2

Zero → \to → Hero : 2 接上篇,Zero → \to → Hero : 1,进一步的扩展模型: 增加输入字符序列的长度,通过多个字符预测下一个字符的概率分布增加模型的深度,通过多层的MLP来学习和预测字符的生成概率增加嵌入层&…

深度学习04-CNN经典模型

简介 卷积神经网络(CNN)是深度学习中非常重要的一种网络结构,它可以处理图像、文本、语音等各种类型的数据。以下是CNN的前4个经典模型 LeNet-5 LeNet-5是由Yann LeCun等人于1998年提出的,是第一个成功应用于手写数字识别的卷积…

【数据结构】线性表之链表

目录 前言一、链表的定义二、链表的分类1. 单向和双向2. 带头和不带头3. 循环和不循环4. 常用(无头单向非循环链表和带头双向循环链表) 三、无头单向非循环链表的接口及实现1. 单链表的接口2. 接口的实现 四、带头双向循环链表接口的及实现1. 双向链表的…

磺酸基-Cy5 羧酸Sulfo-Cy5 COOH分子式C32H37N2KO8S2

Sulfo CY5 COOH是一种有机化合物,属于荧光染料。它具有荧光、稳定、水溶性等特点,因此被应用于分析化学、生物技术、药物研发等领域。Sulfo CY5 COOH的分子式为C32H37N2KO8S2,分子量为680.87。它的荧光波长为670nm,可以通过荧光显…

如何在AD中添加自定义材料单模板

AD默认的材料单格式和常用的格式有点区别,为了减少在材料单格式编辑的工作,决定添加自定义模板到AD的模板中。 1.查找AD模板的安装位置 在AD菜单Reports中,找到“Bill of materials”菜单, 点击后,弹出的窗口中包含了…

Kubernets1.20部署Redis7.0集群6节点三主三从(完整版)-2023.5.13

目录 一、产品选型二、草图三、部署1、安装NFS服务1)NFS Server端安装NFS2)创建NFS 共享点3)启动rpcbind、nfs服务4)验证服务配置 2、创建持久卷PVC1)创建ServiceAccount账号2)创建provisioner3&#xff09…

vite入坑之路:react+vite动态导入报错@vite-ignore的解决方法

正常的动态组件导入方式 webpack搭建的项目,不管是react还是vue通常引入动态组件基本这么写: const url import(../pages/${locale}) // vite不支持or const url import(../pages/${locale}/index.jsx) // vite不支持这在vite架构中,一般…

Vue3+vite环境变量配置

在项目开发中,通常来说,不同的环境会有不同的请求api接口,这就需要修改配置,才能满足对应的环境。所以这里就使用了环境变量。环境变量就是在不同的环境中使用不同的变量值。 # 环境变量文件(.env) 在项目根目录(和sr…

TCP协议和相关特性

1.TCP协议的报文结构 TCP的全称为:Transmission Control Protocol。 特点: 有连接可靠传输面向字节流全双工 下面是TCP的报文结构: 源端口和目的端口: 源端口表示数据从哪个端口传输出来,目的端口表示数据传输到哪个端口去。…

FPGA_学习_03_第一个FPGA程序流水灯

学习编程,最重要永远就是动手,本文将在开发板上实现FPGA的“Hello world”→流水灯。本文主要目的是熟悉在Vivado上从零到程序运行起来的基本开发流程。 1 硬件电路介绍 本人购买的开发板接在PL端的只有2个LED灯,刚好达到流水灯的最低要求。…

今年这情况,大家多一手准备吧......

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

ASEMI代理MAX5048BAUT+T原装ADI车规级MAX5048BAUT+T

编辑:ll ASEMI代理MAX5048BAUTT原装ADI车规级MAX5048BAUTT 型号:MAX5048BAUTT 品牌:ADI /亚德诺 封装:SOT-23-6 批号:2023 安装类型:表面贴装型 引脚数量:6 工作温度:-40C~125C 类型&a…

npx下载构建nuxt3开发模板失败的解决方案

在搭建nuxt3项目开发的时候,安装nuxt3开发模板的时候,使用命令: npx nuxi init my-app 会出出现一下错误: This is related to npm not being able to find a file. 发生上述错误是因为您有一个未正确安装的依赖项。 以下是解决…

大央企的“中央厨房”,泰裤辣

本文来源:特大号 作者:特大妹 最近两年,大央企大国企在数字化转型中,特热衷成立“中央厨房”。 有的中央厨房,单独挂牌为“数科公司”,有的中央厨房,升级为集团数字化转型的一级部门。 把之前各…

“警”彩集结|北峰通信亮相11届警博会,多场景助力警务智能化

2023年5月11日-14日,第十一届中国国际警用装备博览会(警博会)在北京首钢会展中心隆重召开。“警博会”作为中国乃至亚太地区最具影响力、最权威的警用装备盛会,代表了中国警用装备行业的最高水平。北峰通信作为服务公共安全实战30余年的企业,…

软考A计划-真题-分类精讲汇总-第十二章(法律法规与标准化)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Web渗透 不断更新

Web渗透 SQL注入一般注入步骤 文件上传漏洞过滤绕过空格绕过 针对Linux特定字符过滤绕过 针对Linux(例如:cat) 序列号unserialize SQL注入 一般注入步骤 注入点 --> 查询注入字段数 --> 查询注入回显位 --> 查询当前数据库信息 --> 查询数据库表 --&g…

MySQL基础(三十四)锁

1. 概述 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的 资源。为保证数据的一致性,需要对 并发操作进行控制,因此产生了 锁 。同时 锁机制 也为实现MySQL 的各…

HIT数据结构lab2-树型结构的建立与遍历

title: 数据结构lab2-树型结构的建立与遍历 date: 2023-05-16 11:42:26 tags: 数据结构与算法 哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目:树型结构的建立与遍历 实验题目&#xff1…