面试被问Weex ,初步了解Weex,你看我就够了。

前言

去年iOS职位面试,大多数面试官通常都挖这么一个坑,比如会问你,怎么看待 React Native ,会不会 Note.js 跨平台开发,知道 Weex 吗? 我相信多数没有准备过的面试者都折戟沉沙,或许这些技术,面试官也未曾亲自用过,那为什么面试官还要去问呢? 一方面:通过这个可以评估你个人的学习新知识的能力和对待新技术的态度。另外一方面: 也是最重要的,压你工资。 反过来,我们作为求职者,了解或者进一步掌握这些技术还是很有必要的。小编写这篇博客的目的,就是为了让一些初学者再面试的时候,不再因为 Weex 而困扰。


Weex是什么?

Weex 是阿里开源的一套构建跨平台的移动框架,可以类比 React NativeWeex 能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。
对于移动开发者来说,Weex 主要解决了频繁发版多端研发两大痛点,同时解决了前端语言性能差和显示效果受限的问题。开发者可通过 Weex 官网申请内测。
开发者只需要在自己的APP中嵌入 Weex 的SDK,就可以通过撰写HTML/CSS/JavaScript来开发Native级别的 Weex 界面。Weex 界面的生成码其实就是一段很小的JS,可以像发布网页一样轻松部署在服务端,然后在APP中请求执行。


如何使用Weex?


第0步: 安装Node.js

如果你之前安装过Homebrew,可直接通过 Homebrew 安装 Note.js 。Homebrew安装参考我 这篇博客

$ brew install node

或者去 Note.js 官网下载安装,选择 Mac 平台

下载完成后,打开pkg安装包,按照 步骤 一路点击 继续!

一直到最后一步

安装 Note.js 的同时会帮助我们安装好npm。 初步安装的同学可以使用:

$ node -v
v6.9.4

$ npm -v
3.10.10

node -v 和 npm -v 命令来测试 Note.js 环境是否搭建成功。


第1步: 安装weex-toolkit

这里使用npm来完成。因为npm之前已经安装好了。所以,直接拿来使用即可。

$ npm install -g weex-toolkit

安装过程如下:

如果你会发现很慢,可以考虑使用cnpm来安装了。首先,我们全局安装cnpm:

$ npm install -g cnpm

cnpm是一个国内淘宝npm镜像,可以提高下载速度。我们使用cnpm:

$ cnpm install -g weex-toolkit

安装过程中可能会提示权限错误问题,如下图

这时候加上sudo关键字即可:

$ sudo npm install -g weex-toolkit

然后输入你本机电脑密码即可,等待weex-toolkit安装完成后,输入:

$ weex –version
info 1.0.1-alpha

此刻说明,我们安装weex-toolkit成功。


第2步: 创建.we文件

Weex 程序的文件后缀(扩展名)是.we。因此我们创建一个.we的文件,可以使用touch命令创建文件.

$ touch hello.we

我们打开空白的hello.we文件,输入三个标签,内容为:

<template>
  <div>
    <text>Hello world</text>
  </div>
</template>
<style></style>
<script></script>

我们可以通过下图对比查看 Weex 是如何兼容Web开发的,以及支持的 标签样式

这种标签 对于Web前端的同学来说,再简单不过了,但对于iOS开发的前端小白来说,有一定的学习成本。后续,我们会做这方面的专题博客,这里我们假设hello.we 就是Web开发同事编写好的一个比较复杂完成的业务代码文件。

其实,这个时候,我们的程序基本上完成了,就是这么简单粗暴。但是这段代码是不能直接跑的。我们都知道.html是可以直接运行的,这个程序呢,缺少了html的载体。


第3步: weex-toolkit 编译代码

缺少html的载体,怎么办?使用weex-toolkit 下的 weex命令来编译我们的代码。这里,使用 Weex 命令编译hello.we文件

$ weex hello.we

这时,会发现浏览器被打开了,浏览器地址是:

http://127.0.0.1:8081/weex_tmp/h5_render/?hot-reload_controller&page=hello.js&loader=xhr

OK,我们会看到浏览器显示了:Hello world 字样,以上就是使用 Weex 开发 Web页面的原理。

.html文件载体在哪?

我们既然运行了程序,那么一定有一个.html作为程序入口。其实,weex-toolkit给我们生成了相关文件。我们可以到hello.we同级目录下查找,就会发现有一个weex_tmp文件。该文件夹就是生成的可以执行的浏览器代码。


第4步:搭建iOS环境配置,生成js文件

如果你需要将 Weex 开发的Web页面加载到iOS客户端,需要搭建 Weex 在iOS环境配置,生成js文件。

