Tauri:快速、跨平台桌面应用

    Ivaylo Gerchev
    分享

    在本教程中,我们将探索金牛座的,一个用于构建桌面应用程序的现代跨平台框架。

    内容:

    1. 什么是金牛座?
    2. 金牛座vs电子:一个快速比较
    3. 创建一个笔记应用程序
    4. 结论

    多年来,电子实际上是构建桌面应用程序的跨平台框架。Visual Studio Code、MongoDB Compass和Postman都是用这个框架构建的应用程序的很好的例子。Electron确实很棒,但是它有一些明显的缺点,这是其他一些现代框架已经克服的——Tauri就是其中最好的一个。

    什么是金牛座?

    Tauri是一个现代的框架,允许您使用熟悉的web技术(如HTML, CSS和JavaScript)在前端设计,开发和构建跨平台应用程序,同时利用强大的功能Rust编程语言在后台。

    金牛座的是框架不可知论者。这意味着您可以将它与您选择的任何前端库一起使用——例如Vue、React、slvelte等等。另外,在基于tauri的项目中使用Rust是完全可选的。你可以只使用Tauri提供的JavaScript API来构建你的整个应用程序。这不仅可以很容易地构建一个新的应用程序,而且还可以使用你已经构建的web应用程序的代码库,并将其转变为本地桌面应用程序,而几乎不需要修改原始代码。

    让我们看看为什么我们应该使用Tauri而不是Electron。

    金牛座vs电子:一个快速比较

    构建一个真正优秀的应用程序有三个重要元素:应用程序必须小巧、快速和安全。Tauri在这三个方面都优于Electron:

    • Tauri产生的二进制文件要小得多。你可以从Tauri发布的基准测试结果,甚至是超级简单的你好,世界!当使用Electron构建时,应用程序可以是一个巨大的大小(超过120 MB)。相比之下,同一个Tauri应用程序的二进制大小要小得多,不到2mb。在我看来,这是相当令人印象深刻的。
    • Tauri应用程序执行得更快。从上面提到的同一页中,你还可以看到Tauri应用程序的内存使用量可能是等效Electron应用程序的近一半。
    • Tauri应用程序非常安全。在Tauri网站上,你可以读到所有内置安全功能Tauri默认提供。但是我想在这里提到的一个值得注意的特性是,开发人员可以显式地启用或禁用某些api。这不仅让你的应用程序更安全,而且还减少了二进制大小。

    创建一个笔记应用程序

    在本节中,我们将构建一个简单的笔记应用程序,具有以下功能:

    • 添加和删除注释
    • 重命名笔记的标题
    • 在Markdown中编辑笔记内容
    • 在HTML中预览笔记的内容
    • 将笔记保存到本地存储
    • 将票据导入和导出到系统硬盘驱动器

    你可以找到所有的GitHub上的项目文件

    开始

    要开始使用Tauri,您首先需要安装Rust及其系统依赖项.它们根据用户的操作系统而有所不同,所以我不打算在这里探讨它们。请按照文档中有关操作系统的说明操作。

    当你准备好了,在你选择的目录下,运行以下命令:

    npm创建tauri-app

    这将指导您完成如下所示的安装过程:

    $<年代pan class="token function">npm我们希望<年代pan class="token builtin class-name">帮助你和金牛一起创造了一些特别的东西<年代pan class="token operator">!你可以选择一个更大的web技术社区支持的UI框架。这个工具可以让您快速入门。请访问https://tauri.app/查看我们的文档,如果你还没有设置好你的系统,请花点时间。你可能<年代pan class="token function">找到https://tauri.app/v1/guides/getting-started/prerequisites按任意键继续<年代pan class="token punctuation">...?你的应用叫什么名字?我的笔记吗?窗口标题应该是什么?我的笔记?你想添加什么UI配方?create-vite<年代pan class="token punctuation">(香草,vue,反应,苗条,preact,点燃<年代pan class="token punctuation">)https://vitejs.dev/guide/<年代pan class="token comment"># scaffolding-your-first-vite-project)?添加<年代pan class="token string">“@tauri-apps / api”npm包吗?是吗?您想使用哪个vite模板?react-ts<年代pan class="token operator">>>初始化命令<年代pan class="token punctuation">(年代<年代pan class="token punctuation">)需要<年代pan class="token function">安装create-vite@3.2.1可以继续吗?<年代pan class="token punctuation">(y<年代pan class="token punctuation">)y<年代pan class="token operator">>>安装任何额外需要的依赖添加<年代pan class="token number">87包,并经过审计<年代pan class="token number">88包<年代pan class="token keyword">在19世纪<年代pan class="token number">9包裹正在寻找<年代pan class="token keyword">为资金运行<年代pan class="token variable">npm基金<年代pan class="token variable">`发现细节<年代pan class="token number">0漏洞补充道<年代pan class="token number">2包,并经过审计<年代pan class="token number">90包<年代pan class="token keyword">在7 s<年代pan class="token number">10包裹正在寻找<年代pan class="token keyword">为资金运行<年代pan class="token variable">npm基金<年代pan class="token variable">`发现细节<年代pan class="token number">0漏洞<年代pan class="token operator">>>更新<年代pan class="token string">“package.json”>>运行<年代pan class="token string">“金牛座的init”>my-notes@0.0.0金牛座的<年代pan class="token operator">>tauri init——app-name My - Notes——window-title My Notes——disti -dir<年代pan class="token punctuation">../dist——dev-path http://localhost:5173你的frontend dev命令是什么?·<年代pan class="token function">npm你的前端构建命令是什么?·<年代pan class="token function">npm运行构建<年代pan class="token operator">>>更新<年代pan class="token string">“tauri.conf.json”>>运行最终命令<年代pan class="token punctuation">(年代<年代pan class="token punctuation">)安装完成。$<年代pan class="token builtin class-name">cd我的笔记美元<年代pan class="token function">npm运行tauri dev

    请确保你的选择与我所做的匹配,这主要是搭建一个React应用程序与Vite和TypeScript支持,并安装Tauri API包。

    先不要运行应用程序。首先,我们需要为我们的项目安装一些额外的包。在终端上运行以下命令:

    npm安装@mantine/core @mantine/hooks @table /icons @emotion/react标记-反应

    这将安装以下包:

    现在我们准备测试应用程序,但在此之前,让我们看看项目是如何结构的:

    my-notes/├─node_modules/├─public/├─src/│├─assets/││├─react.svg│├─css│├─index.css│├─main。│├─rammstein . exe。ts├─src-tauri /│├─图标/│├─src /│├─.gitignore│├─构建。│├─Cargo。来毫升│ └─ tauri.config.json ├─ .gitignore ├─ index.html ├─ package-lock.json ├─ package.json ├─ tsconfig.json ├─ tsconfig.node.json └─ vite.config.ts

    这里最重要的是应用程序的React部分存储在src目录,Rust和其他特定于tauri的文件存储在src-tauri.我们在Tauri目录中唯一需要接触的文件是tauri.conf.json,在那里我们可以配置应用程序。打开这个文件,找到allowlist关键。将其内容改为:

    “allowlist”“对话框”“保存”真正的“开放”真正的“问”真正的“fs”“writeFile”真正的“readFile”真正的“范围”“美元文档/ *”“桌面/ *美元”“路径”“所有”真正的“通知”“所有”真正的

    在这里,出于安全原因,正如我上面提到的,我们只启用我们将在应用程序中使用的api。我们还限制了对文件系统的访问,只有两个例外-文档而且桌面目录。这将允许用户将他们的笔记导出到这些目录。

    在关闭文件之前,我们还需要更改一件事。找到关键。在那把钥匙下,你会找到标识符关键。将其值更改为com.mynotes.dev.这在应用程序构建中是必需的,因为标识符必须是唯一的。

    我想说的最后一点是,在最后窗户键,你可以设置所有窗口相关的设置:

    “windows”“全屏”“高度”600“可调整大小的真正的“标题”“我的笔记”“宽度”800

    如你所见,标题Key是根据您在安装期间给它的值为您设置的。

    好,让我们最终启动应用程序我的笔记目录下,执行以下命令:

    npm运行tauri dev

    您需要等待一段时间,直到Tauri设置完成,所有文件都第一次编译完成。别担心。在后续的构建中,这个过程将会快得多。当Tauri准备好时,它会自动打开应用程序窗口。下图显示了您应该看到的内容。

    我们新的金牛座窗口"loading=

    注意:在应用程序在开发模式下运行或构建后,一个新的目标目录创建在src-tauri,其中包含所有已编译的文件。在开发模式下,它们被放置在调试子目录,在构建模式下,它们被放置在释放子目录。

    好的,现在让我们根据需要调整文件。首先,删除index.css而且App.css文件。然后打开main.tsx文件并将其内容替换为以下内容:

    进口反应“反应”进口ReactDOM“react-dom /客户端”进口MantineProvider“@mantine /核心”进口应用程序”。/应用程序ReactDOMcreateRoot文档getElementById“根”作为HTMLElement渲染<反应StrictMode><MantineProviderwithGlobalStyles withNormalizeCSS<年代pan class="token operator">><应用程序/></MantineProvider></反应StrictMode>

    这样就可以使用Mantine的组件了。

    接下来,打开App.tsx文件并将其内容替换为以下内容:

    进口useState<年代pan class="token punctuation">}“反应”进口按钮“@mantine /核心”函数应用程序常量数<年代pan class="token punctuation">,setCount<年代pan class="token punctuation">]useState0返回<div<年代pan class="token operator">><按钮onClick<年代pan class="token operator">== >setCount= >数<年代pan class="token operator">+1>数是<年代pan class="token punctuation">{数<年代pan class="token punctuation">}</按钮></div<年代pan class="token operator">>出口默认的应用程序

    现在,如果你看一下应用程序窗口,你应该看到以下内容:

    新的、空的应用程序窗口"loading=

    通过单击按钮,确保应用程序正常运行。如果出现错误,您可能需要调试它。(见下注)

    注意:当应用程序在开发模式下运行时,您可以通过右键单击应用程序窗口并选择打开DevTools<年代trong>检查菜单上的。

    创建基本应用程序功能

    现在让我们创建应用程序的框架App.tsx连同以下文件:

    进口useState<年代pan class="token punctuation">}“反应”进口减价“marked-react”进口ThemeIcon按钮CloseButton开关NavLinkFlex网格分频器文本TextInput文本区域“@mantine /核心”进口useLocalStorage<年代pan class="token punctuation">}“@mantine /挂钩”进口IconNotebookIconFilePlusIconFileArrowLeftIconFileArrowRight“@ table /图标”进口保存<年代pan class="token punctuation">,开放<年代pan class="token punctuation">,问<年代pan class="token punctuation">}“@tauri-apps / api /对话框”进口writeTextFile<年代pan class="token punctuation">,readTextFile<年代pan class="token punctuation">}“@tauri-apps / api / fs”进口sendNotification<年代pan class="token punctuation">}“@tauri-apps / api /通知”函数应用程序常量笔记<年代pan class="token punctuation">,setNotes<年代pan class="token punctuation">]useLocalStorage关键<年代pan class="token operator">:“我的笔记”defaultValue<年代pan class="token operator">:“标题”“新笔记”“内容”""常量活跃的<年代pan class="token punctuation">,setActive<年代pan class="token punctuation">]useState0常量标题<年代pan class="token punctuation">,setTitle<年代pan class="token punctuation">]useState""常量内容<年代pan class="token punctuation">,setContent<年代pan class="token punctuation">]useState""常量检查<年代pan class="token punctuation">,setChecked<年代pan class="token punctuation">]useState常量handleSelection标题<年代pan class="token operator">:字符串<年代pan class="token punctuation">,内容<年代pan class="token operator">:字符串<年代pan class="token punctuation">,指数<年代pan class="token operator">:数量= >setTitle标题<年代pan class="token punctuation">)setContent内容<年代pan class="token punctuation">)setActive指数<年代pan class="token punctuation">)常量addNote= >笔记<年代pan class="token punctuation">.拼接00标题<年代pan class="token operator">:“新笔记”内容<年代pan class="token operator">:""handleSelection“新笔记”""0setNotes...笔记<年代pan class="token punctuation">]常量deleteNote异步指数<年代pan class="token operator">:数量= >deleteNote<年代pan class="token operator">=等待“你确定要删除这张便条吗?”标题<年代pan class="token operator">:“我的笔记”类型<年代pan class="token operator">:“警告”如果deleteNote<年代pan class="token punctuation">)笔记<年代pan class="token punctuation">.拼接指数<年代pan class="token punctuation">,1如果活跃的<年代pan class="token operator">> =指数<年代pan class="token punctuation">)setActive活跃的<年代pan class="token operator">> =1活跃的<年代pan class="token operator">-10如果笔记<年代pan class="token punctuation">.长度> =1setContent笔记<年代pan class="token punctuation">[指数<年代pan class="token operator">-1内容其他的setTitle""setContent""setNotes...笔记<年代pan class="token punctuation">]返回<div<年代pan class="token operator">><网格长米<年代pan class="token operator">=10><网格上校跨度<年代pan class="token operator">=“汽车”><Flex差距<年代pan class="token operator">=“xl”证明<年代pan class="token operator">=“flex-start”对齐<年代pan class="token operator">=“中心”包装<年代pan class="token operator">=“包装”><Flex><ThemeIcon大小<年代pan class="token operator">=“lg”变体<年代pan class="token operator">=“梯度”梯度<年代pan class="token operator">=“蓝绿色”来<年代pan class="token operator">:“石灰”度<年代pan class="token operator">:90><IconNotebook大小<年代pan class="token operator">=32/></ThemeIcon><文本颜色<年代pan class="token operator">=“绿色”fz<年代pan class="token operator">=“xl”弗兰克-威廉姆斯<年代pan class="token operator">=500毫升<年代pan class="token operator">=5>我的笔记</文本></Flex><按钮onClick<年代pan class="token operator">=addNote<年代pan class="token punctuation">}leftIcon<年代pan class="token operator">=<IconFilePlus/>>添加请注意<年代pan class="token operator"></按钮><按钮集团><按钮变体<年代pan class="token operator">=“光”leftIcon<年代pan class="token operator">=<IconFileArrowLeft/>>进口</按钮><按钮变体<年代pan class="token operator">=“光”leftIcon<年代pan class="token operator">=<IconFileArrowRight/>>出口</按钮></按钮集团></Flex><分频器我的<年代pan class="token operator">=“sm”/>笔记<年代pan class="token punctuation">.地图请注意<年代pan class="token punctuation">,指数= ><Flex关键<年代pan class="token operator">=指数<年代pan class="token punctuation">}><NavLinkonClick<年代pan class="token operator">== >handleSelection请注意<年代pan class="token punctuation">.标题请注意<年代pan class="token punctuation">.内容指数<年代pan class="token punctuation">)活跃的<年代pan class="token operator">=指数<年代pan class="token operator">===活跃的<年代pan class="token punctuation">}标签<年代pan class="token operator">=请注意<年代pan class="token punctuation">.标题/><CloseButtononClick<年代pan class="token operator">== >deleteNote指数<年代pan class="token punctuation">)标题<年代pan class="token operator">=“删除记录”大小<年代pan class="token operator">=“xl”iconSize<年代pan class="token operator">=20./></Flex></网格上校><网格上校跨度<年代pan class="token operator">=2><开关标签<年代pan class="token operator">=“切换编辑器/降价预览”检查<年代pan class="token operator">=检查<年代pan class="token punctuation">}onChange<年代pan class="token operator">=事件= >setChecked事件<年代pan class="token punctuation">.currentTarget检查/><分频器我的<年代pan class="token operator">=“sm”/>检查<年代pan class="token operator">===& &<div<年代pan class="token operator">><TextInputmb<年代pan class="token operator">=5/><文本区域minRows<年代pan class="token operator">=10/></div<年代pan class="token operator">>检查<年代pan class="token operator">& &<影子<年代pan class="token operator">=“lg”p<年代pan class="token operator">=10><文本fz<年代pan class="token operator">=“xl”弗兰克-威廉姆斯<年代pan class="token operator">=500tt<年代pan class="token operator">=“利用”>标题<年代pan class="token punctuation">}</文本><分频器我的<年代pan class="token operator">=“sm”/><减价>内容<年代pan class="token punctuation">}</减价></></网格上校></网格></div<年代pan class="token operator">>出口默认的应用程序

    这里有很多代码,所以让我们一点一点地探索它。

    导入必要的包

    一开始,我们导入所有必要的包,如下所示:

    • 减价解析器
    • Mantine组件
    • 螳螂钩
    • 图标
    • 金牛座的api
    进口useState<年代pan class="token punctuation">}“反应”进口减价“marked-react”进口ThemeIcon按钮CloseButton开关NavLinkFlex网格分频器文本TextInput文本区域“@mantine /核心”进口useLocalStorage<年代pan class="token punctuation">}“@mantine /挂钩”进口IconNotebookIconFilePlusIconFileArrowLeftIconFileArrowRight“@ table /图标”进口保存<年代pan class="token punctuation">,开放<年代pan class="token punctuation">,问<年代pan class="token punctuation">}“@tauri-apps / api /对话框”进口writeTextFile<年代pan class="token punctuation">,readTextFile<年代pan class="token punctuation">}“@tauri-apps / api / fs”进口sendNotification<年代pan class="token punctuation">}“@tauri-apps / api /通知”

    设置应用程序存储和变量

    在下一部分中,我们将使用useLocalStorage钩子来设置笔记的存储。

    我们还为当前笔记的标题和内容设置了两个变量,另外两个变量用于确定选择哪个笔记(活跃的)及是否启用减价预览(检查).

    最后,我们创建一个实用函数来处理音符的选择。当一个音符被选中时,它将相应地更新当前音符的属性:

    常量笔记<年代pan class="token punctuation">,setNotes<年代pan class="token punctuation">]useLocalStorage关键<年代pan class="token operator">:“我的笔记”defaultValue<年代pan class="token operator">:“标题”“新笔记”“内容”""常量活跃的<年代pan class="token punctuation">,setActive<年代pan class="token punctuation">]useState0常量标题<年代pan class="token punctuation">,setTitle<年代pan class="token punctuation">]useState""常量内容<年代pan class="token punctuation">,setContent<年代pan class="token punctuation">]useState""常量检查<年代pan class="token punctuation">,setChecked<年代pan class="token punctuation">]useState常量handleSelection标题<年代pan class="token operator">:字符串<年代pan class="token punctuation">,内容<年代pan class="token operator">:字符串<年代pan class="token punctuation">,指数<年代pan class="token operator">:数量= >setTitle标题<年代pan class="token punctuation">)setContent内容<年代pan class="token punctuation">)setActive指数<年代pan class="token punctuation">)

    增加添加/删除注释功能

    接下来的两个函数用于添加/删除注释。

    addNote ()控件中插入一个新的注释对象笔记数组中。它使用handleSelection ()在添加后自动选择新注释。最后更新笔记。我们在这里使用扩散运算符的原因是,否则状态将不会被更新。通过这种方式,我们强制更新状态并重新渲染组件,因此注释将正确显示:

    常量addNote= >笔记<年代pan class="token punctuation">.拼接00标题<年代pan class="token operator">:“新笔记”内容<年代pan class="token operator">:""handleSelection“新笔记”""0setNotes...笔记<年代pan class="token punctuation">]常量deleteNote异步指数<年代pan class="token operator">:数量= >deleteNote<年代pan class="token operator">=等待“你确定要删除这张便条吗?”标题<年代pan class="token operator">:“我的笔记”类型<年代pan class="token operator">:“警告”如果deleteNote<年代pan class="token punctuation">)笔记<年代pan class="token punctuation">.拼接指数<年代pan class="token punctuation">,1如果活跃的<年代pan class="token operator">> =指数<年代pan class="token punctuation">)setActive活跃的<年代pan class="token operator">> =1活跃的<年代pan class="token operator">-10如果笔记<年代pan class="token punctuation">.长度> =1setContent笔记<年代pan class="token punctuation">[指数<年代pan class="token operator">-1内容其他的setTitle""setContent""setNotes...笔记<年代pan class="token punctuation">]

    deleteNote ()使用对话框,以确认用户想要删除注释,并且没有意外单击删除按钮。如果用户确认删除(deleteNote = true),然后如果语句执行:

    • 的注释被删除笔记数组
    • 活跃的变量已更新。
    • 更新当前票据的标题和内容
    • 笔记数组已更新

    创建JSX模板

    在模板部分中,我们有两列。

    在第一列中,我们创建了应用程序的logo和名称,以及用于添加、导入和导出笔记的按钮。我们也循环笔记数组来呈现注释。这里我们使用handleSelection ()再次更新当前笔记的属性,当一个笔记标题链接被点击:

    <网格。上校跨度汽车<年代pan class="token punctuation">"><Flex差距xl<年代pan class="token punctuation">"证明flex-start<年代pan class="token punctuation">"对齐中心<年代pan class="token punctuation">"包装包装<年代pan class="token punctuation">"><Flex><ThemeIcon大小lg<年代pan class="token punctuation">"变体梯度<年代pan class="token punctuation">"梯度{{来自:“水鸭”,:“石灰”,度:90}}><IconNotebook大小{32}/>ThemeIcon><文本颜色绿色<年代pan class="token punctuation">"fzxl<年代pan class="token punctuation">"弗兰克-威廉姆斯{500}毫升{5}>我的笔记<年代pan class="token tag">文本>Flex><按钮onClick{addNote}leftIcon{< IconFilePlus/>} >添加注<年代pan class="token tag">按钮><按钮。集团><按钮变体光<年代pan class="token punctuation">"leftIcon{< IconFileArrowLeft/>} >进口<年代pan class="token tag">按钮><按钮变体光<年代pan class="token punctuation">"leftIcon{< IconFileArrowRight/>} >出口<年代pan class="token tag">按钮>按钮。集团>Flex><分频器我的sm<年代pan class="token punctuation">"/>{笔记。地图((请注意,指数)= >(<年代pan class="token tag"><Flex关键{指数}> handleSelection(注意。标题,请注意。内容,指数)}活跃的={指数===活跃的}标签={请注意.title} />  deleteNote(index)} title="Delete note" size="xl" iconSize={20} /> .<年代pan class="token tag">Flex>)}<年代pan class="token tag">网格。上校>

    在第二列中,我们添加了一个切换按钮,用于在笔记编辑和预览模式之间切换。在编辑模式下,当前笔记的标题有一个文本输入,当前笔记的内容有一个文本区域。在预览模式下,标题是由Mantine 's渲染的文本组件呈现的内容marked-react减价组件:

    <网格。上校跨度{2}><开关标签="Toggle Editor / Markdown Preview" checked={checked} onChange={(event) => setChecked(event. currenttarget .checked)}/> .check ={(event . currenttarget .checked)<年代pan class="token tag"><分频器我的sm<年代pan class="token punctuation">"/>{checked === false && (<年代pan class="token tag"><div><TextInputmb{5}/><文本区域minRows{10}/>div>)} {checked && (<年代pan class="token tag"><影子lg<年代pan class="token punctuation">"p{10}><文本fzxl<年代pan class="token punctuation">"弗兰克-威廉姆斯{500}tt利用<年代pan class="token punctuation">">{标题}<年代pan class="token tag">文本><分频器我的sm<年代pan class="token punctuation">"/><减价>{内容}<年代pan class="token tag">减价>>)}<年代pan class="token tag">网格。上校>

    唷!那是一大堆代码。下图显示了我们的应用程序在这一点上应该是什么样子。

    该应用程序已经准备好添加笔记"loading=

    太棒了!我们现在可以添加和删除笔记,但没有办法编辑它们。我们将在下一节中添加此功能。

    添加注释的标题和内容更新功能

    的后面添加以下代码deleteNote ()功能:

    常量updateNoteTitle目标<年代pan class="token operator">:价值<年代pan class="token punctuation">}目标<年代pan class="token operator">:价值<年代pan class="token operator">:字符串<年代pan class="token punctuation">}= >笔记<年代pan class="token punctuation">.拼接活跃的<年代pan class="token punctuation">,1标题<年代pan class="token operator">:价值<年代pan class="token punctuation">,内容<年代pan class="token operator">:内容<年代pan class="token punctuation">}setTitle价值<年代pan class="token punctuation">)setNotes...笔记<年代pan class="token punctuation">]常量updateNoteContent目标<年代pan class="token operator">:价值<年代pan class="token punctuation">}目标<年代pan class="token operator">:价值<年代pan class="token operator">:字符串<年代pan class="token punctuation">}= >笔记<年代pan class="token punctuation">.拼接活跃的<年代pan class="token punctuation">,1标题<年代pan class="token operator">:标题<年代pan class="token punctuation">,内容<年代pan class="token operator">:价值<年代pan class="token punctuation">}setContent价值<年代pan class="token punctuation">)setNotes...笔记<年代pan class="token punctuation">]

    这两个函数分别替换当前注释的标题和/或内容。为了使它们工作,我们需要将它们添加到模板中:

    <TextInput价值{标题}onChange{updateNoteTitle}mb{5}/><文本区域价值{内容}onChange{updateNoteContent}minRows{10}/>

    现在,当一个笔记被选中时,它的标题和内容将分别显示在输入文本和文本区域中。当我们编辑一个笔记时,它的标题将相应地更新。

    我添加了几个注释来演示应用程序的外观。所选笔记及其内容的应用程序如下图所示。

    笔记添加到我们的应用程序"loading=

    下面的图片显示了我们的笔记的预览。

    注意预览"loading=

    下一张图片显示了在删除笔记时显示的确认对话框。

    删除笔记对话框"loading=

    太棒了!最后一件让我们的应用真正酷的事情是添加功能,导出和导入用户的笔记到系统硬盘驱动器。

    添加导入和导出注释的功能

    的后面添加以下代码updateNoteContent ()功能:

    常量exportNotes异步= >常量exportedNotes<年代pan class="token operator">=JSONstringify笔记<年代pan class="token punctuation">)常量filePath<年代pan class="token operator">=等待保存过滤器<年代pan class="token operator">:的名字<年代pan class="token operator">:“JSON”扩展<年代pan class="token operator">:“json”等待writeTextFile$ {filePath<年代pan class="token interpolation-punctuation punctuation">}exportedNotes<年代pan class="token punctuation">)sendNotification您的笔记已成功保存$ {filePath<年代pan class="token interpolation-punctuation punctuation">}文件。常量importNotes异步= >常量selectedFile<年代pan class="token operator">=等待开放过滤器<年代pan class="token operator">:的名字<年代pan class="token operator">:“JSON”扩展<年代pan class="token operator">:“json”常量fileContent<年代pan class="token operator">=等待readTextFile$ {selectedFile<年代pan class="token interpolation-punctuation punctuation">}常量importedNotes<年代pan class="token operator">=JSON解析fileContent<年代pan class="token punctuation">)setNotesimportedNotes<年代pan class="token punctuation">)

    在第一个函数中,我们将笔记转换为JSON。然后我们使用保存对话框保存注释。接下来,我们使用writeTextFile ()函数将文件物理地写入磁盘。最后,我们使用sendNotification ()函数通知用户笔记已成功保存,以及它们保存的位置。

    在第二个函数中,我们使用开放对话框从磁盘中选择一个包含注释的JSON文件。方法读取文件readTextFile ()函数,将其JSON内容转换为对象,最后使用新内容更新notes存储。

    我们需要做的最后一件事是改变模板来使用上面的函数:

    <按钮变体光<年代pan class="token punctuation">"onClick{importNotes}leftIcon{< IconFileArrowLeft/>} >进口<年代pan class="token tag">按钮><按钮变体光<年代pan class="token punctuation">"onClick{exportNotes}leftIcon{< IconFileArrowRight/>} >出口<年代pan class="token tag">按钮>

    这就是最后App.tsx文件应该是这样的。

    在接下来的截图中,你可以看到<年代trong>另存为而且<年代trong>开放对话框,系统通知显示为笔记被保存。

    另存为按钮"loading=

    文件保存位置的通知"loading=

    打开文件按钮"loading=

    恭喜!您刚刚构建了一个功能齐全的笔记桌面应用程序,具有Tauri的强大功能。

    构建应用程序

    现在,如果一切正常,你对最终结果感到满意,你可以构建应用程序,并为你的操作系统获得一个安装包。执行如下命令:

    npm运行tauri构建

    结论

    在本教程中,我们探索了Tauri是什么,为什么与Electron相比,它是构建原生桌面应用程序的更好选择,以及最后如何构建一个简单但功能齐全的Tauri应用程序。

    我希望你们和我一样享受这短暂的旅程。要更深入地了解金牛座世界,请查看它的文档并不断尝试其强大的功能。

    <年代trong>相关阅读:

    Baidu