• 关于

    框架的划分

    的搜索结果

问题

[@wangccsy][¥20]SSM框架中mapper dao service controller层的划分有什么好处?

月下丶 2019-12-01 19:27:31 528 浏览量 回答数 1

回答

动态灵活的客户端能力 作为开发者,您可以借助客户端动态灵活的能力,有效提升开发效率,打造极致的 App 体验: • 3 大研发框架:Native 开发框架、Kylin H5 开发框架、小程序开发框架。 • 20 多个功能性组件,例如网关服务、埋点分析、热修复、用户反馈、消息推送、离线包等。 • 100 多个 UI 控件,包括 AntUI 和 AntMobile。 坚实的移动中台 覆盖 App 全生命周期,提供强大的支撑,确保客户端稳定、高效运行,并进行快速变更和创新。 面向未来的研发方式:小程序 实现开发一次多端投放,实现更流畅的用户体验。同时,全面开放支付宝能力,快速构建新业务、新生态。 开发框架 Android 开发框架 mPaaS Android 开发框架基于 OSGi 规范,把一个 App 划分成业务独立的 Bundle,并对每个 Bundle 的生命周期和依赖加以管理。Portal 工程则是把所有的 Bundle 打包编译为一个可以运行的 .apk 包。 该框架适用于大团队协同开发全新的 App。mPaaS 框架中包含了组件初始化、埋点等功能,方便您轻松接入 mPaaS 组件。组件对 mPaaS 框架没有强依赖,您也可以单独使用各组件功能。 更多内容,查看 组件化接入方式简介。 iOS 开发框架 mPaaS iOS 框架源自支付宝客户端的开发框架,基于 Framework 的设计思想,将业务隔离成相对独立的模块,并着力追求模块与模块之间高內聚和低耦合。 该框架直接接管应用的生命周期,负责整个应用启动托管、应用生命周期管理、处理与分发 UIApplication 的代理事件、统一管理各业务模块(微应用和服务)等。 更多内容,查看 mPaaS 框架介绍。

LiuWH 2020-03-24 21:53:53 0 浏览量 回答数 0

回答

1、因为模块的划分跟具体业务相关性很大,如果项目刚刚开始,可以先从单个服务开始,采用一些基本的设计模式,减少复杂度,现在框架已经很成熟,可以直接follow一个框架即可,例如spring2、然后可以关注下目前最新的Service Mesh架构和K8S,这两个代表着架构发展的趋势,有很多很好的新的实践在里面。

gaoyusong 2019-12-02 02:00:42 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

maven 多模块开发,如何划分?请给指导性意见

爵霸 2019-12-01 19:35:24 1344 浏览量 回答数 1

问题

带有字段和下拉列表的简单python框架

祖安文状元 2020-02-21 17:28:09 0 浏览量 回答数 1

回答

轻量级: 弹簧在尺寸和透明度方面很轻。弹簧框架的基本版本约为 1MB。而且处理开销也非常有限。 控制反转(IOC): 依赖项注入或控制反转的基本概念是,程序员不需要创建对象,而只需描述应该如何创建对象。 面向方面(AOP): 弹簧支持面向方面的编程。 面向方面的编程是指将辅助函数或支持函数与主程序的业务逻辑隔离开来的编程范式。AOP 是一种用于分离横切问题的技术,在面向对象的编程中通常很难做到。应用程序的模块化以这种方式增加,其维护变得大大容易。 容器: 弹簧包含和管理应用程序对象的生命周期和配置。 MVC 框架: Spring 附带了 MVC Web 应用程序框架,构建在核心 Spring 功能之上。此框架可通过策略接口高度配置,并适合多种视图技术,如 JSP、Velocity、切片、iText 和 POI。 交易管理: Spring 框架为事务管理提供了一个通用抽象层。这允许开发人员添加可插拔的事务管理器,并便于在不处理低级问题的情况下对事务进行划分。 JDBC 异常处理: Spring 的 JDBC 抽象层提供了一个有意义的异常层次结构,简化了错误处理策略。与希伯纳特、JDO 和 iBATIS 集成:Spring 提供最佳集成服务,包括海伯纳特、JDO 和 iBATIS

YDYK 2020-04-24 21:33:17 0 浏览量 回答数 0

回答

开发框架yeomen上面一大堆。主要还是看你们页面要呈现哪些内容,然后怎么排版,组件怎么划分,怎么组织,这些都有一个大致的想法之后,就可以开始写component了吗。

a123456678 2019-12-02 02:08:52 0 浏览量 回答数 0

问题

关于bootstrap“断点划分”和“栅格宽度”的一些疑问

a123456678 2019-12-01 19:29:43 1469 浏览量 回答数 1

回答

