首页 文章 精选 留言 我的

精选列表

搜索[开源供应链],共10000篇文章
优秀的个人博客,低调大师

Mixxx 2.5.6 发布,开源 DJ 软件

Mixxx 的全新稳定版本 2.5.6 现已发布,此版本包含各项更新和问题修复,同时对效果、控制器映射以及整体稳定性进行了改进。 公告称,这应该是 2.5 系列的最后一个版本。值得注意的是,由于发布流程中存在问题,2.5.5 版本已被跳过,因此本版本是 2.5.4 的后续版本。 2.5.6 版本中的重要更新和修复 搜索功能中的“not”运算符无法正常工作 Rhythmbox 导入功能未按预期运行 历史播放列表现在支持导出曲目文件 恢复大量选定曲目时的性能已得到提升 白噪声和回声效果得到了增强,并修复了 QuickEffect 中的杂音问题 Numark Mixtrack 3、Pioneer CDJ-350、Reloop Beatmix 2/4 和 Traktor Kontrol Z1 的控制器映射已更新 已修复启用 keylock 时刮擦的问题 为了方便在 Linux 上安装,已添加 Flatpak 打包文件 完整的更新日志可点击此处查看。

优秀的个人博客,低调大师

开源游戏引擎 Godot 4.5.2 发布

Godot 4.5.2 现已发布,这是一个维护版本。官方公告称,虽然大多数用户都已升级到 Godot 4.6,但有些用户由于各种原因不得不继续使用之前的 4.5 分支,因此他们也在尽力为这些用户提供重要的修复程序。 我们的版本支持策略是,我们会积极支持每个稳定分支,直到其后续分支发布第一个补丁版本为止,也就是一个月前的 4.6.1 版本。但 4.5.2 版本早在 RC1 阶段就已经在开发中了,只是我一直没能完成……所以现在是时候发布一个稳定版本来收尾了! 注意:在此维护版本发布之后,4.5 分支将转为部分支持,而 4.4 分支将停止维护,不再发布新的补丁版本。 此版本对渲染和平台移植方面的重要问题进行了修复,特别是: 为 Android 导出模板提供了调试符号,用户可以将这些符号上传到 Google Play 来解析其崩溃日志。这使得Rift Riff、Kamaeru和Spooky Express等游戏的开发者能够分享一些玩家在游戏中遇到的崩溃的详细堆栈跟踪信息。这些开发者还协助渲染维护团队调试问题,因此Skyth能够针对大多数已发现的问题编写修复程序, 如果你在 Google Play 上发布了使用 Vulkan Mobile 的游戏,官方强烈建议升级到 4.5.2或更高版本,因为这应该可以解决你的游戏可能遇到的许多崩溃问题。如果你使用的是兼容模式,本次更新中也有值得获取的重要崩溃修复。 在渲染方面,向后移植了多项 Direct3D 12 的错误修复和性能改进,尤其着重于缩短初始着色器编译时间,使其更接近 Vulkan 的性能。Godot 4.6 包含更多修复和新功能,使其能够在 Windows 上将 Direct3D 12 设置为默认驱动程序,而 4.5.2 版本仍需选择启用,但这些修复应该能够改善选择使用此 API 的开发者的体验。 最后,关于渲染,使用 Metal(Forward+ 或 Mobile 渲染方法)导出 iOS 游戏时,默认会限制仅支持 A12 或更新的设备。这意味着一些技术上支持 Metal 但运行 Godot 游戏较为困难的旧款 iPad 将被排除在外。可以在导出预设中切换此选项,因为这只是根据你的渲染方法对默认状态所做的调整。 更多详情可查看官方公告:https://godotengine.org/article/maintenance-release-godot-4-5-2/

优秀的个人博客,低调大师

Pinta 3.1 发布,开源绘图工具

