[译] 使用Capacitor 和 Vue.js 构建移动应用

经过本教程,你将学到如何使用 Capacitor 以及如 Vue.js、Ionic 4 web 组件等前沿 web 技术来为 Android 和 iOS 构建跨平台移动应用。你还能够利用 Capacitor 的优点,用相同的代码来构建其余平台,好比桌面和 web。html

最近,Ionic 团队发布了一项名叫 Capacitor 且继承了 Apache Cordova 和 Adobe PhoneGap 核心思想的开源项目。 Capacitor 容许你使用现代 web 技术来构建可在任意平台中运行的应用,从 web 浏览器到移动设备(Android 和 iOS),甚至是经过 Electron(Github 上比较流行的使用 Node.js 和前端 web 技术构建跨平台桌面应用的技术)构建的桌面应用平台。前端

Ionic - 最流行的混合移动应用开发框架 - 目前运行在 Cordova 之上,但在将来版本中,Capacitor 将成为 Ionic 应用的默认选择。Capacitor 也提供了兼容层从而容许在 Capacitor 项目中使用已有的 Cordova 插件。vue

除了在 Ionic 应用中使用 Capacitor,你也可使用任何你喜欢的前端框架或 UI 库,好比 Vue、React、Angular with Material、Bootstrap 等。node

在本教程中,咱们将看到如何使用 Capacitor 和 Vue 来构建一个简单的 Android 移动应用。实际上,如上所述,你的应用也能够做为渐进式 web 应用(PWA)或做为主要操做系统中的桌面应用来运行,这只须要几个命令。android

咱们还将使用一些 Ionic 4 UI 组件来设计咱们的演示移动应用。ios

Capacitor 特性

Capacitor 拥有不少特性,以使其成为 Cordova 等其余解决方案的良好替代品。让咱们看看一些 Capacitor 特性:git

  • 开源而且免费: Capacitor 是一个开源项目,根据 MIT 许可证受权,并由 Ionic 和社区维护。
  • 跨平台: 你可使用 Capacitor 经过一份代码来构建多个平台。你能够经过命令行界面(CLI)运行一些命令来支持另一个平台。
  • 访问平台 SDK: 当你须要访问原生 SDK 时,Capacitor 不会妨碍你。
  • 标准 web 和浏览器技术: 经过 Capacitor 构建的应用使用 web 标准 API,所以你的应用也将是跨浏览器,并将在遵循标准的全部现代浏览器中运行良好。
  • 可扩展: 能够经过添加插件的形式来访问底层平台的原生功能,或者,若是你找不到符合你需求的插件,能够经过简单的 API 来建立一个自定义插件。

依赖

为了完成本教程,你的开发机器须要知足如下要求:github

  • 你须要在你的机器上安装 Node v8.6+ 和 npm v5.6+ 。只需访问 官网 而且下载适用于你的操做系统的版本便可。
  • 要构建 iOS 应用,你须要一台安装了 Xcode 的 Mac。
  • 要构建 Android 应用,你须要安装 Java 8 JDK 和带有 Android SDK 的 Android Studio。

建立一个 Vue 项目

在这一节,咱们将安装 Vue CLI 而且生成一个新的 Vue 项目。而后,咱们将使用 Vue router 为咱们的应用程序添加导航。最后咱们将使用 Ionic 4 组件构建一个简单的 UI。web

安装 Vue CLI v3

让咱们首先经过命令行运行如下命令以便从 npm 安装 Vue CLI v3:vue-router

$ npm install -g @vue/cli
复制代码

你可能须要添加 sudo 来全局安装软件包,具体取决于你的 npm 配置。

生成一个新的 Vue 项目

安装完 Vue CLI,让咱们经过命令行运行如下命令用它来生成一下新的 Vue 项目:

$ vue create vuecapacitordemo
复制代码

你能够进入项目的根目录并运行如下命令来启动开发服务器:

$ cd vuecapacitordemo
$ npm run serve
复制代码

你的前端应用将在 http://localhost:8080/ 下运行。

若是你经过 web 浏览器访问 http://localhost:8080/,你应该看到一下页面:

一个 Vue 应用

一个 Vue 应用 (查看大版本)

添加 Ionic 4

为了在你的应用中使用 Ionic 4 组件,你须要经过 npm 安装 Ionic 4 核心软件包。

因此,继续打开 index.html 文件,它位于你的 Vue 项目中的 public 目录,而后在文件头部添加如下标签 <script src='https://unpkg.com/@ionic/core@4.0.0-alpha.7/dist/ionic.js'></script>

如下是 public/index.html 的内容:

<!DOCTYPE html>
<html>
<head>
<meta  charset="utf-8">
<meta  http-equiv="X-UA-Compatible"  content="IE=edge">
<meta  name="viewport"  content="width=device-width,initial-scale=1.0">
<link  rel="icon"  href="<%= BASE_URL %>favicon.ico">
<title>vuecapacitordemo</title>
</head>
<body>
<noscript>
<strong>We’re sorry but vuecapacitordemo doesn’t work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div  id="app"></div>
<!-- built files will be auto injected -->
<script  src='https://unpkg.com/@ionic/core@4.0.0-alpha.7/dist/ionic.js'></script>
</body>
</html>
复制代码

你能够经过 npm 获得 Ionic 核心软件包的当前版本。

如今,打开 src/App.vue,删除其中的内容后,在 template 标签内添加如下内容:

<template>
<ion-app>
   <router-view></router-view>
</ion-app>
</template>
复制代码

ion-app 是一个 Ionic 组件。它应该是包装其余组件的顶级组件。

router-view 是 Vue 的路由插槽。Vue router 将在此处呈现与路径匹配的组件。

将 Ionic 组件添加到你的 Vue 应用后,你将开始在浏览器控制台中收到相似如下内容的警告:

[Vue warn]: Unknown custom element: <ion-content> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

found in

---> <HelloWorld> at src/components/HelloWorld.vue
       <App> at src/App.vue
         <Root>
复制代码

这是由于 Ionic 4 组件其实是 web 组件,因此你须要告诉 Vue 以 ion 前缀开头的组件不是 Vue 组件。你能够在 src/main.js 文件中添加如下内容进行设置:

Vue.config.ignoredElements = [/^ion-/]
复制代码

如今这些警告应该消失了。

添加 Vue 组件

让咱们添加两个组件。首先,删除 src/components 目录下的全部文件(而且删除 App.vue 中有关 HelloWorld.vue 组件的任何导入),而后添加 Home.vueAbout.vue 文件。

打开 src/components/Home.vue 并添加如下模板:

<template>
<ion-app>
<ion-header>
  <ion-toolbar color="primary">
    <ion-title>
      Vue Capacitor
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content padding>
  The world is your oyster.
  <p>If you get lost, the <a href="https://ionicframework.com/docs">docs</a> will be your guide.</p>
</ion-content>
</ion-app>
</template>
复制代码

接下来,在同一个文件中,添加如下代码:

<script>
export default {
  name: 'Home'
}
</script>
复制代码

如今,打开 src/components/About.vue 并添加如下模板:

<template>
<ion-app>
<ion-header>
  <ion-toolbar color="primary">
    <ion-title>
      Vue Capacitor | About
    </ion-title>
  </ion-toolbar>
</ion-header>
<ion-content padding>
This is the About page.
</ion-content>
</ion-app>
</template>
复制代码

一样的,在同一个文件中,添加如下代码:

<script>
export default {
  name: 'About'
}
</script>
复制代码

使用 Vue Router 添加导航

若是还没有安装 Vue router,须要首先安装,方法是在项目的根目录中执行如下命令:

npm install --save vue-router
复制代码

而后,在 src/main.js 文件中,导入如下内容:

import Router from 'vue-router'
import Home from './components/Home.vue'
import About from './components/About.vue'
复制代码

这将导入 Vue router、Home 和 About 组件。

添加如下内容:

Vue.use(Router)
复制代码

建立一个包含路由数组的 Router 实例:

const  router  =  new  Router({
  routes: [
    {
      path:  '/',
      name:  'Home',
      component:  Home
    },
    {
      path:  '/about',
      name:  'About',
      component:  About
    }
  ]
})
复制代码

最后,告诉 Vue Router 实例:

new  Vue({router,
render:  h  =>  h(App)
}).$mount('#app')
复制代码

如今咱们已经设置了路由,让咱们添加一些按钮和方法以便在 Home 和 About 两个组件之间进行导航。

打开 src/components/Home.vue 并添加 goToAbout() 方法:

...
export default {
  name: 'Home',
  methods: {
    goToAbout () {
      this.$router.push('about')
  },
复制代码

template 块中,添加一个按钮用来触发 goToAbout() 方法:

<ion-button @click="goToAbout" full>Go to About</ion-button>
复制代码

如今,当咱们进入 About 组件时,咱们须要添加一个按钮返回到主页。

打开 src/components/About.vue 并添加 goBackHome() 方法:

<script>
export default {
  name: 'About',
  methods: {
    goBackHome () {
      this.$router.push('/')
    }
  }
}
</script>
复制代码

而且,在 template 块中,添加一个按钮用来触发 goBackHome() 方法:

<ion-button @click="goBackHome()" full>Go Back!</ion-button>
复制代码

在真实的移动设备或模拟器上运行该应用时,你会注意到缩放问题。要解决这个问题,咱们须要简单地添加一些正确设置 viewport 的 meta 标签。

打开 public/index.html,将如下代码添加到页面的 head 中:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
复制代码

添加 Capacitor

你能够经过两种方式使用 Capacitor:

  • 从头开始建立一个新的 Capacitor 项目。
  • 将 Capacitor 添加到已有的前端项目中。

在这篇教程中,咱们将采用第二种方式,由于首先咱们已经建立了一个 Vue 项目,如今咱们将要把 Capacitor 添加到咱们的 Vue 项目中。

集成 Capacitor 与 Vue

Capacitor 旨在融入任何现代 JavaScript 应用。要将 Capacitor 添加到 Vue web 应用中,你须要执行如下几个步骤。

首先,经过 npm 安装 Capacitor CLI 和核心软件包。确保你在你的 Vue 项目中,并执行如下命令:

$ cd vuecapacitordemo
$ npm install --save @capacitor/core @capacitor/cli
复制代码

接下来,运行如下命令,使用你的应用信息初始化 Capacitor:

$ npx cap init
复制代码

咱们使用 npx 运行 Capacitor 命令。npxnpm v5.2.0 附带的实用程序,它用来简化托管在 npm 中的 CLI 程序和可执行文件的运行。好比,它容许开发人员使用本地安装的可执行文件,而无需 npm 运行脚本。

Capacitor CLI 的 init 命令还将为 Capacitor 添加默认的本地原平生台,好比 Android 和 iOS。

系统还会提示你输入有关应用的信息,好比名字、应用 ID(将主要用做 Android 应用的包名)和你的应用程序的目录。

输入所需的详细信息后,Capacitor 将被添加到你的 Vue 项目中。

你也能够经过如下命令来提供应用详情:

$ npx cap init vuecapacitordemo com.example.vuecapacitordemo
复制代码

应用名为 vuecapacitordemo,ID 为 com.example.vuecapacitordemo。包名必须是有效的 Java 包名称。

你应该会看到一条消息, “Your Capacitor project is ready to go!”

你可能还注意到一个名为 capacitor.config.json 的文件被添加到了你的 Vue 项目的根目录中。

就像 CLI 在咱们的 Vue 项目中初始化 Capacitor 时所建议的那样,咱们如今能够添加咱们想要构建的本地平台。这将把咱们的 web 应用转换成咱们添加的每一个平台的原生应用。

可是在添加平台以前,咱们须要告诉 Capacitor 在哪里查找构建文件 — 也就是咱们的 Vue 项目的 dist 目录。当你第一次运行 Vue 应用的 buildnpm run build) 命令时,将建立此目录,它位于 Vue 应用的根目录。

咱们能够经过修改 capacitor.config.json 中的 webDir 来作到这一点,它是 Capacitor 的配置文件。因此,只需用 dist 替换 www 便可。如下是 capacitor.config.json 的内容:

{
  "appId": "com.example.vuecapacitordemo",
  "appName": "vuecapacitordemo",
  "bundledWebRuntime": false,
  "webDir": "dist"
}
复制代码

如今,让咱们建立 dist 目录并运行如下命令来构建咱们的 Vue 项目:

$ npm run build
复制代码

以后,咱们可使用如下命令添加 Android 平台:

npx cap add android
复制代码

若是你查看你的项目,你会发现已经添加了一个 android 原生项目。

这就是整合 Capacitor 和 Android 的所有内容。若是你想要适配 iOS 或 Electron,只需分别运行 npx cap add iosnpx cap add electron

使用 Capacitor 插件

Capacitor 提供了一个运行时以便开发人员可以使用 web 的三大支柱 - HTML、CSS 和 JavaScript - 来构建在 web 上以及主要桌面和移动平台上运行的应用程序。另外它还提供了一组插件用来访问设备的底层功能,例如相机,无需针对每一个平台使用特定的低级代码;该插件将为你完成,并为此提供了统一规范的高级 API。

Capacitor 还提供了 API 以便你可使用该 API 建立 Ionic 团队提供的官方插件未覆盖的自定义插件。你能够在 如何建立插件 中学习。

你也能够在文档中找到有关 API 和核心插件 的更多详细信息。

例子:添加一个 Capacitor 插件

让咱们看一个在咱们的应用中使用 Capacitor 插件的例子。

咱们将使用 “Modals” 插件,该插件用于显示 alerts、confirmations、input prompts 和 action sheets 的原生模态窗口。

打开 src/components/Home.vue,并在 script 块的开头添加如下内容:

import { Plugins } from '@capacitor/core';
复制代码

此代码从 @capacitor/core 中导入 Plugins 类。

接下来,添加如下方法来显示对话框:

…
  methods: {
    …
    async showDialogAlert(){
      await Plugins.Modals.alert({
          title: 'Alert',
          message: 'This is an example alert box'
      });
    }
复制代码

最后,在 template 块里添加一个按钮用来触发这个方法:

<ion-button @click="showDialogAlert" full>Show Alert Box</ion-button>
复制代码

如下是该对话框的屏幕截图:

Capacitor 原生模态框

原生模态框 (查看大版本)

你能够在 文档 找到更多详细信息。

为目标平台构建应用

为了构建项目并为目标平台生成相关二进制文件,你须要执行几个步骤。让咱们首先看一下它们:

  1. 构建 Vue 应用的生产版本。
  2. 将全部 web 资源复制到 Capacitor 生成的原生项目中(在咱们的示例中为 Android)。
  3. 在 Android Studio (或者 Xcode for iOS)中打开你的 Android 项目,并使用本地集成开发环境(IDE)在真实设备(若是已链接)或模拟器上构建和运行你的应用。

因此,运行如下命令来建立生产版本:

$ npm run build
复制代码

接下来,使用 Capacitor CLI 的 copy 命令将 web 资源复制到原生项目:

$ npx cap copy
复制代码

最后,你可使用 Capacitor CLI 的 open 命令在本地 IDE(在咱们的示例中为Android Studio)中打开你的原生项目(在咱们的示例中为Android):

$ npx cap open android
复制代码

Android Studio 将与您的项目一块儿打开,或将打开包含原生项目文件的目录。

Android Studio 项目

在 Android Studio 中打开 Capacitor 项目 (查看大版本)

若是不能打开 Android Studio,那么只需手动打开你的 IDE,转到 ”File“ → ”Open…“,而后导航到你的项目并从 IDE 中打开 android 目录。

你如今可使用 Android Studio 经过模拟器或真实设备来启动你的应用。

Capacitor demo 项目

Capacitor demo 项目 (查看大版本)

结论

在本教程中,咱们使用了带有 Vue 和 Ionic 4 web 组件的 Ionic Capacitor 建立了一个使用 web 技术的移动 Android 应用。你能够在 GitHub repository 中找到该演示应用的源代码。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索