1.Qt与Web混合开发
2.Vue3源码解读之createApp
3.好玩的混合混合开源项目推荐
4.初学Python,有哪些Pythonic的应用源码应用源码源码推荐阅读
5.如何用 Flutter 实现混合开发?闲鱼公开源代码实例
6.ASP源码是什么?
Qt与Web混合开发
探讨Qt与Web混合开发的相关技术与实践。此类技术适用于特定场景,混合混合如利用Web组件扩展Qt项目的应用源码应用源码功能、将性能无关或频繁更新迭代的混合混合页面用HTML单独实现,或提供Web形式的应用源码应用源码弘历六彩神龙源码SDK供用户二次开发。这类非技术性问题,混合混合亦可通过Qt与Web的应用源码应用源码混合开发解决。
本文将概述Qt提供的混合混合多种Web解决方案,并通过一个Web控制Qt端小车的应用源码应用源码案例进行深入探讨。后续文章将进一步展开技术细节与应用实例。混合混合
Qt提供的应用源码应用源码Web方案主要包括WebEngine/WebView、Quick WebGL Stream、混合混合QtWebAssembly三种。应用源码应用源码
Quick WebGL Stream是混合混合一种通信技术,通过将QtQuick程序中的渲染指令和数据,通过socket传输给Web端,由WebGL实现界面渲染。使用方式简单,无需修改源码,仅需在程序启动时指定端口号,即可将Qt程序转变为一个运行于后端的服务器,通过浏览器访问本地或内网地址查看程序页面。此技术在某些工业监控场景中应用,如欧洲某工厂的大量传感器监测设备,通过WebGL Stream方式运行Qt程序,降低显卡和显示器的成本。
Qt WebAssembly技术在5.版本中发布,其核心在于将Qt程序编译为浏览器支持的二进制文件,供浏览器加载运行。这一方案不仅便于将现有Qt程序转化为Web应用,还能弥补Web应用在性能方面的短板。然而,此技术在使用时存在一些坑点,后续文章将详述。
Qt WebEngine/WebView模块支持Web功能,基于google开源浏览器Chromium实现,提供了完整的Web浏览器功能,为开发者提供了丰富的API接口,便于在Qt应用中集成Web内容。
QtWebEngine的更新情况紧跟Chromium版本,最新版本为,开发者可通过Qt Wiki和版本变更日志关注最新动态。WebEngine的架构分为WebEngineCore模块、WebEngine Widgets模块和WebEngine模块,分别针对Widget项目、oc 棋牌游戏源码Qml项目和Web渲染进程。Web渲染在单独的进程中进行,无需开发者额外关注,发布时确保QtWebEngineProcess程序文件即可。
WebEngine的平台要求包括不支持静态编译,对各平台的编译器、系统环境、依赖库等有具体需求,开发者需参照Qt5.版本的要求进行配置。此外,WebView组件提供将Web内容嵌入Qml程序的接口,特别适用于移动端应用。
WebEngine的使用示例包括最简Demo源代码、最小发布包构建及运行结果展示。在Windows平台构建最小发布包时,包含的依赖项中,Qt5WebEngineCore模块最大,为M,QtWebEngineProcess.exe是单独的Web渲染进程实现。此外,还需考虑ICU数据文件、翻译文件、特定模块等依赖。
Qt开发学习资料和实践案例可供开发者深入探索和实践,以实现更高效、灵活的Qt与Web混合开发方案。
Vue3源码解读之createApp
在Vue3中,创建一个应用实例是通过``createApp``方法来实现的。这个方法在packages/runtime-dom/src/index.ts文件中定义,核心作用是创建应用上下文并扩展``mount``方法。以下是创建流程的详细解析:
首先,``createApp``函数接收一个``App``组件实例作为参数,它生成一个包含组件、配置、指令、混合器和挂载等功能的实例对象。这个实例提供了应用上下文,允许链式调用相关方法。
在``createApp``内部,有两个关键步骤。首先,它确保有一个渲染器,如果没有,会通过``createRenderer``创建一个。渲染器包含了``render``方法,居中网页源码以及与创建Vue应用实例相关的``createApp``方法。
``createAppAPI``函数是``createApp``方法的核心部分,它创建了一个工厂函数,这个函数在用户调用``createApp``时实际创建并返回应用实例。实例中包含了``mount``方法的扩展,如处理模板渲染。
``mount``方法是应用实例挂载的核心,它根据传入的模板或渲染函数,创建VNode并进行渲染。如果是服务端渲染,会执行``hydrate``方法,否则执行``render``方法。
总的来说,Vue3的``createApp``方法简化了应用实例的创建,通过渲染器和``mount``方法的扩展,实现了从VNode到DOM节点的转换。开发者调用``createApp``时,实际上触发了一连串的函数调用,构建并初始化了整个应用环境。
好玩的开源项目推荐
欢迎光临,今日为您推荐一系列趣味十足的开源项目,让工作之余也能享受科技带来的乐趣。
项目一:Spleeter。一款音轨分离软件,只需输入一段命令,即可轻松分离音乐中的人声与乐器声,支持多种常见音频格式,由 Python 语言编写,并利用 TensorFlow 进行模型训练。
项目地址:github.com/deezer/spleeter...
项目二:FlutterBoost。由阿里系闲鱼团队开源的框架,提供快速便捷的原生应用与 Flutter 混合集成方案,最新版本为 v3.0-preview,目前仍持续维护中。
项目地址:github.com/alibaba/flutterboost...
项目三:Orika。一个基于字节码技术栈实现的高性能 Java 对象映射框架,以其简单易用、高效的特点成为众多映射框架中的佼佼者。
项目地址:github.com/orika-mapper...
项目四:hotkey。京东 APP 后台热数据探测开源框架,经过多次高压压测和京东 大促的考验,精确探测热门商品并快速推送到服务端,大幅减轻数据层查询压力,提升应用性能。
项目地址:gitee.com/jd-platform-hotkey...
项目五:PaddleOCR。c-erp源码基于飞桨的 OCR 工具库,提供超轻量级中文 OCR,支持中英文数字组合识别、竖排文本识别、长文本识别,同时包含多种文本检测、识别的训练算法。
项目地址:gitee.com/paddlepaddle/...
项目六:XXL-JOB。一个轻量级分布式任务调度平台,设计目标是开发迅速、学习简单、轻量级、易扩展,现已开放源代码,并在多家公司线上产品线中应用。
项目地址:github.com/xuxueli/xxl-job...
项目七:CIM。基于 Netty 框架的即时消息推送系统,支持多端接入,适用于移动应用、物联网、智能家居等领域。
项目地址:gitee.com/farsunset/cim...
项目八:DevSidecar。为开发者提供辅助的边车工具,通过本地代理将 HTTP 请求代理到加速通道,解决网站和库无法访问或访问速度慢的问题。
项目地址:github.com/docmirror/devsidecar...
项目九:Jsoup。一款 Java 的 HTML 解析器,可直接解析 URL 或 HTML 文本,提供简单易用的 API,支持 DOM、CSS 以及类似 jQuery 的操作方法。
项目地址:github.com/jhy/jsoup...
项目十:Knife4j。为 Java MVC 框架集成 Swagger 生成 API 文档的增强解决方案,前身是 swagger-bootstrap-ui,取名 knife4j,旨在小巧、轻量、功能强大。
项目地址:github.com/xiaoymin/swagger-bootstrap-ui...
项目十一:Arthas。阿里巴巴开源的 Java 诊断工具,支持 JDK 6+,适用于 Linux/Mac/Windows,提供命令行交互模式与丰富的 Tab 自动补全功能。
项目地址:github.com/alibaba/arthas...
项目十二:El-admin。基于 Spring Boot、源码包怎么使用Jpa、Spring Security、redis、Vue 的前后端分离的开源后台管理系统,采用 RBAC 权限控制方式,支持数据字典、数据权限管理与代码生成。
项目地址:github.com/elunez/eladmin...
项目十三:Halo。使用 Java 开发的开源博客系统,基于 Spring Boot 框架,通过一行命令即可完成安装。
项目地址:github.com/halo-dev/halo...
项目十四:Hutool。一个功能全面的 Java 工具类库,提供静态方法封装,降低学习成本,提高工作效率。
项目地址:github.com/dromara/hutool...
希望以上推荐能满足您的需求,若感兴趣,不妨前往 GitHub 上探索更多好玩的开源项目,每日都有更新!
初学Python,有哪些Pythonic的源码推荐阅读
1. 初学Python时,阅读Pythonic的源码是提高编程技能的有效方法。推荐从Python标准库中关于网络编程的代码开始学习。
2. 首先,深入研究`SocketServer`模块,它为创建服务器提供了基础。同时,学习与之相关的`socket`模块,掌握TCP和UDP编程的基础知识。
3. 接下来,关注`SocketServer`模块中的`ForkingMixIn`和`ThreadingMixIn`类,它们分别展示了forking和threading并发机制的混合使用,这是理解多线程和多进程编程的重要途径。
4. 了解`thread`和`threading`模块,这对于管理并发执行的线程至关重要。
5. 随后,研究`select`模块,它允许你处理I/O多路复用,这是理解操作系统如何高效处理并发I/O操作的关键。
6. 通过学习`select`模块,你将自然过渡到对`selectors`的理解,这是Python 3.7引入的更现代的I/O多路复用API。
7. 对于想要深入了解并发编程的初学者,可以学习`asyncore`和`asynchat`模块,它们是异步网络编程的基础。
8. 在网络编程的基础上,如果你的兴趣在于游戏开发或实时应用,可以探索`greenlet`和`gevent`,这些库提供了协程,有助于编写高效的并发代码。
9. 如果你对Web开发感兴趣,从`BaseHTTPServer`、`SimpleHTTPServer`和`CGIHTTPServer`开始你的学习之旅。这些模块可以帮助你理解基本的Web服务器和CGI(Common Gateway Interface)。
. 学习`cgi`和`cgitb`模块,这对于调试和运行CGI脚本非常有用。
. 掌握`cookielib`模块,它处理HTTP cookies,这对于处理用户会话和状态管理至关重要。
. 阅读`wsgiref`模块的源码,它是一个WSGI(Web Server Gateway Interface)参考实现,有助于你理解现代Web框架的工作原理。
. 学习如何编写自己的简单Web框架后,你可以更容易地理解并选择`Flask`、`Web.py`、`Django`或`Pyramid`等流行的Web框架。
. 在进行Web开发时,不可避免地需要与API进行交互。因此,熟悉`httplib`、`urllib`和`urlparse`模块是很重要的,它们帮助你处理HTTP请求和响应。
通过以上步骤,初学者可以逐步建立起对Python网络和Web编程的深刻理解,为进一步的编程之旅打下坚实的基础。
如何用 Flutter 实现混合开发?闲鱼公开源代码实例
阿里妹导读:具有一定规模的 App 通常有一套成熟通用的基础库,尤其是阿里系 App,一般需要依赖很多体系内的基础库。那么使用 Flutter 重新从头开发 App 的成本和风险都较高。所以在 Native App 进行渐进式迁移是 Flutter 技术在现有 Native App 进行应用的稳健型方式。
今天我们来看看,闲鱼团队如何在这个实践过程中沉淀出一套独具特色的混合技术方案。
现状及思考
闲鱼目前采用的混合方案是共享同一个引擎的方案。这个方案基于这样一个事实:任何时候我们最多只能看到一个页面,当然有些特定的场景你可以看到多个 ViewController ,但是这些特殊场景我们这里不讨论。
我们可以这样简单去理解这个方案:我们把共享的 Flutter View 当成一个画布,然后用一个 Native 的容器作为逻辑的页面。每次在打开一个容器的时候我们通过通信机制通知 Flutter View 绘制成当前的逻辑页面,然后将 Flutter View 放到当前容器里面。
这个方案无法支持同时存在多个平级逻辑页面的情况,因为你在页面切换的时候必须从栈顶去操作,无法再保持状态的同时进行平级切换。举个例子:有两个页面A,B,当前B在栈顶。切换到A需要把B从栈顶 Pop 出去,此时B的状态丢失,如果想切回B,我们只能重新打开B之前页面的状态无法维持住。
如在 pop 的过程当中,可能会把 Flutter 官方的 Dialog 进行误杀。而且基于栈的操作我们依赖对 Flutter 框架的一个属性修改,这让这个方案具有了侵入性的特点。
新一代混合技术方案 FlutterBoost
重构计划
在闲鱼推进 Flutter 化过程当中,更加复杂的页面场景逐渐暴露了老方案的局限性和一些问题。所以我们启动了代号 FlutterBoost(向C++ Boost库致敬)的新混合技术方案。这次新的混合方案我们的主要目标有:
跟老方案类似,新的方案还是采用共享引擎的模式实现。主要思路是由 Native 容器 Container 通过消息驱动 Flutter 页面容器 Container,从而达到 Native Container与 Flutter Container 的同步目的。我们希望做到 Flutter 渲染的内容是由 Naitve 容器去驱动的。
简单的理解,我们想做到把 Flutter 容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。在 Native 侧我们只需要关心如果初始化容器,然后设置容器对应的页面标志即可。
主要概念
Native 层概念
Dart 层概念
关于页面的理解
在 Native 和 Flutter 表示页面的对象和概念是不一致的。在 Native,我们对于页面的概念一般是 ViewController,Activity。而对于 Flutter 我们对于页面的概念是 Widget。我们希望可统一页面的概念,或者说弱化抽象掉 Flutter 本身的 Widget 对应的页面概念。换句话说,当一个 Native 的页面容器存在的时候, FlutteBoost 保证一定会有一个 Widget 作为容器的内容。所以我们在理解和进行路由操作的时候都应该以 Native 的容器为准, Flutter Widget 依赖于 Native 页面容器的状态。
那么在 FlutterBoost 的概念里说到页面的时候,我们指的是 Native 容器和它所附属的 Widget。所有页面路由操作,打开或者关闭页面,实际上都是对 Native 页面容器的直接操作。无论路由请求来自何方,最终都会转发给 Native 去实现路由操作。这也是接入 FlutterBoost 的时候需要实现 Platform 协议的原因。
另一方面,我们无法控制业务代码通过 Flutter 本身的 Navigator 去 push 新的 Widget。对于业务不通过 FlutterBoost 而直接使用 Navigator 操作 Widget 的情况,包括 Dialog 这种非全屏 Widget,我们建议是业务自己负责管理其状态。这种类型 Widget 不属于 FlutterBoost 所定义的页面概念。
理解这里的页面概念,对于理解和使用 FlutterBoost 至关重要。
与老方案主要差别
前面我们提到老方案在 Dart 层维护单个 Navigator 栈结构用于 Widget 的切换。而新的方案则是在 Dart 侧引入了 Container 的概念,不再用栈的结构去维护现有的页面,而是通过扁平化 key-value 映射的形式去维护当前所有的页面,每个页面拥有一个唯一的 id。这种结构很自然的支持了页面的查找和切换,不再受制于栈顶操作的问题,之前的一些由于 pop 导致的问题迎刃而解。也不需要依赖修改 Flutter 源码的形式去进行页面栈操作,去掉了实现的侵入性。
实际上我们引入的 Container 就是 Navigator 的,也就是说一个 Native 的容器对应了一个 Navigator。那这是如何做到的呢?
多 Navigator 的实现
Flutter 在底层提供了让你自定义 Navigator 的接口,我们自己实现了一个管理多个 Navigator 的对象。当前最多只会有一个可见的 Flutter Navigator,这个 Navigator 所包含的页面也就是我们当前可见容器所对应的页面。
Native 容器与 Flutter 容器(Navigator)是一一对应的,生命周期也是同步的。当一个 Native 容器被创建的时候,Flutter 的一个容器也被创建,它们通过相同的 id 关联起来。当 Native 的容器被销毁的时候,Flutter 的容器也被销毁。Flutter 容器的状态是跟随 Native 容器,这也就是我们说的 Native 驱动。由 Manager 统一管理切换当前在屏幕上展示的容器。
我们用一个简单的例子描述一个新页面创建的过程:
这就是一个新页面创建的主要逻辑,销毁和进入后台等操作也类似有 Native 容器事件去进行驱动。
官方提出的混合方案
基本原理
Flutter 技术链主要由 C++ 实现的 Flutter Engine 和 Dart 实现的 Framework 组成(其配套的编译和构建工具我们这里不参与讨论)。Flutter Engine 负责线程管理,Dart VM 状态管理和 Dart 代码加载等工作。而 Dart 代码所实现的 Framework 则是业务接触到的主要 API,诸如 Widget 等概念就是在 Dart 层面 Framework 内容。
一个进程里面最多只会初始化一个 Dart VM。然而一个进程可以有多个 Flutter Engine,多个 Engine 实例共享同一个 Dart VM。
我们来看具体实现,在 iOS 上面每初始化一个 FlutterViewController 就会有一个引擎随之初始化,也就意味着会有新的线程(理论上线程可以复用)去跑 Dart 代码。Android 类似的 Activity 也会有类似的效果。如果你启动多个引擎实例,注意此时Dart VM 依然是共享的,只是不同 Engine 实例加载的代码跑在各自独立的 Isolate。
官方建议
引擎深度共享
在混合方案方面,我们跟 Google 讨论了可能的一些方案。Flutter 官方给出的建议是从长期来看,我们应该支持在同一个引擎支持多窗口绘制的能力,至少在逻辑上做到 FlutterViewController 是共享同一个引擎的资源的。换句话说,我们希望所有绘制窗口共享同一个主 Isolate。
但官方给出的长期建议目前来说没有很好的支持。
多引擎模式
我们在混合方案中解决的主要问题是如何去处理交替出现的 Flutter 和 Native 页面。Google 工程师给出了一个 Keep It Simple 的方案:对于连续的 Flutter 页面(Widget)只需要在当前 FlutterViewController 打开即可,对于间隔的 Flutter 页面我们初始化新的引擎。
例如,我们进行下面一组导航操作:
我们只需要在 Flutter Page1 和 Flutter Page3 创建不同的 Flutter 实例即可。
这个方案的好处就是简单易懂,逻辑清晰,但是也有潜在的问题。如果一个 Native 页面一个 Flutter 页面一直交替进行的话,Flutter Engine 的数量会线性增加,而 Flutter Engine 本身是一个比较重的对象。
多引擎模式的问题
因此,综合多方面考虑,我们没有采用多引擎混合方案。
总结
目前 FlutterBoost 已经在生产环境支撑着在闲鱼客户端中所有的基于 Flutter 开发业务,为更加负复杂的混合场景提供了支持,稳定为亿级用户提供服务。
我们在项目启动之初就希望 FlutterBoost 能够解决 Native App 混合模式接入 Flutter 这个通用问题。所以我们把它做成了一个可复用的 Flutter 插件,希望吸引更多感兴趣的朋友参与到 Flutter 社区的建设。在有限篇幅中,我们分享了闲鱼在 Flutter 混合技术方案中积累的经验和代码。欢迎兴趣的同学能够积极与我们一起交流学习。
扩展补充
在两个 Flutter 页面进行切换的时候,因为我们只有一个 Flutter View 所以需要对上一个页面进行截图保存,如果 Flutter 页面多截图会占用大量内存。这里我们采用文件内存二级缓存策略,在内存中最多只保存 2-3 个截图,其余的写入文件按需加载。这样我们可以在保证用户体验的同时在内存方面也保持一个较为稳定的水平。
页面渲染性能方面,Flutter 的 AOT 优势展露无遗。在页面快速切换的时候,Flutter 能够很灵敏的响应页面的切换,在逻辑上创造出一种 Flutter 多个页面的感觉。
项目开始的时候我们基于闲鱼目前使用的 Flutter 版本进行开发,而后进行了 Release 1.0 兼容升级测试目前没有发现问题。
只要是集成了 Flutter 的项目都可以用官方依赖的方式非常方便的以插件形式引入 FlutterBoost,只需要对工程进行少量代码接入即可完成接入。详细接入文档,请参阅 GitHub 主页官方项目文档。
ASP源码是什么?
ASP(活动服务器页面)是一种创建动态网页的技术,融合了HTML、脚本语言和组件,可以构建强大的服务器端应用程序。
在ASP环境中,开发人员可以将HTML、脚本语言和组件整合在同一个页面中,以便创建功能丰富的Web站点。
如果你之前创建过混合了HTML、脚本语言和组件的站点,那么你就可以将ASP程序代码添加到其中。通过在HTML页面中嵌入脚本命令,可以创建一个动态的用户界面。
借助ASP,开发人员能够编写脚本程序来生成动态内容,这些程序能够根据用户输入、服务器信息或数据库内容动态地生成网页内容。
另外,ASP支持使用组件来封装业务逻辑规则。组件可以被脚本程序调用,也可以由其他组件调用,从而实现代码的复用和模块化。
总体来说,ASP提供了一种灵活且功能强大的平台,使开发人员能够创建复杂、动态的Web应用程序,同时保持代码的可读性和可维护性。