Hadoop是一个开源框架,用于以分布式方式存储和处理大数据。Hadoop的核心组件是 - HDFS(Hadoop分布式文件系统) - HDFS是Hadoop的基本存储系统。在商用硬件集群上运行的大型数据文件存储在HDFS中。即使硬件出现故障,它也能以可靠的方式存储数据。 Hadoop的核心组件 Hadoop MapReduce - MapReduce是负责数据处理的Hadoop层。它编写了一个应用程序来处理存储在HDFS中的非结构化和结构化数据。它负责通过将数据划分为独立任务来并行处理大量数据。处理分两个阶段完成Map和Reduce。Map是指定复杂逻辑代码的第一个处理阶段,Reduce是指定轻量级操作的第二阶段处理。 YARN - Hadoop中的处理框架是YARN。它用于资源管理并提供多种数据处理引擎,即数据科学,实时流和批处理。

问问小秘 2019-12-02 03:11:41 0 浏览量 回答数 0

问题

企业级分布式应用服务 EDAS功能如何?

猫饭先生 2019-12-01 21:03:02 1173 浏览量 回答数 0

回答

知识清单 常见模式与框架 设计模式 开发框架,比如 spring, springMVC, mybatis 工程化与工具 软件开发流程&规范 分布式架构 负载均衡,高可用 rpc,消息队列 分布式存储 微服务架构 性能优化 应用层:JVM 结构 & 调优 web 服务器层:tomcat 等服务器结构 & 调优 存储层:MySQL 结构 & sql 优化,搜索引擎结构 & 查询优化 底层知识 对 JDK 的包结构,模块深入学习功能&使用场景 围绕数据结构&性能优化学习组织 对于 Java 开发来讲,JDK 几乎就是最底层和基础的知识了。对 JVM, MySQL等非 Java 程序了解结构,原理,调优基本就差不多了。但是 JDK 是要深入了解掌握的,这是你自己开发,学习 Java 程序的基础 从开发到架构师 我理解,1, 2, 5, 6 是高级开发就需要掌握的知识,到架构师级别 3, 4 要理解得比较深入,5, 6 的要求也更高。 技术上是从单体技术 -> 分布式,微服务局部 -> 整体简单 -> 深入 因为架构师是一个更宏观的角色,单体系统的时候,单体系统划分、设计功能模块的也是架构师。随着分布式的兴起,架构师需要从分布式角度看整体系统,而到了微服务时代,架构师又要关注微服务,docker 等技术。

jxiaoyu 2019-12-02 01:47:38 0 浏览量 回答数 0

回答

知识清单 常见模式与框架 设计模式 开发框架,比如 spring, springMVC, mybatis 工程化与工具 软件开发流程&规范 分布式架构 负载均衡,高可用 rpc,消息队列 分布式存储 微服务架构 性能优化 应用层:JVM 结构 & 调优 web 服务器层:tomcat 等服务器结构 & 调优 存储层:MySQL 结构 & sql 优化,搜索引擎结构 & 查询优化 底层知识 对 JDK 的包结构,模块深入学习功能&使用场景 围绕数据结构&性能优化学习组织 对于 Java 开发来讲,JDK 几乎就是最底层和基础的知识了。对 JVM, MySQL等非 Java 程序了解结构,原理,调优基本就差不多了。但是 JDK 是要深入了解掌握的,这是你自己开发,学习 Java 程序的基础 从开发到架构师 我理解,1, 2, 5, 6 是高级开发就需要掌握的知识,到架构师级别 3, 4 要理解得比较深入,5, 6 的要求也更高。 技术上是从单体技术 -> 分布式,微服务局部 -> 整体简单 -> 深入 因为架构师是一个更宏观的角色,单体系统的时候,单体系统划分、设计功能模块的也是架构师。随着分布式的兴起,架构师需要从分布式角度看整体系统,而到了微服务时代,架构师又要关注微服务,docker 等技术。

jxiaoyu 2019-12-02 01:57:28 0 浏览量 回答数 0

回答

知识清单 常见模式与框架 设计模式 开发框架,比如 spring, springMVC, mybatis 工程化与工具 软件开发流程&规范 分布式架构 负载均衡,高可用 rpc,消息队列 分布式存储 微服务架构 性能优化 应用层:JVM 结构 & 调优 web 服务器层:tomcat 等服务器结构 & 调优 存储层:MySQL 结构 & sql 优化,搜索引擎结构 & 查询优化 底层知识 对 JDK 的包结构,模块深入学习功能&使用场景 围绕数据结构&性能优化学习组织 对于 Java 开发来讲,JDK 几乎就是最底层和基础的知识了。对 JVM, MySQL等非 Java 程序了解结构,原理,调优基本就差不多了。但是 JDK 是要深入了解掌握的,这是你自己开发,学习 Java 程序的基础 从开发到架构师 我理解,1, 2, 5, 6 是高级开发就需要掌握的知识,到架构师级别 3, 4 要理解得比较深入,5, 6 的要求也更高。 技术上是从单体技术 -> 分布式,微服务局部 -> 整体简单 -> 深入 因为架构师是一个更宏观的角色,单体系统的时候,单体系统划分、设计功能模块的也是架构师。随着分布式的兴起,架构师需要从分布式角度看整体系统,而到了微服务时代,架构师又要关注微服务,docker 等技术。

