<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lencx</title>
    <description>The latest articles on DEV Community by lencx (@lencx).</description>
    <link>https://dev.to/lencx</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F62265%2F69c3bfb0-9e47-4982-8567-d6cd828bb5a4.png</url>
      <title>DEV Community: lencx</title>
      <link>https://dev.to/lencx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lencx"/>
    <language>en</language>
    <item>
      <title>【07】Tauri 应用篇 - 基本配置</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:42:24 +0000</pubDate>
      <link>https://dev.to/lencx/07-tauri-ying-yong-pian-ji-ben-pei-zhi-3e9n</link>
      <guid>https://dev.to/lencx/07-tauri-ying-yong-pian-ji-ben-pei-zhi-3e9n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  应用名称
&lt;/h2&gt;

&lt;p&gt;应用名称分为两种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dev&lt;/code&gt; 模式&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release&lt;/code&gt; 模式&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  dev 模式
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;编辑 &lt;code&gt;src-tauri/Cargo.toml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[package]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"app"&lt;/span&gt;
&lt;span class="py"&gt;default-run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"app"&lt;/span&gt;
&lt;span class="py"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2021"&lt;/span&gt;
&lt;span class="py"&gt;rust-version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.57"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;修改 &lt;code&gt;name&lt;/code&gt; 与 &lt;code&gt;default-run&lt;/code&gt; 两个字段，保持名称一致。名称只能使用字母数字字符或 - 或 _，并且不能为空。具体修改规则请参考 &lt;a href="https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field" rel="noopener noreferrer"&gt;Cargo.toml name&lt;/a&gt;，避免无效名称。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意：修改 dev 模式下的名称并无实际意义。最终的应用名称还是以 &lt;code&gt;tauri.conf.json&lt;/code&gt; 中的名称为准。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177039873-4e9b6803-3812-49f7-9e65-3cc0ef535367.png" class="article-body-image-wrapper"&gt;&lt;img alt="007-dev-name" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177039873-4e9b6803-3812-49f7-9e65-3cc0ef535367.png" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  release 模式
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;编辑 &lt;code&gt;src-tauri/tauri.conf.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"productName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tauri-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;productName&lt;/code&gt; 支持中英文数字以及 - 和 _ 等。不支持特殊字符及表情等。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177040575-dc243ecd-0454-4814-ada2-756f5aa2d34c.png" class="article-body-image-wrapper"&gt;&lt;img alt="007-release-app" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177040575-dc243ecd-0454-4814-ada2-756f5aa2d34c.png" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  应用版本号
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;编辑 &lt;code&gt;src-tauri/tauri.conf.json&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;version&lt;/code&gt; 是 &lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;semver 版本号&lt;/a&gt;或包含 version 字段的 package.json 文件的路径。&lt;/p&gt;

&lt;h3&gt;
  
  
  semver 版本号
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"productName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tauri-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  文件路径
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"productName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tauri-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../package.json"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;版本格式：&lt;code&gt;主版本号.次版本号.修订号&lt;/code&gt;，版本号递增规则如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;主版本号：当你做了不兼容的 API 修改&lt;/li&gt;
&lt;li&gt;次版本号：当你做了向下兼容的功能性新增&lt;/li&gt;
&lt;li&gt;修订号：当你做了向下兼容的问题修正&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面，作为延伸（如 &lt;code&gt;1.0.0-alpha&lt;/code&gt;、&lt;code&gt;1.0.0-beta+exp.sha.5114f85&lt;/code&gt; 等）。&lt;/p&gt;

&lt;h2&gt;
  
  
  应用图标
&lt;/h2&gt;

