首页 > 学院 > 开发设计 > 正文

Weex 和 React Native的比较

2019-11-09 16:39:59
字体:
来源:转载
供稿:网友

Weex 和 React Native的比较


基本概念

weex

阿里巴巴公司与2016年6月开源的一种用于构建移动跨平台的UI框架 基于JS开发框架 weex基于Vue.js

React Native

Facebook在2015年3月在F8开发者大会上开源的跨平台UI框架 基于JS开发框架 基于React.js

Vue和React的比较


Weex和React Native的异同

相同点:

CSS属性通用 都使用JS开发 都可以直接在Chrome中调试JS代码 需要Node.js基础环境

不同点:

JS框架 Weex基于Vue.js , 以下是HelloWorld程序

<template> <div class="container"> <div class="cell"> <image class="thumb" src="http://t.cn/RGE3AJt"></image> <text class="title">javaScript</text> </div> </div></template><style> .cell { margin-top: 10; margin-left: 10; flex-direction: row; } .thumb { width: 200; height: 200; } .title { text-align: center; flex: 1; color: grey; font-size: 50; }</style>

React Native基于React.js,以下是HelloWorld程序

import React, { Component } from 'react';import { ApPRegistry, Text } from 'react-native';class HelloWorldApp extends Component { render() { return ( <Text>Hello world!</Text> ); }}AppRegistry.registerComponent('HelloWorldApp', () => HelloWorldApp);

社区支持 Weex开源较晚,网上相关资料还比较少,社区规模较小,网站资源还在建设中; React Native社区则比较活跃,可以参考的项目和资料也比较丰富;

开发效率 Weex工程开发套件weexpack Weex的Playground可以在线编码 ReactNative没有工程开发套件,没有在线编码功能
技术 开发工具 在线编码
Weex weexpack 支持
ReactNative notepad++ 不支持

Weex简单程序入门

环境搭建

安装Node.js,建议下载msi格式,它会自动配置环境变量,而exe需要手动配置安装weex-toolkit,命令行输入npm install -g weex-toolkit检查weex是否安装成功,命令行输入weex --version

第一个HelloWorld程序

在任意目录下新建一个.we文件,例如我的是E:/weex_workspace/tech_list.we 文件内容为官方示例:

<template> <div class="container" > <div class="cell"> <image class="thumb" src="http://t.cn/RGE3AJt"></image> <text class="title">Javascript</text> </div> </div></template><style> .cell{margin-top:10 ; margin-left:10 ; flex-direction: row; } .thumb {width: 200; height: 200; } .title {text-align: center ; flex: 1; color: grey; font-size: 50; } </style>

编辑后保存,在命令窗口下执行weex E:/weex_workspace/tech_list.we weex会启动浏览器并且展示出网页,如图所示: 注意图中红色标注部分,不难看出,weex启动了一个服务,我的目录是C:/Users/wangning/weex_tmp/h5_render,顺着这个目录打开,我们可以看到这样一组文件 没错,第二个红色标注部分的tech_list.js就是它,打开之后我们可以看到

红色圈圈的地方就是判断module对象是否有缓存,如果有,则退出当前function,起到了缓存页面的作用。 重点是最后两个function

可以看到1是我们之前tech_list.we中的这段代码

<template> <div class="container" > <div class="cell"> <image class="thumb" src="http://t.cn/RGE3AJt"></image> <text class="title">JavaScript</text> </div> </div></template>

<template>标签之间的布局元素进行的的解析,按照一定规则,转换成了json数据并赋值给module.exports

以此类推,2中对应的是tech_list.we中的

<style> .cell{margin-top:10 ; margin-left:10 ; flex-direction: row; } .thumb {width: 200; height: 200; } .title {text-align: center ; flex: 1; color: grey; font-size: 50; } </style>

<style>标签之间将样式按照一定规则转换成了json数据并赋值给module.exports 只要修改了tech_list.we,与之对应的tech_list.js就会发生相应的变化, 例如,我们向tech_list.we中多添加几个div元素

<template> <div class="container"> <div class="cell"> <image class="thumb" src="http://t.cn/RGE3AJt"></image> <text class="title">JavaScript</text> </div> <div class="cell"> <image class="thumb" src="http://t.cn/RGE3uo9"></image> <text class="title">Java</text> </div> <div class="cell"> <image class="thumb" src="http://t.cn/RGE31hq"></image> <text class="title">Objective C</text> </div> </div></template><style> .cell{ margin-top:10 ; margin-left:10 ; flex-direction: row; } .thumb { width: 200; height: 200; } .title { text-align: center ; flex: 1; color: grey; font-size: 50; }</style>

刷新网页,tech_list.js发生了变化,用文件比较器查看,变为内容如下:

可以看到,只要<template>标签之间有布局元素变化,weex就会自动修改与之对应的js文件,并将当前布局元素以json数据的形式呈现在与.we对应的.js文件中. 以此类推,<style><script>标签同理,不再敖述。

在手机上运行

接下来,我们将这段代码集成到安卓开发环境 将已经生成的js文件复制到AndroidStudio的assets目录下

