最近项目在改造,尝试使用Weex代替原有的H5 和原生页面,提高系统运行效率。期间遇到了很多坑,后面会仔细讲讲,先来看下Weex的基本信息。

一、什么是weex

"Weex是一个可以使用现代化的 Web 技术开发高性能原生应用的框架",这是Weex官网对其的一句很简介明了的定义。Weex是一个可以利用web 前端开发技术来实现Android/ios 原生引用的框架,使用 Vue 作为上层框架,并遵循 W3C 标准实现了统一的 JSEngine 和 DOM API。

二、整体架构

本地开发的web 页面,构建形成 Weex 的一个 JS bundle(native);在云端,开发者可以把生成的 JS bundle 部署上去,然后通过网络请求或预下发的方式传递到用户的移动应用客户端;在移动应用客户端里,WeexSDK 会准备好一个 JavaScript 引擎,并且在用户打开一个 Weex 页面时执行相应的 JS bundle,并在执行过程中产生各种命令发送到 native 端进行的界面渲染或数据存储、网络通信、调用设备功能、用户交互响应等移动应用的场景实践。

1、Weex 的 iOS 和 Android 客户端中都会运行一个 JavaScript 引擎,来执行 JS bundle。

2、Weex向各端的渲染层发送规范化的指令,调度客户端的native渲染和其它各种能力。

3、我们在 iOS 下选择了 JavaScriptCore 内核,而在 Android 下选择了 UC 提供的 v8 内核。

原理:
1、将XML+CSS+JavaScript代码转换为JSBundle
2、JSBundle传给JS Framework解析为Json格式的Virtual DOM
3、客户端通过接收Virtual DOM渲染界面

 

 

三、技术特点

1、一次实现,多端适用

    使用Weex框架+ web开发语言和开发经验开发应用,可构建 Android、iOS 和 Web 应用三端统一的应用。

2、支持的前端框架

    Weex并不强依赖在特定的框架上使用,但官方推荐使用的是vue.jsRax 前端框架,这俩种框架也是Weex 目前功能最全、最稳定的方案。在 WeexSDK v0.10.0 (发布于 2016 年 2 月 17 日)以及后续的版本中,集成了 v2 版本的 Vue.js。

 

Vue 和 Rax

  •  Vue.js 是一个不断进化中的前端框架。
  • Rax 是提供类 React 语法和兼容性的前端框架。

3、调试工具

  •  官方推荐使用Playground 来调试,预览weex页面,在 Playground 里,你可以打开各种示例。
  •  访问 Weex online playground. 在这个网站上,你可以浏览、修改、新建各种基于 Vue.js 的单页面例子,并用 WeexPlayground 应用扫码查看实时效果。
  • 同时weex 也提供了weex debug ,需要APP集成 weex sdk。weex debug 启动步骤如下:

       1、执行 weex debug 指令;   执行成功后会提示访问URL、端口等。   

    2、访问URL,会有一个debug 二维码

    3、使用继承了weex sdk 的APP引用扫码,链接APP和网页,就可以在调试网页。

   4、weex debug 支持对单个文件进行调试, 通过 weex debug [folder | file]  命令进行编译。

 

四、weex和 web的平台差异

    虽然使用weex框架可以实现web , android 、ios 三端统一,但是它与纯web 开发有几点很明显的区别。

1、weex环境中没有 DOM    

     weex的运行环境以原生应用为主,在 Android 和 iOS 环境中渲染出来的是原生的组件,不是 DOM Element。

  • 不支持 DOM 操作

    原生环境中不支持 Web API,没有 Element 、Event 、File 等对象。不支持选中元素,如 document.getElementById 、 document.querySelector 等;当然也不支持基于 DOM API 的程序库(如 jQuery)。

  • 有限的事件类型

    Weex支持在标签上绑定事件,和在浏览器中的写法一样,但是Weex 中的事件是由原生组件捕获并触发的,行为和浏览器中有所不同,事件中的属性也和 Web 中有差异。支持 Web 中的事件类型,详情请参考《通用事件》。同时,不区分事件的捕获阶段和冒泡阶段,相当于 DOM 0 级事件。

 2、Weex环境中没有BOM

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

  • 没有 window 、screen 对象

     因为没有BOM ,所以不支持供浏览器中的window, screen对象,获取设备的屏幕或环境信息,可以使用 WXEnvironment 变量。

WXEnvironment 备注
weexVersion WeexSDK 的版本
appName 应用的名称
appVersion 应用的版本
platform 运行平台,可能的值是 Web 、Android 、iOS 之一
osName 系统的名称
osVersion 系统版本
deviceWidth 设备宽度
deviceHeight 设备高度
  // 获取屏幕高度
  this.scrollHeight = (750 / weex.config.env.deviceWidth * weex.config.env.deviceHeight-140) ; 
  • 没有doucment 对象

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

  • 没有location,history,navigator 对象

    Weex 也提供了 navigator 模块来操作页面的跳转,使用方法参考《navigator 导航控制

3、能够调用移动设备原生 API

    Weex 提供了clipboard navigator storage等模块来调用移动设备原生 API。同时,提供了横向扩展的能力,可以扩展原生模块,具体的扩展方法请参考《iOS 扩展》 和《Android 扩展

 

参考资料

weex 官网

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