&lt;p&gt;Tauri 默认使用其 logo 作为应用程序图标，这可能不是你想要的。为了实现自定义图标，Tauri 提供了一个 &lt;a href="https://github.com/tauri-apps/tauricon" rel="noopener noreferrer"&gt;tauricon&lt;/a&gt; 的命令。该命令可以输入图片路径（默认情况下为 &lt;code&gt;./app-icon.png&lt;/code&gt;，尺寸为 &lt;code&gt;1240 x 1240&lt;/code&gt; 的 PNG 或正方形的 SVG）来创建各种平台所需的所有图标，推荐使用 SVG 格式。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @tauri-apps/tauricon &lt;span class="nt"&gt;--help&lt;/span&gt;

  Description
    Create all the icons you need &lt;span class="k"&gt;for &lt;/span&gt;your Tauri app.

    &lt;span class="s2"&gt;"ICON-PATH"&lt;/span&gt; is the path to the &lt;span class="nb"&gt;source &lt;/span&gt;icon &lt;span class="o"&gt;(&lt;/span&gt;default: &lt;span class="s1"&gt;'app-icon.png'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
    The icon needs to be either png &lt;span class="o"&gt;(&lt;/span&gt;1240x1240 with transparency&lt;span class="o"&gt;)&lt;/span&gt; or svg &lt;span class="o"&gt;(&lt;/span&gt;square dimensions with transparency&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

  Usage
    &lt;span class="nv"&gt;$ &lt;/span&gt;tauricon &lt;span class="o"&gt;[&lt;/span&gt;ICON-PATH]

  Options
    &lt;span class="nt"&gt;--help&lt;/span&gt;, &lt;span class="nt"&gt;-h&lt;/span&gt;          Displays this message
    &lt;span class="nt"&gt;--log&lt;/span&gt;, l            Logging &lt;span class="o"&gt;[&lt;/span&gt;boolean]
    &lt;span class="nt"&gt;--target&lt;/span&gt;, t         Target folder &lt;span class="o"&gt;(&lt;/span&gt;default: &lt;span class="s1"&gt;'src-tauri/icons'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;生成好的图标默认放在 &lt;code&gt;src-tauri/icons&lt;/code&gt; 目录下，在构建时包含在应用程序中。&lt;br&gt;
如果需要从其他位置获取图标，则可以编辑 &lt;code&gt;src-tauri/tauri.conf.json&lt;/code&gt; 的以下部分：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"icon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"icons/32x32.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"icons/128x128.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"icons/128x128@2x.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"icons/icon.icns"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"icons/icon.ico"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;图标文件类型说明：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;icons.icns&lt;/code&gt; = macOS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;icons.ico&lt;/code&gt; = MS Windows&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*.png&lt;/code&gt; = Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177047807-32945b62-aae6-4583-afdb-4f32a576578d.png" class="article-body-image-wrapper"&gt;&lt;img alt="007-app-icon" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F177047807-32945b62-aae6-4583-afdb-4f32a576578d.png" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【06】Tauri 应用篇 - tauri.conf.json 配置</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:41:24 +0000</pubDate>
      <link>https://dev.to/lencx/06-tauri-ying-yong-pian-tauriconfjson-pei-zhi-58je</link>
      <guid>https://dev.to/lencx/06-tauri-ying-yong-pian-tauriconfjson-pei-zhi-58je</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;code&gt;tauri.conf.json&lt;/code&gt; 是由 &lt;a href="https://tauri.app/v1/api/cli#init" rel="noopener noreferrer"&gt;&lt;code&gt;tauri init&lt;/code&gt;&lt;/a&gt; 命令生成的文件，该文件位于 Tauri 应用程序源目录 &lt;code&gt;src-tauri&lt;/code&gt; 中。可以通过修改它来自定义 Tauri 应用程序。此文仅列举部分常用字段，更多请查看 &lt;a href="https://tauri.app/v1/api/config/" rel="noopener noreferrer"&gt;Tauri Configuration&lt;/a&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  特定平台
&lt;/h2&gt;

&lt;p&gt;除了 &lt;code&gt;tauri.conf.json&lt;/code&gt; 外，Tauri 还可以从 &lt;code&gt;tauri.linux.conf.json&lt;/code&gt;、&lt;code&gt;tauri.windows.conf.json&lt;/code&gt;、&lt;code&gt;tauri.macos.conf.json&lt;/code&gt; 中读取特定于平台的配置，并将其与 &lt;code&gt;tauri.conf.json&lt;/code&gt; 主配置合并。&lt;/p&gt;

&lt;h2&gt;
  
  
  配置结构
&lt;/h2&gt;

&lt;p&gt;示例配置：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"beforeBuildCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"beforeDevCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"devPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"distDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../dist"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"productName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tauri-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allowlist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"security"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"csp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"updater"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"windows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fullscreen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"resizable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tauri App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tauri.conf.json&lt;/code&gt; 由以下部分组成：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/api/config#packageconfig" rel="noopener noreferrer"&gt;package&lt;/a&gt;：Package 设置&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/api/config#tauriconfig" rel="noopener noreferrer"&gt;tauri&lt;/a&gt;：Tauri 配置&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/api/config#buildconfig" rel="noopener noreferrer"&gt;build&lt;/a&gt;：构建配置&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/api/config#pluginconfig" rel="noopener noreferrer"&gt;plugins&lt;/a&gt;：插件配置&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  package
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;productName&lt;/td&gt;
&lt;td&gt;string?&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;APP 名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;version&lt;/td&gt;
&lt;td&gt;string?&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;版本号，它是 &lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;semver 版本号&lt;/a&gt;或包含 &lt;code&gt;version&lt;/code&gt; 字段的 &lt;code&gt;package.json&lt;/code&gt; 文件的路径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  tauri
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pattern&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PatternKind&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;要使用的模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;windows&lt;/td&gt;
&lt;td&gt;[&lt;strong&gt;WindowConfig&lt;/strong&gt;]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;窗口配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cli&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://tauri.app/v1/api/config/#cliconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;CliConfig&lt;/strong&gt;&lt;/a&gt;?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;命令行界面配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tauri.app/v1/api/config/#bundleconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;BundleConfig&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;捆绑器配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allowlist&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tauri.app/v1/api/config/#allowlistconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;AllowlistConfig&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;白名单配置，如系统文件，路径，剪贴板，脚本，进程等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;security&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tauri.app/v1/api/config/#securityconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;SecurityConfig&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;安全配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updater&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tauri.app/v1/api/config/#updaterconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;UpdaterConfig&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;更新应用配置，如签名公钥，更新应用的窗口配置等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;systemTray&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://tauri.app/v1/api/config/#systemtrayconfig" rel="noopener noreferrer"&gt;&lt;strong&gt;SystemTrayConfig&lt;/strong&gt;&lt;/a&gt;?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;应用系统托盘的配置，如图标配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOSPrivateApi&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;MacOS 私有 API 配置。启用透明后台 API 并将首选项 &lt;code&gt;fullScreenEnabled&lt;/code&gt; 设置为 &lt;code&gt;true&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  PatternKind
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tauri&lt;/code&gt; -&amp;gt; &lt;code&gt;pattern&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;应用程序模式，可以是以下任何一种类型：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/guides/architecture/inter-process-communication/brownfield" rel="noopener noreferrer"&gt;brownfield&lt;/a&gt; - 棕地模式，这是使用 Tauri 最简单直接的模式，因为它试图尽可能与现有的前端项目兼容。简而言之，它试图除了现有Web前端可能在浏览器中使用的内容之外，不需要任何其他内容。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.app/v1/guides/architecture/inter-process-communication/isolation" rel="noopener noreferrer"&gt;isolation&lt;/a&gt; - 隔离模式是一种在前端发送到 Tauri Core 之前拦截和修改 Tauri API 消息的方法，所有这些都是使用 JavaScript 进行的。由隔离模式注入的安全 JavaScript 代码称为隔离应用程序。出于安全目的，建议使用此模式。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"brownfield"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"isolation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"dir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"../dist-isolation"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  WindowConfig
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tauri&lt;/code&gt; -&amp;gt; &lt;code&gt;windows[]&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;label&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口标识符，它必须是字母数字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;url&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WindowUrl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;窗口 Web 视图 URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fileDropEnabled&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;是否在 Web 视图上启用文件拖拽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;center&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;窗口是否以居中方式启动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口左上角的水平位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口左上角的垂直位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;width&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口宽度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;height&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口高度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;minWidth&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口最小宽度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;minHeight&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口最小高度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;maxWidth&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口最大宽度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;maxHeight&lt;/td&gt;
&lt;td&gt;number?(format: double)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口最大高度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resizable&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;窗口是否可调整大小&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;窗口标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fullscreen&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;窗口是否以全屏方式启动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;focus&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;窗口是否聚焦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;transparent&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;窗口是否透明，注意：mac 需要启用 &lt;code&gt;macOSPrivateApi&lt;/code&gt;（警告：使用私有 API 会阻止应用程序被接受）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;maximized&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;窗口是否最大化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;visible&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;窗口是否可见&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decorations&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;窗口是否具有边框和标题栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alwaysOnTop&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;窗口是否应始终位于其他窗口上层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipTaskbar&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;是否将窗口图标添加到任务栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;theme&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Theme&lt;/strong&gt;?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;初始窗口主题，默认为系统主题。仅在 Windows 和 macOS 10.14+ 上实现&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  WindowUrl
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tauri&lt;/code&gt; -&amp;gt; &lt;code&gt;windows[]&lt;/code&gt; -&amp;gt; &lt;code&gt;url&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;要在Tauri Web 视图窗口中打开的 URL，可以是以下任何一种类型：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;格式 uri&lt;/code&gt; - 外部 URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;应用程序 URL 的路径部分&lt;/code&gt; - 例如：&lt;code&gt;tauri://localhost/users/lencx&lt;/code&gt; 的部分路径 &lt;code&gt;users/lencx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Theme
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tauri&lt;/code&gt; -&amp;gt; &lt;code&gt;windows[]&lt;/code&gt; -&amp;gt; &lt;code&gt;theme&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;系统主题，可以是以下任一值：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Light&lt;/li&gt;
&lt;li&gt;Dark&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【05】Tauri 入门篇 - 跨平台编译</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:39:35 +0000</pubDate>
      <link>https://dev.to/lencx/05-tauri-ru-men-pian-kua-ping-tai-bian-yi-1h4d</link>
      <guid>https://dev.to/lencx/05-tauri-ru-men-pian-kua-ping-tai-bian-yi-1h4d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  背景
&lt;/h2&gt;

&lt;p&gt;Tauri 严重依赖原生库和工具链，因此目前无法在某一平台实现交叉编译。最佳选择是使用托管在 &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;、&lt;a href="https://azure.microsoft.com/en-gb/services/devops/pipelines/" rel="noopener noreferrer"&gt;Azure Pipelines&lt;/a&gt;、&lt;a href="https://docs.gitlab.com/ee/ci/index.html" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; 或其他选项上的 CI/CD 管道进行编译。管道可以同时为每个平台运行编译，使编译和发布过程更加容易。&lt;/p&gt;

&lt;p&gt;为了便于设置，官方目前提供 &lt;a href="https://github.com/tauri-apps/tauri-action" rel="noopener noreferrer"&gt;Tauri Action&lt;/a&gt;。这是一个 &lt;code&gt;GitHub Action&lt;/code&gt;，可在所有支持的平台上运行，编译软件，生成应用程序安装包，并将发布到 &lt;a href="https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Action
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;从构思到生产，自动化工作流程&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;利用 GitHub Actions，在你的仓库中自动化、定制和执行你的软件开发工作流程。你可以发现、创建和共享操作，以执行你想要的任何工作，包括 CI/CD，并在一个完全定制的工作流程中组合操作。&lt;/p&gt;

&lt;h2&gt;
  
  
  使用 Action
&lt;/h2&gt;

&lt;h3&gt;
  
  
  创建 release.yml
&lt;/h3&gt;

&lt;p&gt;在项目根路径下创建 &lt;code&gt;.github/workflows&lt;/code&gt; 目录，在 &lt;code&gt;.github/workflows&lt;/code&gt; 下创建 &lt;code&gt;release.yml&lt;/code&gt;（文件名自定义） 文件。将以下内容复制到文件中：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 可选，将显示在 GitHub 存储库的“操作”选项卡中的工作流名称&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release CI&lt;/span&gt;

&lt;span class="c1"&gt;# 指定此工作流的触发器&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# 匹配特定标签 (refs/tags)&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*'&lt;/span&gt; &lt;span class="c1"&gt;# 推送事件匹配 v*, 例如 v1.0，v20.15.10 等来触发工作流&lt;/span&gt;

&lt;span class="c1"&gt;# 需要运行的作业组合&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# 任务：创建 release 版本&lt;/span&gt;
  &lt;span class="na"&gt;create-release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;RELEASE_UPLOAD_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.create_release.outputs.id }}&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="c1"&gt;# 查询版本号（tag）&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Query version number&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get_version&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "using version tag ${GITHUB_REF:10}"&lt;/span&gt;
          &lt;span class="s"&gt;echo ::set-output name=version::"${GITHUB_REF:10}"&lt;/span&gt;

      &lt;span class="c1"&gt;# 根据查询到的版本号创建 release&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create Release&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create_release&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/create-release@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;tag_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;steps.get_version.outputs.VERSION&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}'&lt;/span&gt;
          &lt;span class="na"&gt;release_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;steps.get_version.outputs.VERSION&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}'&lt;/span&gt;
          &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;See&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;assets&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;download&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;install.'&lt;/span&gt;

  &lt;span class="c1"&gt;# 编译 Tauri&lt;/span&gt;
  &lt;span class="na"&gt;build-tauri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-release&lt;/span&gt;
    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;fail-fast&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;macos-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows-latest&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.platform }}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

     &lt;span class="c1"&gt;# 安装 Node.js&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup node&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;

      &lt;span class="c1"&gt;# 安装 Rust&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Rust stable&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions-rs/toolchain@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;toolchain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stable&lt;/span&gt;

      &lt;span class="c1"&gt;# 使用 Rust 缓存，加快安装速度&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Swatinem/rust-cache@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install dependencies (ubuntu only)&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;matrix.platform == 'ubuntu-latest'&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;sudo apt-get update&lt;/span&gt;
          &lt;span class="s"&gt;sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf&lt;/span&gt;

      &lt;span class="c1"&gt;# 可选，如果需要将 Rust 编译为 wasm，则安装 wasm-pack&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jetli/wasm-pack-action@v0.3.0&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Optional version of wasm-pack to install(eg. 'v0.9.1', 'latest')&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.9.1&lt;/span&gt;

      &lt;span class="c1"&gt;# 可选，如果需要使用 rsw 构建 wasm，则安装 rsw&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install rsw&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cargo install rsw&lt;/span&gt;

      &lt;span class="c1"&gt;# 获取 yarn 缓存路径&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get yarn cache directory path&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn-cache-dir-path&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "::set-output name=dir::$(yarn config get cacheFolder)"&lt;/span&gt;

      &lt;span class="c1"&gt;# 使用 yarn 缓存&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Yarn cache&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v2&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn-cache&lt;/span&gt; &lt;span class="c1"&gt;# use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.yarn-cache-dir-path.outputs.dir }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}&lt;/span&gt;
          &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-yarn-&lt;/span&gt;

      &lt;span class="c1"&gt;# 安装依赖执行构建，以及推送 github release&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install app dependencies and build it&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn &amp;amp;&amp;amp; yarn build&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tauri-apps/tauri-action@v0&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;releaseId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ needs.create-release.outputs.RELEASE_UPLOAD_ID }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;具体可以参考 &lt;a href="https://github.com/lencx/OhMyBox/blob/main/.github/workflows/release.yml" rel="noopener noreferrer"&gt;OhMyBox/.github/workflows/release.yml&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  触发 Action
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;GitHub Tag&lt;/code&gt; 来触发 Action&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 创建 tag&lt;/span&gt;
git tag v0.1.0

