最新要闻
- 今日热议:吉利汽车2月销量10.87万辆 极氪同比增长87% 可自主选择是否开启单踏板
- 全球信息:苹果iPhone掉熊窝被叼走 第一视角记录血盆大口
- 快报:荣耀赵明:苹果还是行业标杆 向苹果致敬 然后超越
- 环球快看:人口不断下降!一周工作时间增至69小时 韩国打工人也要迎来996
- 6g是什么概念
- 简讯:父母不给买鞋28岁女儿瞬间崩溃 跪地哀求200块都不给我花:网友感叹
- 男子在LV官网买包近2年未发货:最后商家取消订单
- 【快播报】男子挑战18元5片天价土豆火锅店:最后点了5盘土豆吃到崩溃
- 今日热讯:小伙早餐喝下20个生鸡蛋 网友:是个狠人 上一个这么喝的是周润发
- 环球热讯:弹幕也要放广告?!还能不能让人好好看剧了
- 视讯!避免延期发售?曝《GTA6》可能削减本体内容移到后续DLC
- 焦点热议:公称抗拉强度值_公称抗拉强度
- 教你用QQ邮箱如何发送文件
- 天天速看:南昌工学院开展“保护母亲河,争当河小青”净滩环保志愿活动
- 天天关注:收到背去世老人下楼订单?顺丰回应引围观 网友感叹这单也敢接
- 每日速读!拒绝ChatGPT后:苹果光速反悔
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天热文:浅谈基于Web的跨平台桌面应用开发
作者:京东物流 王泽知
近些年来,跨平台跨端一直是比较热门的话题,Write once, run anywhere,一直是我们开发者所期望的,跨平台方案的优势十分明显,对于开发者而言,可以做到一次开发,多端复用,一套代码就能够运行在不同设备上,这在很大程度上能够降低研发成本,同时能够在产品效能上做到快速验证和快速上线。如今跨端跨平台的优秀技术方案也比较多,
- 移动端: React Native,Flutter,Weex;
- 小程序端: Taro,Uniapp;
- 桌面端: NW.js,Electron,Flutter for desktop,Tauri,Wails,
今天我们聊聊桌面应用开发。
(资料图片仅供参考)
1 什么是跨平台
泛指编程语言、软件或硬件设备可以在多种操作系统或不同硬件架构的电脑上运作。一般来说,有这几种场景,分别是跨设备平台(如 PC 端和移动端),跨操作系统,(移动端中分Android,IOS,PC端中分 Windows,macOS,Linux),国内的小程序(微信,京东,百度,支付宝,字节跳动等等)
2 跨平台的技术方案
跨平台编程不是一件容易的事情,这是由于在不同平台之间,有许多小而复杂的差异,这都需要考虑周全,现在我们有了成熟的跨平台技术方案,能够减小开发者的开发成本及跨平台的难易程度。
- NW.js
- Electron
- Flutter for Desktop
- Tauri
- Wails
2.1 NW.js
官网:https://nwjs.io/GitHub:https://github.com/nwjs/nw.js语言:Nodejs + 前端任意框架代表项目:微信小程序 IDE,京东小程序 IDE
NW.js(node-webkit )是一个基于 Chromium 和 Node.js 的 Web 运行环境,可让你直接在 DOM 中调用 Node.js 模块,并可使用任何现有的 Web 技术来编写本地应用。
2.2 Electron
官网:https://www.electronjs.org/GitHub:https://github.com/electron/electron语言:Nodejs + 前端任意框架代表项目:VSCode,百度小程序 IDE,京 ME,Facebook Message,
Electron 的前身叫做 Atom-Shell,本来是 GitHub 发布开源编辑器 Atom 时一并发布的副产物,但是后来这个副产物的影响力远远的超过了 Atom 本身,于是便改名为一个独立专案,也就是现在的 Electron。Electron 的本质很简单,就是 Chromium + Node.js 的组合,两者之间透过 IPC 通讯。类似于 NW.js,表面上,它们似乎非常相似,但是这两个项目有着本质上的区别,使得 Electron 和 NW.js 成为两个完全独立的产品。
- 应用入口不同,NW.js 主入口是一个 HTML,Electron 中是 JavaScript,可操作性更强
- Node 集成方式不同,在 NW.js 中网页中的 Node 需要通过给 Chromium 打补丁来实现,Electron 则是通过各个平台的消息循环与 libuv 的循环集成,避免了直接在 Chromium 上做改动
- 功能,支持的功能数量上有明显的差距,Electron 有着较大的社区及社区活跃度,大量成熟的 npm 功能模块。
2.3 Tauri
官网:https://tauri.app/GitHub:https://github.com/tauri-apps/tauri语言:Rust + 前端任意框架代表项目:仅有少量开源应用
Tauri 是 2021年 JavaScript 明星项目(https://risingstars.js.org/2021/zh#section-all)的最受欢迎项目中排名第5,在 stateofjs 2021 (https://2021.stateofjs.com/en-US/libraries/mobile-desktop/)中 满意度和关注度排名第1, 由于 Vite,esbuild,swc,Rome 等工具的大火,让基于 Go、Rust 的高效率构建类工具进入爆发期,加上 Bundleless 的构建体验,让 Rust、Go 成为前端开发者的又一扇门。由于 Tauri 的 Rust 背景,加上构建产物小,内存占用低,还是值得长期关注的。
题外话:Rust 前景还是非常不错的,如 Linux内核接纳 Rust,deno采用 Rust,微软拥抱Rust,fuchsia 的 Rust 代码占比超50%,Apple 在底层 all-in rust,连续6年的 stackoverflow 最受欢迎语言。就是学习门槛稍微有点高
2.4 Wails
官网:https://wails.io/GitHub:https://github.com/wailsapp/wails语言:Go + 前端任意框架代表项目:暂无
Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。与 Tauri 类似,Windows 上使用的是 Webview2。
2.5 Flutter for Desktop
官网:https://flutter.dev/multi-platform/desktopGitHub:https://github.com/flutter/flutter语言:Dart代表项目:暂无
从渲染原理看 Flutter 是 skia 自绘性能优于 Electron,但需要考虑下稳定性和生态。
3 跨平台的架构原理
本次我们讨论下用的最多的 Electron 和比较有前景的 Tauri 的架构原理。
通过 Web 技术写 UI,赋予了底层能力,达到跨平台的能力及体验。
3.1 Chromium 多进程架构
大多数现代 Web 浏览器都为多进程架构,主要有浏览器主进程、渲染进程、插件进程、网络进程、GPU 进程,Chromium 也是如此。
IPC = Inter-Process Communication 进程间通信
Chromium 是 Chrome 的开源版,同时也是一个浏览器。
- 主进程的 RenderProcessHost 和渲染进程的 RenderProcess 负责处理 IPC 事件
- 渲染进程的 RenderView,页面的展示就是在这里基于 Webkit 排版出来的
- ResourceDispatcher 处理资源请求,当页面需要请求资源时,通过 ResourceDispather 创建一个请求 ID 转发到 IPC,在 Browser 进程中处理后返回
3.2 Electron 架构
- 在每个进程中暴露了 Native API(Main Native API,Renderer Native API)
- 引入 Node.js
- Web 技术实现 UI
3.3 Electron 进程模型
Electron 继承了来自 Chromium 的多进程架构,这使得此框架在架构上非常相似于一个现代的网页浏览器。
为何采用多进程架构?网页浏览器是个极其复杂的应用程序。 除了显示网页内容的主要能力之外,他们还有许多次要的职责,例如:管理众多窗口 ( 或 标签页 ) 和加载第三方扩展。在早期,浏览器通常使用单个进程来处理这些功能。 这种模式虽然能减小打开每个标签页的开销,但也同时意味着一个网站的崩溃或无响应会影响到整个浏览器。为了解决这个问题,Chrome 团队决定让每个标签页在自己的进程中渲染, 从而限制了一个网页上的有误或恶意代码可能导致的对整个应用程序造成的伤害。 然后用单个浏览器进程控制这些标签页进程,以及整个应用程序的生命周期
Electron 也是这样,作为应用开发者,控制着两种类型的进程,主进程和渲染进程。主进程负责应用程序窗口管理,应用程序的生命周期,原生API等渲染进程负责UI的展示,这部分我们可以选择任意前端框架 Vue、React、Svelte、Preact
3.4 Tauri 进程模型
Tauri 采用了一种类似 Electron 和大多数现代Web浏览器那样的多进程架构。包括主进程和 WebView进程,单个主进程管理一个或多个 WebView 进程。
3.5 进程间通信
Electron 的进程通信渲染器进程 -> 主进程
- (单向)ipcRenderer.send API 发送消息,然后使用 ipcMain.on API 接收
- (双向)ipcRenderer.invoke 与 ipcMain.handle 搭配使用来完成
4 实战 - 导航启动工具
为了对比 Electron 和 Tauri 差异性,分别用 Electron 和 Tauri 做一个简单的应用,导航启动器,类似 Alfred,Spotlight。
4.1 功能描述
首先描述下这个应用的功能,启动应用后,通过快捷键 Ctrl/Command + K 唤起应用界面 - 一个输入框,在输入框输入关键词 git 会展示 git 相关的系统名称列表,选择后回车即可打开 github.com,相当于另类的书签。
4.2 设计思路
4.3 项目结构及实现
这里 Electron 使用的是 Electron React Boilerplate 脚手架,使用 webpack 构建 UI 部分Tauri 是使用官方的脚手架工具 - create-tauri-app,内置了 Vite,在前端框架上选了 React
这个导航启动器主要涉及的功能点有:
- 整个应用不展示关闭,最小化,最大化的按钮及整个菜单栏(menuBar),无边框窗口
- 视觉上整个应用是一个输入框,应用窗口的高度是根据网页内容的高度自适应
- 注册全局快捷键,显示应用,隐藏应用
- 监听按键,并使用默认浏览器打开链接
4.3.1 对于功能点一
Electron 是通过对主窗口初始化时修改配置,frame 设置成 false 可实现无边框窗口
在 Tauri 中,实现无边框窗口有 3 种方式:通过 tauri.conf.json 配置,通过 Tauri 提供的 JS API -@tauri-apps/api,通过 Rust 原生修改 window;这里我们选用在 tauri.config.json 中配置
4.3.2 对于功能点二
输入框部分均由 React 实现,主要的差异在窗体根据内容高度动态调整窗体的高度,就是根据 document.body.offsetHeight 的高度去设置 mainWindow 的高度在 Electron 中,可以在渲染进程中发 IPC 通知主进程去修改,主进程监听到消息后进行高度修改
在 Tauri 中,相对比较方便,对于常用的功能都封装了 JS API,也就是前面提到的@tauri-apps/api,直接导入方法调用即可
4.3.3 对于功能点三
注册全局快捷键,控制 mainWindow 的显示和隐藏在 Electron 中,首先定义 registerGlobalShortcut 方法,在 app 启动后注册快捷键,主要是在主进程中操作。
在 Tauri 中,得益于 JS API 的便利性,在渲染进程中就可以注册,因此只需要在 React 生命周期中执行注册
4.3.4 对于功能点四
方便演示,我们这里直接对 document.body 进行 onkeydown 监听,上下光标选择对应的选项,回车或点击使用默认浏览器打开对应的链接,这里两者的实现很相似
至此,主要功能已经完成,下一步进入看下如何打包多平台的应用。
4.4 应用打包
Electron 中比较常见的有两种打包,electron-packager 和 electron-builder,electron-builder 的生态更好,我们这里选择 electron-builder。
Tauri 中则是内置在 cli 的打包方案,执行 yarn tauri build 即可
同一应用对比,相同 React 版本,未使用 UI 框架
通过以上数据对比基本与 Tauri 主页上的数值相符,较小的体积,内存占用小。
4.5 应用更新
两者都有对应的解决方案,具体内容可以看下官方文档,本文不做过多介绍。
5 总结
NW.js 的时代已经过去,考虑 NW.js 的可以优先 Electron。Tauri 表现不错,前景看好。它解决了 Electron 现有的很多问题,带来了简单便捷的开发体验,也期待 Tauri 的 roadmap 中集成 Deno 作为应用的后端处理,这样就可以继续使用 JavaScript/TypeScrupt 来实现应用后端逻辑,新项目可以考虑使用,但是还有一些问题需要改进以及 Rust 的学习曲线曲折,有一定的学习成本。Electron 目前仍是最多的选择,得益于自身庞大的社区,丰富的功能及工程实践,性能优化这部分比较考验开发者。
天天热文:浅谈基于Web的跨平台桌面应用开发
环球视讯!聊聊消息队列中的基础概念
今日热议:吉利汽车2月销量10.87万辆 极氪同比增长87% 可自主选择是否开启单踏板
全球信息:苹果iPhone掉熊窝被叼走 第一视角记录血盆大口
快报:荣耀赵明:苹果还是行业标杆 向苹果致敬 然后超越
环球快看:人口不断下降!一周工作时间增至69小时 韩国打工人也要迎来996
6g是什么概念
简讯:父母不给买鞋28岁女儿瞬间崩溃 跪地哀求200块都不给我花:网友感叹
天天新资讯:python-模块与包
男子在LV官网买包近2年未发货:最后商家取消订单
【快播报】男子挑战18元5片天价土豆火锅店:最后点了5盘土豆吃到崩溃
今日热讯:小伙早餐喝下20个生鸡蛋 网友:是个狠人 上一个这么喝的是周润发
环球热讯:弹幕也要放广告?!还能不能让人好好看剧了
视讯!避免延期发售?曝《GTA6》可能削减本体内容移到后续DLC
焦点热议:公称抗拉强度值_公称抗拉强度
教你用QQ邮箱如何发送文件
天天速看:南昌工学院开展“保护母亲河,争当河小青”净滩环保志愿活动
天天关注:收到背去世老人下楼订单?顺丰回应引围观 网友感叹这单也敢接
每日速读!拒绝ChatGPT后:苹果光速反悔
观众对《最后生还者》真人剧选角不满:女演员与想象不符
每日速讯:女子入职10天因老板娘不同意被开除:当事人感觉“很离谱”
2-高级特性
入门云原生,你需要了解的基础知识
俄罗斯国产新电脑启用!搭载自研8核ARM处理器、运行Linux定制系统
西班牙推出3D打印植物肉:模拟真肉口感
世界快消息!iOS从安卓抄来的这5个功能:苹果用户直呼真香?
世界快消息!学生免费领取7个月云服务器
每天吃的盐:一步步伤害你的身体
女子爱吃生腌海鲜:胆管长满活虫和虫卵
世界实时:iQOO Z7系列配置泄露:最高骁龙782G、支持120W闪充
精彩看点:地方融资平台
环球简讯:郑东新区“红立方·楼事会”荣获全市基层党建“十佳书记项目”
数据漂移问题及解决方案
全球新资讯:(数据库系统概论|王珊)第十章数据库恢复技术-第三节:故障种类
今日热搜:一次Java服务内存过高的分析过程
超划算!冷酸灵泵式牙膏5件套39元发车(送牙刷+漱口水)
天天热点!M.2 SSD秒变移动硬盘!酷冷至尊神钥Air图赏
焦点速讯:亚航被曝行李超重5公斤补收1807元:拍照被威胁不要上飞机
【全球新要闻】极氪官方二手车上线:不以盈利为目的 只收12万公里0事故车辆
精选!安卓“女皇”王雪红爆料苹果MR头显最快年中发布:HTC不担心竞争
环球视点!统一日志输出打印POST请求参数
法系车疯狂降价 12万买C级车雪铁龙C6!有销售一天卖车150多台
热点聚焦:豆瓣评分仅6.0:《蚁人3》周末北美票房暴跌61%
资讯:淄博烧烤店开门一分钟坐满大学生:组团去山东撸串火出圈
699元起 荣耀手表GS 3i发布:14天长续航、支持血氧监测
《巫师3》叶奈法玩偶推出:真人尺寸 能替换服饰
全球速看:stegsolve与zsteg的使用
环球即时:用线性二次模型建模大型数据中心,基于 MPC 进行冷却控制
环球头条:2023,大前端技术趋势及小程序未来分析
全球球精选!如何使用JDBC将Cordova应用程序连接到MySQL数据库?
当前快看:北京故宫三八节门票预定时间是几点?
索尼推出IMX611景深传感器:实现高精度物距测量
天热来两件!220g重磅精梳棉:放克男士纯色T恤20元大促
小米手机在家就能自助检测!支持充电、网络等12项自检
全球快报:北京、郑州等14个省会级城市气温创今年来新高:或挑战历史最暖纪录
和14 Pro一样!iPhone 15全系登岛:苹果又搞了新配色
全球通讯!旖旎是什么意思
当前滚动:hutool XML反序列化漏洞(CVE-2023-24162)
焦点热讯:【MRTK】解决 Unity.IL2CPP.Building.BuilderFailedException: Lump_libil2cpp_vm.cp
记录--uni-app中安卓包检查更新、新版本下载、下载进度条显示功能实现
焦点信息:基于datax抽取mysql数据到HDFS
阅读并手撸JS版Naive Ui Admin骨架
京东客服确认:百亿补贴商品不支持价保!
世界消息!“点对点”自动驾驶 红旗发布E702官图:百公里人工接管小于0.5次
速讯:2499元 荣耀观影眼镜发布:轻至80g、500nit入眼亮度
世界实时:荣耀最强旗舰!一图了解荣耀Magic5至臻版:6699元
环球焦点!超薄+四种体验:冈本Okamoto金装系列1.7元/枚大促
要闻:拖胆选号怎么玩_拖胆选号
Django-2
当前观点:【建议收藏】超详细的Canal入门,看这篇就够了!!!
当前快看:3.6 C提高3day
本地硬盘文件映射公网 cpolar轻松做到
顶象中标GovHK香港政府一站通数字化项目
每日播报!《消费者报告》公布最不可靠的10款电动车:特斯拉双车上榜
微头条丨荣耀Magic 5系列亮相:曲面屏也能拥有直屏体验
天天精选!女子算命核桃树挡姻缘 家人将树砍掉:当事人称要相信科学
安装Redis6.2.7主从哨兵集群教程
当前视点!NTP对时服务器(NTP电子时钟)重要参数指标表
焦点速讯:接口安全性问题02——jwt身份验证与授权
短讯!熬夜后心里咯噔一下要注意:有三大风险
全球快讯:浪费人才?酒店回应去一本院校招聘洗碗工:2千工资对应发展空间广
环球观热点:努比亚Z50 Ultra缩小系统固件:仅8个不可卸载应用
【天天快播报】特斯拉失控、单踏板风波不断 为何还买?吉利李书福:建议大家买国产新能源汽车
2月XGP最佳游戏玩家投票:俄罗斯3A大作《原子之心》荣获第一
A/B 实验避坑指南:为什么不建议开 AABB 实验
观速讯丨.NET7依赖注入
3月6日译名发布:乔治·桑托斯
黄鳝吃什么东西
看点:699元 小米米家首款智能钢琴灯发布:雷达感应自动开关灯
天天微资讯!降低水产品检测标准!日本坚决核污水排海 100%移除放射性元素做不到
专家呼吁每天省杯咖啡提前规划养老:背后商业版图显现 网友无语满嘴跑火车
一个摄像头就能让虚拟人唱跳rap:抖音即可玩
有哪些值得收藏的运营思维导图?
环球速看:在工作中最容易犯的3个大忌
环球头条:1-基础入门
每日热门:网络安全(中职组)-B模块:Windows操作系统渗透测试
当前资讯!你也能成为“黑客”高手——趣谈Linux Shell编程语言
每辆都是碰撞测试车 特斯拉全球首创真实碰撞测试系统
当前热点-惊蛰习俗有哪些?专家科普:吃梨、吃“懒龙”了解下
【世界报资讯】33万买奥迪A7L!上汽回应“内购价最高优惠16万”:正严查信息外泄