首頁 > 軟體

使用Vue構建桌面應用程式:Vuido

2020-06-16 16:43:53

我非常喜歡Vue。這是個優秀的框架,可以幫助我們搭建完美的web應用程式。但真正神奇的地方是你不僅僅可以用它搭建web應用程式,還可以使用WeexNativeScript-Vue建立本地移動應用程式。你還可以選擇ElectronVuido庫,搭建桌面應用程式。在本文中,我將介紹如何使用Vuido庫建立本地應用程式。

Vuido是一款基於Vue.js的框架,由Micha? M?ciński開發,用於建立本地桌面應用程式。使用Vuido開發的應用程式可以執行在Windows、OS X和Linux平台,使用原生的GUI元件,不需要Electron庫。

Vuido使用為每款桌面平台提供本地GUI元件的libui庫,以及Node.js的libui-node係結。

我們將搭建什麼?

為了便於介紹,我們將開發一款簡單的應用程式,用於檢視你指定城市的當前天氣。我們將使用OpenWeatherMap API獲取真實資料。

如果你想查閱完整的程式碼,請點選這裡

安裝

正如Vuido文件所述,要開發桌面應用程式有些預先條件。根據平台的不同,預先條件也不同:

Windows平台

windows-build-tools

Visual Studio 2013的Visual C++ Redistributable

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

在安裝完成之後,你將在src資料夾中發現MainWindow.vue元件,程式碼如下所示:

<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>

要讓輸入框和按鈕水平對齊,並在它們之間保持點距離,我們需要一個有horizontal和padded屬性的<Box>容器。Box和HTML的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

然後匯入它,設定好base URL和OpenWeatherMap API key變數:

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應用程式最簡單最好的方式是庫作者推薦的一個方法。他建議使用他自己的LaunchUILaunchUI Packager庫來封裝,並分發應用程式給終端使用者。

我已經安裝了LaunchUI Packager:

npm install --global launchui-packager

之後我要在應用程式root資料夾執行以下指令:

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是一個很好的選擇。它有非常清晰的文件,可能之後內建的元件會變得更多。

本文作者

Natalia Tepluhina是熱愛VueJS的前端開發人員。她還是Vue Vixens的CTO,Noob大會的講師。

檢視英文原文Building a Desktop App with Vue: Vuido

 

 


IT145.com E-mail:sddin#qq.com