&lt;span class="c"&gt;# 推送 tag&lt;/span&gt;
git push &lt;span class="nt"&gt;--tag&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw11ekghch4orc9641vrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw11ekghch4orc9641vrm.png" alt="005-action-release" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwc9jsl9lpm5opw7zx594.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwc9jsl9lpm5opw7zx594.png" alt="005-release" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  常见问题
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Error: Resource not accessible by integration
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;release.yml&lt;/code&gt; 中的 GitHub 环境令牌​ &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 由 GitHub 为每个运行的工作流自动颁发，无需进一步配置，这意味着没有秘密泄露的风险。但是，此令牌在默认情况下仅具有读取权限，在运行工作流时可能会收到 &lt;code&gt;Resource not accessible by integration&lt;/code&gt;（资源无法通过集成访问）错误。如果发生这种情况，需要为此令牌添加写入权限。为此，请前往 GitHub 仓库 &lt;code&gt;Settings&lt;/code&gt;，然后选择 &lt;code&gt;Actions&lt;/code&gt;，向下滚动到 &lt;code&gt;Workflow permissions&lt;/code&gt;（工作流权限）并选中 &lt;code&gt;Read and write permissions&lt;/code&gt;（读取和写入权限）。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Settings -&amp;gt; Actions -&amp;gt; General -&amp;gt; Workflow permissions -&amp;gt; Read and write permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Action 意外终止
&lt;/h4&gt;

&lt;p&gt;如果 Action 因某些原因（如缓存错误，依赖下载失败等）终止工作流，不需要重新创建 &lt;code&gt;tag&lt;/code&gt; 来触发工作流，可以通过 &lt;code&gt;Re-run all jobs&lt;/code&gt; 按钮来重新触发。&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【04】Tauri 入门篇 - 集成 WebAssembly</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:37:20 +0000</pubDate>
      <link>https://dev.to/lencx/04-tauri-ru-men-pian-ji-cheng-webassembly-1m97</link>
      <guid>https://dev.to/lencx/04-tauri-ru-men-pian-ji-cheng-webassembly-1m97</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  安装依赖
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/rwasm/vite-plugin-rsw" rel="noopener noreferrer"&gt;vite-plugin-rsw&lt;/a&gt; - 基于 vite 实现的 webAssembly 插件，支持热更新，友好的报错提示&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; vite-plugin-rsw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/rwasm/rsw-rs" rel="noopener noreferrer"&gt;rsw-rs&lt;/a&gt; - 一个 CLI 工具，用于增强 &lt;a href="https://github.com/rustwasm/wasm-pack" rel="noopener noreferrer"&gt;wasm-pack&lt;/a&gt; 的功能，如支持 watch 模式，多 crate 同时 build，watch，自动执行 &lt;code&gt;npm link&lt;/code&gt; 等&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;rsw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  使用说明
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 编辑 vite.config.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ViteRsw&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite-plugin-rsw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ✅ 新增&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;ViteRsw&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// ✅ 新增&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 编辑 package.json
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rsw build &amp;amp;&amp;amp; tsc &amp;amp;&amp;amp; vite build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"preview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite preview"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tauri"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rsw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rsw"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 运行 rsw
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1). 初始化 rsw 配置
&lt;/h4&gt;

&lt;p&gt;生成 &lt;code&gt;rsw.toml&lt;/code&gt;，了解更多 &lt;a href="https://github.com/rwasm/rsw-rs#rswtoml" rel="noopener noreferrer"&gt;rsw.toml 配置信息&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn rsw init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F175357566-2e0a9d06-d66f-4f5a-abf7-2a0ced072c45.png" class="article-body-image-wrapper"&gt;&lt;img alt="rsw-init" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F175357566-2e0a9d06-d66f-4f5a-abf7-2a0ced072c45.png" width="664" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2). 新建 wasm 项目
&lt;/h4&gt;

&lt;p&gt;内置三种模式，可以通过编辑 &lt;code&gt;rsw.toml&lt;/code&gt; &amp;gt; &lt;code&gt;[new]&lt;/code&gt; &amp;gt; &lt;code&gt;using&lt;/code&gt; 来切换&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn rsw new @mywasm/foo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F175358509-66e811f5-8c6e-4b77-94b6-3d1f46f6bce9.png" class="article-body-image-wrapper"&gt;&lt;img alt="rsw-new" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F16164244%2F175358509-66e811f5-8c6e-4b77-94b6-3d1f46f6bce9.png" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在 &lt;code&gt;rsw.toml&lt;/code&gt; &amp;gt; &lt;code&gt;[[crates]]&lt;/code&gt; 中新增 &lt;code&gt;@mywasm/foo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;#! link 类型: `npm` | `yarn` | `pnpm`, 默认是 `npm`&lt;/span&gt;
&lt;span class="py"&gt;cli&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npm"&lt;/span&gt;

&lt;span class="nn"&gt;[new]&lt;/span&gt;
&lt;span class="c"&gt;#! 使用: `wasm-pack` | `rsw` | `user`, 默认 `wasm-pack`&lt;/span&gt;
&lt;span class="c"&gt;#! 1. wasm-pack: `rsw new &amp;lt;name&amp;gt; --template &amp;lt;template&amp;gt; --mode &amp;lt;normal|noinstall|force&amp;gt;`&lt;/span&gt;
&lt;span class="c"&gt;#! 2. rsw: `rsw new &amp;lt;name&amp;gt;`, 内置模板&lt;/span&gt;
&lt;span class="c"&gt;#! 3. user: `rsw new &amp;lt;name&amp;gt;`，如果 `dir`未配置, 则使用 `wasm-pack new &amp;lt;name&amp;gt;`初始化 wasm 项目&lt;/span&gt;
&lt;span class="py"&gt;using&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"rsw"&lt;/span&gt;
&lt;span class="c"&gt;#! 当 `using = "user"` 时，`dir` 才会生效&lt;/span&gt;
&lt;span class="c"&gt;#! 如果 `using = "wasm-pack"` 或 `using = "rsw"`，则忽略&lt;/span&gt;
&lt;span class="c"&gt;#! 复制此目录下的所有文件到初始化的 wasm 项目中&lt;/span&gt;
&lt;span class="py"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my-template"&lt;/span&gt;