iOS环境搭建中我们使用Cocoapods环境,执行一下命令:

$ vim Podfile

在Podfile文件中加上pod ‘WeexSDK’、pod ‘SocketRocket’ 如下:

编写完Podfile文件执行

$ pod install

导入成功后,将WeexSDK框架中的main.js拖到工程文件夹里面,操作过程如下图所示:


将刚刚的 hello.we 文件转化为 iOS端的 js文件 执行如下命令行

$ weex hello.we -o hello.js

把生成的js文件 拉到我们的项目目录下

我们来看一个 iOS客户端接入 Weex 的demo,我们以一个页面的部分区域使用 Weex 为例,在AppDelegate.m文件中做如下配置:

#import "AppDelegate.h"
#import <WeexSDK/WeexSDK.h>

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // 参数初始化
    [WXAppConfiguration setAppGroup:@"AliApp"];         // 项目组织名称
    [WXAppConfiguration setAppName:@"ZYY_WeexStudy"];   // 项目名称
    [WXAppConfiguration setAppVersion:@"1.0.0"];        // 项目版本
    [WXSDKEngine initSDKEnviroment];                    // 初始化SDK环境
    [WXLog setLogLevel: WXLogLevelAll];                 // 输出日志
    return YES;
}

在.m文件中导入WXSDKInstance.h文件,并添加相关属性,如下图所示:

#import "ViewController.h"
#import <WeexSDK/WXSDKInstance.h>

@interface ViewController ()

@property (nonatomic, strong) WXSDKInstance *instance;
@property (nonatomic, strong) UIView *weexView;
@property (nonatomic, strong) NSURL *jsUrl;

@end

在ViewController.m文件中

- (void)viewDidLoad {
    [super viewDidLoad];

    // 添加一个原生按钮
    self.view.backgroundColor = [UIColor whiteColor];
    UIButton *testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 64, 200, 100)];
    [self.view addSubview:testButton];
    [testButton setTitle:@"原生模块" forState:UIControlStateNormal];
    [testButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

    if (!self.jsUrl) {
        return;
    }
    [self render];
}

- (void)render {

    CGFloat width = self.view.frame.size.width;
    self.instance = [[WXSDKInstance alloc] init];
    self.instance.viewController = self;
    self.instance.frame = CGRectMake(self.view.frame.size.width-width, 200, width,     self.view.frame.size.height);
    __weak typeof(self) weakSelf = self;
    self.instance.onCreate = ^(UIView *view) {
        [weakSelf.weexView removeFromSuperview];
        weakSelf.weexView = view;
        weakSelf.weexView.backgroundColor = [UIColor purpleColor];
        [weakSelf.view addSubview:weakSelf.weexView];
    };
    self.instance.onFailed = ^(NSError *error) {
        NSLog(@"加载失败");
    };
    self.instance.renderFinish = ^(UIView *view) {
        NSLog(@"加载成功");
    };

    //[self.instance renderWithURL:self.jsUrl options:@{@"bundleUrl":[self.jsUrl absoluteString]} data:nil];
    [self.instance renderWithURL:self.jsUrl];
}

// dealloc 里调用一下 destroyInstanc 来销毁 weex 实例,不然会内存溢出。
- (void)dealloc {
    [_instance destroyInstance];  
}

- (NSURL *)jsUrl {
    if (!_jsUrl) {
        _jsUrl =  [[NSBundle mainBundle] URLForResource:@"hello" withExtension:@"js"];
        // 这里 加载我们放在本地的 js文件,也可以是网络获取的js。
    }
    return _jsUrl;
}

OK!!!然后运行项目,就成功了! 效果如下:

从上述的逻辑来看,应该可以推敲出, Weex 渲染结果显然需要一个UIView来承接,最后再将这个UIView覆盖到系统的view,所以理论上,你可以生成多个 Weex 的instance,来拼凑页面,只需要设置好frame即可。

到此, Weex 可以将你用Web技术写好的页面,同时呈现在iOS客户端对应的View中。不过,一个应用如果都是纯展示,那么到此就结束了,但往往不是。也许,你还需要各种各样Native的能力,也许Native也需要各种各样JS的能力, Weex 为我们提供了多少种方式来协调,我们下篇博客再介绍。

初步了解以上这些,当面试官在问到 Weex 的时候,我相信大伙都心里有底了。更多 Weex 的知识,后续将持续更新,请关注我的博客。

更多iOS技术交流
请加群: 553633494

猜你喜欢

转载自blog.csdn.net/u014641631/article/details/54407396