在模拟器上运行,我们看到

发现没有显示图片,因为我们没有实现IWXImgLoaderAdaptersetImage方法 我们使用imageloader加载网络图片,代码如下:

public class ImageAdapter implements IWXImgLoaderAdapter { private static final String TAG = "ImageAdapter"; @Override public void setImage(final String url, final ImageView view, WXImageQuality quality, WXImageStrategy strategy) { //实现你自己的图片下载,否则图片无法显示。 Log.d(TAG, "setImage: url"+url); ImageLoader.getInstance().displayImage(url, view, new DisplayImageOptions.Builder() .cacheInMemory(Boolean.TRUE) .imageScaleType(ImageScaleType.EXACTLY) .bitmapConfig(Bitmap.Config.RGB_565).build()); }}

再次运行,图片就出来了

Weex中的变量定义和方法定义

以这段代码为例

<template> <div style="width: {{w}}; height: {{h}}; background-color: red;" onclick="update"></div></template><script> module.exports = { data: function () { return {w: 750, h: 200} }, methods: { update: function (e) { this.h += 200 } } }</script>

data中定义数据,类似于成员变量,methods定义方法,可以把module.exports看做一个类, update方法对成员变量h进行了自增200的运算,{{h}}是Vue.js的数据绑定语法,只要对h的值进行了变更,则会立即生效。

我们将这段代码在Playground中运行,如下图

手机顶部有一块红色区域,就是我们<template>标签中的<div>,这个<div>有一个点击事件,onclick="update"点击后会执行update方法,将变量h自增200,由于变量h是在<div>的height的值,因此点击后高度会自增200,若是之前安装了Playground手机程序,可以打开Playound App扫面右侧二维码,在手机上查看实际效果


ReactNative简单程序入门

环境搭建

安装Node.js,建议下载msi格式,它会自动配置环境变量,而exe需要手动配置安装Python2安装 Yarn、React Native的命令行工具(react-native-cli) npm install -g yarn react-native-cli安装Android Studio2.0及以上版本

第一个HelloWorld程序

命令窗口下执行:

react-native init AwesomeProjectcd AwesomeProjectreact-native run-android

Windows用户请注意,请不要在命令行默认的System32目录中init项目!会有各种权限限制导致不能运行!

手动运行Packager

有个常见的问题是在你运行react-native run-android命令后,Packager可能不会自动运行。此时你可以手动启动它:

cd AwesomeProjectreact-native start

如果你碰到了ERROR Watcher took too long to load的报错,请尝试将这个文件中的MAX_WAIT_TIME值改得更大一些 (文件在node_modules/react-native/目录下)。

打开AwesomeProject工程下的index.android.js文件,我们可以看到如下内容: 我们可以看到<View>标签中包含了三个<Text>标签,分别展示了三条文本内容,需要注意的是,每一个工程必须要有一个render() {}方法,他负责渲染页面,只返回一个直接子节点

正确写法:

render() { return ( <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> </View> ); }

错误写法:

render() { return ( <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> </View> <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> </View> ); }

在手机上运行

首先,我们需要用AndroidStudio打开AwesomeProject工程下的android工程 E:/reactnative_workspace/AwesomeProject/android 建议先将E:/reactnative_workspace/AwesomeProject/android/gradle/wrapper/gradle-wrapper.properties替换成已有的gradle版本,避免不必要的下载。 项目构建成功后,请确保packager服务已经打开,若未打开,请cd到工程目录下,执行react-native start,

如下图所示

表示packager服务已经启动成功。

我们运行AwesomeProject,如下图所示

index.android.js代码中的三个<Text>文本内容就展示出来了

现在你已经成功运行了项目,我们可以开始尝试动手改一改了:

使用你喜欢的文本编辑器打开index.android.js并随便改上几行 按两下R键,或是用Menu键(通常是F2,在Genymotion模拟器中是⌘+M)打开开发者菜单,然后选择 Reload JS 就可以看到你的最新修改。 在终端下运行adb logcat *:S ReactNative:V ReactNativeJS:V可以看到你的应用的日志。

React Native内置了对ES2015标准的支持,你可以放心使用而无需担心兼容性问题。上面的示例代码中的import、from、class、extends、以及() =>箭头函数等新语法都是ES2015中的特性。如果你不熟悉ES2015的话,可以看看阮一峰老师的书,还有论坛的这篇总结。


总结:作为一个Android程序员到底该选择weex还是ReactNative?

以上我们分别完成了Weex和ReactNative简单程序的编写,若以现在为时间点,做项目要选择其一,究竟两者该如何选择?

从学习资源上看 ReactNative更丰富

Weex相对而言则资料太少

从成功案例上看 ReactNative有很多成功案例

而Weex没有

从UI组件上看 ReactNative更丰富 Weex相对较少

从学习成本上看 ReactNative需要学习javascript,React.js,ES6 Weex需要学习javascript,Vue.js,ES6

对比图如下

对比项 Weex ReactNative
学习资源
从成功案例
UI组件 相对较少 较多
学习成本 一般 一般

上一篇:xib的加载

下一篇:File存储

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表