&lt;span class="nn"&gt;[[crates]]&lt;/span&gt;
&lt;span class="c"&gt;#! npm 包，@mywasm 为 npm 组织，foo 是该组织下的包名&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"@mywasm/foo"&lt;/span&gt;
&lt;span class="c"&gt;#! 是否执行 link， link 类型通过 `cli` 配置&lt;/span&gt;
&lt;span class="py"&gt;link&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[[crates]]&lt;/span&gt;
&lt;span class="c"&gt;#! npm 包，@mywasm 为 npm 组织，bar 是该组织下的包名&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"@mywasm/bar"&lt;/span&gt;
&lt;span class="c"&gt;#! 是否执行 link， link 类型通过 `cli` 配置&lt;/span&gt;
&lt;span class="py"&gt;link&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  开发模式
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;监听 rust 文件变更，自动执行构建，并通知到浏览器（热更新）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;执行以下命令，不要退出：&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn rsw watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新开一个命令行窗口，执行 a 或 b：&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# a. 在浏览器环境&lt;/span&gt;
yarn dev

&lt;span class="c"&gt;# b. 在 tauri 环境&lt;/span&gt;
yarn tauri dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmleplxnwn4sxtnfmoh70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmleplxnwn4sxtnfmoh70.png" alt="004-rsw-watch" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  使用
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;在项目中使用 wasm&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// App.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mywasm/foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ✅  初始化，加载 wasm 文件&lt;/span&gt;
    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ✅ 调用 greet 方法，必须保证 init 方法执行完成之后，才可以调用，否则会报错 */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;click me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  构建
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;编译生产环境下的 wasm 文件（代码优化）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;构建 wasm&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn rsw build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建项目&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foue51nb32gqnsvtaiuy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foue51nb32gqnsvtaiuy7.png" alt="004-rsw-build" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  项目结构
&lt;/h2&gt;

&lt;p&gt;rsw 对项目结构并无特别要求，但是为了保持统一及维护性，推荐以下结构。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@mywasm&lt;/code&gt;: wasm 包的组织名称（推荐使用，但非必需），rust 编译为 wasm，会以 npm 包的形式提供给前端使用。使用组织的好处就是方便管理，防止包名冲突&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.rsw&lt;/code&gt; - rsw 运行时生成的临时文件夹&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rsw.toml&lt;/code&gt; - rsw 配置文件 &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.watchignore&lt;/code&gt; - rsw watch 监听文件变更时需要忽略的文件，忽略规则与 &lt;a href="https://git-scm.com/docs/gitignore" rel="noopener noreferrer"&gt;.gitignore&lt;/a&gt; 类似
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;tauri-app] &lt;span class="c"&gt;# 项目名称&lt;/span&gt;
│ &lt;span class="c"&gt;# 新增结构&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;@mywasm] &lt;span class="c"&gt;# ✅ 组织名称（npm org）&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;foo] &lt;span class="c"&gt;# ✅ @mywasm/foo - wasm 包名&lt;/span&gt;
│    └─ &lt;span class="o"&gt;[&lt;/span&gt;bar] &lt;span class="c"&gt;# ✅ @mywasm/bar - wasm 包名&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;.rsw] &lt;span class="c"&gt;# ✅ rsw 临时文件夹&lt;/span&gt;
├─ rsw.toml &lt;span class="c"&gt;# ✅ rsw 配置文件&lt;/span&gt;
├─ .watchignore &lt;span class="c"&gt;# ✅ rsw watch 忽略文件&lt;/span&gt;
│┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
│ &lt;span class="c"&gt;# 原结构&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;node_modules] &lt;span class="c"&gt;# 前端依赖&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;src] &lt;span class="c"&gt;# 前端程序源&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;src-tauri] &lt;span class="c"&gt;# Tauri 程序源&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;icons] &lt;span class="c"&gt;# 应用程序图标&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;src] &lt;span class="c"&gt;# Tauri App 程序源，例如系统菜单，托盘，插件配置等&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;target] &lt;span class="c"&gt;# 构建的产物会被放入此文件夹中，target 目录的结构取决于是否使用 --target 标志为特定的平台构建&lt;/span&gt;
│    ├─ build.rs &lt;span class="c"&gt;# Tauri 构建应用&lt;/span&gt;
│    ├─ Cargo.lock &lt;span class="c"&gt;# 包含了依赖的精确描述信息，类似于 yarn.lock 或 package-lock.json&lt;/span&gt;
│    ├─ Cargo.toml &lt;span class="c"&gt;# Tauri (Rust) 项目清单&lt;/span&gt;
│    └─ tauri.conf.json &lt;span class="c"&gt;# 自定义 Tauri 应用程序的配置文件，例如应用程序窗口尺寸，应用名称，权限等&lt;/span&gt;
├─ index.html &lt;span class="c"&gt;# 项目主界面&lt;/span&gt;
├─ package.json &lt;span class="c"&gt;# 前端项目清单&lt;/span&gt;
├─ tsconfig.json &lt;span class="c"&gt;# typescript 配置文件&lt;/span&gt;
├─ vite.config.ts &lt;span class="c"&gt;# vite 配置文件&lt;/span&gt;
├─ yarn.lock &lt;span class="c"&gt;# 前端依赖的精确描述信息&lt;/span&gt;
└─ ... &lt;span class="c"&gt;# 其他&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【03】Tauri 入门篇 - 创建项目</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:33:45 +0000</pubDate>
      <link>https://dev.to/lencx/03-tauri-ru-men-pian-chuang-jian-xiang-mu-2710</link>
      <guid>https://dev.to/lencx/03-tauri-ru-men-pian-chuang-jian-xiang-mu-2710</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;本教程以 macOS 为例，其他平台类似，想了解更多请查看官方文档&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  初始化
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 使用 yarn&lt;/span&gt;
yarn create tauri-app

&lt;span class="c"&gt;# 或使用 npx&lt;/span&gt;
npx create-tauri-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;此项目以 &lt;code&gt;vite&lt;/code&gt; + &lt;code&gt;react-ts&lt;/code&gt; 为例（使用 &lt;code&gt;vite&lt;/code&gt; 是为了配合 &lt;a href="https://github.com/rwasm/vite-plugin-rsw" rel="noopener noreferrer"&gt;vite-plugin-rsw&lt;/a&gt; 插件，可以无缝集成 webAssembly）。如需在老项目中添加 tauri 支持，请参考文档 &lt;a href="https://tauri.studio/v1/guides/getting-started/beginning-tutorial/#1-add-tauri-to-existing-project" rel="noopener noreferrer"&gt;Add Tauri to Existing Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri6y2kko13px7fdiwxwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri6y2kko13px7fdiwxwd.png" alt="tauri-create-app" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  项目结构
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;tauri-app] &lt;span class="c"&gt;# 项目名称&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;node_modules] &lt;span class="c"&gt;# 前端依赖&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;src] &lt;span class="c"&gt;# 前端程序源&lt;/span&gt;
├─ &lt;span class="o"&gt;[&lt;/span&gt;src-tauri] &lt;span class="c"&gt;# Tauri 程序源&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;icons] &lt;span class="c"&gt;# 应用程序图标&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;src] &lt;span class="c"&gt;# Tauri App 程序源，例如系统菜单，托盘，插件配置等&lt;/span&gt;
│    ├─ &lt;span class="o"&gt;[&lt;/span&gt;target] &lt;span class="c"&gt;# 构建的产物会被放入此文件夹中，target 目录的结构取决于是否使用 --target 标志为特定的平台构建&lt;/span&gt;
│    ├─ build.rs &lt;span class="c"&gt;# Tauri 构建应用&lt;/span&gt;
│    ├─ Cargo.lock &lt;span class="c"&gt;# 包含了依赖的精确描述信息，类似于 yarn.lock 或 package-lock.json&lt;/span&gt;
│    ├─ Cargo.toml &lt;span class="c"&gt;# Tauri (Rust) 项目清单&lt;/span&gt;
│    └─ tauri.conf.json &lt;span class="c"&gt;# 自定义 Tauri 应用程序的配置文件，例如应用程序窗口尺寸，应用名称，权限等&lt;/span&gt;
├─ index.html &lt;span class="c"&gt;# 项目主界面&lt;/span&gt;
├─ package.json &lt;span class="c"&gt;# 前端项目清单&lt;/span&gt;
├─ tsconfig.json &lt;span class="c"&gt;# typescript 配置文件&lt;/span&gt;
├─ vite.config.ts &lt;span class="c"&gt;# vite 配置文件&lt;/span&gt;
├─ yarn.lock &lt;span class="c"&gt;# 前端依赖的精确描述信息&lt;/span&gt;
└─ ... &lt;span class="c"&gt;# 其他&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  启动项目
&lt;/h2&gt;

&lt;p&gt;有两种启动方式：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 启动 web 项目
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;纯前端项目，不和操作系统产生任何交互&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 启动 tauri 项目
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;需要和操作系统产生交互，如系统文件读写操作&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第一次启动项目时，tauri 会根据&lt;code&gt;src-tauri/Cargo.toml&lt;/code&gt; 去下载相关依赖（导致第一次启动比较慢），第二次启动会快很多。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn tauri dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e09otl5tawgld2c3d9f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e09otl5tawgld2c3d9f.png" alt="tauri-run" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  构建应用
&lt;/h2&gt;

