Vue在Web和终端的差异

Vue.js 最初是为 Web 平台设计的,Web 开发和手机上原生开发毕竟不同,在功能和开发体验上都有一些差异,这些差异从本质上讲是原生开发平台和 Web 平台之间的差异。

终端平台和Web平台差异如下:

原生环境下没有DOM

DOM(Document Object Model),即文档对象模型,是 HTML 和 XML 文档的编程接口,是 Web 中的概念。银商小程序的运行环境以原生应用为主,在 Android 和 iOS 环境中渲染出来的是原生的组件,不是 DOM Element。

不支持 Web DOM 操作

原生环境中不支持 Web API,没有 ElementEventFile 等对象,详细列表可以参考 Web APIs on MDN

不支持选中元素,如 document.getElementByIddocument.querySelector 等;

也不支持基于 DOM API 的程序库(如 jQuery)。

银商小程序只支持有限的DOM操作,详细请参考节点操作章节。

有限的事件类型

小程序支持在标签上绑定事件,和在浏览器中的写法一样,但是 小程序 中的事件是由原生组件捕获并触发的,行为和浏览器中有所不同,事件中的属性也和 Web 中有差异。

  • 并不支持 Web 中所有的事件类型,参考《通用事件》

  • 不区分事件的捕获阶段和冒泡阶段,相当于 DOM 0 级事件。因此原生组件不支持事件修饰符,例如.prevent,.capture,.stop,.self 。 此外,按键修饰符以及系统修饰键 例如 .enter,.tab,.ctrl,.shift 在移动端基本没有意义,也不支持。

终端环境中没有 BOM

BOM(Browser Object Model),即浏览器对象模型,是浏览器环境为 javascript 提供的接口。银商小程序 在原生端并不基于浏览器运行,不支持浏览器提供的 BOM 接口。

没有 windowscreen 对象

小程序并未提供浏览器中的 window 和 screen 对象,不支持使用全局变量。如果是想要获取设备信息,可以使用 getDeviceInfo() 方法

没有 document 对象

在浏览器中 document 表示了当前活动的文档模型,在 Android 和 iOS 环境中并没有这个对象,也不支持与其相关的 DOM 操作。

没有 historylocation 对象

  • history 保存了当前页面的历史记录,并且提供了前进后退操作。
  • location 记录了当前页面 URL 相关的信息。

这些接口与浏览器自身的实现有关,可以控制页面的前进后退并且获取状态信息。虽然在 Android 和 iOS 中也有“历史”和“导航”的概念,但是它是用于多个管理视图之间的跳转的。换句话说,在浏览器中执行“前进”、“后退”仍然会处于同一个页签中,在原生应用中“前进”、“后退”则会真实的跳转到其他页面。

此外 小程序 也提供了 navigator 模块来操作页面的跳转,使用方法参考导航章节。

能够调用移动设备原生 API

银商小程序 中能够调用终端设备原生 API,包括clipboard 、 navigator 、storage 等设备通用的, 也包括银商U架构这些银商设备特有的。

仅引入了Vue Runtime

小程序 中仅引入 Vue Runtime 的功能,这样做除了可以减少代码体积以外,还能减少运行期编译模板的负担,提升性能。

小程序 Vue Runtime与Web Vue 的Runtime的差异:

  • 定义组件时不支持使用 template 属性
  • 不支持使用 x-templates
  • 不支持使用 Vue.compile

隔离多页面的作用域

银商小程序默认是MPA模式(多页应用),每个页面都是Android的一个Activity。不同的 js bundle 将会在不同的原生Activity中执行;也就是说,不同的 js bundle 之间将不能共享 js 变量。即使是 Vue 这个变量,在MPA下 在不同页面中也对应了不同的引用。

基于这个特性,Vue 中全局功能将只在当前页面内生效:

  • Vue.config
  • Vue.component
  • Vue.directive
  • Vue.filter
  • Vue.mixin
  • Vue.use

样式差异

Web 中的 CSS 非常的灵活,积累了特别多的属性,支持多种布局方法;这是其优势,也是浏览器性能优化的一个瓶颈。

小程序 中的样式是由原生渲染器解析的,出于性能和功能复杂度的考虑,银商小程序 对 CSS 的特性做了一些取舍,使其更符合最佳实践。

单类名选择器和作用域

小程序中只支持单个类名选择器,不支持关系选择器,也不支持属性选择器。

/* 支持单个类名选择器 */
.one-class {
  font-size: 36px;
}
/* 不支持关系选择器 */
.parent > .child {
  padding-top: 10px;
}
/* 不支持属性选择器,不支持 `v-cloak` 指��� */
[v-cloak] {
  color: #FF6600;
}

这个只是对样式定义的限制,不影响样式类名的使用,在标签中可以添加多个样式类名,如:

<template>
  <div class="one two three"><div>
</template>

组件级别的作用域

在 银联商务小程序 里, 每一个 Vue 组件的样式都是 scoped

支持的样式属性

小程序 持的样式特性是 CSS 的子集,并且会不断扩充;在实现过程中我们参考了 CSS 属性在浏览器中的使用频率,优先实现其中频率最高的一些属性。

小程序 支持了基本的盒模型和 flexbox 布局,以及其他常用样式,详情可参考通用样式文档

在编写样式时,还应该注意一下几点:

  • 不需要写样式前缀
  • 不支持 display: none;,因此也不支持 v-show 指令。
  • 为了优化样式解析的效率,样式属性暂不支持简写,涉及一下属性:
    • border 、border-(top|bottom|left|right)
    • margin
    • padding
    • flex

编译环境的差异

针对 Web 平台,和普通 Vue 2.X 项目一样,可以使用任意官方推荐的方式编译源文件,如 Webpack + vue-loader 或者 Browserify + vueify。

针对银商智能终端,我们推荐使用银商脚手架工具 umstool-kit,详情请参考搭建开发环境