jxiaoyu 2019-12-02 01:49:29 0 浏览量 回答数 0

回答

入门足够啦,后期进阶 知识清单 常见模式与框架 设计模式 开发框架,比如 spring, springMVC, mybatis 工程化与工具 软件开发流程&规范 分布式架构 负载均衡,高可用 rpc,消息队列 分布式存储 微服务架构 性能优化 应用层:JVM 结构 & 调优 web 服务器层:tomcat 等服务器结构 & 调优 存储层:MySQL 结构 & sql 优化,搜索引擎结构 & 查询优化 底层知识 对 JDK 的包结构,模块深入学习功能&使用场景 围绕数据结构&性能优化学习组织 对于 Java 开发来讲,JDK 几乎就是最底层和基础的知识了。对 JVM, MySQL等非 Java 程序了解结构,原理,调优基本就差不多了。但是 JDK 是要深入了解掌握的,这是你自己开发,学习 Java 程序的基础 从开发到架构师 我理解,1, 2, 5, 6 是高级开发就需要掌握的知识,到架构师级别 3, 4 要理解得比较深入,5, 6 的要求也更高。 技术上是从单体技术 -> 分布式,微服务局部 -> 整体简单 -> 深入 因为架构师是一个更宏观的角色,单体系统的时候,单体系统划分、设计功能模块的也是架构师。随着分布式的兴起,架构师需要从分布式角度看整体系统,而到了微服务时代,架构师又要关注微服务,docker 等技术。

jxiaoyu 2019-12-02 01:58:56 0 浏览量 回答数 0

回答

OSGI规范的核心组件是OSGI框架。这个框架为应用程序(被叫做组件(bundle))提供了一个标准环境。整个框架可以划分为一些层次:L0:运行环境L1:模块L2:生命周期管理L3:服务注册 还有一个无处不在的安全系统渗透到所有层。L0层执行环境是Java环境的规范。Java2配置和子规范,像J2SE,CDC,CLDC,MIDP等等,都是有效的执行环境。OSGi平台已经标准化了一个执行环境,它是基于基础轮廓和在一个执行环境上确定了最小需求的一个小一些的变种,该执行环境对OSGi组件是有用的。L1模块层定义类的装载策略。OSGi框架是一个强大的具有严格定义的类装载模型。它基于Java之上,但是增加了模块化。在Java中,正常情况下有一个包含所有类和资源的类路径。OSGi模块层为一个模块增加了私有类同时有可控模块间链接。模块层同安全架构完全集成,可以选择部署到部署封闭系统,防御系统,或者由厂商决定的完全由用户管理的系统。L2生命周期层增加了能够被动态安装、开启、关闭、更新和卸载的bundles。这些bundles依赖于于具有类装载功能的模块层,但是增加了在运行时管理这些模块的API。生命周期层引入了正常情况下不属于一个应用程序的动态性。扩展依赖机制用于确保环境的操作正确。生命周期操作在安全架构保护之下,使其不受到病毒的攻击。L3层增加了服务注册。服务注册提供了一个面向bundles的考虑到动态性的协作模型。bundles能通过传统的类共享进行协作,但是类共享同动态安装和卸载代码不兼容。服务注册提供了一个在bundles间分享对象的完整模型。定义了大量的事件来处理服务的注册和删除。这些服务仅仅是能代表任何事物的Java对象。很多服务类似服务器对象,例如HTTP服务器,而另一些服务表示的是一个真实世界的对象,例如附近的一个蓝牙手机。这个服务模块提供了完整安全保障。该服务安全模块使用了一个很聪明的方式来保障bundles之间通信安全。 答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 03:02:31 0 浏览量 回答数 0

回答

Flink是一个分层架构的系统,每一层所包含的组件都提供了特定的抽象,用来服务于上层组件。Flink分层的组件栈如下图所示: Deployment层 该层主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)。 Runtime层 Runtime层提供了支持Flink计算的全部核心实现,比如:支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等,为上层API层提供基础服务。 API层 API层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API。 Libraries层 该层也可以称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。面向流处理支持:CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作);面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)。

茶什i 2019-12-02 03:19:13 0 浏览量 回答数 0

回答

