wails官方文档

安装

go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 检查wails是否正确安装
wails doctor

创建项目

wails init -n myproject -t <前端框架模板(react | vue | svelte | preact | lit | vanilla)>


开发

wails dev

编译

wails build

angular

虽然 Wails 没有 Angular 模板,但可以将 Angular 与 Wails 一起使用。

  "frontend:build": "npx ng build",
  "frontend:install": "npm install",
  "frontend:dev:watcher": "npx ng serve",
  "frontend:dev:serverUrl": "http://localhost:4200",

如何在别的 go 文件里定义 go 方法并给前端使用

1. 创建 include/xxx.go

2. 复制 App.go 的内容到新建的 go 文件,在 App.go 和 xxx.go 里添加用于设置上下文的 SetContext 方法

package include

import (
    "context"
    "fmt"
)

// App struct
type Calculator struct {
    ctx context.Context
}

// NewApp creates a new App application struct
func NewCalculator() *Calculator {
    return &Calculator{}
}

// startup is called when the app starts. The context is saved
// so we can call the runtime methods
func (c *Calculator) startup(ctx context.Context) {
    c.ctx = ctx
}

// 用于wails.Run时给结构体设置上下文
func (c *Calculator) SetContext(ctx context.Context) {
    c.ctx = ctx
}

3. 在 xxx.go 里添加要被前端使用的方法

package include

import (
    "context"
    "fmt"
)

// ...

// 让前端调用的方法
// 计算a+b
func (c *Calculator) Add(a int, b int) string {
    return fmt.Sprintf("a + b = %v", (a + b))
}

4. 修改 main.go

package main

import (
    "embed"
    "context"
    // rp是go.mod里定义的模块名
    // include是Calculator结构体所在的包
    "rp/include"
    "github.com/wailsapp/wails/v2"
    "github.com/wailsapp/wails/v2/pkg/options"
    "github.com/wailsapp/wails/v2/pkg/options/assetserver"
)

//go:embed all:frontend/dist
var assets embed.FS

func main() {
    // Create an instance of the app structure
    app := NewApp()
    cal := include.NewCalculator()

    // Create application with options
    err := wails.Run(&options.App{
        Title:  "rp",
        Width:  1024,
        Height: 768,
        AssetServer: &assetserver.Options{
            Assets: assets,
        },
        BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
        // OnStartup:        app.startup,
        // 新的startup方法,我们将上下文注入到结构体
        OnStartup: func(ctx context.Context) {
            app.SetContext(ctx)
            cal.SetContext(ctx)
        },
        // 绑定结构体实例
        Bind: []interface{}{
            app,
            cal,
        },
    })

    if err != nil {
        println("Error:", err.Error())
    }
}

5. 在 frontend 的 wailsjs/go 下新建/include/xxx.js 和/include/xxx.d.ts

// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT

export function Add(arg1, arg2) {
  // 可以看出这里是go[包名][结构体名][方法名](参数)
  return window["go"]["include"]["Calculator"]["Add"](arg1, arg2);
}

// 这个不用写,我们给go结构体添加SetContext方法后运行
// wails自动添加上
export function SetContext(arg1) {
  return window["go"]["include"]["Calculator"]["SetContext"](arg1);
}
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import { context } from "../models";

// 在这里指定参数的类型和返回的类型
export function Add(arg1: number, arg2: number): Promise<string>;

// 这个不用写,我们给go结构体添加SetContext方法后运行
// wails自动添加上
export function SetContext(arg1: context.Context): Promise<void>;

6. 在前端使用

import { useState } from 'react';
import logo from './assets/images/logo-universal.png';
import './App.css';

// 导入go方法
import { Greet } from "../wailsjs/go/main/App";
import { Add } from "../wailsjs/go/include/calculator";

function App() {
    // ...

    function greet() {
        // 使用了App.Greet方法
        Greet(name).then(updateResultText);
        // 使用了Calulator.Add方法
        Add(2, 3).then(
            // 方法返回了字符串
            res => {
                // 操作
                console.log(res);
            }
        )
    }

    return (
        // ...
    )
}

export default App

7. 运行

wails dev

右键打开控制台,可以看到输出


通过 wails 提供的服务器获取前端 assets 里的资源

在 assets 里创建 fuck.json

获取

wails dev

fuck.json: http://127.0.0.1:5173/src/assets/fuck.json

菜单,没搞懂

wailsjs/go/runtime.js

wailsjs 下的文件每次都会自动生成

/*
 _       __      _ __
| |     / /___ _(_) /____
| | /| / / __ `/ / / ___/
| |/ |/ / /_/ / / (__  )
|__/|__/\__,_/_/_/____/
The electron alternative for Go
(c) Lea Anthony 2019-present
*/

// 打印日志
export function LogPrint(message) {
  window.runtime.LogPrint(message);
}

export function LogTrace(message) {
  window.runtime.LogTrace(message);
}

export function LogDebug(message) {
  window.runtime.LogDebug(message);
}

