ext-ui.com

使用 JavaScript构建响应式、数据驱动的企业应用程序


在企业软件领域,响应速度已不再是锦上添花。用户期望同一款应用程序无论使用4K显示器在台式机上工作、在平板电脑上查看操作结果,还是在现场用智能手机查看关键指标,都能流畅运行。


这种期望带来了真正的架构挑战。企业应用并非简单的营销网站或消费者仪表盘,而是围绕表单、数据网格、透视表、嵌套视图和角色特定操作构建的复杂、工作流程密集型系统。在桌面端运行良好的布局,如果只是简单地“缩小”,在手机上可能就无法使用了。 所以真正的问题是:如何在不维护碎片化代码库或向移动用户提供过大的桌面软件包的情况下,为每个屏幕构建丰富的、数据密集型的企业应用程序? 这正是Ext JS旨在解决的问题。借助合适的架构,团队可以从单一代码库构建响应式企业应用程序,同时还能针对每种设备类型优化用户体验、性能和软件包大小。

企业响应能力为何不同


面向消费者的响应式设计通常侧重于重新排列内容。卡片垂直堆叠,侧边栏折叠,导航变成汉堡菜单。这种设计非常适合以内容为中心的网站。 企业软件则有所不同。 用户通常会用到:
  • 高密度金融网络
  • 运营仪表盘
  • 审批流程
  • 多步骤表格
  • 实时遥测
  • 树状图、透视图和报表视图
你不能简单地将一个 120 列的网格压缩到智能手机的屏幕尺寸内就称之为响应式设计。在企业级应用中,响应式设计必须兼顾可用性、性能和工作流程的连续性。 现代企业响应式战略应建立在四大支柱之上:

1. 单一统一的代码库


业务逻辑、模型、存储和 API 连接器应该编写一次,并在所有平台上共享。

2. 情境感知型用户体验


桌面用户可能需要悬停交互、键盘快捷键和数据密集型屏幕。移动用户则需要触控友好的组件、简化的导航、滑动操作模式和更清晰的视觉层级。

3. 降低开发成本


单一框架和存储库可以减少重复工作,降低测试开销,并简化功能交付。

4. 一致的安全性和治理


当业务规则或 API 保护措施发生变更时,更新只需在一个地方进行,即可在所有地方保持一致的应用。
选择合适的工具包:经典款与现代款
在任何 Ext JS 项目中,首要的架构决策之一就是在经典工具包和现代工具包之间做出选择。

对于需要旧版支持或高度专业化桌面行为的组织而言,经典工具包依然功能强大。但对于大多数新项目来说,现代工具包是更佳的战略选择。

为什么?因为它提供了一种更通用的组件模型,并且旨在跨所有现代设备类型都能良好运行。如果您的目标是构建一个适用于桌面、平板电脑和移动设备的单一响应式架构,那么 Modern 架构将为您提供最坚实的基础。

静态自适应与动态自适应:平台配置和响应式配置


Ext JS 提供了两种响应式自适应的关键机制,了解何时使用哪种机制至关重要。

platformConfig:静态,启动时自适应


platformConfig仅在应用程序启动时评估一次。它非常适合那些需要在启动时确定并在整个会话期间保持稳定的设置。 典型应用场景包括:
  • 手机屏幕上的短标题
  • 移动端和桌面端的图标不同
  • 触摸设备需要更大的行高
  • 启用仅限桌面端的菜单或操作
因为它只在启动时运行一次,所以基本上没有运行时性能开销。

例子

Ext.define('MyApp.view.MainPanel', {
        extend: 'Ext.panel.Panel',
        xtype: 'mainpanel',

        platformConfig: {
            desktop: {
                title: 'Enterprise Analytics Dashboard Overview',
                iconCls: 'x-fa fa-desktop'
            },
            '!desktop': {
                title: 'Analytics',
                iconCls: 'x-fa fa-mobile'
            }
        }
    });

何时使用


使用platformConfig来区分设备类之间的细微、静态差异。

响应式配置:动态、运行时自适应


responsiveConfig专为应用程序运行时的实时更改而设计。它可以响应视口大小变化、方向偏移和浏览器窗口大小调整。 典型应用场景包括:
  • 将侧抽屉折叠到低于宽度阈值的位置
  • 将容器从水平布局切换到垂直布局
  • 在区域之间移动面板
  • 在较小的视口中隐藏非关键列
这项功能非常有用,但应谨慎使用。运行时适配比启动时配置的开销更大,尤其是在跨深层组件树使用时。
例子
    Ext.define('MyApp.view.ResponsiveContainer', {
        extend: 'Ext.container.Container',
        mixins: [
            'Ext.mixin.Responsive'
        ],

        responsiveConfig: {
            'width >= 800': {
                layout: 'hbox',
                region: 'west',
                collapsed: false
            },
            'width < 800': {
                layout: 'vbox',
                region: 'top',
                collapsed: true
            }
        }
    });

最佳实践


responsiveConfig用于高层结构布局更改,而不是用于重新计算数千个子组件的样式。

一个简单的经验法则


  • 如果可以在启动时一次性做出决定,则使用
  • platformConfig。
  • 如果用户界面必须实时响应调整大小或方向的变化,请使用响应式配置

基于应用配置文件的架构分离