我也在开发中遇到这个问题,下面是我的想法,仅供参考首先,我觉得规划css的有个影响因素,就是网站的设计思路,如果网站是有一个整个的设计风格的话,规划的时候可以将模块的粒度适度放大。结构拆分基础框架:包含重置样式、栅格、css3动画模块,还是可以加上矢量图标库(iconfont)、辅助类通用样式库: 基本的复用模块,如button、form、table等,这个设计的时候要注意复用性和维护性业务样式:包含网站各页面之间的网站特有的样式,如导航、列表页、评论等解决方案: 可以归纳一下常用的css问题,如兼容多浏览器的高度不固定的垂直水平居中、png透明图片支持等。。代码规范命名空间+模块化+语义命名,可以参考Amaze UI HTML/CSS 规范兼容性列表:这个视业务需求而定了,如果逼格高一点,如ie8+基本和hack说再见了javascript组件:复杂的交互组件都是和javascript配合,建议公司内部有统一的规范,如果没有,可以参考业内的bootstrap、aralejs都可以开发工具现在通过预处理器开发样式很常见了吧,如果是node,就用stylus或者less,像est的样式工具库应该可以帮你提高效率哈文档文档不多说了,对于团队的维护性不言而喻,推荐一个专门用于css自动化文档工具 -- Hologram,不过依赖于ruby业界参考Semantic UI顾名思义,语义化的css库,组件的划分我觉得可以参考一下哈Amaze UI中国首个开源 HTML5 跨屏前端框架,采用less编写,移动优先,文档很详细,建议仔细阅读,收获不少bootstrap什么的就不用说了

a123456678 2019-12-02 02:23:15 0 浏览量 回答数 0

问题

管理系统前端页面开发报错 

kun坤 2020-06-10 13:23:06 29 浏览量 回答数 2

问题

【精品问答】微服务架构spring核心知识50问

游客pklijor6gytpx 2019-12-01 21:57:33 4208 浏览量 回答数 2

问题

MaxCompute用户指南:图模型:SDK概述

行者武松 2019-12-01 22:04:43 999 浏览量 回答数 0

问题

MaxCompute用户指南:MapReduce:MR限制项汇总

行者武松 2019-12-01 22:04:34 1012 浏览量 回答数 0

问题

全局事务服务 GTS样例工程

猫饭先生 2019-12-01 21:24:46 1104 浏览量 回答数 0

问题

【精品问答】python技术1000问(2)

问问小秘 2019-12-01 22:03:02 68 浏览量 回答数 0

回答

