002 我对 umi.js 的理解

简介: 002 我对 umi.js 的理解

image.png


什么是Umi

Umi,中文发音为「乌米」,是一个用于开发可扩展的企业级前端应用框架的开源项目(MIT)。它是云谦编写的一个和 next.js、remix、ice、modern.js 等同类型的元框架。它既是一个框架也是一个工具。简单的理解可以称它为一个类 next.js 的专注性能的前端框架。通过约定、自动生成和解析代码等方式来辅助开发,减少开发者要写的代码量。

Umi是通用方案,几乎适用于现在所有的 web 环境。



Umi 的优势

Umi是一个以路由为基础,同时支持配置式路由和约定式路由,配以生命周期完善的插件体系,覆盖从源码到构建产物的每个生命周期,支持各种功能扩展和业务需求的前端框架,它的优势是:


  • 文件即路由,约定式的项目文件结构,自动将 pages 目录下的文件映射成路由配置。(并支持动态路由)
  • 自动代码拆分,提升页面加载速度
  • 内置 Less 支持。
  • 内置的大量性能优化
  • 多端,无缝支持容器和浏览器访问
  • 类 webpack 的插件机制,可拔插的插件设计,你可以完全的自定义你自己的 Umi 框架
  • 针对 antd 和 dva 有友好的支持


我个人最喜欢的是 Umi 的文件即路由特性了,即在pages下面新建文件,就会自动产生配套的路由,对于我之前使用的其他前端框架,路由配置一直是一个很麻烦的事情,而且,对于多人协作开发的情况下,公共的配置文件,将面临着更多的文件冲突的可能。

由于每个页面都是在一个单独的目录下,并且对于单个页面来说,不需要任何多余的配置,所以你甚至可以直接把整个页面交给一个零基础的实习生。



Umi的可扩展性

作者称“Umi有着类webpack般灵活的插件机制,他就是一个架子”。 Umi 把骨架搭好,把框架的生命周期钩子暴露出来,然后通过插件让功能丰富起来(包括现有的内部逻辑也是这么实现的)。

我却更喜欢把它形容为一个高达玩具,对于刚入手的玩家,可以根据说明书,一步一步的组装出自己心爱的玩具。而对于高玩来说,官方提供了一个骨架,保证了高达的可动性,然后你自己可以随意的DIY,任意的使用材料和设计方式。

对于 Umi 也是相同,对于刚接触前端的朋友,你可以很好的完成公司的业务需求。对于对前端有一定了解的朋友,你可以随意的修改,包括配置、编译、开发、模板、请求方式、数据流等等,几乎所有你能想到的前端工程化的内容,都允许你自定义。并且在一步步接触这些可配置项的时候,你也对前端工程化有了一步步的认识和理解。



Umi的性能

对于项目性能方面,Umi也做了很多的优化,包括尺寸,执行效率,首屏加载时间,用户体验等等方面,但这些对于开发者其实是无感知的,可以说有时候你就升级了一下插件版本,你的整个项目就优化了,你根本不需要进行任何的多余操作。作者称“你只管写业务代码,我会负责性能,并且随着 Umi 的迭代,我保证你的应用会越来越快”。

简单的说,Umi做到了开箱即用,对于开发者和前端初学者是非常友好的。



Umi 4 的特点

1、体系化有体感的默认快

Umi 默认快很多一部分是它基于 webpack 5 Module Federation 特性的构建的提速方案 MFSU。完成了既有 webpack 的功能和生态,又有 Vite 的速度的开发体验,实现了启动快、热更快、页面打开也快的效果。


同时尽可能的用上缓存提速,避免了同样的事情做多次的窘境,比如使用了 webpack 5 的物理缓存,又用上了 babel 缓存,MFSU 中还试用了预编译缓存等;同时在构建环节还用上了 rust 和 go 语言编写的构建工具 swc 和 esbuild。通过这种比 js 更加贴近于原生的语言,在压缩和编译环节提速效果显著。


