weex_weex超出隐藏 - CSDN
精华内容
参与话题
  • Weex 简介

    2020-06-18 21:08:48
    最近项目在改造,尝试使用weex代替原有的H5 和原生页面,提高系统运行效率。期间遇到了很多坑,后面会仔细讲讲,先来看下weex的基本信息。 一、什么是weex "weex是一个可以使用现代化的 Web 技术开发高性能原生...

    最近项目在改造,尝试使用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 官网

    展开全文
  • Weex 入门这一篇就够了

    万次阅读 多人点赞 2018-03-10 11:06:09
    一:Vue.js 了解 Vue.js 环境配置 (1) 安装 nodejs (2) 安装 webpack : npm install webpack -g (3)安装 vue-cli 脚手架:npm install vue-cli -g ...(1)vue init webpack vue-hello ( vue-hello 为项目...

    一:Vue.js 了解

    Vue.js 环境配置

    (1) 安装 nodejs

    (2) 安装 webpack : npm install webpack -g

    (3)安装 vue-cli 脚手架:npm install vue-cli -g

    Vue.js 项目创建

    (1)vue init webpack vue-hello ( vue-hello 为项目名称 )

    (2)cd vue-hello

    (3)npm install

    (4)npm run dev 或 npm start

    这里写图片描述

    Vuejs 项目结构

    这里写图片描述

    二:Weex 入门

    Weex 环境配置

    (1)全局安装 weex-toolkit : npm install weex-toolkit -g

    (2)将 weex 安装路径配置至系统环境变量中: C:\Program Files\nodejs\node_cache

    ​ weex - v,显示版本表示安装成功:

    C:\Users\jiuya>weex -v
       v1.2.9
     - weexpack : v1.1.5
     - weex-builder : v0.3.14
     - weex-previewer : v1.4.6

    这里写图片描述

    Weex 创建项目

    (1) 创建 weex 空项目:weex create weex-custom-extends ( weex-custom-extends 为项目名称)

    (2) 进入到项目根目录: cd weex-custom-extends

    (3) 安装依赖的第三方 js 包:npm install

    (4) 启动本地 web 服务,浏览器预览渲染效果:npm start

    这里写图片描述

    (5) 添加 Android 或 iOS 平台:weex platform add android 或 weex platform add ios

    这里写图片描述

    (6)运行:weex run android

    这里写图片描述
    这里写图片描述

    Weex debug 调试

    (1) 命令: weex debug ,浏览器自动打开待调试的页面。

    这里写图片描述

    这里写图片描述

    (2) 使用 weex playground app 扫描二维码,扫描成功后,浏览器自动跳转到下面页面,点击下图框中的二维码,并使用 weex playground app 扫描,即可开始调试待 debug 的页面。

    这里写图片描述

    (3) 扫描框中二位码成功后,即看到下面页面。

    debug app success

    Weex 扩展

    module 扩展

    (1) Android Studio 创建 Android Project ,并添加相关依赖

    (2) 新建 PhoneInfoModule.java , 集成自 WxModule

    
    public class PhoneInfoModule extends WXModule {
    
        /**
        * 获取 Phone 相关信息,并回调给 weex
        */
        @JSMethod(uiThread = false)
        public void getPhoneInfo(JSCallback callback) {   // JSCallback 为 WeexSDK 中的 API
            Map<String, String> infos = new HashMap<>();
            infos.put("board", Build.BOARD);
            infos.put("brand", Build.BRAND);
            infos.put("device", Build.DEVICE);
            infos.put("model", Build.MODEL);
            callback.invoke(infos);
        }
    
        @JSMethod(uiThread = true)
        public void printLog() {
            Toast.makeText(mWXSDKInstance.getContext(), "item clicked", Toast.LENGTH_SHORT).show();
        }
    
    }

    扩展 component

    public class RichText extends WXComponent<TextView> {
    
        public RichText(WXSDKInstance instance, WXDomObject dom, WXVContainer parent) {
            super(instance, dom, parent);
        }
    
        @Override
        protected TextView initComponentHostView(@NonNull Context context) {
            TextView textView = new TextView(context);
            textView.setTextSize(20);
            return textView;
        }
    
        @WXComponentProp(name = "tel")
        public void setTel(String number) {
            SpannableString spannableString = new SpannableString("tel:" + number);
            ImageSpan imageSpan = new ImageSpan(getContext(), R.mipmap.phone);
            spannableString.setSpan(imageSpan, 0, 4, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            getHostView().setText(spannableString);
        }
    }
    

    (3) 在 Application 中进行注册

    public class WXApplication extends Application {
    
      private static final String TAG = "WXApplication";
    
      @Override
      public void onCreate() {
        super.onCreate();
        InitConfig config = new InitConfig.Builder().setImgAdapter(new ImageAdapter()).build();
        WXSDKEngine.initialize(this, config);
        String packageName = getPackageName();
        Log.d(TAG, "onCreate: packageName  =" + packageName);
        try {
          // 注册扩展 module  
          WXSDKEngine.registerModule("phoneInfo", PhoneInfoModule.class);
          // 注册扩展 component  
          WXSDKEngine.registerComponent("richText", RichText.class, false);
        } catch (WXException e) {
          e.printStackTrace();
        }
      }
    }

    (4) 在 vue 中引用自定义的 module,component

    <template>
        <div class="wrapper">
            <image :src="logo" class="logo" @click="print"/>
            <text class="greeting" @click="getPhoneInfo">The environment is ready!</text>
            <!--扩展component-->
            <richText tel="10086" style="width:200px;height:100px"></richText>
    
            <HelloWorld/>
        </div>
    </template>
    
    <script>
        import HelloWorld from './components/HelloWorld.vue'
    
        const modal = weex.requireModule('modal');
        const phoneInfo = weex.requireModule('phoneInfo');
    
        export default {
            name: 'App',
            components: {
                HelloWorld
            },
            data() {
                return {
                    logo: 'https://gw.alicdn.com/tfs/TB1yopEdgoQMeJjy1XaXXcSsFXa-640-302.png'
                }
            },
            methods: {
                // 调用 PhoneInfoModule 中的 printLog()
                print() {
                    phoneInfo.printLog();
                },
                // 调用 PhoneInfoModule 中的 getPhoneInfo(),并回调给 weex
                getPhoneInfo() {
                    phoneInfo.getPhoneInfo(function (e) {
                        modal.alert({
                            message: JSON.stringify(e),
                            duration: 0.3
                        })
                    });
                }
            }
        }
    </script>
    
    <style scoped>
        .wrapper {
            justify-content: center;
            align-items: center;
        }
    
        .logo {
            width: 424px;
            height: 200px;
        }
    
        .greeting {
            text-align: center;
            margin-top: 70px;
            font-size: 50px;
            color: #41B883;
        }
    
    </style>
    
    

    (5) npm run build 编译 vue ,将生成的 js 拷贝至 Android Studio 的 assets 目录中

    run weex

    运行结果:

    res

    展开全文
  • 先说结论,本人极度非常不推荐weex作为任何商用开发有很多人会说了... 你瞎扯.. 你看别人阿里.. 啊飞猪... 啊那个支付宝... 人家不是用得好好的么...当然这也是我们公司作为技术选型的考量.. 三端通用.. 阿里系的app...

    先说结论,本人极度非常

    不推荐weex作为任何商用开发


    有很多人会说了... 你瞎扯.. 你看别人阿里.. 啊飞猪... 啊那个支付宝... 人家不是用得好好的么...

    当然这也是我们公司作为技术选型的考量.. 三端通用.. 阿里系的app全线在用.. 理论上是可以实现的.. 而且我们在编码过程中.. 可以把IOS工程师,安卓工程师和前端工程师以及部分熟悉一点前端的后端工程师都拉过来贡献一套代码.. 代码质量可以得到保障

    现在想想只能说... 太天真了... 你也不想想人家阿里有多少大牛有多少人在做这个项目.. 再说淘宝都卡成啥样了大家还是愿意用.. 如果你的项目这样卡两下你的app是否还能像淘宝那样拉住顾客??

    这就像你说你想写一篇巨著... 你打算用英文写... 翻译成中文 俄文 日文(ios android web)... 让人看了还能把别人国家的感动得稀里哗啦的.. 本身难度就会不小.. 

    另外你在android中打开布局边界看一下天猫飞猪... 里面weex的界面已经只剩下很少的界面了.. 很多界面已经替换成了原生或者webview的混合界面... 做得那么杂用户体验还过得去.. 我只能说一句.. 阿里牛逼=.= ... 所以很明显的一个信息就是.. 这个技术连他们自己人都不广泛使用了.. 可见还是有很大的局限性的..

    而且随着项目持续增大.. weex项目的编译时间会呈指数型上升.. 这样的编码体验.. 说糟糕都是在侮辱糟糕这个词... 所以也请大家慎重考虑

    如果你们已经决定使用weex.. 或者正准备用它构建三端应用... 那么.. 希望我的踩坑指南可以帮到你.. 从入门到放弃...


    一.开始准备

    搭建开发环境

    首先根据官网的提示安装node.js weex-toolkit  然后就可以开始创建项目了.. 你可以选择RN的rex 或者前端的VUE模式写代码都是可以的.. 但是我们用的是vue.. rex也考虑过.. 只是没人会写RN.. 加上网上weex+RN的例子很少.. 所以就放弃了.. 

    如果是在windows上的话.. 安装的东西都是需要配置环境变量的... 

    D:\nodeJs\npm;D:\nodeJs\node.exe;C:\Users\jupiter\AppData\Roaming\npm;C:\Users\jupiter\AppData\Roaming\npm\node_modules\weex-toolkit\bin\weex.js;C:\Users\jupiter\AppData\Roaming\npm\node_modules\weexpack\bin\weexpack.js;C:\Users\jupiter\AppData\Roaming\npm\node_modules\weex-toolkit\node_modules\weex-previewer\vue-template\template\assets\vue.js


    分享一下我的环境变量里的东西.. node weex npm这些是必须要配置进去的... 如果不配置的都是用不了的.. jupiter是我windows的用户名 其他的大家自己看一下它给安装到什么路径下了.. 尤其是weex和weexpack是默认的一个路径 层级还很深.. 仔细找找配置进去..

    另外推荐个飞猪开源的UI框架 weex-ui 

    weex-ui

    总体来说这个UI框架还是能帮上一些忙的.. 但是里面本身就有些问题.. 比如其中utils中的getPageHeight的高度.. 在web上是对的.. 但是手机上... emmmm... 会少一些高度.. 大约是88px... 原因不明.. 可能是android里面使用的默认的toolbar... 但是他自动帮你减掉了.. 但实际上没有toolbar.. 这个高度就少了..


    二.开始踩坑


    至于如何写vue代码或者简单的helloworld.. 百度上都能查到... 我就不再赘述了.. 这里只说些百度不到的坑或者旧坑解决方法已经无效的问题..  如果你觉得你会写vue到此就万事大吉了要开始构建三端应用了... 那么我得先给你泼一盆冷水了... 大哥.. 你跳个界面给我看下..

    1.界面跳转

    你会说:切 不就跳界面么.. 看我一手startActivi... vi... 

    vi你个头..  

    在这里的跳转需要使用navigator 去实现.. 原理上这个东西是做了各端的特殊处理的.. 在web上比较像vue router.. 也就是单页跳转.. 而在android上则是通过隐式去拦截对应的url类型.. 如果是http和https开头的.. 会用webview去打开.. 如果是files开头的... 呵呵.. 你就发现它没动静了...

    这里再吐槽一手weex不适合商用的原因... 完全没有社区... 这是最骚的... 所以遇到很多问题只能自己去看源码或者百度... 而且百度好多东西都是基于旧版本的.. 你用上就发现.. 写得什么玩意 根本没效果嘛..


    跳转就是我们遇到的第一个大坑.. 百度上都说.. 可以用vue router.. 然后我们试了之后发现.. vue router在移动端上根本不是真的界面跳转.. 只是一个单页面.. 每次都重新加载.. 没有跳转动画.. 这对于app的效果来说是完全不能接受的..

    而另一方面网上说用navigator的实现.. 在跳转本地界面的时候都不生效.. 

    我们编码的地方在src里.. 在使用npm build(npm run 或者weex run android等都会先build)后会生成一套JS文件存在dist里.. 而网上说的只要用navigator打开里面编译生成的js文件就可以实现跳转.. 实际上打开后.. 并不行..

    那么在新版本的weex里要怎么做呢.. 我们试了好久后.. 受到首页的地址是index.html的启发.. 发现使用src对应目录下的vue文件地址把后缀改成html即可实现web跳转... 比如你首页的地址是http://192.168.2.17:8081/index.html... 那么你需要打开components下的home.vue界面  那地址就是 http://192.168.2.17:8081/components/home.html ...
    网页跳转正常了 .. 当我们欢呼雀跃准备继续时.. 发现手机上又跳不了... 

    在项目目录下运行

    weex platform add android

    你的项目就可以用 weex run android运行在安卓手机上了... 

    网上好多说需要找到本地资源文件夹下的地址即可跳转.. 在android中.. 确实发现assets文件夹下有这些界面的js文件.. 


    只要用 file://assets/dist/在安卓中找到这个文件跳转就可以了.. 然后再次发现是无效的.. 但是发现跳转http和https在手机上是有效的.. 那么也就是说隐式调用没有拦截到这file这个请求..


    但是明明在android项目的manifast里是已经在拦截file的.. 最后发现确实file是拦截不到的.. 其他什么关键字都可以.. 那么怎么办呢.. 最后我只能在地址前面加上别的关键字local 但是让隐式拦截local关键字.. 最后再activity里再把local给去掉 用file地址去渲染..


    最终获取三端对应跳转地址的方法 (注意安卓中前面添加了local是为了给拦截)

    getJumpBaseUrl(toUrl) {
    
            var bundleUrl = weex.config.bundleUrl;
    
            var isnav = true
            bundleUrl = new String(bundleUrl);
            var nativeBase;
            var native;
            var isAndroidAssets = bundleUrl.indexOf('file://assets/') >= 0;
            var isiOSAssets = bundleUrl.indexOf('file:///') >= 0 && bundleUrl.indexOf('WeexDemo.app') > 0;
            if (isAndroidAssets) {
                nativeBase = "local://" + 'file://assets/dist/';
                native = nativeBase + toUrl + ".js";
            } else if (isiOSAssets) {
                nativeBase = bundleUrl.substring(0, bundleUrl.lastIndexOf('/') + 1);
                native = nativeBase + toUrl + ".js";
            } else {
                var host = 'localhost:8081';
                var matches = /\/\/([^\/]+?)\//.exec(bundleUrl);
                if (matches && matches.length >= 2) {
                    host = matches[1];
                }
    
                //此处需注意一下,tabbar 用的直接是jsbundle 的路径,但是navigator是直接跳转到新页面上的.
                if (typeof window === 'object') {
                    nativeBase = 'http://' + host + '/';
                } else {
                    nativeBase = 'http://' + host + '/';
                }
    
                native = nativeBase + toUrl + ".html";
            }
            return native;
        }

    android manifest 中拦截local

          <activity
                android:name="com.weex.app.WXPageActivity"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
    			
    			>
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <action android:name="com.alibaba.weex.protocol.openurl"/>
    
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="com.taobao.android.intent.category.WEEX"/>
    
                    <data android:scheme="http"/>
                    <data android:scheme="https"/>
                    <data android:scheme="local"/>
                </intent-filter>
    
    
    
            </activity>

    android java code中把local头给去掉 拿file地址去渲染


    把local关键字给替换掉.. 然后其他的和原来操作一样

    这样在android上的跳转才算解决了

    如果你看到这个坑就已经准备放弃了.. 我只能说.. 施主 回头是岸.. 如果你觉得还想挑战一下.. 那么继续看后面的坑吧..

    2.控件太少 基本只能实现最基本的效果

    第二个大坑就是控件过于少.. 很多效果在weex中你是没法实现的.. 或者说不是一般人可以实现的... 除非你是真的精通三端的技术大牛.. 不然你要掂量一下自己的项目.. 是不是有地图.. 是不是有其他动画.. 是不是有weex-ui中没有的效果.. 如果有.. 那么是否有替代方案或者对UI的要求高不高..能不能接受替换.. 是否有自己封装控件的经验..


    就算你要自己做.. 还有一个事情你必须知道..

    那就是

    什么意思呢.. 就是说滑动事件获取是不靠谱的.. 甚至在weex-ui的slide-nav(视窗增大)中看到了类似的备注


    之前还考虑过希望封装个类似ios picker的效果... 看到这个之后就放弃了.. 滑动事件的监听都不靠谱的话.. 很多效果就算要自己封装也是不太可能呢..

    3.滚动控件滑不动

    在weex 中提供了好多种滚动控件 包括list scroller 但是一开始使用的时候发现都滑不动... 后来才发现.. 如果不给这些控件指定高度.. 那么它会包裹内容高度.. 那么内容高度和控件高度相同也就不可以滑动了... 控件已经顶出屏幕了你也不知道.. 那么对于这些滚动控件是必须指定高度的... 但是高度怎么拿呢...

    weex的规则是屏幕宽度是750px 而高度是根据宽高比算出来的.. 也就是高度是不固定的.. weex-ui中的utils中有获取屏幕高度的方法.. 但是就是开头提到的问题.. android上回少88px;

    所以只能自己封装个获取高度的方法

    import {Utils} from 'weex-ui'       
    
     const screenHeight = Utils.env.getPageHeight() ;
            const androidNavHeight =  Utils.env.isAndroid() ? 88 : 0;
            return screenHeight +androidNavHeight;

    用这样的方法获取的高度.. 再设置给scroller才可以使用.. 当然如果你的界面里还有其他控件.. 高度还要再减去那些.. 不然scroller会包裹内容高度..

    4.前端代码不是全部可靠的


    在官网上写出了几种不支持的样式, 百分比是不支持的.. 包括我之前用的border 50% 去绘制圆形.. 到app上会变成50px.. 另外用border绘制三角形之类的都是不可靠的.. 在web上可以实现.. 到手机上就雪崩了.. 所以如果你是前端过来的同学.. 不要什么vue的骚操作都往里套.. 它并不是真正意义上的前端代码.. 所以还要对不同系统去调整适配问题... 所以你的团队中最少的需要有三端都懂的人才可以用.. 而不是说你懂前端就闷头写.. 最后web没问题了.. 在android和ios上都运行不起来.. 最后debug都不知道从哪做起... 展开记录一下那些写法是不可以的..

    4.1.dom document对象不可用

    在前端中也许会有类似

             var mo = function(e) {
                e.preventDefault();
             };
             document.body.style.overflow = 'hidden';
             document.addEventListener("touchmove", mo, false); //禁止页面滑动

    的代码来实现禁止页面滑动.. 在网页中如果内容超过了浏览器高度便可以滑动.. 如果你想禁用掉这个滑动便会涉及到以上的代码.. 但是这个代码在手机上会报 render error:-2013

    实际上就是js中找不到这个对象.. 所以这个写法是不可用的

    另外.. 所有的类似空指针的操作.. 在网页上是可以显示的.. 但是在android中.. 会报出上面所说的render error:-2013的错误... 而且不知道如何定位这个错误在哪.. 所以解决报错也是个比较头疼的问题.. 最好拿每天的代码都跑一下手机看看是否有类似报错.. 不然层级太多了都不知道这个错是哪里来的...

    4.2.css代码如百分比不可用

    在前端中画圆你可能会用到 border-width:50% 这样的代码来实现一个节点的圆形... 但是这在手机上也是不可用的... weex官网上有解释.. 类似width这种传数字的无论你传什么单位都会被转成px ... 所以以上代码的实际效果就是50px的圆角了... 如果要实现圆形.. 还是要自己传定死的半径进去..

    具体还有不可用的css写法参考 :   css支持

    4.3.list中必须使用cell标签才可以显示

    在网页中.. list中的布局无论放什么都是可以正常展示的.. 但是在手机中... 不用<cell> 包裹的话.. 内容是不予展示的.. 这样设计的考虑可能是涉及到一个复用机制... 在手机中无论是IOS的TableView还是android的listview Recyclerview中的item都是要复用的.. 不然在手机中反复生成item会导致oom.. 所以cell包裹的内容会被复用.. 没被cell包裹的将不会被复用.. 且在list中不显示.. 主要是防止未复用的item过多导致oom所以强制使用的吧

    4.4.很多标签在手机上不支持部分基础css属性

    现在发现的主要是在android上margin属性在<cell>标签中是无效的.. 所以要使用margin需要在cell中再使用div包裹一层.. 

    讲道理margin这种基础css属性应该在所有标签上都是生效的.. 但是实际却不是.. 文档中也没有相关提示

    5.vue的mvvm控件内部双向绑定问题

    vue对于前端的同学可能不会陌生... 这是一个类似mvvm思想的框架,也就是说.. 视图直接和数据绑定了... 在数据改变时直接改变控件对应的视图状态,如下


    前面也说过weex是用vue完成代码再在手机上去用原生控件渲染的...

    但是vue中会涉及到一个内部控件去改外部参数的问题...如 点击打开链接

    控件内部希望修改props中传进来的参数去控制外部状态时.. 会报出 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "xxxx"(参数名) 

    然后外部参数并没有改变.. 只是内部的变量改变了..

    那么怎么办呢.. 其实在vue中可以传入对象作为参数... 而props中的参数是不可变的.. 也就是传入的对象是不可被改变的 但是对象中的参数是可变的..


    我的做法就是传入data整个对象.. 里面包含了checkPosition属性... 这样就可以在js中对外部的属性进行修改了

    6.android中picasso版本太旧导致部分https地址图片加载有问题

    在android项目中对image标签中的地址图片.. 实际上是在用picasso加载的.. 但是它的版本已经比较旧了.. 好像是2.5.2的... 之前还以为是服务器上的图片处理有问题..  后来在排错之后发现是picasso旧版本对https支持不太好 ... 只要把旧版本的picasso升级.. 再extend下的ImageAdapter的代码用picasso的新版api加载图片.. 就可以解决这个问题了.. 不过也许你也遇不到这个问题.. 并不是所有的https下的图片都不可加载..

    7.血坑!! 编译速度过慢

    这个是最近才越来越明显感受到的一个问题.. 随着项目变大.. 编译速度会指数型上升.. 前期编译一下几秒.. 后来编译一下半分钟... 现在项目基本没五分钟跑不起来了.. 而且项目是没有布局预览的.. 也就是说你改一下布局想看看效果..就要付出五分钟的代价.. 太痛苦了.. 这个应该作为团队技术选型时的重要考虑点.. 是否真的为了不是很完美的三端通用.. 去浪费茫茫多的编译时间...

    解决:后来发现在安卓手机编译的速度会比较快一些.. 大约30秒左右... 算是可以接受吧... 起码比五分钟好多了..

    三.结论

    暂时遇到的坑就这些 .. 但是还是那句话..

    别拿weex来做商用!! 坑太多!!!

    我这个项目已经入坑了只能硬着头皮做下去.. 后面有新坑我还会回来更新的..

    比较完整的学习项目目前只找到

    网易严选demo

    这个项目是用vue router做的跳转.. 没有用navigator实现真正的多页应用.. 不过里面的vue+js+css代码还是有很多可以参考的地方的...

    四.后记

    最终还是和老大商量用安卓原生重做整个app了... 如大家所见.. 上面茫茫多的问题.. 记录一下我们竭尽所能仍未解决的一些问题吧.. 希望大家引以为戒..

    1.入口如何修改?

    在目录中就一个index文件作为入口.. 但是对于app来说应该会有所判断的.. 如区分有token和没有token的情况... 但是始终没有找到如何修改或能判断入口的地方..

    2.兼容性问题巨大

    在安卓4.4上.. 某些文字在离开界面再返回时直接会不见... 而高度在安卓上也会乱跳... (之前提到的减去88px并不是可靠的).. 因为滚动控件必须要限定边界... 所以逐渐就没有很好的解决方案了..

    3.模板内部的点击和滚动事件失效

    在component内部分点击和滚动事件直接无响应.. scroller中的布局也从水平的变成竖直的了...(在网页中都是正常的)... 现在已经决定放弃这个框架了也就懒得去排错了... 反正就是布局和手势在component中引用会有很大的问题...

    4.没有很好的debug手段

    由于他的代码在手机和网页中并不是都可用的... 所以难免在手机中会报很多错.. 但是错误会直接在界面上写个render error:-2013就停止执行了.. 完全看不到错误提示.. 也没有debug模式.. 在网页中又好端端的... 所以遇到一个小错就是半小时一小时.. 如此时间成本.. 做出来一个项目怕已经到了明年..


    本次weex的探索之旅就到此结束了... 所以不稳定的技术真的不要瞎用.. 代价很大..

    展开全文
  • 阿里妹导读:本文主要为大家介绍飞猪 Weex 技术体系从无到有的过程,包括 Weex Ui 组件库的开发和发展,重点分享在 Weex Ui 层建设的一些经验,希望能对大家有所启发。 文章较长,首先放上 Weex Ui 的...



    阿里妹导读:本文主要为大家介绍飞猪 Weex 技术体系从无到有的过程,包括 Weex Ui 组件库的开发和发展,重点分享在 Weex Ui 层建设的一些经验,希望能对大家有所启发。


    文章较长,首先放上 Weex Ui 的开源地址,欢迎大家提PR,同时也可以通过 Star 来表示你的喜欢。(https://github.com/alibaba/weex-ui)



    分享嘉宾:侑夕 阿里巴巴高级前端工程师

    Why Weex ?

    Weex vs H5

    我们为什么选择Weex作为我们首要的跨端开发技术呢?

    写过H5的同学肯定会被它的简单高效发布即更新一条URL可适配多端等这些所吸引,但写过 Native 的同学肯定也会被 Native 的富交互性能体验可调用原生能力可管理内存等特性给我们的业务带来更好的体验。

    快和体验想同时兼得

    飞猪前几年也一直在这个方向上面探索。

    包括最开始的 Hybrid 开发,通过 Bridge 提供部分 Native 能⼒来提升 H5 体验,譬如我们在H5里面可以直接获取App的定位信息、使用相机、播放视频、导航跳转等能力,业界也有Cordova、Ionic、Meteor这些成熟的方案。


    还有利用离线包体系通过提前将资源⽂件下载,访问时路由拦截加载本地资源,让我们的H5页面可以达到秒出、动态更新、弱网可用效果,内部有手淘Zcache、飞猪信鸽、支付宝九州这些成熟的系统。

    等到了16年左右,跨平台开发技术逐渐火起来后,一种全新的开发思路吸引这我们,也即用JS来写Native,⽤ Web 的开发体验构建⾼性能、可扩展的 Native 应⽤,同时真正获取上述所说的体验

    业务对比分析


    那么为什么会选择 Weex 呢?其实和飞猪业务特点很有关系,同时又可以很好解决这些痛点。

    飞猪业务迭代速度快,也需要快速上线;同时很多时候景点和海外弱网使用,同时要体验良好;

    其中最重要的一点是多容器接入,适配飞猪、手淘、天猫、支付宝,也即我们一次重要业务的开发需要一个iOS、一个Android同学来开发两端,同时由一个H5同学来开发兼容手淘、支付宝、UC的 Web 版本,也即一次业务发布涉及到多端同时开发、上线。



    Weex 其实很好的解决了上述的一些问题,包括在飞猪、手淘、天猫 Weex环境下完全 Native体验,同时Bundle 资源大小较 H5 小很多,加上富交互体验、长列表性能好非常适合商品列表页面和双十一场景,最重要的是真正让我们从3个人的开发减少到了1个人,其他2个人可以去做更多有意义的事情。

    接下来我们可以从下面这个展示来看Weex和H5业务的一个展示、数据对比:


    这是一个业务逻辑复杂的页面,包括筛选、排序、日历选择、收藏、长列表、业务逻辑也很复杂的页面,重构成Weex以后,我们首屏可用时间降级68%、Bundle大小直接减少了73%,由于体验变好变快、让我们页面转化率居然提升了14.5%。


    以上也就是我们为什么选择Weex作为我们跨端开发的一些重要原因,接下来介绍的是飞猪的weex 技术体系。


    飞猪 Weex 技术体系

    架构图


    可以从底层一直往上看,底层由我们APP的Framework / Libraries / OS Kernel等组成,我们在Weex的上下层和手淘、天猫一起设计出一套统一的Api设计,包括接口请求、数据埋点、路由跳转、网络状态、支付功能、导航栏定制等这一系列的通用服务,在 Weex 上面我们封装了Weex Ui组件库、业务组件库、UPX搭建营销模块、还有抹平多端差异的 Util 函数库,这样在我们上层可以长出我们众多的业务。

    由于 Weex 在我们这边和 H5 一样,都是当做页面来发布、而不是一个 View 里面写很多子View来组织,同时也很不建议大家使用vue-router来管理,更多的使用多页面来跳转体验会更好。

    说到构建发布流程,我们统一通过Clam来对我们项目进行初始化、构建、debug、预发、发布等工作,同时在上线方面直接通过Awpp命令来直接发布页面到CND,同时可以通过信鸽将离线资源推送到APP,运营同学也可以直接通过搭建的方式将页面发布出去。

    Weex 页面如何在飞猪、手淘、支付宝进行多端投放 ?

    那你可能会问 Weex 页面如何在飞猪、手淘、支付宝进行多端投放呢?


    第一种为通过前端 URL 参数决定渲染为 Weex 还是 H5

    xxxx.html?_wx_tpl=xxxx.js:前面为降级时的 H5 地址, 后面 _wx_tpl 带的参数代表 Weex JS 地址, 当容器发现 URL 带有 _wx_tpl 参数时, 会下载后面的 JS 地址然后用 Weex 容器渲染。

    第二种为通过服务端返回内容决定渲染为 Weex 还是 H5

    xxxx?wh_weex=true:前面可以是 JS 地址也可以是 H5 地址,后面是固定的参数 wh_weex=true,当容器发现 URL 带有 wh_weex=true 时, 会请求前面的 xxxx 地址, 如果发现响应的 mime type(HTTP header content-type)为 application/javascript,则使用 Weex 渲染返回的内容, 否则使用 WebView 渲染成 H5。

    飞猪 Weex 业务大盘




    Weex 并不是像外界某些人传言说没有什么公司在使用Weex的,反而是超过你的想象,以上是我们这边17年12月份前的一个相关weex页面的一览,大家可以在飞猪、手淘、支付宝里面找到这些页面,均是一份页面同时投放到多端的。


    什么业务适合用 Weex ?

    包括众多的营销业务、首页、频道、搜索列表、正向流程、简单详情、富交互页面都是很适合使用Weex来开发的,同时在我们这边也有一个对应的原则包括 展示类项目优先使用 Weex、重构/新项目优先使用 Weex、深度垂直类目尝试使用 Weex。

    Weex 不适合复杂场景 ?


    大家可以看下如下这几个场景的视频演示:

    大家可能会觉得Weex不适合复杂的场景,其实也不一定,通过很多方式是可以做到复杂场景的支持,包括双11超长列表滚动,30多屏数据,快速滚动很顺滑。


    同时包括逻辑异常复杂、多组件的国际机票列表页,Weex 同样也可以胜任;包括图3富交互的使用场景,粘手效果的丝滑拖动,快速滑动,动态隐藏头部等等功能都是可以做到的。

    通过在我们这边很多业务场景的使用 Weex 踩坑 最佳实践的积累,其实有很多东西可以沉淀下来 通过封装的方式给后续其他业务使用,这样让后面的业务可以达到快速生产,这也是我们建议Weex Ui 组件体系一个很大的原因。

    Weex Ui 的发展和开源

    为什么要建立 Weex Ui 组件库体系 ?

    • 在引入 Weex 初期,通过 Weex Ui 让未接触 Weex 的同学对其编写有借鉴作用

    • 提炼业务中的公共组件,便于直接引用,提高大家开发效率

    • 业务规范、视觉规范、最佳实践的及时同步

    • 将 Weex 业务中的疑难杂症通过组件封装,对外只暴露简单逻辑


    Weex Ui 一览

    经过一年多的建设,我们一步一步将 Weex Ui 优化,整理,最终进行了开源,通过下图可以看到 Weex Ui 是怎么来的。


    目前 Weex Ui 组件库包括7大类31个成熟的组件,同时并不是直接开源给大家使用,而是在内部已经使用了1年多后稳定后开源给大家使用,大家可以通过手淘、飞猪、任何浏览器扫码进行预览。


    同时一个开源库的文档其实是后续发展中用户是否能快速上手的一个很大因素,Weex UI

    包括组件说明、使用规则、Demo展示、详细使用API、升级文档等等,可以让你快速使用。


    Weex Ui 是不是只适合电商体系呢?

    近期我们队 Weex Ui的使用者做过一次问卷调查,结果让我们很惊喜,并不是只有电商在使用,还很很多其他的体系在使用,包括工具类、企业应用、文娱、自媒体、新闻这些其实都是有使用的。


    组件化搭建你的 Weex 页面

    很多时候基础建设,其实为了给业务开发来加速,譬如接下来这个飞猪专线的页面就是通过我们的Weex Ui组件库来搭建起来的。


    然而基础组件只能够解决通用组件的问题,其实还包括业务组件这一块,也即上图中的your-item组件, 也即我们下面要说的 Weex 业务组件化。


    除了基础库,在 Weex Ui 层还可以做什么 

    Weex 业务组件化


    业务组件库更多是前端、后端、设计师之间的一个“约定”,通过一定规范共同让业务组件变得可复用。

    也即Weex代码中直接引入此组件,直接插入后端返回的原始数据,就可以生成设计师所设计出的商品卡片,最终可以做到支撑任意 Weex 业务模块 投放到 任意 Weex 页面 中 任意位置 的能力

    那么应该怎么做呢?


    可以自动化测试 Weex 吗 ?

    答案是可以的,之前通过macacajs测试框架和Weex结合来弄,通过自定义一连串的手势、事件,最后通过用json来表明执行的顺序,可以做到: 

    1、安装app

    2、自动打开native页面

    3、登录,自动输入

    4、自动测试飞猪度假首页,包括点击、跳转、滑动、下拉刷新等操作

    5、自动测试飞猪专线、包括左滑、右滑操作

    6、自动测试Weex Ui,包括打开组件、点击交互逻辑

    7、自动各个页面运行截图,并将测试情况邮件给测试方



    Weex 无障碍优化

    Weex 其实也是支持无障碍的,也即让盲人在最短的时间内通过最快的方式找到自己想要的信息。

    同时当盲人访问我们Weex页面时候,让他们对 Weex 是可感知的、可操作的、可理解的、同时页面也是鲁棒的。



    无障碍在Weex实现起来是很简单的,譬如如下实现:


    飞猪 Weex 双十一性能优化

    每年的双十一也就是我们Weex的一个战场,几乎所有会场页面均由Weex实现,如何让用户丝滑的逛我们的页面呢?期间我们也将之前很多经验包括优化技巧放到了双十一的会场页面,包括一些经验的整理。



    回到开源

    其实 Weex 可以在很多很多地方使用,包括各种应用场景,这也是我们开源Weex Ui 的一个很大原因,给大家更多 Weex 可实现功能的输入,最佳实践实现的参考。同时外部开发者也急需要一套成熟组件库来提高开发效率。

    开源地址:https://github.com/alibaba/weex-ui

    从2017年9月30号开始,我们一直在弄Weex Ui 的开源发展,包括共建 weex-toolkit 让其更好支持Weex Ui、欠缺组件的补全 + 现有组件的增强、继续扩展边界 + 轻舟解决方案 UI 库、引入更多富交互体验 + 组件的无障碍优化、简易的使用方式 + 详细的中英文档等等工作。

    其实更多的是想大家一起参与进来,共同促进我们 Weex 的发展,说到共同促进,那么你可以做什么呢? 其实可以做很多很多事情:


    晚上圆桌会议 - Weex 组件方向讨论总结

    1. Weex 原生组件的封装应该注意什么?

    • 通用性,只有多个业务同时在使用,同时具备可抽离性特性的组件,譬如Video/TabBar/TitleBar/ImageUpload 这些在 Native中成熟的组件

    • 稳定性,Native 组件不像 weex 上层的组件可调节性大,所以需要注意好 Native 组件一定需要没有Bug,防止修复和更新麻烦,同时 Native 组件一开始应该将大部分情况做成可配置化,防止频繁更新,导致需要适配很多版本

    • 原子性,不建议一个组件同时做很多事情,应该是单一的功能,然后通过搭配的方式来得到更多功能


    2.weex 组件开发和实践过程中的一些经验?

    • 811原则,默认80%的功能应该是不需要用户配置很多参数,10%的地方用户可以通过配置一些参数来达到目的,10%的稀有情况可以暂时不考虑,可能这里会花费很多时间开发,所以可以等到有业务需要使用时候,再更新上去

    • 统一收口原则,为了避免后续组件变成一个大杂烩,后续迭代视觉交互、新功能的增加需要将通用性考虑进去,这里需要一个人统一来收口、开发维护此组件,可以避免很多“业务特性”来干扰组件的可用性

    • 性能体验的优化,Weex 组件比页面的编写更应该保证他的性能体验

    • 信任机制:很多时候别人使用你的组件一个很大原因是由于相信你的组件没有问题,是稳定的,同时后续会常常维护的


    3.未来跨端开发会是怎么样的?

    • Native的布局方式需要向H5的开发灵活性学习,逐步使用自动布局来实现,同时引入弹性思路开发,避免绝对计算

    • 数据绑定方面会越来越便捷,譬如和MVVM思路一样,数据变化后,视图立马修改,而不是手动去触发

    展开全文
  • 安卓比较复杂的weex例子,里面有具体的weex的项目,仿的商场项目。
  • 什么是Weex

    2019-12-11 20:29:51
    Weex是一个致力于使用现代web开发技术创建高性跨平台的移动应用的框架。 在实践中,我们可以使用JavaScript和一些前端框架来开发移动应用。前端框架是Weex的语法层。目前,Vue.js和Rax两个前端框架在Weex开发中被...
  • Weex和Web开发体验的异同

    千次阅读 2017-05-05 12:16:53
    Weex和Web开发体验的异同 ...场景研读 2017-01-20 10:25:...摘要: 在2017年1月12日 Weex Conf 2017下午的技术实践论坛上, Weex团队的勾股详细讲解了Weex和Web开发体验的异同。他主要从Weex 中的 Web 标准、Wee
  • weex项目实战篇(二)

    万次阅读 2019-09-29 12:46:27
    1. 前言经常前面的准备,我们终于可以开始上手weex项目了。2.新建weex项目1)新建一个名为hongkong的项目,如图所示: 2 ) 输入项目名称 3)点击【create】则项目则创建成功 4)新建一个.we文件 5)新建一个...
  • Weex

    千次阅读 2019-06-02 18:17:36
    Weex 是一个可以使用现代化的 Web 技术开发高性能原生应用的框架。 快速开始 高性能 Weex 使用原生组件和原生模块,来最大化利用原生渲染的性能优势以及平台能力,所有的组件和模块都是可插拔、可扩展的。 ...
  • weex入门到掌握

    千次阅读 2018-12-15 23:19:21
    http://localhost:8081/index.android.bundle?platform=android  1.环境配置 1.下载安装node   检验安装成功:  node -v 2.在cmd中安装npm  检验安装成功:  ...
  • weex

    2017-08-25 14:15:32
    本期六篇文章目录 一. 阿里Weex框架快速体验与环境搭建 二. weex sdk集成到Android工程 ...三. weex服务项目搭建 ...Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体
  • WEEX

    2017-10-31 15:55:11
    WEEX中文手册
  • Weex多页面配置

    2019-07-12 11:08:54
    Weex是使用Vue和WebPack进行项目配置的。Weex创建的项目默认是只有一个入口的,也就是说,是单页面应用。对于移动开发来说,使用单页面(使用vue-router)是没有原生的页面跳转效果。在Weex的官方文档中,Weex提供了...
  • Weex尝鲜

    千次阅读 2016-07-08 10:38:12
    Weex是阿里开源的类React Native技术,其实按知乎上的讨论基本可以说是整合Vue.js+React Native造的轮子(如何看待阿里无线前端发布的Weex?)。Weex是一款轻量级的移动端跨平台动态性技术解决方案,主要致力于使用...
  • Weex实践

    千次阅读 2017-12-11 13:36:50
    尚妆达人店接入weex也一年的时间了,在此期间,也陆陆续续出了一些文章: 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角) 「前端」weex页面传参 「大前端」weex里native主动发送事件到JS的方案...
  • 阿里Weex框架快速体验与环境搭建

    万次阅读 2019-09-29 12:35:26
    目录阿里Weex框架快速体验与环境搭建weex sdk集成到Android工程weex服务项目搭建Weex优雅的“降级”到 HTML51. 前言Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持...
  • weex 选择器 weex picker weex-x-picker

    千次阅读 热门讨论 2018-08-11 17:02:50
    weex-x-picker weex-x-picker 支持 single(单选),area(区域),section(区间),date(日期),time(时间)。 使用文档,稍后更新
  • Weex开发之地图篇

    千次阅读 2019-01-01 18:36:52
    Weex开发中,如果要使用定位、导航和坐标计算等常见的地图功能,可以使用weex-amap插件。 weex-amap是高德针对Weex开发的一款地图插件,在Eros开发中,Eros对weex-amap进行二次封装,以便让开发者更集成地图功能。...
  • 初步认识Weex

    千次阅读 2016-09-12 21:06:01
    原文地址: http://blog.csdn.net/jasonblog/article/details/51863173 目录(?)[+] 原文地址:...相比较于React Native的“Learn once, write anywhere”,Weex的口号是“Wr
  • 12月15日,阿里巴巴宣布将移动开源项目Weex捐赠给Apache基金会开始孵化,Weex有望成为中国移动领域的首个Apache顶级项目,这意味着中国移动技术开始反哺世界。据悉,这也是继JStorm、RocketMQ之后,阿里向Apache捐赠...
1 2 3 4 5 ... 20
收藏数 14,688
精华内容 5,875
关键字:

weex