&lt;p&gt;Tauri Bundler 是一个 Rust 工具，用于编译二进制文件、打包资产并准备最终捆绑包。 它会检测你当前的操作系统并相应地构建一个包。目前支持：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tauri.studio/v1/guides/building/windows" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;: .msi&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.studio/v1/guides/building/macos" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;: .app, .dmg&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tauri.studio/v1/guides/building/windows" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;: .deb, .appimage
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn tauri build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果未修改 &lt;code&gt;src-tauri/tauri.conf.json&lt;/code&gt; 中的 &lt;code&gt;identifier&lt;/code&gt; 直接 build 会报以下错误。想要正确构建，只需修改为自己特有的标识符即可，如 &lt;code&gt;com.myapp.dev&lt;/code&gt;。构建完成后，在 &lt;code&gt;src-tauri/target/release/bundle/{platform}/{app}&lt;/code&gt; 下就可以找到应用程序安装包。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foneeupg562y6gulxkdyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foneeupg562y6gulxkdyp.png" alt="003-tauri-build-error" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpy5bytcm2knd0pmlj4i5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpy5bytcm2knd0pmlj4i5.png" alt="003-tauri-build-app" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;了解更多不同平台打包注意事项：&lt;a href="https://tauri.studio/v1/guides/building/" rel="noopener noreferrer"&gt;Tauri Building&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  检查信息
&lt;/h2&gt;

&lt;p&gt;检查 Tauri 信息以确保一切设置正确，在对问题进行分类时，此信息可能很有用。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn tauri info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sd4xlbg6kk5v95qsrv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sd4xlbg6kk5v95qsrv8.png" alt="tauri-check-info" width="800" height="976"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【02】Tauri 入门篇 - 开发环境</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:31:00 +0000</pubDate>
      <link>https://dev.to/lencx/02-tauri-ru-men-pian-kai-fa-huan-jing-gfc</link>
      <guid>https://dev.to/lencx/02-tauri-ru-men-pian-kai-fa-huan-jing-gfc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;注意：仅在开发 Tauri 应用程序时才需要此设置。最终使用应用程序的用户不需要执行任何操作。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第一步是安装 &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; 和系统依赖项。以 Windows 和 macOS 为例，如果想了解更多平台开发环境，请查看 &lt;a href="https://tauri.studio/v1/guides/getting-started/prerequisites" rel="noopener noreferrer"&gt;Tauri 官网指南&lt;/a&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Microsoft Visual Studio C++ Build Tools
&lt;/h3&gt;

&lt;p&gt;安装 &lt;a href="https://visualstudio.microsoft.com/visual-cpp-build-tools/" rel="noopener noreferrer"&gt;Build Tools for Visual Studio 2022&lt;/a&gt; ，确保已勾选 &lt;code&gt;C++ 构建工具&lt;/code&gt; 和 &lt;code&gt;Windows 10 SDK&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnjdrz1efbjvvnxi71df.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnjdrz1efbjvvnxi71df.png" alt="Build Tools for Visual Studio 2022" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. WebView2
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;注意：Windows 11 中已内置 WebView2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tauri 严重依赖 WebView2 在 Windows 上呈现 Web 内容，因此必须安装 WebView2。最简单的方法是从 &lt;a href="https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section" rel="noopener noreferrer"&gt;Microsoft Edge Developer&lt;/a&gt; 下载并运行 Evergreen Bootstrapper。 引导程序将尝试为你的系统确定正确的程序包及版本。注意：如果遇到问题（尤其是 ARM 上的 Windows），可以手动选择正确的安装程序。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnahtgq1nzuzzf80aw7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnahtgq1nzuzzf80aw7d.png" alt="Evergreen Bootstrapper" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Rust
&lt;/h3&gt;

&lt;p&gt;前往 &lt;a href="https://www.rust-lang.org/tools/install" rel="noopener noreferrer"&gt;rust-lang.org/tools/install&lt;/a&gt; 安装 &lt;code&gt;rustup&lt;/code&gt;（Rust 安装程序）&lt;/p&gt;

&lt;h2&gt;
  
  
  macOS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. CLang 和 macOS 开发依赖项
&lt;/h3&gt;

&lt;p&gt;在终端（Terminal）执行以下命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcode-select &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Rust
&lt;/h3&gt;

&lt;p&gt;在终端（Terminal）执行以下命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上面的命令会下载脚本并开始安装 rustup 工具，该工具会安装最新的稳定版 Rust。系统可能会提示输入密码。如果安装成功，将出现以下内容：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Rust is installed now. Great!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  更新及卸载
&lt;/h2&gt;

&lt;p&gt;Tauri 及其组件可以通过编辑 &lt;code&gt;Cargo.toml&lt;/code&gt; 文件或运行 &lt;a href="https://github.com/killercup/cargo-edit" rel="noopener noreferrer"&gt;cargo-edit&lt;/a&gt; 工具提供的 &lt;a href="https://github.com/killercup/cargo-edit#cargo-upgrade" rel="noopener noreferrer"&gt;cargo upgrade&lt;/a&gt; 命令来手动更新：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;通过 &lt;code&gt;rustup&lt;/code&gt; 来更新 Rust 版本，在终端执行以下命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustup update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;通过 &lt;code&gt;rustup&lt;/code&gt; 来完全卸载机器上的 Rust：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustup self uninstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  故障排除
&lt;/h2&gt;

