Tauri客户端开发框架介绍Tauri是一个现代化的跨平台桌面应用程序开发框架,它允许开发者使用 Web技术(HTML、CSS和 JavaScript)构建轻量级、安全且高性能的桌面应用。
跨平台支持:可构建 Windows、macOS和 Linux应用程序
轻量高效:生成的应用程序体积小,内存占用低
安全性强:内置安全最佳实践,包括沙箱隔离和权限控制
现代技术栈:支持主流前端框架如 React、Vue、Svelte等
原生集成:可通过 Rust轻松调用系统原生功能##技术架构Tauri采用前后端分离架构:
前端:使用任何 Web技术构建用户界面-
后端:基于 Rust提供系统级功能和安全性-
通信桥梁:前后端通过安全的 IPC机制通信
优势对比相比
Electron:-更小的应用体积(Electron的1/10左右)
-更低的内存占用-更快的启动速度-更安全的默认配置
典型应用场景-需要原生系统集成的桌面应用
-资源受限环境下的应用-对安全要求较高的应用
-希望复用现有 Web代码的项目Tauri正迅速成为传统 Electron应用的有力替代方案,特别适合注重性能和安全性的桌面应用开发。
框架 | 冷启动时间 | 内存占用 | 安装包大小 |
---|---|---|---|
Electron | 2.1s | 210MB | 85MB |
Tauri | 0.8s | 40MB | 3.2MB |
Flutter | 1.2s | 90MB | 22MB |
Tauri默认初始化的项目 界面效果。一句代码没写,生成客户端应用,而且还有安装流程的exe。
tarui 打包exe的大小确实惊艳,1.9MB, 我集成heroui 做了一个简单的登录界面,最后1.9 MB。相比我们现在公司使用Election方案达到了百兆级别,真的是非常适合joggle的客户端开发。我决定了就使用tarui进行joggle客户端开发。
为什么选择heroui,因为heroui的界面效果是我看到过的最好的,各个组件都有动效果,体验是非常棒的。
The following has evaluated to null or missing: ==> mrcms_407038f353f6418fa13309619eab1bfd [in template "article.html" at line 274, column 64] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #list mrcms_407038f353f6418fa13309619... [in template "article.html" at line 274, column 57] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at freemarker.core.Expression.assertNonNull(Expression.java:233) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:103) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93) at freemarker.core.Environment.visit(Environment.java:330) at freemarker.core.Environment.visit(Environment.java:336) at freemarker.core.Environment.process(Environment.java:309) at freemarker.template.Template.process(Template.java:384) at org.marker.mushroom.template.SendDataToView.process(SendDataToView.java:144) at org.marker.mushroom.core.WebAPP.start(WebAPP.java:187) at org.marker.mushroom.servlet.DispatcherServlet.progress(DispatcherServlet.java:48) at org.marker.mushroom.servlet.DispatcherServlet.doGet(DispatcherServlet.java:75) at javax.servlet.http.HttpServlet.service(HttpServlet.java:489) at javax.servlet.http.HttpServlet.service(HttpServlet.java:583) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:212) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:156) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:181) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:156) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:662) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:428) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:360) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:297) at org.marker.mushroom.filter.SystemCoreFilter.doFilter(SystemCoreFilter.java:245) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:181) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:156) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:679) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:617) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:934) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1690) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:840)