2、依赖预打包让你的项目安全又稳定

「中间商锁依赖,定期更新,并对此负责」

依赖预打包前,Umi 通过 dependency 依赖 webpack、babel 和其他的一些第三方依赖,比如 colors 和 faker.js 等(如果不知道这两个库发生了什么事故的小伙伴,可以百度一下)。这时如果其中一个依赖出现异常,就会最终导致用户项目出现异常,这在 npm 包管理体系中是一个很普遍的问题。


依赖预打包之后, Umi 通过使用框架中第三方依赖的构建产物,引用的是框架内的相对路径,因此底层包发生事故,就不会再影响到整个生态体系。又由 Umi 作为依赖包的中间商,定期更新底层依赖,可以再次锁定到最新可用的依赖版本,这就同时满足了,“锁包”和“升级”的矛盾需求。


3、双构建引擎给用户更多选择

同时支持 webpack 和 vite,用户可以通过简单的配置在不同模式之间切换,并且 Umi 尽可能保证功能的一致性。你可以在开发的时候用 vite 构建,体会现代框架的编译体验,然后在上生产构建的时候用 webpack 的生态,保证项目的兼容和稳定。


题外话: Umi 的 webpack 方案 MFSU,比 vite 还快,可以看官网说明。比 Vite 还快的 MFSU


4、技术栈最新把底层依赖升到最新,尤其是 react router 6

使用 react router 6 来实现状态保持(keepalive),只需要不到 50 行的代码,这是我使用时最大的感受。


5、微生成器。

就是类似 modern.js 的微生成器,这功能从 modern.js 里学习了不少。举个例子,像页面模版、默认配置还有比如 prettier 功能,可能不是每个项目都需要,就比较适用于微生成器,按需启用、添加配置、安装依赖。这个在我们后续的课程中会用到不少,因为他确实能够最大程度的减少开发中的重复性工作,我们也会在教程中学会如何编写自己的微生成器,来满足项目的特定模版需求。


6、强约束功能集成。

Umi 4 提供 API 让强约束和代码校验变得非常容易。API 包括 api.onCheck、api.onCheckConfig、api.onCheckPkgJSON 和 api.onCheckCode,顾名思义,非常好理解他们分别是干嘛的,可以分别对依赖类、代码类和配置类的内容做校验和卡点,适用于团队。教程中我们用到这个 API 来做强约束的可能性不大,因为默认提供的约束方案,对于正常团队已经够用了。


看完上面的介绍,不知道你对 Umi 是不是更感兴趣了呢?那么请在未来的一个月左右的时间内,紧跟此专栏的更新吧。


要继续跟进后面的内容,你的电脑需要有现代前端开发需要的环境,安装了 node 和 git 并且有一个 IDE ,我推荐使用 VS Code。如果你是一个完全的前端新人,那你可以参照我的前一个专栏中的 day2 环境准备和技能要求 进行环境搭建。


感谢阅读,同时也感谢你喜欢这个专栏。

目录
相关文章
|
6月前
|
分布式计算 JavaScript
JS项目小Tipes总结
JS项目小Tipes总结
|
6月前
|
存储 JavaScript 前端开发
JS项目练习
JS项目练习
|
JavaScript
【JS篇】JS基础要件
【JS篇】JS基础要件
72 0
|
9天前
|
JavaScript 前端开发 定位技术
Nuxt.js 和 Next.js 差异
Nuxt.js 和 Next.js 差异
|
3月前
|
JavaScript 前端开发
js之juqer使用
js之juqer使用
22 1
|
3月前
|
JavaScript
注意!Vue.js 或 Nuxt.js 中请停止使用.value
注意!Vue.js 或 Nuxt.js 中请停止使用.value
|
6月前
|
前端开发 JavaScript API
toastify-js
toastify-js
96 0
|
前端开发
dva.js初识
dva.js初识
52 0
|
JavaScript
js实现全选反选
js实现全选反选
下一篇
无影云桌面