先说结论: 不要对接!不要对接!不要对接! 开个玩笑,以上仅代表个人观点,大家也知道这种“三体式警告”根本没有用的,我自己也研究如何对接,说不定做完后就觉得“真香”了。 为什么要对接? 首先讨论一下为什么要把 Flutter 对接到 Web 生态。 Flutter 现在是一个炙手可热的跨平台技术,能够一套代码运行在 Android、iOS、PC、IoT 以及浏览器上,被认为是下一代跨平台技术。相比于 Weex 和 React Native 可以很好地解决多平台一致性问题,原生渲染性能相近,上层没有 JS 那么厚的封装层次,整体性能会略好一些。 但是大部分兴冲冲去学 Flutter 的人疑惑的第一个问题就是:为什么 Flutter 要用 Dart?一个全新的语言意味着新的学习成本,难道 JS 不香吗?JS 不香不是还有 TypeScript 吗!事实上 Flutter 抛弃的岂止是 JS 这门语言,也抛弃了 HTML 和 CSS,设计了一套解耦得更好的 Widget 体系,Flutter 抛弃的是整个 Web,致力于打造一个新的生态,但是这个生态无法复用 Web 生态的代码和解决方案。尤其是之前所有跨平台方案 Hybrid、React Native、Weex 都是对接 Web 生态的,这让 Flutter 显得有些格格不入,也让大部分前端开发者望而却步。 下面是我整理出来的,前端开发者使用 Flutter 的各方面成本: 因为 Flutter 的开发模式和前端框架比较像(可以说就是抄的 React),所以框架的学习成本并不高,稍微高一些的是 Dart 语言的学习成本,另外还要学习如何用 Widget 组装 UI,虽然很多布局 Widget 设计得和 CSS 很像,灵活度还是差了很多。要想在真实项目中用起来,还要改造整个工具链,以“Native First”的视角做开发,开发 Flutter 和开发原生应用的链路是比较像的,和开发前端页面有较大差异。最高的还是生态成本,前端生态的积累无论是代码还是技术方案都很难复用,这是最痛的一点,生态也是 Flutter 最弱的一环。 无论是为了先进的技术理念还是出于商业私心,先不管 Flutter 为什么抛弃 Web 生态,现实问题是最大的 UI 开发者群体是前端,最丰富的生态是 Web 生态,我觉得 Web 技术也是开发 UI 最高效的方式。如果能在上层使用 Web 技术栈开发,在底层使用 Flutter 实现跨平台渲染,不是可以很好的兼顾开发效率、性能和跨平台一致性吗?还能复用 Web 技术栈大量的技术积累。 可能这些理由也不够充分,暂且先照着这个假设继续分析,最后再重新讨论到底该不该对接。 关于 Flutter 和 Web 生态的对接涉及两个方面: 从 Web 到 Flutter。就是使用 Web 技术栈来开发,然后对接到 Flutter 上实现跨平台渲染。对 Web 来说是解决性能和跨平台一致性问题,对 Flutter 来说是解决生态复用问题。从 Flutter 到 Web。就是官方已经实现的 Web support for Flutter,把已经用 Dart 开发好的 App 编译成 HTML/JS/CSS 然后运行在浏览器上,可以用于降级和外投场景。 如何实现“从 Web 到 Flutter”? 首先分析一下 Flutter 的架构图,看看可以从哪里下手。 Flutter 可以分为 Framework 和 Engine 两部分,Engine 部分比较底层也比较稳定了,最好不要动,需要改的是用 Dart 实现的 Framework。要想对接 Web 生态的话,JS 引擎肯定是要引入的,至于是否保留 Dart VM 有待讨论。图中最上面 Material 和 Cupertino 两个 UI 库前端是不需要的,前端有自己的。关键是 Widget 这部分,是替换成 HTML/CSS 的方式写 UI,还是继续保留 Widget 但是把语言换成 JS,不同方案给出的解法也不一样。 有不少方案可以实现对接,业界有挺多尝试的,我总结了下面三种方式: - TS 魔改:用 JS 引擎替换掉 Dart VM,用 JS/TS 重新实现 Flutter Framework(或者直接 dart2js 编译过来)。 - JS 对接:引入 JS 引擎同时保留 Dart VM,用前端框架对接 Flutter Framework。 - C++ 魔改:用 JS 引擎替换掉 Dart VM,用 C++ 重新实现 Flutter Framework。 TS 魔改 TS 魔改就是完全抛弃掉 Dart VM,用 TypeScript 重新实现一遍用 Dart 写的 Flutter Framework。 为啥是 TS 而不是 JS?这不是因为 TS 是个大热门嘛,而且向下兼容 JS,现在几乎所有时髦的框架都要用 TS 重写了。 这种方案的出发点是“如果能把 Flutter 的 Dart 换成 JS 就好了”,最容易想到的路就是把 Dart 翻译成 TS,或者直接用 dart2js 把代码编译成 js,但是编译出来的代码包含很多 dart:ui 之类的库的封装,生成的包也挺大的,也比较难定制需要导出的接口,不如干脆用 TS 重写一遍,工具链更熟悉一些,还可以加一些定制。 理论上讲翻译之后 Flutter 绝大部分功能都依然支持,可以复用各种 npm 包,还可以动态化,但是丧失了 AOT 能力,JS 语言的执行性能应该是不如 Dart 的。而且所有节点的布局运算都发生在 JS,底层只需要提供基础的图形能力就好了,就好像是基于 Canvas API 写了一套 UI 框架,性能未必有现存前端框架的性能高。 此外最大的问题是如何与官方 Flutter 保持一致,假如现在是从 v1.13 版本翻译过来的,以后官方升级到了 v1.15 要不要同步更新?这个过程没啥技术含量,而且需要持续投入,做起来比较恶心。 另外还需要考虑上层是用 Widget 的方式写 UI,还是用前端熟悉的 HTML+CSS。如果依然用 Widget 的话,那大部分前端组件还是用不了的,UI 还是得重写一遍。反正要重写的话,成本也没降下来,那就用 Dart 重写呗…… 直接用官方原版 Flutter 也避免每次更新都要翻译一遍 Dart 代码。所以既然选择了对接前端生态,那就要对接 CSS,不然就没有足够的价值。然而 CSS 和 Widget 的对接也是很繁琐的过程,而且存在完备性问题。 JS 对接 翻译代码的方式不够优雅,那就保留 Dart,把 JS/CSS 对接到 Widget 上面不就好了? 当然可以,这种方式是仅把 Flutter 当做了底层的渲染引擎,上层保持前端框架的写法,仅把渲染部分对接到 Flutter。现存的很多前端框架都把底层渲染能力做了抽象,可以对接到不同渲染引擎上,如 Vue/Rax 同时支持浏览器和 Weex,用同样的方式,可以再支持一个 Flutter。 这种方式对前端框架的兼容性比较好,但是链路太长了,业务代码调用前端框架接口做渲染,一顿操作之后发出了渲染指令,这个渲染指令要基于通信的方式传给 Flutter Framework,这中间涉及一次 JS 到 C++ 再到 Dart 的跨语言转换,然后再接收到渲染指令之后还要转成相应的 Widget 树,从 CSS 到 Widget 的转换依然很繁琐。而且 Widget 本身是可以带有状态的,本身就是响应式更新的,在更新时会重新生成 widget 并 diff,如果在前端更新 UI 的话,前端框架在 js 里 diff 一次 vdom,传到 Flutter 之后又 diff 一次 widget。 如果要绕过 Widget 直接对接图中的 Rendering 这一层,可以绕过 widget diff 但是得改 Flutter Framework 的渲染链路,既然要改 Flutter Framework 那为什么不直接用 TS 魔改呢,还绕过了 JS 到 Dart 的通信,又回到了第一种方案。 总结来说,这个方案的优点是:实现简单、能最大化保留前端开发体验,缺点是:渲染链路长、通信成本高、响应式逻辑冲突、CSS 转 Widget 不完备等。 C++ 魔改 想要干掉 Dart VM,就需要用其他语言重新实现用 Dart 开发的 Framework,用 JS/TS 可以,用 C++ 当然可以,最硬核的方式就是用 C++ 重新实现 Flutter 的 Framework,然后接入 JS 引擎,通过 binding 把 C++ 接口透出到 JS 环境,上层应用还是用 JS 做开发。 把 Framework 层下沉到 C++ 之后,不仅会有更好的性能,也能支持更多语言。原本 Flutter Framework 是在 Dart VM 之上的,必须依赖 Dart VM 才能运行,所以对 Dart 有强依赖;用 C++ 重新实现之后,JS 引擎是在 C++ 版 Framework 之上的,框架本身并不依赖 JS 引擎,还可以对接其他各种语言,如对接了 JVM 之后可以支持 Java 和 Kotlin,对接回 Dart VM 可以继续支持 Dart。 这个方案可以增强性能,也能保持和 Flutter 的一致性,但是改造成本和维护成本都相当高。C++ 的开发效率肯定不如 Dart,当 Flutter 快速迭代之后如何跟进是很大的问题,如果跟进不及时或者实现不一致那很可能就分化了。从 CSS 到 Widget 的转换也是不得不面对的问题。 几种方案对比 把上面几种方案画在同一张图里是这个样子的: 图中实线部分表示了跨语言的通信,太过频繁会影响性能,虚线部分表示了其他对接可能性。 从下到上,Flutter Engine 是不需要动的,这一层是跨平台的关键。Framework 则有三种语言版本,JS/TS、Dart、C++,性能是 C++ 版本最好,成本是 Dart 版本最低。然后还需要向上处理 HTML/CSS 和 Widget 的问题,可以直接对接一个前端框架,也可以直接在 C++ 层实现(不然需要透出的 binding 接口就太多了,用通信的方式也太过频繁了)。 如何实现“从 Flutter 到 Web”? 这个功能官方已经实现了,可以把使用 Dart 开发的 App 编译成 Web App 运行在浏览器上,官方文档以介绍用法和 API 为主,我这里简单分析一下内部具体的实现方案。 实现原理 结合 Flutter 的架构图来看,要实现 Web 到 Flutter 需要改造的是上层 Framework,要实现 Flutter 到 Web 需要改造的则是底层 Engine。 Framework 对 Engine 的核心依赖是 dart:ui,这是库是在 Engine 里实现的,抽象出了绘制 UI 图层的接口,底层对接 skia 的实现,向上透出 Dart 语言的接口。这样来看,对接方式就比较简单了: 使用 dart2js 把 Framework 编译成 JS 代码。基于浏览器的 API 重新实现 dart:ui,即 dart:web_ui。 把 Dart 编译成 JS 没什么问题,性能可能会有一点影响,功能都是可以完全保留的,关键是 dart:web_ui 的实现。在原生 Engine 中,dart:ui 依赖 skia 透出的 SkCanvas 实现绘制,这是一套很底层的图形接口,只定义了画线、画多边形、贴图之类的底层能力,用浏览器接口实现这一套接口还是很有挑战的。上图可以看到 Web 版 Engine 是基于 DOM 和 Canvas 实现的,底层定义了 DomCanvas 和 BitmapCanvas 两种图形接口,会把传来的 layer tree 渲染成浏览器的 Element tree,但是节点上仅包含了 position, transform, opacity 之类的样式,只用到 CSS 很小的一个子集,一些更复杂的绘制直接用 2D canvas 实现。 存在的问题 我编译了一个还算复杂的 demo 试了一下,性能很不理想,滑动不流畅,有时候图片还会闪动。生成出来的 js 代码有 1.1MB (minify 之后,未 gzip),节点层次也比较深,我评估这个页面用前端写不会超过 300KB,节点数可以少一半以上。 另外再看一下 Flutter 仓库的 issue,过滤出 platfrom-web 相关的,可以看到大量:文字编辑失效、找不到光标、ListView 在 ios 上不可滚动、checkbox/button 行为不正常、安卓滚动卡顿图片闪烁、字体失效、某些机型视频无法播放、文字选中后无法复制、无法调试…… 感觉 flutter for web 已经陷入泥潭,让人回想起前端当年处理各种浏览器兼容性的噩梦。 这些性能和兼容性问题,核心原因是浏览器未暴露足够的底层能力,以及浏览器处理手势、用户输入和方式和 Flutter 差异巨大。 实现 Flutter Engine 需要的是底层的图形接口和系统能力,虽然canvas 提供了相似的图形接口,如果全部用 canvas 实现的话很难处理可访问性、文本选择、手势、表单等问题,也会存在很多兼容性问题。所以真实方案里用的是 Canvas + DOM 混合的方式,封装层次太高了,渲染链路太长。就好像 Flutter Framework 里进行了一顿猛如虎的操作之后,节点生成好了、布局算好了、绘制属性也处理好了,就差一个画布画出来了,然后交到浏览器手里,又生成一遍 Element,再算一遍布局,在处理一遍绘制,最终才交给了底层的图形库画出来。 再比如长页面的滚动,浏览器里只要一条 CSS (overflow:scroll) 就可以让元素可滚动,手势的监听以及页面的滚动以及滚动动画都是浏览器原生实现的,不需要与 JS 交互,甚至不需要重新 layout 和 paint,只需要 compositing。如上图所示,在 Flutter 中 Animation 和 Gesture 是用 Dart 实现的,编译过来就是 JS 实现的,浏览器本身并不知道这个元素是否可滚,只是不断派发 touchmove 事件,JS 根据事件属性计算节点偏移,然后运算动画,然后把 transform 或者新的 position 作用到节点上,然后浏览器再来一遍完整的渲染流程…… 优化方案 性能和兼容性的问题还是要解决的,短期内先把 issue 解掉,长线的优化方案,官方有两种尝试: 使用 CSS Painting API 做绘制。 a, 这是还处于提案状态的新标准,可以用 JS 实现一些绘制功能,自定义 CSS 属性。 b. 目前还未实现,需要等浏览器先把 CSS Houdini 支持好。 使用 WebAssembly 版本的 Skia 做绘制 https://skia.org/user/modules/canvaskit a, 这样可以发挥 wasm 的性能优势,并且保持 skia 功能的一致。但是目前 wasm 在浏览器环境里未必有性能优势,这里不展开讨论了。 b. 已经部分实现,参考这里的配置启用功能: https://github.com/flutter/flutter/issues/41062#issuecomment-533952994 这两个方案都是想更多的利用到浏览器的底层能力,只有浏览器暴露了更多底层能力,才能更好的实现 Flutter 的 Web Engine。不过这个要等挺久的时间,我们也参与不了,现阶段想要使用 flutter for web,还是得保持现有架构,一起参与进去把 issue 解决掉,优先保障功能,其次优化性能。 一种适应性更好的架构 如果理想化一点,能不能从架构角度让 Flutter 和 Web 生态融合的更好一些呢? 回顾文章最开始的官方架构图,上面是 Framework(Dart),下面是 Engine(C++),切分在 Foundation 这一层,双方之间的交互是几何图形信息。如果还保持这个架构,把切分层次划分的更靠上一些,如下图所示,划分在 Widgets 和 Rendering 这一层,理论上讲对 Flutter 的开发者来说是无感知的,因为上层的开发语言和 Widget 接口都是不变的。 切分在这一层,Framework 和 Engine 之间的交互就不再是几何图形而是节点信息,Widget 的组合、setState 响应式更新、Widget diff 都还在 Dart 中,展开后的 RenderObject 的布局、绘制、裁剪、动画全都在 C++ 中,不仅有更好的性能,还可以与 Engine 有更好的结合。 或者说,还原本保留 Engine 的设计,把下沉的这部分逻辑上划分成 Renderer,就有了如下三层的结构: 这样划分出来的每一层都有明确的定位: Framework: 开发框架。为开发者提供可编程 API,实现响应式的开发模式,提供细粒度 Widget 供开发者自由封装和组合。Renderer: 渲染引擎。专门实现布局、绘制、动画、手势的的处理,这部分功能相对独立,是可以与开发框架解耦的,也不必与特定语言绑定。Engine: 图形引擎。实现跨平台一致的图形接口,合成输入的层并绘制到屏幕上,处理好平台力的接入和适配。 这样切分除了有性能优势以外,也使得渲染引擎摆脱了对 Dart 的依赖,能够支持多种语言,也能支持多种开发模式。对接到 Dart VM 就可以用 Dart 写代码,对接到 JS 引擎就可以用 JS 写代码,对接到 JVM 还可以写 Java,但是无论怎么写,底层的渲染能力是一样的,一套统一的布局算法,动画和手势的处理行为也是一致的。 在这样的架构下,对接 Web 生态就更容易了。Dart 和 Widget 是前端不想要的,希望能换成 JS 和 CSS,但是又想要底层的跨平台一致渲染引擎,那从 Renderer 层开始对接就好了,绕过了所有不想要的,也保留了所有想要的。 要实现 Flutter for Web 也更简单了一些。在 Engine 层做对接,一直苦于浏览器透出的底层能力不够,如果是在 Renderer 之上做对接就更容易一些,基于 JS/CSS/DOM/Canvas 的能力封装出一套 Rendering 接口,供 Widget 调用就好了,这样可以使渲染链路更短一些,但是依然要处理 Widget 和 DOM/CSS 之间的兼容性问题。 再讨论一遍:为什么要对接? 技术上已经分析完了,要想搞定 Flutter 生态和 Web 生态的对接,需要投入很大的成本,所以真正决定做之前,要先讨论清楚为什么要做对接?到底要不要做对接? 首先 Google 官方对 Flutter 的定位就是个问题。Flutter 设计之初就是不考虑 Web 生态的,甚至在刻意回避,倡导的是更贴近原生的开发方式。我之所以在开头说不要对接,原因也很简单:两种技术设计理念不同,不是朝着一个方向发展的,生态不通,技术方案不通,强行融合很可能让彼此都丧失了优势。但是业界又有很多团队在做这种尝试,说明需求是存在的,如果 Google 抵制这个方向,那就不好做了。不过现在官方已经支持了 Flutter for Web,已经向 Web 生态迈了一步,未来是否进一步与 Web 融合,也是有可能的。 另外就是跨平台技术本身的问题,浏览器发展了二三十年,已经是个很强大的跨平台产品了,几乎是 Web 的代名词了,这一点无人能敌。但是也臃肿不堪,有大量历史包袱,性能和体验不够好,和 Native 的结合度差,尤其在移动和 IoT 平台。虽然硬件性能在不断提升,但这是所有软件共享的,浏览器的性能和体验总会比 Native 差一些,差的这一些很可能就是新业务和新场景的发挥空间。观察一下近几年新诞生的业务场景,很多都是利用到了 Native 新提供的能力才火爆起来的,如 AI/AR/ 视频 / 直播 等,有因为新的 Web API 而孵化生出来的商业模式吗? 原文链接: https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650405725&idx=1&sn=0b7476f7c7c01df7fdafda578f9ceb98&chksm=83953345b4e2ba53917ac30b709c07be15bd1c2fd5ae2a8ecfbb129b3813f771621b8fac95ca&scene=27#wechat_redirect