export function LogInfo(message) {
  window.runtime.LogInfo(message);
}

export function LogWarning(message) {
  window.runtime.LogWarning(message);
}

export function LogError(message) {
  window.runtime.LogError(message);
}

export function LogFatal(message) {
  window.runtime.LogFatal(message);
}

// 此方法为给定的事件名称设置一个侦听器,但最多只能触发 counter 次。 它返回 一个函数来取消侦听器。
export function EventsOnMultiple(eventName, callback, maxCallbacks) {
  return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks);
}

export function EventsOn(eventName, callback) {
  return EventsOnMultiple(eventName, callback, -1);
}

export function EventsOff(eventName, ...additionalEventNames) {
  return window.runtime.EventsOff(eventName, ...additionalEventNames);
}

export function EventsOnce(eventName, callback) {
  return EventsOnMultiple(eventName, callback, 1);
}

// 触发事件
export function EventsEmit(eventName) {
  let args = [eventName].slice.call(arguments);
  return window.runtime.EventsEmit.apply(null, args);
}

// 执行“重新加载”(重新加载当前页面)。
export function WindowReload() {
  window.runtime.WindowReload();
}

// 重新加载应用程序前端
export function WindowReloadApp() {
  window.runtime.WindowReloadApp();
}

// 设置窗口置顶
export function WindowSetAlwaysOnTop(b) {
  window.runtime.WindowSetAlwaysOnTop(b);
}

// 窗口设置系统主题相关,仅限 Windows。-start
export function WindowSetSystemDefaultTheme() {
  window.runtime.WindowSetSystemDefaultTheme();
}

export function WindowSetLightTheme() {
  window.runtime.WindowSetLightTheme();
}

export function WindowSetDarkTheme() {
  window.runtime.WindowSetDarkTheme();
}
// 窗口设置系统主题相关,仅限 Windows。 -end

// 窗口居于显示器中间
export function WindowCenter() {
  window.runtime.WindowCenter();
}

// 设置窗口标题栏中的文本。
export function WindowSetTitle(title) {
  window.runtime.WindowSetTitle(title);
}

// 全屏相关 - start
export function WindowFullscreen() {
  window.runtime.WindowFullscreen();
}

export function WindowUnfullscreen() {
  window.runtime.WindowUnfullscreen();
}

export function WindowIsFullscreen() {
  return window.runtime.WindowIsFullscreen();
}
// 全屏相关 - end

// 窗口尺寸 - start
export function WindowGetSize() {
  return window.runtime.WindowGetSize();
}

export function WindowSetSize(width, height) {
  window.runtime.WindowSetSize(width, height);
}

export function WindowSetMaxSize(width, height) {
  window.runtime.WindowSetMaxSize(width, height);
}

export function WindowSetMinSize(width, height) {
  window.runtime.WindowSetMinSize(width, height);
}
// 窗口尺寸 - end

// 设置位置
export function WindowSetPosition(x, y) {
  window.runtime.WindowSetPosition(x, y);
}

export function WindowGetPosition() {
  return window.runtime.WindowGetPosition();
}

export function WindowHide() {
  window.runtime.WindowHide();
}

export function WindowShow() {
  window.runtime.WindowShow();
}

// 最大最小化相关 - start
export function WindowMaximise() {
  window.runtime.WindowMaximise();
}

// 切换窗口最大最小化
export function WindowToggleMaximise() {
  window.runtime.WindowToggleMaximise();
}

// 退出最大化
export function WindowUnmaximise() {
  window.runtime.WindowUnmaximise();
}

export function WindowIsMaximised() {
  return window.runtime.WindowIsMaximised();
}

export function WindowMinimise() {
  window.runtime.WindowMinimise();
}

export function WindowUnminimise() {
  window.runtime.WindowUnminimise();
}
// 最大最小化相关 - end

export function WindowSetBackgroundColour(R, G, B, A) {
  window.runtime.WindowSetBackgroundColour(R, G, B, A);
}

export function ScreenGetAll() {
  return window.runtime.ScreenGetAll();
}

export function WindowIsMinimised() {
  return window.runtime.WindowIsMinimised();
}

export function WindowIsNormal() {
  return window.runtime.WindowIsNormal();
}

// 使用系统默认浏览器打开给定的 URL。
export function BrowserOpenURL(url) {
  window.runtime.BrowserOpenURL(url);
}

export function Environment() {
  return window.runtime.Environment();
}

export function Quit() {
  window.runtime.Quit();
}

export function Hide() {
  window.runtime.Hide();
}

export function Show() {
  window.runtime.Show();
}

// 剪贴板 - start
export function ClipboardGetText() {
  return window.runtime.ClipboardGetText();
}

export function ClipboardSetText(text) {
  return window.runtime.ClipboardSetText(text);
}
// 剪贴板 - end

引入

import * as rt from "../wailsjs/runtime/runtime";
import * as App from "../wailsjs/go/main/App.js";


  转载请注明: malred-blog wails官方文档

  目录