使用 Vue 构建桌面应用程序:Vuido
我爱Vue。它是一个很棒的框架,可以让你构建出色的 Web 应用。但真正的魔力在于,它不仅限于 Web 应用。你可以使用Weex或NativeScript-Vue轻松创建原生移动应用;当然,你也可以构建桌面应用。你可以选择Electron或Vuido库来实现这一点。在本文中,我将介绍 Vuido 的使用方法,下一篇文章中,我将尝试使用 Electron 构建同样的应用。
Vuido 是一个基于 Vue.js 创建原生桌面应用的框架,由Michał Męciński创建。使用 Vuido 的应用程序可以在 Windows、OS X 和 Linux 上运行,使用原生 GUI 组件,并且不需要 Electron。
在底层,Vuido 使用libui库,该库为每个桌面平台提供原生 GUI 组件,以及为 Node.js 提供libui-node绑定。
💻我们要构建什么
作为示例,我们将开发一个简单的应用程序,用于检查您所选城市的当前天气。我们将使用OpenWeatherMap API 来获取实际数据。
如果您只想检查最终代码,它就在这里。
🛠️ 安装
如 Vuido 文档所述,开始开发桌面应用需要满足一些先决条件。不同平台的要求有所不同:
💡Windows
windows-build-tools
Visual C++ Redistributable Package for Visual Studio 2013
💡Linux
build-essential
GTK+ 3
💡OSX
Xcode
我正在使用 OSX 进行开发,此时我已经安装了 Xcode。
此外,您还需要安装vue-cli(如果您使用的是 Vue CLI 3,则还需要@vue/cli-init
)。
要创建新项目,请运行以下命令:
vue init mimecorg/vuido-webpack-template my-project
安装完成后,您可以使用以下代码在文件夹MainWindow.vue
中找到该组件:src
<template>
<Window title="some-app" width="400" height="100" margined v-on:close="exit">
<Box>
<Text>Welcome to your Vuido application!</Text>
</Box>
</Window>
</template>
<script>
export default {
methods: {
exit() {
this.$exit();
},
},
};
</script>
如果您运行build
然后执行start
任务,您将看到一个带有非常基本的桌面应用程序的窗口:
现在我们准备构建一些更有趣的东西了😅
💅 搭建应用程序
关于 Vuido,你首先需要知道的是它使用的是原生组件。因此,它既没有我们熟悉的 HTML 标签,也没有 CSS 样式,只有一组兼容不同桌面平台的原生 GUI 组件。使用 Vuido 构建的应用程序在每个平台上都能拥有原生的外观和体验。
这可能被视为优点和缺点——您无法构建具有非常自定义外观的应用程序,但它会比使用 Electron 构建的应用程序更轻量级并且运行速度更快。
内置组件的完整列表可以在Vuido 文档的此部分找到。
我最初的想法是开发一个应用,显示用户所选城市的天气情况,以便测试简单的用户交互和 API 调用。我首先需要的是一个带按钮的输入框。此外,我还将窗口大小更改为400x150px
:
<Window title="Weather" width="400" height="150" margined v-on:close="exit">
<Box padded>
<Box horizontal padded>
<TextInput stretchy></TextInput>
<Button>Search</Button>
</Box>
</Box>
</Window>
要将输入字段与按钮水平对齐并在它们之间添加填充,我们需要一个具有和属性的<Box>
容器。类似于 HTML ,它作为包装器来包含和对齐组件。horizontal
padded
Box
div
TextInput
是一个输入字段,它的stretchy
属性意味着它将伸展以填充可用空间。
现在我们的应用程序看起来是这样的:
让我们query
向组件数据添加一个属性,并将其设置为v-model
输入字段。此外,我们需要在没有查询字符串时禁用按钮,这对我来说有点棘手,因为我尝试过一个熟悉的disabled
属性——但在 Vuido 中你应该使用enabled
它!所以现在我们的输入框如下所示:
<Box horizontal padded>
<TextInput v-model="query" stretchy></TextInput>
<Button :enabled="!!query">Search</Button>
</Box>
🔗 进行 API 调用
现在的想法是使用给定的查询字符串作为城市来获取当前天气状况。
为了获取天气数据,我使用了OpenWeatherMap API。它提供了很多不同的功能,但我们只需要一章。您可以在此处Current weather data
查看 JSON 响应的示例。
因此,为了开始获取数据,我们需要添加一个 axios 库:
npm install --save axios
然后导入它并设置基本 URL 和 OpenWeatherMap API 密钥变量:
import axios from 'axios';
axios.defaults.baseURL = 'http://api.openweathermap.org/data/2.5'
const apiKey = process.env.API_KEY;
在此之后,让我们为天气数据添加一些新属性以及从 API 中获取数据的方法:
export default {
data() {
return {
query: '',
error: false,
city: '',
country: '',
weatherDescription: '',
temp: null,
tempMin: null,
tempMax: null,
humidity: null,
};
},
methods: {
exit() {
this.$exit();
},
showWeather() {
axios
.get(
`/weather?q=${this.query}&units=metric&&appid=${apiKey}`,
)
.then(response => {
this.city = response.data.name;
this.country = response.data.sys.country;
this.weatherDescription = response.data.weather[0].description;
this.temp = response.data.main.temp;
this.tempMin = response.data.main.temp_min;
this.tempMax = response.data.main.temp_max;
this.humidity = response.data.main.humidity;
this.error = false;
})
.catch(() => {
this.error = true;
this.city = '';
});
},
},
};
现在是时候将新方法附加到按钮并更改模板以显示所有给定的数据,或者如果查询与任何现有城市不匹配则显示错误
<Window title="Weather in your city" width="400" height="150" margined v-on:close="exit">
<Box padded>
<Box horizontal padded>
<TextInput stretchy v-model="query"/>
<Button :enabled="!!query" @click="showWeather">Search</Button>
</Box>
<Separator horizontal/>
<Group margined>
<Box padded>
<Text v-if="error">There is no such city in the database</Text>
<Box v-if="!!city">
<Box padded horizontal>
<Text stretchy>{{city}}, {{country}}</Text>
<Text>{{temp}}°C</Text>
</Box>
<Text>{{weatherDescription}}</Text>
<Separator horizontal/>
<Box padded horizontal>
<Text stretchy>Min: {{tempMin}}°C</Text>
<Text stretchy>Max: {{tempMax}}°C</Text>
<Text stretchy>Humidity: {{humidity}}%</Text>
</Box>
</Box>
</Box>
</Group>
</Box>
</Window>
如你所见,第一个框是我们在上一章中创建的输入容器。下方有一条Separator
水平线,用于在视觉上分隔各个小部件。接下来是Group
一个容器,它在其内容周围提供带有标题的边框。
在里面,Group
你可以看到已经见过的组件的组合:Text
用于简单的文本内容,Box
作为容器和Separator
。现在应用程序看起来如下:
📦包装
在我看来,打包基于 Vuido 的应用程序最好、最简单的方法是库作者推荐的方法。他建议使用他自己的库LaunchUI和LaunchUI Packager来打包应用程序并将其分发给最终用户。
我已经全局安装了 LaunchUI Packager:
npm install --global launchui-packager
然后我在应用程序根文件夹中运行以下命令:
launchui-packager weather-app 1.0 dist/main.min.js
上面的命令weather-app
是应用程序名称、1.0
版本和dist/main.min.js
捆绑文件的路径。
之后就是一个包含我的应用程序的文件夹!程序包大小为 39Mb,比作者承诺的要大一点(文档中提到大约 20Mb),但也没大太多。
如果您尝试运行它,您可能会注意到它启动得非常快(0.1 秒左右)。
🌟 结论
优点:
- 易于构建
- 与 Electron 驱动的应用程序相比,包体积更小
- 有据可查
缺点
- 没有很酷的风格😕
- 仍未发布(当前版本为 0.2.0)
如果你需要一个快速、小型且外观简洁的应用程序,Vuido 看起来是个不错的选择。它有清晰的文档,而且内置组件列表未来可能会越来越丰富。
文章来源:https://dev.to/n_tepluhina/building-a-desktop-app-with-vue-vuido-490n