剑曼红尘 2020-03-10 09:54:40 0 浏览量 回答数 0

问题

【案例】从hadoop框架与MapReduce模式中谈海量数据处理

jack.cai 2019-12-01 21:00:28 15859 浏览量 回答数 3

回答

你的模块划分估计有问题。把你的模块框架写出来,大家帮你分析一下吧。回复<aclass='referer'target='_blank'>@东向利:能把pom和beans给我看看嘛基本明白你的意思,我现在的应用和你的差不多,我全部使用Sping管理。使用Maven管理项目时,最好的办法,是把所有依赖放在pom项目,其它Maven项目继承就可以了。server负责客户端的接入,这个名字可能起的不好,主要用的netty。logic负责具体的业务逻辑,里面分service和dao两层,dao层用的是mybatis。还有个util工具模块。不知这么划分是否合理。请帮忙指导指导[13]有个东西叫正则 <spanstyle="color:<atarget='_blank'>#008000;background-color:#efefef;font-weight:bold;">com..*.service 1.一个就可以了,放sever也可以,放logic也可以,但为何不用注解 2.这个得看你如何读取xml的,一般读取路径都是class:xxx.xml回复<aclass='referer'target='_blank'>@plugin:你要告诉我们你怎么读的,贴代码谢谢。我用的就是注解啊。beans.xml里放了数据库的配置。我如果把这个文件就放logic里。那我在server里读取他。路径为什么呢<divclass='ref'> 引用来自“maradona”的评论 1.一个就可以了,放sever也可以,放logic也可以,但为何不用注解 2.这个得看你如何读取xml的,一般读取路径都是class:xxx.xml回复<aclass='referer'target='_blank'>@maradona:好吧.多谢了...回复<aclass='referer'target='_blank'>@plugin:这个我得实地调试才知道咯,仔细检查下注解写了没,换一种注入方式,试试set注入,调试一下,等等回复<aclass='referer'target='_blank'>@maradona:1.我改成com或者com.haoyin.*了,这下应该包含B项目了吧.还是没有用.2.其次,我在B项目中,随便给一个类加个@Service注解,这是在main方法通过spring的getBean去取,能取到.这说明B项目是扫描到了回复<aclass='referer'target='_blank'>@plugin:有木有扫描B项目的...我看你的base-package是logic的,不是server的回复<aclass='referer'target='_blank'>@maradona:这A,B两个模块,beans.xml放在A里,B里有main方法启动spring.我测试了下这时在main里用代码获得A的某个@Service注解的对象.是可以获得的,但是在B的某个类中的成员对象上@Autowired.却总是无法注入.怎么回事

爱吃鱼的程序员 2020-06-10 14:39:38 0 浏览量 回答数 0

问题

一个项目的自动化测试实践

技术小菜鸟 2019-12-01 21:15:22 3291 浏览量 回答数 1

问题

ERP系统CRMSCM之间的管理之道

lovequeen0 2019-12-01 20:18:19 6696 浏览量 回答数 0

问题

【教程免费下载】Angular从零到一

知与谁同 2019-12-01 22:07:51 2016 浏览量 回答数 1

问题

面向服务的ERP可重构开发模型

hua2012h 2019-12-01 20:13:41 7876 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站