引言

一项技术能得以广泛运用,其中的一个关键点在于工程化。前端从最开始的简单写写网页和样式,发展为需要处理复杂的逻辑,伴随而来的是问题是相关文件越来越多,简单在网页中引用已经解决不了问题,需要相关的工程化工具来处理和优化这个流程。前端社区也涌现了较多的解决方案,例如rollup,parcel,webpack,esbuild等,在不同情况下都能较好的处理问题。这其中webpack因其微内核架构,在核心功能稳定且优秀的发挥情况下,开发者可以灵活的控制各个流程,使得其周边生态趋于多样和较为完善,逐渐成为各解决方案中的首选。

但是正是基于其微内核架构的灵活性,以及生态的多样性,使得其复杂度直线上升。缺乏经验的工程师往往对其配置等不太了解,浪费了较多时间解决配置问题,影响开发效率;同时如何更好的优化打包效率,也需要一定的积累。数栈前端团队基于webpack封装了ko,并在数栈指标管理,业务中心,消息管理中心等产品线陆续实践和优化,最终使得配置等问题更为简化,同时打包效率相比于之前有2倍以上的提升,较为完美的解决了如上问题。

整体架构

ko的整体架构如下所示:

整体上是一个monorepo,借助lerna与yarn workspace方便对包进行管理,其中:

  • babel-preset-ko-app是针对于ko的babel preset,供babel-loader使用
  • ko-config集成了eslint,prettier,stylelint等lint相关的配置和依赖,供ko-lints使用
  • ko-lints集成了eslint,prettier,stylelint等lint相关的工具
  • ko作为整个工具的入口,集成了ko-lints,并整合了dev与build相关核心功能

在数栈中的应用

从整体架构上来说,目前ko集成了打包和格式化相关的功能,那么ko在数栈中是如何应用的呢?我们以数栈产品业务中心的整个研发流程来举例。

develop

首先是开发流程,ko dev相关的可配置项如下所示:

  • -p, --port <port>: 配置端口号
  • --host <host>: 配置host
  • -t, --ts: typescript支持
  • -a,--analyzer: 使用webpack-bundle-analyzer进行打包结果分析

另外与之相关的是ko的配置文件ko.config.js,我们只需要在配置文件中添加如下内容:

module.exports = {
  entry: ['./src/app.tsx'],
  devServer: {
    proxy,
    host: '127.0.0.1',
    port: 8082,
  },
};

指定开发阶段的几个必要配置,并执行ko dev -t命令,就可以在http://127.0.0.1:8082看到程序正常运行

code review

在整个数栈的研发体系中,code review这个环节会先借助eslint来对代码写法等进行检测,检测通过之后再进行后续的review步骤,借助工具进行代码检测这个功能也被集成进了ko。

ko eslint相关的可配置项如下所示:

  • -f, --fix: 开启自动修复
  • -c, --config <path>: eslint自定义配置路径
  • --ignore-path <ignorePath>: eslint需要忽略的文件配置路径,默认为.koignore

我们只需要执行ko eslint或者ko es就可以对代码格式等进行检测。ko默认集成了比较合理的eslint配置项,同时也可以使用-c, --config <path>配置项来自定义配置项。

与ko eslint类似的还有ko prettier和ko stylelint,分别是借助prettier和stylelint来对相关代码进行检测和格式化,使用方式和ko eslint基本相同

build

开发和code review结束并通过测试之后,我们可以将当前的版本内容发布到线上环境了,这时候就需要使用ko build将当前版本内容进行打包。

ko build相关的可配置项如下所示:

  • --hash: 打包文件名添加hash
  • -t,--ts,--typescript: typescript支持
  • -e,--esbuild: esbuild支持,目前只使用了esbuild压缩相关功能

执行ko build -t命令 ,等待一小段时间后,打包结果会输出到当前目录的dist文件夹下

至此,整个研发流程结束,可以看到ko在数栈的整个研发流程中有着较高的参与度,涉及到了develop,code review与build三个重要的阶段。

效率提升

在保证整个研发流程稳定的情况下,ko在版本迭代的同时也对打包流程进行了优化,优化结果如下所示:

可以看到目前5.x版本的ko相比于4.x版本的ko在首次打包和二次打包的速度上有较为明显的提升

未来方向

前端目前还处于高速发展的阶段,社区中也涌现了如Vite,Rome等新的解决方案,ko在迭代的过程中也会不断的尝试新的技术运用与新的方向。在2022年,ko会尝试着针对以下几点内容进行发力,争取效率的提升与易用性的提升:

  • 依托于webpack 5新增的module federation,尝试打包速度的提升与微前端的实践
  • 更多的尝试esbuild相关功能,提升打包效率
  • 制定更加细节的eslint等规则,服务于数栈各个产品线乃至社区

期待2022年ko做的更好,为数栈前端团队乃至开源社区贡献属于自己的一份力量

ko在数栈中的应用的更多相关文章

  1. 细数Javascript技术栈中的四种依赖注入

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...

  2. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  3. 袋鼠云研发手记 | 数栈·开源:Github上400+Star的硬核分布式同步工具FlinkX

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  4. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  5. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  6. 袋鼠云出品!数栈UI 5.0全新体验升级,设计背后的故事

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 数栈作为云原⽣⼀站式⼤数据开发平台,从2016年发布第⼀个版本 ...

  7. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

  8. 当SD卡拔出时,返回首页,栈中的activity都要清除,只留下首页的activity

    目标:当SD卡拔出时,返回首页,栈中的activity都要清楚,只留下首页的activity 我在清单中注册了一个静态广播: <receiver android:name="com.p ...

  9. iOS 导航控制器返回栈中的某一控制器

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  10. [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. RANSAC---从直线拟合到特征匹配去噪

    Ransac全称为Random Sample Consensus,随机一致性采样.该方法是一种十分高效的数据拟合方法.我们通过最简单的拟合直线任务来了解这种方法思路,继而扩展到特征点匹配中的误点剔除问 ...

  2. 继承内存图--java进阶 day01

    主方法进栈,有new进堆 堆内存中先存自己类中有的变量 又因为继承了父类,所以父类中的变量也要存入 即使被私有化,依旧可以继承,只是没有权限使用! 创建对象时,会调用构造方法,所以走构造方法,实参传形 ...

  3. 【Docker】容器数据卷

    Docker容器数据卷 第一次听说这个名字,我一直以为是数据卷(juǎn),后来查看官方英文文档的"volume"这个单词的时候,我才反应过来,这是容器数据卷(juàn),书卷的卷 ...

  4. 【C语言】Linux 飞翔的小鸟

    [C语言]Linux 飞翔的小鸟 零.环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev 壹.编写代码 代码如下: bird.c #include ...

  5. 【Java】Java提取${}占位符并组装对应值

    目录 Java提取${}占位符并组装对应值 零.起因 壹.想法 贰.实现 叁.总结 肆.参考文档 Java提取${}占位符并组装对应值 实现了一个${}装配工~ 零.起因 最近写个JavaWeb项目, ...

  6. SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型

    「SpringAI vs JBoltAI:Java企业级AI开发的框架之争与实战选型」 一.Java生态的AI困局:工具碎片化与工程化缺失 1. 技术断层:从API调用到全生命周期管理多数企业仍停留在 ...

  7. OpenEuler22.03源码编译安装nginx1.24.0

    一.环境说明 操作系统版本:OpenEuler22.03 SP2 LTS Nginx版本:1.24.0 安装位置:/app/nginx Selinux配置:关闭或设置为permissive 二.Ngi ...

  8. 2025dsfz集训Day4:BFS及其优化

    DAY4: BFS及其优化 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling BFS 广度优 ...

  9. CDH6.2.0部署-亲自操作验证可行

    CDH6.2.0部署 PDF文档:https://files.cnblogs.com/files/duxingren/CDH6.2-pdf.zip 郑重声明:并非拿来主义.亲手实践并花费一天时间整理文 ...

  10. Java线程控制: sleep、yield、join深度解析

    结论先行 sleep:主动让出CPU但保持锁,适合控制执行节奏和优化CPU占用 yield:建议让出CPU但无强制力,适用场景有限且效果不稳定 join:通过等待机制实现线程顺序控制,底层基于wait ...