# dLink 跨端统一路由协议

尽管Router模块已经帮您抹平了路由跳转方法上的差异,但是多数情况下,我们往往会遇到这样的需求场景:

某H5页面在Web端,微信小程序、支付宝小程序、多点App内适配,点击商品行需要跳转至商品详情页,然而商详页在每端的链接都不同;或者是页面名称相同,需要拼接在url上的参数格式又有差异。

开发者A君无奈之下,只得向每端的负责人询问页面链接与跳转参数……

A君遇到的情况恐怕并非个例。因此即使您接入了kreator的Router模块,也许还是不得不在跳转场景写各种switch判断代码——看起来客户端差异的问题并没有得到解决。

因此,我们提出了一种通用跳转规则:即dLink路由协议。让我们用一个栗子来说明:

通常情况下,A君在跳转商详页时需要有如下的环境判断:

if (this.isDmallApp) {
    galleon.Navigator.forward(item.resource);
} else if (this.isMpAlipay) {
    my.navigateTo({
        url: `/pages/wareDetail/wareDetail?id=${item.venderId}-${item.storeId}-${item.skuId}`,
    });
} else if (this.isMiniprogram) {
    wx.miniProgram.navigateTo({
        url: `/pages/itemdetail/itemdetail?id=${item.venderId}-${item.storeId}-${item.skuId}`,
    });
} else {
    kayak.router.go(
        window.kayak.EVT +
                `i.dmall.com/#item/view/item/item:id=${item.venderId}-${item.storeId}-${item.skuId}`
        );
     return;
}

PS: 如果A君的产品经理提出了适配社区拼团小程序和麦德龙App的需求,那么他大概率今晚又不能回家吃晚饭了。

借助dLink协议,我们可将上述代码进行简化:

kreator.router.navigateTo(`dLink://wareDetail?venderId=${item.venderId}&storeId=${item.storeId}&skuId=${item.skuId}`);

或许你会感到有些振奋,毕竟通过这种方式,我们几乎不用关心客户端环境的差异。

Kreator通过判断当前运行环境的Source枚举值来判断客户端环境,同时每个客户端会有一套对应的常用页面的字典表,根据传入的协议名称来匹配当前客户端对应的页面路径。通过这种方式,开发者在适配不同客户端时,无需再考虑各端页面的名称与参数,Kreator内部会解析参数与协议名称,帮助开发者匹配正确的参数与页面链接。

但是Kreator不可能覆盖到所有的页面——毕竟这是一个业务性较强的需求场景,所以我们只会覆盖使用率最高的页面。同时我们也会随着迭代频率扩展dLink协议,满足开发者尽可能多的需求场景。