钉钉Weex微应用开发通关手册

>>>Link Start!

LinkStart.jpg

目录

  • 配置环境
  • 代码编写
  • 界面跳转传参
  • weex-bundle.js热更新(缓存处理)
  • 界面返回重绘问题(数据处理)
  • 签名校验失败问题

关卡一:配置环境

  • 1.安装CLI命令行工具

在此之前要确保Node.js >= 6.9.4

$ npm install -g weex-dingtalk-cli
  • 2.创建一个钉钉微应用新项目
$ dingtalk init webpack-simple dingding

过程中可能会遇到这个错误
⠹ install node modules dingtalk-cli · Error: npm install fail

我们只需要进入刚刚创建的dingding文件夹

$ cnpm install

前提是,npm的镜像已经配置成taobao镜像了

  • 3.运行访问Weex
$ npm run dev:weex

把这个地址
http://localhost:8089/weex-bundle-dev.js?dd_wx_tpl=http://localhost:8089/weex-bundle-dev.js
丢到钉钉客户端IM聊天界面中,同时要将localhost替换成你本机的IP地址(端口号默认是8089)。


关卡二:代码编写

  • 1.目录结构
目录结构.png
  1. components 可以共享的组件放在这里
  2. container 如果你使用了vue-router,那么需要使用这里的共用容器
  3. lib 可以共享的函数.js文件放在这里
  4. pages 真正的页面放在这里
  5. platforms 平台相关的入口放在这里

然后就可以在pages->home->index.vue里愉快的写代码了。
具体详情,请参考Weex官方文档钉钉Weex微应用官方文档
Weex使用的语法是基于Vue的,语法的使用请移步参考vue官方教程


关卡三:界面跳转传参

我使用的是用vue-router进行页面管理跳转及传参。

  • 1.配置路由

在container中创建一个router.js文件

import VueRouter from 'vue-router';
import dingtalk from 'weex-dingtalk';
import journey from 'weex-dingtalk-journey';
import { toast,setLeft } from '../lib/util.js';
import detailPage from '../pages/detail/index.vue';
import HomePage from '../pages/home/index.vue';

const routes = [
  {
    path:'/',
    name: 'home',
    component: HomePage
  },
  {
    path: '/detail',
    name: 'detail',
    component: detailPage
  }
];

dingtalk.error(function(err){
  console.log(JSON.stringify(err));
  toast('Error : ' + JSON.stringify(err));
});

const { env } = journey;

export default function Router(Vue){
  Vue.use(VueRouter);
  const router = new VueRouter({
    routes: routes
  });

  const left = {
    show: true,
    control: true,
    text: '返回'
  }

  const backHandler = function(e){
    if (env.isWeb){
      e.preventDefault();
    }
    router.go(-1);
  }

  setLeft(left, backHandler);
  return {
    router
  }
}
  • 2.使用路由跳转并传参

需要指定界面名称和参数,界面名称是在路由管理里配置好的

doClick (index){
                var self = this;
                var data = self.list[index];
                this.$router.push({name:'detail',params:{data: data}});
            }

相对之下,要在下一个界面接收参数

 export default {
        name: 'detail',
        data (){
            return {
                data: ''
            }
        },
      mounted (){
            this.data = this.$route.params.data;
        }
}

关卡四:weex-bundle.js热更新(缓存处理)

  • 1.代码打包
# build vue web release 环境
$ npm run build:web

# 启动 weex release 环境
$ npm run build:weex

# 编译weex和web环境下所需要的资源,这是可以正式部署的静态资源
$ npm run build
  • 2.部署到服务器

把dist文件夹里面打包好的文件,部署到服务器上,我是用Node搭建的http-server服务

$ npm install http-server -g

Windows下使用:在站点目录下开启命令行输入(端口号自行指定)

http-server -p 8888

