系列文章的目录在 ? 这里html
在配置完开发环境以后,就能够开始写应用了。在写应用以前,确定会先划分好页面,一个一个独立着写的。前端
不过,首先要明确的是,使用 Weex 写出来的是原生应用,页面的概念还和 Web 上同样吗?vue
写的有些乱,与下边内容关系不太,不理解能够忽略。webpack
Weex 的实例在 Web 上是和“浏览器页签”的概念相对应的,一般一个 Weex 实例就是一个“页面”。git
在 Web 上,只要没有新开页签,网页中的各类跳转,都是记录在 History
对象中的,对于 Weex 而言,这些都至关与在一个“页面”以内。在 Native 上,页面的跳转是记录在 Navigator
中的,内部也有一个栈来存储跳转记录,能够 push
、 pop
。github
要想在原生页面之间(Weex 多实例之间)跳转,可使用 navigator
模块,也能够看看 weex-router。web
想深刻理解这方面的概念,还须要了解一些 Native 开发的知识。原生开发里边,页面是个比较上层的概念,能够来回切换和销毁,在背后还有生命周期更长程序在运行,Weex Runtime 就运行在这一层里,多个 Weex 的实例会共用一个 Runtime。vue-router
由于 vue-router 的设计和实现都是在同一个页面内的,是 SPA 概念里的产物。其实前端路由也是基于 SPA 产生的概念,在 Weex 或者原生应用这种多页跳转的场景里可能并不合适,慎重使用。虽然 weex-hackernews 项目里用了 vue-router ,可是依然在同一个 Weex 实例中。相关话题我在 《使用 vue-router》这篇文章里详细再说。apache
以 weex-hackernews 为例,看 webpack.config.js
中的配置,src/entry.js 就是入口文件。项目代码中由于用了 Vuex 和 vue-router,入口文件还有点长,其实只须要引入口组件,配置挂载点,而后初始化 Vue 实例就好了。segmentfault
import Vue from 'vue' import App from './App.vue' // 将 App 组件挂载到 #root 之上,生成的 DOM 节点会替换 #root 标签 App.el = '#root' // 建立 Vue 实例 new Vue(App)
这还要求你在 Web 入口 HTML 文件里手动写上 #root
的标签:
<div id="root"></div>
至于 Android 和 iOS 平台,只要指定了 el
属性便可,属性值就无所谓了,Weex 会默认将其挂载到容器根视图中(可由 Native 端配置)。
在配置好入口文件以后,就能够开始写组件了,推荐写单文件组件,也就是 .vue
文件。语法就再也不重复介绍,官方文档中写得很详细,能支持 ES6+,甚至能够配置 TypeScript 、Sass 、Stylus 、PostCSS 、Jade 等语法。
须要注意的是,针对 Web 平台,依然使用 Webpack + vue-loader
的方式编译 .vue
文件,可是针对 Android 和 iOS 平台,你必须使用 Webpack + weex-loader
才能够。也就是说,针对 Web 和 Native 平台要分别生成两份不一样的 js bundle,具体的配置参考 webpack.config.js。
Weex 已经将 Vue Runtime 的代码整合进了 SDK 中,Vue 中支持的语法特性也能用在 Weex 中。注意,是 Vue Runtime (运行时构建)。若是你下载过 Vue 2.0 对外发布的版本,应该能发现除了区分产品版和开发版,既区分 “Standalone” 版本和 “Runtime-only” 版本,具体的差别能够看官方安装指南(其实有些名词不太好翻译,看英文原版文档或许能理解得更准确一些)。
简单来讲,Vue 在 Weex 中使用的是“预编译”模式,只保留了运行时,不支持实时编译模板。简单来讲,就是不支持下边几个特性:
定义组件时不支持使用 template
属性。
不支持使用 x-templates
。
不支持使用 Vue.compile
。
写代码的过程和写其余 Vue 2.0 项目是同样的,没什么可说的。可是既然说了是写原生应用,就要注意跨平台的问题,虽然 Weex 抹平了不少差别,可是平台差别是客观存在的。Web 和 Android 和 iOS 毕竟都不相同,想写跨平台的应用,了解平台差别仍是颇有必要的。
推荐阅读官方文档:
大概摘录一下是这样的:
Weex 环境中没有 DOM
不支持 DOM 操做,原平生台没有 DOM 概念。
并不支持 Web 中全部的事件类型,详情请参考《通用事件》。
不区分事件的捕获阶段和冒泡阶段,至关于 DOM 0 级事件。
Weex 环境中没有 BOM
没有 window 、screen 对象,能够经过 WXEnvironment
获取设备环境信息。
没有 document 对象,没有选择器方法。
没有 history 、location 、navigator 对象,有 navigator 模块。
可以调用移动设备原生 API
能够经过模块调用设备原生 API,如 clipboard 、 navigator 、storage 等。
为了保证三端可用,不能使用浏览器提供的标签,只能用 Weex 提供的标签(组件)。若是你写了 <figure>
或者 <menu>
这类组件,在 Web 端能够看到效果,可是在客户端上渲染效果是不肯定的。并且,客户端上没有 SEO 和语义化的需求,HTML5 中的大多数标签均可以经过别名实现(参考 weex-component-alias)。
具体组件的使用方法参考官方文档。
CSS 的属性特别多,写法也特别多,能力很强大,也有不少坑。一方面新标准在不断的提出,像 CSS Grid 和 Houdini 这些概念也逐渐受到关注;另外一方面旧标准是很难再废除的,新旧语法总能摩擦出各类奇葩的行为,CSS 也是容易滋生“奇技淫巧”的地方,也有各类关于“最佳实践”的话题,不少人乐于此道。浏览器内部为了处理这些边界状况确定用了大量“特殊技巧”。
然而在实际使用中,绝大多数的网页只用了其中不多一部分属性(参考 Global CSS property usage)。Weex 是由 Native 平台解析的样式,Android 和 iOS 自己并不支持 CSS ,全部解析都是原生渲染器实时计算的,因此必然要再性能和可用性之间作平衡。既然不能支持、也不打算支持全部 CSS 特性,那就必然要分清主次,优先支持经常使用样式。
Weex 对 CSS 样式的支持状况,能够参考这篇文档。简单归纳下边几点:
支持基本的盒模型。
支持 position
定位布局。
支持使用 flexbox
布局。
使用限制
只支持单个类名选择器,不支持关系选择器,也不支持属性选择器。
默认是组件级别的做用域,没有全局样式。
不支持样式继承(由于有做用域隔离)。
考虑到样式的数据绑定,样式属性暂不支持简写。