经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AngularJS » 查看文章
Angular等了三年,那个她已经来了
来源:cnblogs  作者:濮水大叔  时间:2024/5/29 9:12:31  对本文有异议

Angular生态丰富,功能强大,支撑了许多大型项目的开发。而且一直在前方等待着其他框架跟上。但是不得不直面的一个问题就是:“在等待其他框架跟上的这三年”,Angular在陆陆续续抛弃之前引以为豪的设计。又由于大量的历史包袱,这些设计变更又做得扭扭捏捏,做不到轻装上阵。比如NgModule之于Standalone,zone.js之于Singals,Rxjs更是一言难尽

Angular虽然有许多超前的架构设计和工程化能力,但是就目前而言,仍有以下不足:

  1. 响应式系统不好用:即便是新引入的Signal,如果要访问一个状态值,需要像函数一样调用,这是反直觉的实现方式
  2. 对tsx支持不友好:全网很难找到angular+tsx的最佳实践。单靠模版,支撑大型业务系统的开发,难度是很大的
  3. ioc容器太过繁琐:看看文档就知道了,angular劝退新人的点很多,ioc繁琐是最主要的
  4. 模块化隔离性不够好,拖泥带水:虽然angular引入了模块化概念,但是模块之间隔离不彻底。比如我在A模块实现了一个service,如果要在B模块使用,就需要明确指定service在A模块的文件路径,而不是指定一个名称就行。这样就让模块耦合很深。类似这样的设计问题还有很多

Cabloy-Front就很好的解决了angular的这些短板。Cabloy-Front是一款支持ioc容器的Vue3框架,有以下特点:

  1. 底层采用vue3的响应式系统:在ioc容器的加持下,定义响应式状态不再需要ref/reactive,也不再需要ref.value
  2. 在独立的render class中书写tsx代码,从而让tsx代码更加舒展、从容
  3. 提供了两类ioc容器:一类是全局ioc容器,可以实现pinia的能力。另一类是组件实例ioc容器,该容器与Vue组件实例绑定,在这个容器中的所有 Class 实例都可以在组件实例范围之内共享数据和逻辑
  4. 模块化体系:实现了完全隔离的模块化体系。模块作为一个相对独立的业务单元,包含各种类型的资源,包括Config配置、Constant常量、Locale国际化、Error错误异常、Component组件,等等。在跨模块访问这些资源时,是基于名称寻址,而不是基于资源的原始文件路径寻址,因此,心智负担更低
  5. 更优雅的ioc容器开发体验:采用依赖注入依赖查找相结合的方式,大量减少装饰器的使用,让代码更简洁、更优雅。优先使用依赖查找的机制可以达到化类型于无形的效果?简而言之,就是无须标注类型,却能享受到“类型约束”和“智能提示”的好处

口说无凭,我们简单看一下cabloy-front的代码风格是怎样的:

  1. 定义响应式状态

在组件中定义一个响应式变量count,并且添加两个方法修改变量

  1. export class MotherPageCounter {
  2. count: number = 0;
  3. inrement() {
  4. this.count++;
  5. }
  6. decrement() {
  7. this.count--;
  8. }
  9. }
  1. 使用响应式状态

采用tsx语法使用count

  1. export class RenderPageCounter {
  2. render() {
  3. return (
  4. <div>
  5. <div>count(ref): {this.count}</div>
  6. <button onClick={() => this.inrement()}>Inrement</button>
  7. <button onClick={() => this.decrement()}>Decrement</button>
  8. </div>
  9. );
  10. }
  11. }
  1. 逻辑抽离

将count逻辑抽离出来,创建一个Counter Bean

  1. @Local()
  2. export class Counter {
  3. count: number = 0;
  4. inrement() {
  5. this.count++;
  6. }
  7. decrement() {
  8. this.count--;
  9. }
  10. }
  1. 在组件中注入并使用

使用装饰器函数@Use注入bean

  1. export class MotherPageCounter {
  2. @Use()
  3. $$counter: Counter;
  4. }

采用tsx语法使用已注入的bean实例

  1. export class RenderPageCounter {
  2. render() {
  3. return (
  4. <div>
  5. <div>count(ref): {this.$$counter.count}</div>
  6. <button onClick={() => this.$$counter.inrement()}>Inrement</button>
  7. <button onClick={() => this.$$counter.decrement()}>Decrement</button>
  8. </div>
  9. );
  10. }
  11. }

Cabloy-Front框架已开源:https://github.com/cabloy/cabloy-front

原文链接:https://www.cnblogs.com/zhennann/p/18216167

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号