然后,把地址(localhost改成服务器的地址,corpId改成你的企业id)
http://localhost:8888/?dd_wx_tpl=https://localhost:8888/weex-bundle.js&corpId=ding92f3ce1bc64e3e5b35c2f4657eb6378f#/
配置到企业工作台的自建应用。

  • 3.weex-bundle.js热更新

上面都搞好了后,终于大功告成。然而在下次更新js文件时,发现明明都已经改掉的代码,在钉钉上还是没有任何改变。此时,只需要点开我->设置->通用->清理缓存,就好了,但是,这样只是缓兵之计。

解决方法:修改http缓存策略

通过http头信息设置Cache-Control : no-cache来实现。

钉钉Weex微应用采用的是加载weex-bundle.js文件实现的,就是意味着我们可以通过http头信息设置E-Tag结合Cache-Control来实现缓存策略。
最终效果就是,index.vue -> index.js,第一次读取加载index.js是从网络下载下来并且保存到本地,第二次加载index.js是直接加载的保存到本地的 index.js文件,当线上index.vue被修改时,index.vue -> index.js,第三次加载index.js时根据缓存策略会知道线上index.js 已经和本地index.js 有差异,于是重新下载index.js到本地并加载(参考HTTP缓存这篇文章)。


关卡五:界面返回重绘问题(数据处理)

在开发时,我遇到从第二个界面回到第一个界面时,第一个界面会重新绘制,不会像手机app中会把第一个界面在内存中存下来。
我的解决方法是把第一个界面的交互数据存储下来,界面返回时再重新读取绘制界面。

  • 1.数据存储(封装的方法)
// 存储数据
export function setItem (name,val){
  dingtalk.ready(function(){
    dingtalk.apis.util.domainStorage.setItem({
      name: name,
      value: JSON.stringify(val)
    });
  });
}

调用

setItem('data', this.data);
  • 2.获取数据
// 获取存储数据
export function getItem (name,cb){
    const date = new Date();
    dingtalk.ready(function(){
        dingtalk.apis.util.domainStorage.getItem({
            name: name,
            onSuccess (res){
                const value = res.value;
                if (!value){
                    if (typeof cb === 'function'){
                        cb(1,value);
                    }
                    return;
                }
                if (typeof cb === 'function'){
                    try {
                        let item = JSON.parse(value);
                        cb(null, item);
                    }catch(e){
                        cb(e,res);
                    }
                }
            }
        });
    });
}

调用

getItem('data', (err,res) => {
                this.data = res;
            });
  • 3.删除数据
// 删除存储数据
export function removeItem (name){
  dingtalk.ready(function(){
    dingtalk.apis.util.domainStorage.removeItem({
      name: name
    });
  });
}

调用

removeItem('data');
  • 4.微应用退出时删除数据

重写左侧返回按钮

export function setLeft(cb){
    dingtalk.ready(function(){
        const dd = dingtalk.apis;
        dd.biz.navigation.setLeft({
            show: true,
            control: true,
            text: '返回',
            android: true
        });
        dingtalk.on('goBack',cb);
    });
}

调用(用type判断界面是从哪里返回的)

var self = this;
const cb = function(){
                if (self.type == '1') {
                    dingtalk.ready(function () {
                        const dd = dingtalk.apis;
                        dd.biz.navigation.close({
                            onSuccess: function (result) {
                                removeItem('data');
                            },
                            onFail: function (err) {
                            }
                        });
                    });
                }
            };
            setLeft(cb);

关卡六:签名校验失败问题

在调用钉钉提供的API的时候,有时会遇到签名校验失败的问题,如图:


签名校验失败图.png

我遇到的情况是在实现免登的时候和调用需要鉴权的API的时候出现的。

解决方法:把服务端调用钉钉API中的回调域名,改成签名校验失败图中url的参数:http://192.168.22.3:8089/weex-bundle-dev.js

如果有其他问题,可以参考钉钉官方给出的demo
还可以参考一位前辈的《可能是史上最全的weex踩坑攻略》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容