&lt;p&gt;检查安装的 Rust 版本是否正确，输入以下命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustc &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;会看到以下信息（已发布的最新稳定版的版本号、提交哈希和提交日期）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# rustc x.y.z (abcabcabc yyyy-mm-dd)&lt;/span&gt;
rustc 1.59.0 &lt;span class="o"&gt;(&lt;/span&gt;9d1b2106e 2022-02-23&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果未看到此信息，则 Rust 已损坏。可以通过 &lt;a href="https://doc.rust-lang.org/book/ch01-01-installation.html#troubleshooting" rel="noopener noreferrer"&gt;Rust 的疑难解答&lt;/a&gt;部分以了解如何解决此问题。如果问题仍然存在，也可以从官方 &lt;a href="https://discord.com/invite/tauri" rel="noopener noreferrer"&gt;Tauri Discord&lt;/a&gt; 和 &lt;a href="https://github.com/tauri-apps/tauri/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; 中获得帮助。&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>【01】Tauri 入门篇 - 是什么</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 01 Aug 2022 09:27:03 +0000</pubDate>
      <link>https://dev.to/lencx/01-tauri-ru-men-pian-shi-shi-yao-3dc2</link>
      <guid>https://dev.to/lencx/01-tauri-ru-men-pian-shi-shi-yao-3dc2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;仓库：&lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;lencx/OhMyBox&lt;/a&gt;&lt;br&gt;
如果文章对你有所帮助，可以 &lt;a href="https://github.com/lencx/OhMyBox" rel="noopener noreferrer"&gt;star&lt;/a&gt; 此项目，或转发给更多有需要的人。大家的支持也会给我更大的写作动力，感恩。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://tauri.studio" rel="noopener noreferrer"&gt;Tauri&lt;/a&gt; 使用 Web 前端构建更小、更快、更安全的桌面应用程序。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tauri 是什么？
&lt;/h2&gt;

&lt;p&gt;Tauri 是一个工具包，可以帮助开发者为主要桌面平台制作应用程序（如 mac，windows，linux 等）。几乎支持现有的任何前端框架（如 react, vue, vite 等），其核心是使用 Rust 编写的。Rust 负责系统通信，应用构建，上层应用开发只需要专注于 webview 中的网页编写（可以使用自己喜欢的任何前端语言）。&lt;/p&gt;

&lt;h3&gt;
  
  
  安全第一
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tauri 允许您选择要发布的 API 端点，是否希望在你的应用程序中内置一个本地主机（localhost）服务器，甚至可以在运行时随机化功能句柄&lt;/li&gt;
&lt;li&gt;默认情况下 Tauri 只提供二进制文件，而非 &lt;a href="https://github.com/electron/asar" rel="noopener noreferrer"&gt;Asar&lt;/a&gt; 文件&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Asar
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;提高在 Windows 等平台上读取文件的性能，而不是通过复制其所有源文件来发布您的应用程序。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Asar 用于将 Electron 应用程序文件连接到一个大文件。为了缓解 Windows 上长路径名问题，稍微加快 require 并隐藏源代码不被粗略检查（Cursory Inspection），可以选择将应用程序打包成 asar 归档文件，而对源代码几乎没有改动。&lt;/p&gt;

&lt;h3&gt;
  
  
  多语言支持
&lt;/h3&gt;

&lt;p&gt;目前，Tauri 使用 Rust 作为后端 —— 但在不远的将来，其他后端如 Go、Nim、Python、Csharp 等也将成为可能。目前官方维护的是 Rust 与 webview 组织的绑定，因为 API 可以用任何带有 C 语言互操作的语言来实现，所以选择自己喜欢的语言作为后端只是一个 PR 的问题。&lt;/p&gt;

&lt;h3&gt;
  
  
  开放源代码
&lt;/h3&gt;

&lt;p&gt;如果没有一个社区，这一切都没有任何意义。今天的软件社区是令人惊奇的地方，人们在那里互相帮助，创造出令人敬畏的东西。&lt;/p&gt;

&lt;h3&gt;
  
  
  Tauri vs Electron
&lt;/h3&gt;

&lt;p&gt;Electron 的一个主要好处是可以针对单个浏览器和运行时版本进行开发，而不必处理所有小而耗时的兼容性问题。Tauri 相比于 Electron 放弃了一些兼容性，换来了内存以及应用体积的更小化，在安全方面也做了一些事情。从 Tauri 的架构图来看它实现的是 Webview2 和系统之间的一个胶水层，目前后端是 Rust 实现，将来也可以替换成别的语言。前端现在就可以使用自己喜欢的框架来编写（vue，react 等）。而且从 &lt;a href="https://github.com/tauri-apps/tauri#platforms" rel="noopener noreferrer"&gt;README platforms&lt;/a&gt; 可以看到，Tauri 始于桌面，但并不止步于此。后期可以跨平台到 iOS/iPadOS，Android 等。称其为下一代跨端框架似乎也不过分。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgdf9tdgnm5mr361g1yy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgdf9tdgnm5mr361g1yy.png" alt="Comparison between Tauri and Electron" width="800" height="1011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tauri 架构
&lt;/h2&gt;

&lt;p&gt;Tauri 是一个多语言通用工具包，其超强的组合性允许工程师制作各种应用程序。它使用 Rust 工具和 Webview 中呈现的 HTML 的组合来构建桌面应用程序。后端使用 Rust 和系统进行交互（如系统信息，系统通知，系统文件等），包装成 Tauri 插件后会暴露出 JS API 供前端使用，通过 Webview 进行消息传递来控制系统。所以不支持的功能，开发人员可以通过编写 Rust 来扩展默认 API。&lt;/p&gt;

&lt;p&gt;Tauri 应用程序可以有&lt;a href="https://tauri.studio/v1/guides/features/menu" rel="noopener noreferrer"&gt;自定义菜单&lt;/a&gt;和&lt;a href="https://tauri.studio/v1/guides/features/system-tray" rel="noopener noreferrer"&gt;托盘类型的界面&lt;/a&gt;。它们可以按预期由用户的操作系统进行&lt;a href="https://tauri.studio/v1/guides/distribution/updater" rel="noopener noreferrer"&gt;更新和管理&lt;/a&gt;。它们&lt;a href="https://tauri.studio/about/benchmarks" rel="noopener noreferrer"&gt;非常小&lt;/a&gt;，因为它们使用操作系统的 webview。它们不提供运行时，因为最终的二进制文件是从 Rust 编译的。这使得 &lt;a href="https://tauri.studio/about/security" rel="noopener noreferrer"&gt;Tauri 应用程序的逆向不是一项简单的任务&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpmoaq9ounei81ge4w5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpmoaq9ounei81ge4w5l.png" alt="tauri-arch" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;核心（Core）&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri" rel="noopener noreferrer"&gt;tauri&lt;/a&gt; - 主条板箱（major  crate）把所有东西（运行时、宏、实用程序和 API ）都集中在一起构成最终产品。在编译时读取 &lt;a href="https://tauri.studio/v1/api/config" rel="noopener noreferrer"&gt;tauri.conf.json&lt;/a&gt; 文件，以引入功能并进行应用程序的实际配置（包括项目中的 Cargo.toml 文件）。在运行时处理脚本注入（用于 polyfills/原型修改），托管系统交互的 API 及管理更新。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-runtime" rel="noopener noreferrer"&gt;tauri-runtime&lt;/a&gt; - Tauri 本身和较低级别的 webview 库之间的粘合层。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-macros" rel="noopener noreferrer"&gt;tauri-macros&lt;/a&gt; - 通过利用 &lt;code&gt;tauri-codegen&lt;/code&gt; crate 为上下文、处理程序和命令创建宏。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-utils" rel="noopener noreferrer"&gt;tauri-utils&lt;/a&gt; - 在许多地方重用的通用代码，并提供有用的实用程序，例如解析配置文件、检测平台三元组（CPU 系列/型号的名称、供应商和操作系统名称）、注入 CSP 和管理资产。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-build" rel="noopener noreferrer"&gt;tauri-build&lt;/a&gt; - 在构建时应用宏，为 &lt;code&gt;cargo&lt;/code&gt; 装配所需的一些特殊功能。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-codegen" rel="noopener noreferrer"&gt;tauri-codegen&lt;/a&gt; - 嵌入、散列和压缩资产，包括应用程序和系统托盘的图标。在编译时解析 &lt;code&gt;tauri.conf.json&lt;/code&gt; 并生成配置结构。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tauri/tree/dev/core/tauri-runtime-wry" rel="noopener noreferrer"&gt;tauri-runtime-wry&lt;/a&gt; - 专门为 WRY 开辟了直接的系统级交互，如打印、显示器检测和其他与窗口相关的任务。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;上游条板箱（Upstream Crates）&lt;/strong&gt; - Tauri-Apps 组织维护 Tauri 的两个“上游”板条箱，即用于创建和管理应用程序窗口的 TAO，以及用于与窗口内的 Webview 交互的 WRY。

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/tao" rel="noopener noreferrer"&gt;TAO&lt;/a&gt; - Rust 中的跨平台应用程序窗口创建库，支持 Windows、macOS、Linux、iOS 和 Android 等所有主要平台。它是用 Rust 编写的，是一个 &lt;a href="https://github.com/rust-windowing/winit" rel="noopener noreferrer"&gt;winit&lt;/a&gt; 的分支，根据需要进行了扩展，例如菜单栏和系统托盘。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tauri-apps/wry" rel="noopener noreferrer"&gt;WRY&lt;/a&gt; - WRY 是 Rust 中的跨平台 WebView 渲染库，支持 Windows、macOS 和 Linux 等所有主要桌面平台。 Tauri 使用 WRY 作为抽象层，负责确定使用哪个 webview（以及如何进行交互）。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tauri 不是什么?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tauri 不是一个轻量级的内核包装器。相反，它直接使用 &lt;code&gt;WRY&lt;/code&gt; 和 &lt;code&gt;TAO&lt;/code&gt; 来完成对操作系统进行系统调用的繁重工作。&lt;/li&gt;
&lt;li&gt;Tauri 不是虚拟机或虚拟化环境。相反，它是一个允许制作 Webview OS 应用程序的应用程序工具包。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  相关阅读
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tauri.studio/" rel="noopener noreferrer"&gt;Tauri Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=26194990" rel="noopener noreferrer"&gt;Tauri: An Electron alternative written in Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/electron/electron/blob/9f12edac65/docs/tutorial/application-distribution.md#with-an-app-source-code-archive" rel="noopener noreferrer"&gt;With an app source code archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.osdev.org/Target_Triplet" rel="noopener noreferrer"&gt;Target Triplet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tauri</category>
      <category>rust</category>
      <category>web</category>
      <category>desktop</category>
    </item>
    <item>
      <title>Rust + Vite = 🚀</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Mon, 28 Feb 2022 06:32:10 +0000</pubDate>
      <link>https://dev.to/lencx/rust-vite--3d9p</link>
      <guid>https://dev.to/lencx/rust-vite--3d9p</guid>
      <description>&lt;p&gt;🥳 vite-plugin-rsw released v2.0 version!&lt;/p&gt;

&lt;p&gt;Completely refactored the vite-plugin-rsw plug-in, and now open two processes without affecting each other. One process is responsible for watching the rust code build into wasm, and the other process is to start the front-end service.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reop：&lt;a href="https://github.com/lencx/vite-plugin-rsw" rel="noopener noreferrer"&gt;https://github.com/lencx/vite-plugin-rsw&lt;/a&gt; - 🦀 wasm-pack plugin for Vite&lt;/li&gt;
&lt;li&gt;rsw cli：&lt;a href="https://github.com/lencx/rsw-rs" rel="noopener noreferrer"&gt;https://github.com/lencx/rsw-rs&lt;/a&gt; - 🦞 wasm-pack based build tool&lt;/li&gt;
&lt;li&gt;wasm demo：&lt;a href="https://github.com/lencx/learn-wasm" rel="noopener noreferrer"&gt;https://github.com/lencx/learn-wasm&lt;/a&gt; - 🎲 Learning WebAssembly&lt;/li&gt;
&lt;li&gt;wasm scaffold：&lt;a href="https://github.com/lencx/create-mpl" rel="noopener noreferrer"&gt;https://github.com/lencx/create-mpl&lt;/a&gt; - ⚡️ Create a project in seconds!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>vite</category>
    </item>
    <item>
      <title>rsw - wasm-pack based build tool</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Thu, 10 Feb 2022 04:37:49 +0000</pubDate>
      <link>https://dev.to/lencx/rsw-wasm-pack-based-build-tool-ffo</link>
      <guid>https://dev.to/lencx/rsw-wasm-pack-based-build-tool-ffo</guid>
      <description>&lt;h3&gt;
  
  
  Feature
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;rsw init&lt;/li&gt;
&lt;li&gt;rsw watch&lt;/li&gt;
&lt;li&gt;rsw build&lt;/li&gt;
&lt;li&gt;rsw new

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wasm-pack&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rsw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;debug info&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  TODO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;local sub-dependency file changes trigger hot updates&lt;/li&gt;
&lt;li&gt;integrate front-end scaffolding, such as &lt;code&gt;vite&lt;/code&gt;, &lt;code&gt;webpack&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;rsw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# help&lt;/span&gt;
rsw &lt;span class="nt"&gt;-h&lt;/span&gt;

&lt;span class="c"&gt;# dev&lt;/span&gt;
rsw watch

&lt;span class="c"&gt;# release&lt;/span&gt;
rsw build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgtmko04qv8b4ghb3d44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgtmko04qv8b4ghb3d44.png" alt="rsw help" width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Logger
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# @see: https://github.com/env-logger-rs/env_logger&lt;/span&gt;
&lt;span class="c"&gt;# RUST_LOG=rsw=&amp;lt;info|trace|debug|error|warn&amp;gt; rsw &amp;lt;watch|build|new&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# 1. info&lt;/span&gt;
&lt;span class="nv"&gt;RUST_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;rsw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info rsw &amp;lt;SUBCOMMAND&amp;gt;

&lt;span class="c"&gt;# 2. all: info, trace, debug, error, warn&lt;/span&gt;
&lt;span class="nv"&gt;RUST_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rsw rsw &amp;lt;SUBCOMMAND&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  rsw.toml
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;configuration file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://toml.io/en/" rel="noopener noreferrer"&gt;TOML Doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rustwasm.github.io/docs/wasm-pack/commands/build.html" rel="noopener noreferrer"&gt;&lt;code&gt;wasm-pack build&lt;/code&gt; Doc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Options
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;rsw.toml&lt;/code&gt; in the project root path, configure the &lt;code&gt;rust crate&lt;/code&gt; parameter, and run the &lt;code&gt;rsw watch&lt;/code&gt; or &lt;code&gt;rsw build&lt;/code&gt; command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt; - Profile name (optional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;version&lt;/code&gt;&lt;/strong&gt; - Profile version (optional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;interval&lt;/code&gt;&lt;/strong&gt; - Development mode &lt;code&gt;rsw watch&lt;/code&gt;, time interval for file changes to trigger &lt;code&gt;wasm-pack build&lt;/code&gt;, default &lt;code&gt;50&lt;/code&gt; milliseconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;[new]&lt;/code&gt;&lt;/strong&gt; - Quickly generate a crate with &lt;code&gt;wasm-pack new&lt;/code&gt;, or set a custom template in &lt;code&gt;rsw.toml -&amp;gt; [new] -&amp;gt; using&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;using&lt;/code&gt;&lt;/strong&gt; - &lt;code&gt;wasm-pack&lt;/code&gt; | &lt;code&gt;rsw&lt;/code&gt; | &lt;code&gt;user&lt;/code&gt;, default is &lt;code&gt;wasm-pack&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wasm-pack&lt;/code&gt; - &lt;code&gt;rsw new &amp;lt;name&amp;gt; --template &amp;lt;template&amp;gt; --mode &amp;lt;normal|noinstall|force&amp;gt;&lt;/code&gt; &lt;a href="https://rustwasm.github.io/docs/wasm-pack/commands/new.html" rel="noopener noreferrer"&gt;wasm-pack new doc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rsw&lt;/code&gt; - &lt;code&gt;rsw new &amp;lt;name&amp;gt;&lt;/code&gt;, built-in templates&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user&lt;/code&gt; - &lt;code&gt;rsw new &amp;lt;name&amp;gt;&lt;/code&gt;, if &lt;code&gt;dir&lt;/code&gt; is not configured, use &lt;code&gt;wasm-pack new &amp;lt;name&amp;gt;&lt;/code&gt; to initialize the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;dir&lt;/code&gt;&lt;/strong&gt; - Copy all files in this directory. This field needs to be configured when &lt;code&gt;using = "user"&lt;/code&gt;. &lt;code&gt;using = "wasm-pack"&lt;/code&gt; or &lt;code&gt;using = "rsw"&lt;/code&gt;, this field will be ignored&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;code&gt;[[crates]]&lt;/code&gt;&lt;/strong&gt; - Is an array that supports multiple &lt;code&gt;rust crate&lt;/code&gt; configurations

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt; - npm package name, supporting organization, e.g. &lt;code&gt;@rsw/foo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;root&lt;/code&gt;&lt;/strong&gt; - Relative to the project root path, default is &lt;code&gt;.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;target&lt;/code&gt;&lt;/strong&gt; - &lt;code&gt;bundler&lt;/code&gt; | &lt;code&gt;nodejs&lt;/code&gt; | &lt;code&gt;web&lt;/code&gt; | &lt;code&gt;no-modules&lt;/code&gt;, default is &lt;code&gt;web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;out-dir&lt;/code&gt;&lt;/strong&gt; - npm package output path, default &lt;code&gt;pkg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;[crates.watch]&lt;/code&gt;&lt;/strong&gt; - Development mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;run&lt;/code&gt;&lt;/strong&gt; - Whether this &lt;code&gt;crate&lt;/code&gt; needs to be watching, default is &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;profile&lt;/code&gt;&lt;/strong&gt; - &lt;code&gt;dev&lt;/code&gt; | &lt;code&gt;profiling&lt;/code&gt;, default is &lt;code&gt;dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;[crates.build]&lt;/code&gt;&lt;/strong&gt; - Production mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;run&lt;/code&gt;&lt;/strong&gt; - Whether this &lt;code&gt;crate&lt;/code&gt; needs to be build, default is &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;profile&lt;/code&gt;&lt;/strong&gt; - &lt;code&gt;release&lt;/code&gt; | &lt;code&gt;profiling&lt;/code&gt;, default is &lt;code&gt;release&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note: &lt;code&gt;name&lt;/code&gt; in &lt;code&gt;[[crates]]&lt;/code&gt; is required, other fields are optional.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# rsw.toml&lt;/span&gt;

&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"rsw"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="c"&gt;#! default is `50` ms&lt;/span&gt;
&lt;span class="py"&gt;interval&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;

&lt;span class="c"&gt;#! ---------------------------&lt;/span&gt;

&lt;span class="c"&gt;#! rsw new &amp;lt;name&amp;gt;&lt;/span&gt;
&lt;span class="nn"&gt;[new]&lt;/span&gt;
&lt;span class="c"&gt;#! @see https://rustwasm.github.io/docs/wasm-pack/commands/new.html&lt;/span&gt;
&lt;span class="c"&gt;#! using: `wasm-pack` | `rsw` | `user`, default is `wasm-pack`&lt;/span&gt;
&lt;span class="c"&gt;#! 1. wasm-pack: `rsw new &amp;lt;name&amp;gt; --template &amp;lt;template&amp;gt; --mode &amp;lt;normal|noinstall|force&amp;gt;`&lt;/span&gt;
&lt;span class="c"&gt;#! 2. rsw: `rsw new &amp;lt;name&amp;gt;`, built-in templates&lt;/span&gt;
&lt;span class="c"&gt;#! 3. user: `rsw new &amp;lt;name&amp;gt;`, if `dir` is not configured, use `wasm-pack new &amp;lt;name&amp;gt;` to initialize the project&lt;/span&gt;
&lt;span class="py"&gt;using&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"wasm-pack"&lt;/span&gt;
&lt;span class="c"&gt;#! this field needs to be configured when `using = "user"`&lt;/span&gt;
&lt;span class="c"&gt;#! `using = "wasm-pack"` or `using = "rsw"`, this field will be ignored&lt;/span&gt;
&lt;span class="c"&gt;#! copy all files in this directory&lt;/span&gt;
&lt;span class="py"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my-template"&lt;/span&gt;

&lt;span class="c"&gt;#! ################# NPM Package #################&lt;/span&gt;

&lt;span class="c"&gt;#! When there is only `name`, other fields will use the default configuration&lt;/span&gt;
&lt;span class="c"&gt;#! -------- package: rsw-hello --------&lt;/span&gt;
&lt;span class="nn"&gt;[[crates]]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"rsw-hello"&lt;/span&gt;

&lt;span class="c"&gt;#! =======================================================&lt;/span&gt;

&lt;span class="c"&gt;#! -------- package: @rsw/hello --------&lt;/span&gt;
&lt;span class="c"&gt;# [[crates]]&lt;/span&gt;
&lt;span class="c"&gt;# #! npm package name&lt;/span&gt;
&lt;span class="c"&gt;# name = "@rsw/hello"&lt;/span&gt;
&lt;span class="c"&gt;# #! default is `.`&lt;/span&gt;
&lt;span class="c"&gt;# root = "."&lt;/span&gt;
&lt;span class="c"&gt;# #! default is `pkg`&lt;/span&gt;
&lt;span class="c"&gt;# out-dir = "pkg"&lt;/span&gt;
&lt;span class="c"&gt;# #! target: bundler | nodejs | web | no-modules, default is `web`&lt;/span&gt;
&lt;span class="c"&gt;# target = "web"&lt;/span&gt;
&lt;span class="c"&gt;# #! rsw watch&lt;/span&gt;
&lt;span class="c"&gt;# [crates.watch]&lt;/span&gt;
&lt;span class="c"&gt;# #! default is `true`&lt;/span&gt;
&lt;span class="c"&gt;# run = false&lt;/span&gt;
&lt;span class="c"&gt;# #! profile: `dev` | `profiling`, default is `dev`&lt;/span&gt;
&lt;span class="c"&gt;# profile = "dev"&lt;/span&gt;
&lt;span class="c"&gt;# #! rsw build&lt;/span&gt;
&lt;span class="c"&gt;# [crates.build]&lt;/span&gt;
&lt;span class="c"&gt;# run = false&lt;/span&gt;
&lt;span class="c"&gt;# #! profile: `release` | `profiling`, default is `release`&lt;/span&gt;
&lt;span class="c"&gt;# profile = "release"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webassembly</category>
      <category>rust</category>
      <category>command</category>
    </item>
    <item>
      <title>How to implement the scroll progress bar</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Wed, 22 Sep 2021 07:11:49 +0000</pubDate>
      <link>https://dev.to/lencx/how-to-implement-the-scroll-progress-bar-54k7</link>
      <guid>https://dev.to/lencx/how-to-implement-the-scroll-progress-bar-54k7</guid>
      <description>&lt;p&gt;&lt;a href="https://code.lencx.tech/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; - Code Snippets&lt;/p&gt;

&lt;p&gt;Creates a progress bar indicating the scroll percentage of the page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;position: fixed&lt;/code&gt; and a large &lt;code&gt;z-index&lt;/code&gt; value to place the element at the top of the page and above any content.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;EventTarget.addEventListener()&lt;/code&gt; along with &lt;code&gt;Element.scrollTop&lt;/code&gt; to determine the scroll percentage of the document and apply it to the width of the element.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💠 Core
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"scroll_progress_bar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#scroll_progress_bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#7983ff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scrollProgress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll_progress_bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;scrollProgress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✍️ Implement - Vue3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ScrollProgress.vue --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onUnmounted&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#3eaf7c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;placement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bottom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[ScrollProgress(placement)] The value must match one of these strings: 'top' | 'bottom'`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;zIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sr"&gt;/^-&lt;/span&gt;&lt;span class="se"&gt;?[\d]&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;targetNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[ScrollProgress(root)] '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' is invalid`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;childList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subtree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MutationObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;mutationsList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MutationRecord&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Use traditional 'for loops' for IE 11&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mutation&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;mutationsList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attributes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;appHeight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollHeight&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scrollProgress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;appHeight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientHeight&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt;
  &lt;span class="nx"&gt;scrollProgress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;onUnmounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;zIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placement&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;placement&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bottom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nf"&gt;defineExpose&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"scroll_progress"&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"el"&lt;/span&gt; &lt;span class="na"&gt;:style=&lt;/span&gt;&lt;span class="s"&gt;"style"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;#scroll_progress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;ease-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎥 Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgljoy98pjdb285q0ij5c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgljoy98pjdb285q0ij5c.gif" alt="scroll_progress_bar" width="375" height="668"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event" rel="noopener noreferrer"&gt;[MDN] Document: scroll event&lt;/a&gt; - The scroll event fires when the document view has been scrolled.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver" rel="noopener noreferrer"&gt;[MDN] MutationObserver&lt;/a&gt; - The &lt;code&gt;MutationObserver&lt;/code&gt; interface provides the ability to watch for changes being made to the &lt;code&gt;DOM tree&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://v3.vuejs.org/" rel="noopener noreferrer"&gt;Vue3 API&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/api/options-data.html#props" rel="noopener noreferrer"&gt;props&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/api/sfc-script-setup.html#basic-syntax" rel="noopener noreferrer"&gt;&amp;lt;script setup&amp;gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/api/composition-api.html#lifecycle-hooks" rel="noopener noreferrer"&gt;Lifecycle Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/api/sfc-script-setup.html#defineprops-and-defineemits" rel="noopener noreferrer"&gt;defineProps and defineEmits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3.vuejs.org/api/sfc-script-setup.html#defineexpose" rel="noopener noreferrer"&gt;defineExpose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>css</category>
      <category>animation</category>
      <category>vue3</category>
      <category>scrollprogressbar</category>
    </item>
    <item>
      <title>Top Coding Resources and Tools for Beginners (+ Beyond) in 2021</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Wed, 21 Jul 2021 09:16:35 +0000</pubDate>
      <link>https://dev.to/lencx/top-coding-resources-and-tools-for-beginners-beyond-in-2021-2kh9</link>
      <guid>https://dev.to/lencx/top-coding-resources-and-tools-for-beginners-beyond-in-2021-2kh9</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/8" rel="noopener noreferrer"&gt;Web Development Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/27" rel="noopener noreferrer"&gt;Terminal Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/23" rel="noopener noreferrer"&gt;macOS Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/22" rel="noopener noreferrer"&gt;WebAssembly Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/6" rel="noopener noreferrer"&gt;WebGL Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/33" rel="noopener noreferrer"&gt;JavaScript Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/5" rel="noopener noreferrer"&gt;CSS Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lencx/z/discussions/11" rel="noopener noreferrer"&gt;React State Management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/lencx/z/discussions" rel="noopener noreferrer"&gt;More ...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web</category>
      <category>macos</category>
      <category>webassembly</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Show GitHub Discussions on your GitHub profile/project readme</title>
      <dc:creator>lencx</dc:creator>
      <pubDate>Fri, 02 Jul 2021 05:19:14 +0000</pubDate>
      <link>https://dev.to/lencx/show-github-discussions-on-your-github-profile-project-readme-5gac</link>
      <guid>https://dev.to/lencx/show-github-discussions-on-your-github-profile-project-readme-5gac</guid>
      <description>&lt;p&gt;Show your latest blog posts from GitHub Discussions on your GitHub profile/project readme automatically using the RSS feed&lt;/p&gt;

&lt;p&gt;GitHub Discussions RSS：&lt;a href="https://github.com/lencx/rgd" rel="noopener noreferrer"&gt;https://github.com/lencx/rgd&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Run workflow automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Generate RSS:&lt;br&gt;
&lt;a href="https://github.com/lencx/z/blob/main/.github/workflows/deploy.yml#L21" rel="noopener noreferrer"&gt;https://github.com/lencx/z/blob/main/.github/workflows/deploy.yml#L21&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# step1&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; rgd

&lt;span class="c"&gt;# step2&lt;/span&gt;
rgd &lt;span class="nt"&gt;--owner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lencx &lt;span class="nt"&gt;--repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;z &lt;span class="nt"&gt;--limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="nt"&gt;--outdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dist &lt;span class="nt"&gt;--token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ secrets.GH_TOKEN &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--site-title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;浮之静 &lt;span class="nt"&gt;--site-link&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://z.nofwl.com &lt;span class="nt"&gt;--site-desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"浮之静 技术社区"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blog Post Workflow:&lt;br&gt;
&lt;a href="https://github.com/lencx/lencx/blob/main/.github/workflows/blog-post-workflow.yml" rel="noopener noreferrer"&gt;https://github.com/lencx/lencx/blob/main/.github/workflows/blog-post-workflow.yml&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/lencx/lencx" rel="noopener noreferrer"&gt;https://github.com/lencx/lencx&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