Pinta 3.1 现已发布,具体更新内容包括: Added 实现了新的 axonometric grid(View > Canvas Grid... > Show Axonometric Grid)(#1438,#1541) 重写了 canvas 组件,以改善放大图像时的性能和内存使用问题(#1020,#1485)。 新增 Cells effect(#1589) Lasso Select tool新增多边形选择模式(#1725,#1096) Gradient tool 现在提供了用于调整渐变长度和方向的控制柄(#1533,#1773) “About”对话框现在包含指向问题跟踪器和讨论论坛的链接(#1343) 编译 Pinta 时,可以设置 GirCoreSource MSBuild 属性,以便轻松地针对本地构建的 gir.core 构建 Pinta,从而方便调试(#1403)。 现在所有工具栏按钮的工具提示中都会显示键盘快捷键(#1408,#1432) 为图层添加了右键菜单,其中包含可应用于所选图层的操作(#1588) 抖动效果现在除了可以使用效果的预设调色板之外,还可以使用 Pinta 的当前调色板(#1594)。 文本工具现在支持使用 Ctrl+Backspace 删除单词(#1680) 添加了 Windows ARM64 安装程序(#1699,#1378) …… Changed Packaging changes 已更新依赖项,需要 GTK 4.18+ 和 libadwaita 1.7+ Pinta 现统一采用应用程序 IDcom.github.PintaProject.Pinta,该 ID 之前已应用于下游软件包的补丁中(#1706,#1419)。 插件的 API 发生破坏性变更,需要使用 Pinta 3.1 重新构建插件。 用于效果配置属性的属性(CaptionAttribute,MaximumValueAttribute, ...) 现在位于Pinta.Core程序集和Pinta.Core命名空间中(#1665) EffectsManager中的RegisterEffect、UnregisterInstanceOfEffect、RegisterAdjustment及UnregisterInstanceOfAdjustment方法现为generic(#1678) 移除了对已弃用的 Gtk.FontButton 的使用(#1421) View menu 已从 hamburger menu 移至专用按钮(#1428,#1471) 更新了 macOS 上的应用程序图标,使其更好地符合平台图标样式指南(#1572) 移除 Clouds effect 的 blend 模式参数,替代操作流程为新建图层并配置图层 blend 模式(#1695)。 为了提高可见性,透明调色板颜色现在绘制在棋盘格图案上(#1759) 现在,将包含多个图层的图像保存为不支持图层的格式时,会警告用户图像正在被扁平化(#1856,#1283) Fixed 修复了取消颜色选择器对话框后调色板颜色仍可能更新的错误(#1390,#1411) 文本工具的“Normal and Outline”模式现在会在文本后面绘制轮廓,以避免遮挡文本(#1423,#1426) 改进了 Rotate / Zoom Layer对话框中对负角度值的处理(#1142,#1440) 修复了渐变工具中透明颜色的错误行为(#1552,#1543) 修复了切换文档时图层控件未显示正确选定图层的问题(#1602,#1573) 修复了工具栏布局中光标位置和选区尺寸的显示问题(#1429,#1540) 修复了在工具中切换活动图层时可能出现的卡顿问题(#1463,#1660) 修复了文本工具中的一个错误,即 Ctrl+A 只能从当前行开始选择(#1698) 现在在 KDE Wayland 会话中图标和窗口标题显示正确(#1419) 修复了文本工具可能错误显示默认光标的错误(#1707) 修复了在使用垂直或水平手柄扩展矩形选择时按住 Shift 键出现的漂移问题(#1733) 修复了顶部栏图标缺失的问题(#1814) 修复了在文本工具中按左箭头键时行首可能出现的错误(#1824) 修复了某些情况下鼠标按键释放无法正确注册的问题(#1456,#1891) 修复了复制时未包含未最终定稿文本的错误(#1666,#1894) 修复了 macOS 上 libadwaita 对话框缺少翻译的问题(#1877,#1417) Checksums Fingerprint:5BDA 30D0 C2E9 85E5 9808 9E44 4CF8 0E80 E77C 5C35 GPG Signature:gpg --verify pinta-3.1.tar.gz.asc Checksum:pinta-3.1.tar.gz.sha512 详情可查看:https://github.com/PintaProject/Pinta/releases/tag/3.1

优秀的个人博客,低调大师

开源游戏引擎 Godot 3.6.2 发布

Godot 3.6.2 现已发布,这是一个维护版本。 值得注意的是,原始版本存在一个影响 Windows 二进制文件(至少是编辑器)的回归问题,导致崩溃(GH-111979、GH-112021)。这是由于官方构建容器的 MinGW-GCC 14.2.1 更新所致。目前项目团队已暂时撤销该更改,并重建了 Windows 二进制文件。如果你在 2025-10-25 21:30 UTC 之前下载了此 Windows 版本或导出模板,建议重新下载,因为二进制文件已被替换。 具体更新内容包括: Changed Buildsystem:更新官方构建的工具链(Fedora 42 base、Mono 6.12.0.206、MinGW-GCC 14.2.1,Xcode 16.2) (build-containers#156)。 由于将 Windows 工具链更新到 MinGW-GCC 14.2.1 后,LTO 出现崩溃问题,因此暂时回滚了更新。3.6.2-stable Windows二进制文件(编辑器和导出模板)已于 2025 年 10 月 25 日 21:30 UTC 使用之前的 MinGW-GCC 版本重新构建。 Network:mbedTLS:更新至 mbedTLS 3.6.5(GH-108382,GH-111845)。 Porting:Android:更新至target API 35、NDK r28、16kb 页面大小(GH-108433)。 Porting:Android:解决 API 35 UI 变化(GH-110255)。 Porting:Android:将 minsdk 设置为 21,解决 Opus 中的fseeko错误(GH-111061)。 Porting:iOS:将窗口创建切换到 UIScene(GH-111103)。 Thirdparty:启用 miniupnpc API 18 构建(GH-100389)。 Fixed Buildsystem:通过删除 AGL 框架链接修复 macOS 26 上的构建(GH-110898)。 Editor::修复清除后无法分配脚本的问题(GH-108171)。 Editor::修复 self-contained 模式下的打开编辑器数据/设置文件夹菜单(GH-110414)。 Export修复 macOS 模板检查的操作顺序(GH-108930)。 GUI:修复使用特定字体的颜色标签时换行可能无法正常工作(GH-109695)。 Rendering:Batching:修复MultiRect类型转换错误问题(GH-109111)。 更新说明:https://godotengine.org/article/maintenance-release-godot-3-6-2/

优秀的个人博客,低调大师

开源游戏引擎 Godot 4.5 发布

Godot引擎今年最重磅的版本:4.5稳定版现已发布。在 4.5 版本中,Godot着重提升了易用性与稳定性,同时在渲染、脚本、平台支持等多个方面带来重大改进。 以下是主要亮点与详细更新内容。 一、亮点 Stencil Buffer支持 新增 Stencil Buffer,可以用来做壁洞、遮罩等效果,让壁面、遮挡的渲染控制更灵活。 屏幕阅读器支持(Screen Reader Support) 借助 AccessKit,Control 节点等 GUI 元素支持屏幕阅读器,为视力障碍或学习障碍用户改进体验。编辑器中部分(Project Manager、标准 UI 节点、Inspector)已有初步支持。 脚本回溯与自定义日志(Script Backtracing & Custom Loggers) 即使在 Release 构建中,也能获得错误发生的确切调用堆栈(call stack)信息。用户可以拦截日志/错误,以便做错误报告工具等。 Shader Baker(着色器预编译器) 在导出(export)设置中启用后,编辑器会扫描场景与着色器,提前编译目标平台所需格式,从而显著缩短启动或首次运行中的等待时间。比如在 Windows + D3D12 与 macOS + Metal 的组合中,部分测试项能看到20 倍启动时间缩短。 实时预览国际化(Internationalization Live Preview) 开发者可以在编辑器里直接预览不同语言环境下 GUI 的界面效果。这有助于在多语言支持下调整界面布局。注意,目前界面方向(layout direction)只跟主 locale 同步。 二、通用改进 2D TileMap 物理系统重构 以前每个 Tile 会对应一个物理 body,数量多会造成性能问题。4.5 中 TileMapLayer 的物理形状会尽可能合并,提高效率。 深度复制(Deep Duplicate)增强 新增duplicate_deep()方法,用于 Resource、Array、Dictionary 等,可以更可靠、可控地复制子资源或内容。之前的 deep 参数在某些情况下不能覆盖所有子元素的问题得到修复。 定制构建配置 Profile 提升 编辑引擎构建配置时,不仅检测项目中用到的类,还能设置对应的构建选项,更好地为项目量身定做。支持 GDExtensions 使用情况的检测。 编辑器体验改进 游戏视图中新增 “静音(Mute Game)” 切换按钮,方便在调试过程中关闭声音。 支持脚本中把资源(Resource)拖放到脚本中并以 UID(唯一标识)方式预加载(preload),代替路径方式,从而减少资源路径分离或重命名导致的问题。 运行时允许在 Remote 节点列表中选择多个节点,并编辑公共属性。 编辑器语言可以即时切换,不再需要重启编辑器。 Inspector 面板中区块(section)可以折叠(collapse)或展开,并且在区块名旁边能看到启用状态。 导出变量为 Variant 类型时,Editor 中会对类型选择与值输入做更灵活处理。 脚本编辑器中为 Color 类型值增添颜色预览,并支持点预览图标直接弹出颜色选择器。 可以在 Editor 的命令面板(command palette)里执行项目中特定的 EditorScripts,以便快速操作。 在资源复制粘贴过程中,“Paste as Unique” 选项使粘贴资源时能直接创建唯一副本,而不仅仅是引用。 在项目管理器(Project Manager)里新增“复制项目”(Duplicate Project)按钮,方便备份或分支项目。如果更新引擎版本可能导致不可逆变更,还会提示备份。 GUI 相关改进 FoldableContainer 节点:可折叠区块,支持“手风琴”式展开,仅一个区块打开。 标签(Label)支持叠加效果层(stacked effects),例如复杂阴影、描边等更灵活控制样式。 控制节点(Control)支持 focus 与 mouse 行为递归(recursive)禁用或启用,使复杂 UI 的行为控制更容易。 图标与界面清晰度 编辑器 UI 在 HiDPI 屏幕上看起来更清晰;图标等 UI 元素在高分辨率屏幕上模糊问题大幅改善。 三、平台支持 Android 引入 TouchActionsPanel,为平板/手机上的编辑器用户提供常用操作按钮(比如保存、撤销)以便快速调用。 支持 Android 15 的 16KB 内存页面(page size)特性。 支持 edge-to-edge 显示模式,使游戏画面尽可能占满屏幕空间,同时允许系统状态栏/导航栏重叠显示。 支持访问设备原始相机输入流(camera feed),方便做 AR 或实时滤镜处理。 Linux 支持原生 Wayland 子窗口(sub-window)功能;在支持 Wayland 的桌面环境中,Godot 可以生成独立子窗口(比如弹出窗口、设定窗口等)。 Apple / macOS / visionOS 在 macOS 上引入游戏嵌入窗口 (embedded game window) 支持。 新增对 Apple visionOS 的原生导出支持,使 Godot 项目可以在 Vision Pro 上运行,目前为“窗口化”应用(非全沉浸式体验)。 Windows Windows 导出时,对于 exe 文件的元数据(图标、产品名称、公司信息等),之前依赖外部工具rcedit,现在可以在任何平台上本地完成这些操作,不再依赖外部工具。 Web WebAssembly 的 SIMD 支持上线,提升 Web 游戏的性能表现,尤其在 CPU 负荷较重的情况下会更明显。 四、脚本语言与扩展 C# / .NET Android 导出的 APK 中的 .NET 程序集(assemblies)现在直接从 APK 加载,而不是先提取到缓存,这样能避免版本混乱和权限问题。 GDScript 支持可变长度参数(variadic arguments):函数可以接受不定数量的参数。 引入抽象类和抽象方法(abstract classes / methods):允许声明一个类为抽象类(不能直接实例化),并定义抽象方法,子类必须实现这些方法。 GDExtension 支持注册主循环(main loop)回调,例如引擎启动与关闭等生命周期回调。这对于插件扩展或与引擎底层交互非常有帮助。 五、系统级别与渲染 动画 (Animation) 新增BoneConstraint3D,含 AimModifier3D、CopyTransformModifier3D、ConvertTransformModifier3D 等,用于将一个骨骼绑定到另一个骨骼,使得动画动作更自然、更灵活。 导入 (Import) 恢复批量修改资源(import)属性的功能:可以在资源浏览面板中选中多个文件,在 Import Dock 修改某些属性后,一键重新导入。 输入 (Input) 使用 SDL3 来处理游戏控制器(gamepad)的输入支持。这意味着未来控制器特性(例如自适应触发,震动,麦克风,动作控制等)更新会更快、更稳定。 导航 (Navigation) 引入专门的 2D 导航服务器(NavigationServer2D),使纯 2D 游戏不再依赖带有 3D 支持的导出模板,从而减小体积,优化性能。 导航区域计算支持异步(async)处理,可以在后台线程中进行,从而减少主线程负担。 物理 (Physics) 在 SceneTree 中实现 3D 物理插值(interpolation),修复之前在 RenderingServer 中实现导致的一系列问题。对节点 transform 的插值查询问题得到解决。虽然底层有很多变化,但保留了原有 API,以避免破坏现有项目。 渲染 (Rendering) 支持基于环境光的镜面遮蔽 (specular occlusion from ambient light),使一些物体缝隙、裂隙间不会意外反射天空等光源。 支持 Bent Normal Maps(弯曲法线贴图)以改善光照与间接光反射的准确性。 加入 SMAA 1x 抗锯齿支持(Subpixel Morphological Anti-Aliasing)以替代或增强 FXAA 类型的抗锯齿效果。 在支持的移动硬件上显式使用半精度浮点格式 (half-precision / F16) 渲染,以节省资源、提高性能与帧率稳定性。 XR / AR /虚拟现实 对 OpenXR 的 D3D12 后端支持。 在 Vulkan 移动渲染器中支持“foveated rendering”(眼动渲染 / 边缘简化渲染)通过 “Fragment Density Map” 扩展,以减少边缘区域的渲染负担。 支持 XR 渲染模型(render models):控制器等交互组件模型会按设备正式显示。 支持 Meta / Pico 等头显的 Application SpaceWarp / 帧合成(frame synthesis)功能,以改善低功耗 / 高刷新率头显上的体验。

优秀的个人博客,低调大师

Harmony 鸿蒙路由框架:TheRouter 开源

TheRouter 是一个用于移动端APP,包括 Android、iOS、Harmony 三端的模块化、组件化开发的一整套解决方案框架。提供了三端高一致性,对移动端开发者更友好,让开发人员更适应,使用起来也更顺手。在鸿蒙上, TheRouter 基于HMRouter做了深度定制,不仅支持平台化应用实现组件化、跨模块调用、动态化等功能的集成等功能基础上,还提供了编译时安全检查、支持动态路由下发与修改、路由 Path 一对多等高度动态能力。 Github: https://github.com/HuolalaTech/hll-wp-therouter-harmony/ 官网:http://therouter.cn/ TheRouter Harmony 核心功能具备如下能力: 页面导航跳转能力(Navigator) 跨模块依赖注入能力(ServiceProvider) 动态化能力(ActionManager) <br> 一、为什么要使用 TheRouter 路由是现如今移动端开发中必不可少的功能,尤其是企业级APP,可以用于将多模块页面跳转的强依赖关系解耦,同时减少跨团队开发的互相依赖问题。 对于大型 APP 开发,基本都会选用模块化(或组件化)方式开发,对于模块间解耦要求更高。 TheRouter 是一整套完全面向模块化开发的解决方案,不仅能支持常规的模块依赖解耦、页面跳转,同时提供了模块化过程中常见问题的解决办法。 <br> 1.1 TheRouter 鸿蒙端的三大能力 Navigator: 支持 Path 与页面多对一关系或一对一关系,可用于解决多端path统一问题 页面 Path 支持正则表达式声明 支持 json 格式路由表导出 路由表支持为页面添加注释说明 支持动态下发 json 路由表,降级任意页面为H5 支持页面跳转拦截处理 支持使用路由跳转到第三方 SDK 中的页面 ServiceProvider: 支持跨模块依赖注入 支持自定义注入项的创建规则,依赖注入可自定义参数 支持注入对象缓存,多次注入,只会 new 一次对象 ActionManager: 支持全局回调配置 支持多对一链式响应 支持优先级响应 方法支持返回值与入参 支持记录调用路径,解决调试期观察者模式无法追踪 Observable 的问题 <br> 二、鸿蒙路由方案 根据华为官方文档建议,从API 10开始,推荐使用 NavPathStack 配合 navDestination 属性进行页面路由。所以 TheRouter 也是按照这个方案实现的,如果你的项目还是使用 ohos.router 组件,建议尽早迁移。 详细内容请查看华为官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-router 无论哪个平台,路由的本质就是一个 Map,或者说是字典。其中 key 是,页面的 path,value 是路由项。对于 Action、ServiceProvider,也都是一样。 所以在鸿蒙上最核心的重点,是实现在编译期将注解 path 关联到具体的路由项,使其产生一个一对多或一对一的对应关系。其次就是要考虑如何与系统自带的路由表兼容,遵循系统方案而不是完全打造一套,否则可能引起将来的不确定性。 在 TheRouter 中,通过编译期的 hvigor 插件,解析全部的注解关键字,并将获取到的内容保存下来,在应用编译完成后,参照系统的路由表格式,生成一份增量的路由表,聚合到系统的路由表内。正是因为这样,才能做到兼容第三方SDK,正常跳转到第三方页面。既然第三方都能跳转,那么其他的二方、或自己的独立模块自然也就可以正常跳转了。 <br> 三、使用 TheRouter 页面跳转 3.1 声明路由项 如果一个页面允许被路由打开,则需要使用注解 @Route 声明路由项,每个页面允许声明多个路由项,也就是一对多的能力,极大降低多端路由统一时的业务影响面。 参数释义 path: 路由path 【必传】。 建议是一个url,并推荐三端url统一。path内支持使用正则表达式,允许多个path对应同一个Page。 description: 页面描述【可选】。 会被记录到路由表中,方便后期排查的时候知道每个path或Page是什么业务。 params: 页面参数【可选】。 自动写入当前页面参数中,允许写在路由表中动态下发修改默认值,或通过路由跳转时代码传入。 launchMode: 当前页的启动方式【可选】。 启动模式,可选项:'STANDARD'(默认)、'MOVE_TO_TOP_SINGLETON'、'POP_TO_SINGLETON'、'NEW_INSTANCE'。 <br> @Route({ path: BaseConstant.MAIN_PAGE, description: 'Demo首页', params: ["hello", "路由表默认参数"], launchMode:'STANDARD' }) @Component export struct MainPage { } <br> 3.2 发起页面跳转 传入的参数可以是 string 和基本数据类型、也可以是ESObject对象。 TheRouter.build("http://therouter.com/home") .withNumber("key1", 12345678) .withString("key2", "参数") .withBoolean("key3", false) .with({xxx:xxx}) // navigation、replace、pop 均可以额外传入 callback 参数,对当前跳转的个状态回调 .navigation(); // 替换页面(相当于先 pop 再 push) .replace(); // 关闭当前页 .pop(); <br> 3.3 路由表生成规则 如果两条路由的 path 完全相同,则认为是同一条路由,不会考虑参数是否相同。 路由表生成规则:编译期按照如下顺序取并集。 覆盖规则: 根据如下顺序,如果相同,后者可以覆盖前者的路由表规则。 编译期解析注解生成路由表 首先取 业务模块(har/hap) 中的路由表 再取 主hsp module 代码中的路由表 最后取 resources/base/profile/RouteMap.json 文件中声明的路由表。 如果编译期没有这个文件,会生成一份默认路由表放在这个目录内(编译完成后如果没有配置保留,会自动删掉);如果有,会将路由表合并。 运行时线上动态下发的路由表 路由表允许线上动态下发,将覆盖本地路由表,详见 【3.4 动态路由表的设计与使用】 如果编译期没有这个文件,会生成一份默认路由表放在这个目录内(编译完成后如果没有配置保留,会自动删掉);如果有,会将路由表合并,因此,对于没办法修改代码的第三方SDK内部,如果希望通过路由打开,只需要手动在 RouteMap.json 文件中声明,就能通过路由打开了。 <br> 3.4 动态路由表的设计与使用 TheRouter 的路由表是动态添加的,项目每次编译后,会在 app 内生成一份当前模块的全量路由表。这个路由表也可以后续通过远程下发的方式使用,例如远端可以针对不同的APP版本,下发不同的路由表达到配置目的。这样如果将来线上某些页面发生Crash,可以通过将这个页面的落地页替换为H5的方式,临时解决这类问题。 <br> 有两种推荐的远程下发方式可供使用方选择: 将打包系统与配置系统打通,每次新版本打包后自动将所有模块(hsp、har、hap) resource/rawfile/ 目录中的路由表文件上传到配置系统,聚合成一个 json 后,下发给对应版本 APP 。优点在于全自动不会出错。 配置系统无法打通,线上手动下发需要修改的路由项,因为 TheRouter 会自动用最新下发的路由项覆盖包内的路由项。优点在于精确,且流量资源占用小。 <br> 动态路由限制 :准确的说,应该是鸿蒙系统的限制。在鸿蒙上,路由表必须是静态的并且在编译期确定下来。TheRouter Harmony 做了一些黑科技处理,允许动态加载一个或多个路由表,但是动态加载的路由页面必须是在编译期就已经存在的,不能凭空新增(类似 Android 的 Activity,在编译后就不能再改或新增注册清单文件了)。 <br> // 与Android逻辑不同,此代码 必须 在页面打开之前,路由初始化之后调用。 建议紧跟 TheRouter.init() 调用 TheRouter.setRouteMapInitTask(task: (map: Map<string, routeitem>) =&gt; void); /** * 此处的 map 就是当前应用的路由表全量, * 当获取到远端路由表以后,把路由表继续传入map中,有重复项可自动覆盖 */ TheRouter.setRouteMapInitTask(() =&gt; { // 此处为纯业务逻辑,每家公司远端配置方案可能都不一样 const json = Connfig.doHttp("routeMap"); // 只需要将路由json返回给框架即可,不建议在任务中做耗时操作 return json; }); <br> 3.5 拦截器用法 框架内置四种自定义处理器可供业务场景定制,用于在路由跳转过程中,以切面的方式统一修改路由落地页参数信息。 Harmony 路由与 Android 路由的拦截器使用完全一致,可以直接参考【Android 文档 第三部分】。 // 所有拦截器方法均在 TheRouter 类下,可以直接如下方式全局调用 TheRouter.addNavigatorPathFixHandle() /** * 应用场景:用于修复客户端上路由 path 错误问题。 * 例如:相对路径转绝对路径,或由于服务端下发的链接无法固定https或http,但客户端代码写死了 https 的 path,就可以用这种方式统一。 * 注:必须在 TheRouter.build() 方法调用前添加处理器,否则处理器前的所有path不会被修改。 */ static addNavigatorPathFixHandle(handle: NavigatorPathFixHandle); /** * 页面替换器 * 应用场景:需要将某些path指定为新链接的时候使用。 也可以用在修复链接的场景,但是与 path 修改器不同的是,修改器通常是为了解决通用性的问题,替换器只在页面跳转时才会生效,更多是用来解决特性问题。 * * 例如模块化的时候,首页壳模板组件中开发了一个SplashActivity广告组件作为应用的MainActivity,在闪屏广告结束的时候自动跳转业务首页页面。 但是每个业务不同,首页页面的 Path 也不相同,而不希望让每个业务线自己去改这个首页壳模板组件,此时就可以组件中先写占位符https://kymjs.com/splash/to/home,让接入方通过 Path 替换器解决。 * 注:必须在 TheRouter.build().navigation() 方法调用前添加处理器,否则处理器前的所有跳转不会被替换。 */ static addPathReplaceInterceptor(interceptor: PathReplaceInterceptor); /** * 路由替换器 * 应用场景:常用在未登录不能使用的页面上。例如访问用户钱包页面,在钱包页声明的时候,可以在路由表上声明本页面是需要登录的,在路由跳转过程中,如果落地页是需要登录的,则先替换路由到登录页,同时将原落地页信息作为参数传给登录页,登录流程处理完成后可以继续执行之前的路由操作。 * * 路由替换器的拦截点更靠后,主要用于框架已经从路由表中根据 path 找到路由以后,对找到的路由做操作。 * * 这种逻辑在所有页面跳转前写不太合适,以前的做法通常是在落地页写逻辑判断用户是否具有权限,但其实在路由层完成更合适。 * 注:必须在 TheRouter.build().navigation() 方法调用前添加处理器,否则处理器前的所有跳转不会被替换。 */ static addRouterReplaceInterceptor(interceptor: RouterReplaceInterceptor); /** * 路由AOP拦截器 * 与前三个处理器不同的点在于,路由的AOP拦截器全局只能有一个。用于实现AOP的能力,在整个TheRouter跳转的过程中,跳转前,目标页是否找到的回调,跳转时,跳转后,都可以做一些自定义的逻辑处理。 * * 使用场景:场景很多,最常用的是可以拦截一些跳转,例如debug页面在生产环境不打开,或定制startActivity跳转方法。 */ public setRouterInterceptor(interceptor: (route: RouteItem, callback: (route: RouteItem) =&gt; void) =&gt; void); 3.6 高级用法 TheRouter同时支持更多页面跳转能力: 为第三方库里面的页面添加路由表,达到对某些页面降级替换的目的; 跳转过程拦截器(总共四层,可根据实际需求使用); 跳转结果回调; <br> 四、跨模块依赖注入 ServiceProvider 的设计 对于模块化开发中跨模块的调用,我们推荐采用 SOA(面向服务架构) 的设计方式,服务调用方与使用方完全隔离,调用模块外的能力不需要关注能力的提供者是谁。ServiceProvider 的核心设计思想也是这样的,目前服务间的调用协议采用接口的方式。当然,也可以兼容不通过接口下沉而是直接调用的情况。 <img src="https://oscimg.oschina.net/oscnet//2b415a4c5e28eb030692174056fbf876.jpeg" class="blog-img"> 服务提供方负责提供服务,不需要关心调用方是谁会在何时调用自己。 服务的使用方只关注服务本身,不需要关心这个服务是谁提供的,只需要只能服务能提供哪些能力即可。 例如上面的图片:拉拉需要使用录音的服务,小货则向外提供一个录音的服务,由TheRouter的ServiceProvider负责撮合。 <br> 4.1 服务使用方:拉拉 她无需关心,IRecordService 这个接口服务是谁提供的,他只需要知道自己需要使用这样的一个服务就行了。 注:如果没有提供服务的提供方,TheRouter.get() 可能返回 undefined TheRouter.get<irecordservice>(BaseConstant.CLASS_SERVICE)?.doRecord() <br> 4.2 服务提供方:小货 服务提供方需要声明一个提供服务的方法,用 @ServiceProvider 注解标记,并需要实现接口 IServiceProvider。 // 类名不限定,任意名字都行 // 所有的 ServiceProvider 必须实现 IServiceProvider 接口 // 多次添加重复serviceName,框架会保证安全,在编译时报错 @ServiceProvider({ serviceName: BaseConstant.CLASS_SERVICE, singleton: true }) export class CustomService implements IRecordService, IServiceProvider { doRecord(): void { } } <br> @ServiceProvider 参数释义 serviceName: 服务名 【必传】。 服务的唯一标识。如果重复,在编译期会直接报错。 singleton: 默认false【可选】。 服务提供方提供出的服务是否为单例。 <br> 五、动态化能力 Action 的设计 Action 本质是一个全局的系统回调,主要用于预埋的一系列操作,例如:弹窗、上传日志、清理缓存。 与 Android 系统自带的广播通知类似,你可以在任何地方声明动作与处理方式。并且所有 Action 都是可以被跟踪的,只要你愿意,可以在日志中将所有的动作调用栈输出,以方便调试使用,这样在一定程度上可以解决观察者模式带来的通病:无法追踪 Observable 的问题。 <br> 5.1 Action 使用 声明一个 Action: // action建议遵循一定的格式 const readonly ACTION = "therouter://action/xxx" // action既可以放在ServiceProvider里面,也可以单独放在任意类中,但不能是top-level函数,这一点与Android不同 // action函数允许有返回值,可以做耗时操作 // 多次添加重复action,每个action的方法都会执行,但最终只会返回优先级最高的方法的返回值 @Action({ action: ACTION }) public test(par: string): string { return "返回入参:" + par; } <br> 执行一个 Action: // action建议遵循一定的格式 const val ACTION = "therouter://action/xxx" // 如果执行了一个没有被声明的Action,则不会有任何动作 // 这里的"hello"字符串,是根据action定义时有一个入参,所以调用时需要传入这个参数 TheRouter.action<string>(ACTION, "hello").then((str) =&gt; { this.text = str; }) <br> @Action 参数释义 action: 事件名 【必传】。 当前函数需要响应的action。如果同一个action有多个函数订阅,会在响应时根据优先级决定先后顺序。 priority: 优先级(number类型),默认5【可选】。 数字越大,优先级越高。 <br> 5.2 客户端动态响应使用场景 如果仅客户端使用,常用的场景可能是:当用户执行某些操作(打开某个页面、H5点击某个按钮、动态页面配置的点击事件)时,将会自动触发,执行预埋的 Action 逻辑。 如果与服务端链路打通,这个能力其实是需要整个公司的配合,比如有一套类似智慧大脑的方案,可以基于客户端过去的一些埋点数据,智能推断出用户下一步要做的事情,然后通过长连接直接向客户端下发指令做某些事情。那么通过客户端预埋的页面跳转、弹窗、清缓存、退出登录等等操作,就可以通过服务端指令进行操作,则就是一套完整的动态化方案。 <img src="https://oscimg.oschina.net/oscnet//79f8e6cef031e34cfa80d4f329003662.png" class="blog-img"> <br> 六、从其他路由迁移至 TheRouter 6.1 迁移工具一键迁移? TheRouter 在 Android 项目上提供了图形化界面的迁移工具,可以一键从其他路由迁移到TheRouter。 鸿蒙当然也提供了相同的能力,你可以在插件市场搜索,直接安装。安装好以后,点击 IDE 顶部的 Tool 菜单,找到迁移工具。 <br> 6.2 与其他路由对比 <br> 功能 TheRouter HMRouter Navigation 具备三端高一致性 ✔️ ✖️ ✖️ 注解生成路由表 ✔️ ✔️ ✖️ 路由path支持正则表达式 ✔️ ✔️ ✖️ 指定拦截器 ✔️(四大拦截器可根据业务定制) ✔️ ✖️ 导出路由表 ✔️(路由文档支持添加注释描述) ✔️ ✖️ 支持跨模块调用 ✔️ ✔️ ✖️ 动态修改路由信息 ✔️ ✖️(未提供功能接口) ✔️(限制高,需提前定义,通过if/else修改实现) 远端路由表下发 ✔️ ✖️ ✖️ 多 Path 对应同一页面(低成本实现双端path统一) ✔️ ✖️ ✖️ 支持使用路由打开第三方SDK页面 ✔️ ✖️ ✖️ <br> 七、总结 <br> TheRouter 并不仅仅是一个小巧灵活的路由库,而是一整套 Android、iOS、Harmony 三端完整的移动端解决方案,对移动端开发者更友好,上手开发适应性更强。使用 TheRouter 能够解决几乎全部的模块化过程中会遇到的问题。 对于现有的路由框架,我们也在最大限度支持平滑迁移。你也可以在 Github issue 中提出需求,我们评估后会尽快支持,也欢迎任何人提供 Pull Requests。 <br> 更多问题请加群沟通: <br> <img src="https://oscimg.oschina.net/oscnet//58894fe2e65215c645807394c7428b38.png" class="blog-img"> <br> </string></irecordservice></string,>

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册