有时仅仅更改配置是不够的。 桌面界面可能需要带有密集导航的多窗格仪表盘,而手机体验可能需要底部标签页、卡片视图和简化的任务流程。试图在单个视图类中处理如此大的差异通常会导致代码臃肿且条件语句繁多。
应用程序配置文件提供了一种清晰的架构解决方案,可以解决这一问题。
配置文件允许您按设备类型分离视图层,同时仍能共享视图:
  • 模型
  • 商店
  • 视图模型
  • 控制器
  • 服务
  • API集成
类似MyApp.profile.Phone这样的配置文件可以通过isActive()方法确定是否应该激活:
    Ext.define('MyApp.profile.Phone', {
        extend: 'Ext.app.Profile',

        isActive: function() {
            return Ext.os.is.Phone;
        },

        launch: function() {
            // Phone-specific initialization logic
        }
    });

为什么这很重要


应用程序配置文件允许您保持业务层的统一性,同时为每种外形尺寸提供其自身专门构建的UI 组件。 这意味着:
  • 更简洁的代码
  • 视图中减少特定于设备的条件语句
  • 团队间协作更加便捷
  • 随着应用程序的增长,可维护性更好
与其强迫一个功能过载的用户界面服务于所有场景,不如在共享的应用程序核心之上创建适合设备的体验。

使用 Sencha Cmd 构建配置文件优化交付


即使使用应用程序配置文件,如果每个用户都下载一个大型通用软件包,性能仍然会受到影响。 这在移动网络上尤其成问题,用户最终可能会下载他们永远不会使用的桌面专用类、主题和视图层次结构。 答案是使用app.json中定义的Sencha Cmd 构建配置文件。
例子
    "builds": {
        "desktop": {
            "toolkit": "classic",
            "theme": "theme-triton"
        },
        "phone": {
            "toolkit": "modern",
            "theme": "theme-material"
        }
    }

运行生产版本时,Sencha Cmd 会针对每个构建目标分别评估依赖项。它会移除未使用的类和资源,从而为桌面、手机或平板电脑环境生成专用的软件包。

为什么建立个人资料很重要


这将使您获得:
  • 更小的应用包
  • 移动端启动速度更快
  • 减少 JavaScript 的浪费
  • 设备专属主题
  • 更高效的生产交付
实际上,这可以大幅减少移动用户的有效载荷大小,并显著提高初始加载性能。

利用虚拟化和缓冲存储扩展密集数据


企业应用程序经常需要处理海量数据集,包括:
  • 金融交易
  • 运营库存
  • 客户记录
  • 物联网遥测流
  • 报告包含数十万行的表格
直接将该体积渲染到 DOM 中是不可行的。性能会迅速下降,尤其是在移动设备上。
Ext JS 通过两种互补的策略来解决这个问题。

1. 网格虚拟化


虚拟网格仅渲染视口中可见的内容,外加一小块屏幕外缓冲区。当用户滚动页面时,网格会循环利用现有的 DOM 节点,而不是不断地创建和销毁它们。 这样可以保持渲染效率和内存使用稳定。

2. 缓冲存储


缓冲式存储会根据需要从后端分小块加载记录,而不是预先下载整个数据集。 虚拟化和缓冲加载相结合,使得流畅处理极其庞大的数据集成为可能,而不会导致浏览器崩溃。

仅靠性能还不够:移动设备需要不同的数据呈现方式


虚拟网格技术上可以处理 10 万行数据,但这并不意味着它就适合移动设备。 手机上密集的多列网格布局往往会带来糟糕的用户体验:
  • 横向滚动
  • 缩放和捏合
  • 可读性差
  • 难以触及的目标
因此,响应式企业设计不应仅仅优化渲染,还应优化交互。 更好的方法是按设备配置文件切换组件:
  • 桌面:全网格面板
  • 平板电脑:简化的分屏视图或减少列数的网格
  • 电话:列表视图或卡片式数据视图
关键在于,所有这些应用都可以共享相同的底层存储和业务逻辑,只有表示层会发生变化。

现代企业应用的三步行动计划


如果您正在启动一个新项目或对现有项目进行现代化改造,以下是一条切实可行的路径:

1. 标准化现代工具包


对于大多数新型企业应用程序而言,Modern 提供了性能、跨设备支持和面向未来的架构的最佳组合。

2. 使用应用程序配置文件创建独立视图


避免在视图中填充设备检测和嵌套条件逻辑。保持特定于设备尺寸的 UI 隔离,同时共享应用程序的核心数据和业务层。

3. 使用 Sencha Cmd 实现自动化优化构建


在app.json中定义构建目标,并为每个平台生成专用包,以便用户只下载他们实际需要的内容。

最后想说的话


响应式企业架构并非简单地缩小桌面用户界面以适应较小的屏幕,而是设计能够智能适应用户上下文的应用程序,同时保持性能、可用​​性和可维护性。 Ext JS 通过以下方式实现这一点:
  • 共享应用程序逻辑
  • 设备特定视图架构
  • 运行时和启动时配置工具
  • 平台优化的构建输出
  • 高性能数据虚拟化
对于构建数据丰富的企业系统的团队来说,这种方法兼具两者的优点:开发人员可以使用单一代码库,而每个用户在每个屏幕上都可以获得量身定制的体验。

英文原文:https://www.sencha.com/blog/building-responsive-data-driven-enterprise-applications-with-javascript/

译者:占卜士