侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在go语言中使用Wails + SvelteKit构建桌面应用流程步骤

Go  /  管理员 发布于 1年前   781

Wails是一个可让您使用Go和Web技术编写桌面应用的项目。将它看作为Go的快并且轻量的Electron 替代品。 您可以使用Go的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。

官网文档:

https://wails.io/zh-Hans/docs/next/introduction/


项目搭建步骤

1.首先安装 wails 以及相关工具,这一步官网已经有详细的介绍,参考官网教程

2.安装好相关工具以后,使用 wails 初始化一个项目 

wails init -n otool -t svelte

这里指定项目名称 otool 以及项目模板使用 svelte。

命令执行完毕,就会在当前目录下创建一个名为 otool 的项目


3.接着重新初始化前端模块。

进入 otool 目录,可以发现自带的前端模块目录 frontend。

我们使用 SvelteKit 这个 web 框架,因此自带的不需要,直接删除 frontend 目录。

然后执行 

npm create svelte@latest frontend 

创建一个 SveleteKit 项目的 frontend 目录。执行该命令后,将询问你一系列问题:

首先是选择创建应用的类型,我们选择 Skeleton project 来生成一个基本的应用骨架

接着会询问你是否需要 TypeScript 类型检查等问题,我选择的是第一个:使用 JavaScript with JSDoc comments

最后选择一些附加选项,按需选择即可

4.初始化前端模块以后,还需要更改前端的配置。

首先需要修改 SvelteKit 适配器,该配置用于将 Svelte 应用程序部署到不同的服务器环境中。

默认的适配器是 adapter-auto,由于是桌面应用开发为纯静态页面,因此更改适配器为 adapter-static。

进入 frontend 目录,修改 package.json 中的 devDependencies 下的
”@sveltejs/adapter-auto” 为”@sveltejs/adapter-static”(静态站点适配器)。
修改 svelte.config.js 中的‘@sveltejs/adapter-auto’ 为‘@sveltejs/adapter-static’


5.回到 otool 目录然后执行 wails dev, 该命令会自动安装相关依赖并在开发模式下运行应用。

第一次执行会报错 

all routes must be fully prerenderable, but found the following routes that are dynamic 

在 adapter-static 模式下,需要我们告诉 SvelteKit 需要渲染哪些路由,因此会出现这个错误。

一般我们是加载所有符合路由规则的文件,所以在 frontend/src/routes 目录下创建 + layout.js 文件并写入 export const prerender = true;。

再次运行 

wails dev 

就可以看到弹出的应用窗口了,窗口中会显示 

Welcome to SvelteKit


6.调试模式下没问题后,我们执行 

wails build 

看下编译后的 app 效果。

此时会发现编译的 app 无法正常运行,因为 SvelteKit 编译后的文件是在 frontend/build 目录下,因此打开 main.go 修改嵌入的前端资源路径。

将 //go:embed all:frontend/dist 修改为 //go:embed all:frontend/build。

再次编译就可以正常打开 app 了


以上基本工作就做好了,可以开始开发我们的应用


应用布局

我们使用 bootstrap 来作为 ui 库,在 frontend 目录下运行 

npm install [email protected] 

安装 bootstrap。

为了适配 bootstrap 需要再次在 frontend/src/routes/+layout.js 文件中写入 export const ssr = false; 

通过关闭服务端渲染来避免 document is not defined 此类浏览器端 api 在服务端运行时下的错误。


然后创建布局文件 frontend/src/routes/+layout.svelte,放入如下代码:

<script>
    import 'bootstrap/dist/css/bootstrap.min.css'
    import 'bootstrap/dist/js/bootstrap.bundle.min.js'
    import Menu from './Menu.svelte'
</script>
<div class="main d-flex flex-row">
    <Menu />
    <div class="flex-fill overflow-scroll">
        <slot></slot>
    </div>
</div>
<style>
    .main {
        height: 100vh;
        width: 100vw;
        overflow-x: auto;
        overflow-y: hidden;
    }
</style>

同目录下创建 Menu.svelte,代码如下:

<script>
    let activeItem = null;
    let menus = [
        { name: "menu1", url: "/hello" },
    ];
    function setActive(index) {
        activeItem = index;
    }
</script>
<div class="flex-shrink-0 text-bg-dark p-2 overflow-scroll w-25" style="max-width: 220px;">
    <a
        href="/"
        on:click={() => setActive(-1)}
        class="d-flex justify-content-center text-white text-decoration-none"
    >
        <span class="fs-4">oapp</span>
    </a>
    <hr />
    <ul class="nav nav-pills flex-column mb-auto">
        {#each menus as item, index}
            <li class="nav-item">
                <a
                    href={item.url}
                    class="nav-link text-white d-flex justify-content-center"
                    class:active={activeItem === index}
                    on:click={() => setActive(index)}
                >
                    {item.name}
                </a>
            </li>
        {/each}
    </ul>
</div>

接着创建菜单组件中的”/hello” 对应文件,在 routes 目录下创建 hello/+page.svelte,在其中随便写点内容。

运行 

wails dev 

就可以看到一个经典侧边栏菜单布局的应用了,点击 menu1 菜单就可以跳转到相关页面


最后

在布局完成后,还需要配置一下前端允许访问的外部资源路径。

可以看到 wails 生成的 go 代码绑定 js 文件位于 src 同级的 wailsjs 目录下,

先配置这个路径,执行 

npm install @types/node

然后在 vite.config.js 中加入:

...
import path from "path";
...
export default defineConfig({
  ...
  resolve: {
    alias: {
      $wailsjs: path.resolve(__dirname, "./wailsjs"),
    },
  },
  server: {
    fs: {
      allow: ["./wailsjs"],
    },
  },
  ...
});

在前端代码中就可以像这样 

import * as app from "$wailsjs/go/backend/App"; 

引入 wailsjs 文件。


  • 上一条:
    近期有用lnmp一键安装包的注意了:关于LNMP供应链投毒事件风险提示
    下一条:
    go语言应用程序(如网络服务器)等如何在后台或作为守护进程运行?
  • 昵称:

    邮箱:

    3条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-09
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-12
    • 2021-01
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-08
    • 2024-11
    • 2025-02
    • 2025-04
    • 2025-05
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客