浏览器端路由本该如此:meteorhacks:flow-router

第一次写关于Meteor的中文技术文,如果有些术语的翻译不妥请指正。

浏览器端路由概述

所谓浏览器端路由,即Client-side Router。那么浏览器端的路由有什么不同呢?我们在下面简称CR

  1. 在客户端(浏览器)上执行。CR在浏览器上执行,调用HTML5 API来改变地址栏里的地址。
  2. 无刷新。链接等跳转的东西由CR接管,站内链接直接调用JS代码重新渲染页面,站外才直接跳出。
  3. 服务器不考虑路径。URL的解析也交给CR,服务器不处理URL,不管什么URL都返回带CR的HTML页面。

iron:router V.S. meteorhacks:flow-router

(下面iron:router简称IRmeteorhacks:flow-router简称FR

IR是一个完整的路由,写出来的代码像极了服务器端路由。同时它还封装了页面渲染、发布/订阅。如果你要用Meteor做一个比较传统的app,完全可以采用它。但是它的缺陷,就是灵活度不高。

钩子

处理一些切换动画或者会话变量(Sessions)设置时就需要各种名目繁多的钩子(hooks)。下面是摘自IR文档的钩子列表:

Available Hook Methods

  • onRun: Called when the route is first run. It is not called again if the
    route reruns because of a computation invalidation. This makes it a good
    candidate for things like analytics where you want be sure the hook only runs once. Note that this hook won't run again if the route is reloaded via hot code push.
  • onRerun: Called if the route reruns because its computation is
    invalidated.
  • onBeforeAction: Called before the route or "action" function is run. These
    hooks behave specially. If you want to continue calling the next function you
    must call this.next(). If you don't, downstream onBeforeAction hooks and
    your action function will not be called.
  • onAfterAction: Called after your route/action function has run or had a
    chance to run. These hooks behave like normal hooks and you don't need to call
    this.next() to move from one to the next.
  • onStop: Called when the route is stopped, typically right before a new
    route is run.

泥垢啊!我就写个简单的切换动画,我就得用两个钩子!onBeforeAction用于显示载入动画或者去除原页面内容,onAfterAction用于切入动画……
让我们来看看在FR里我们如何处理它:

FlowRouter.route('/', {
    action: function(params) {
        doSthBeforeRendering();
        render('xxx');
        doSthAfterRendering();
    }
});

其中的render()只是个例子,FR并不支持渲染模版——FR的一个原则就是只做真正的路由,至于模版渲染,交给你自己来完成。当然,你也可以通过另一个包meteorhacks:flow-layout简化你的模版渲染。这个包不在这篇文章的讨论范围内。
上面的代码非常清晰,意思就是遇上/URL请求就做action

订阅

IR包下了做订阅要的活,但是只在订阅同步完成后才渲染页面,就不能分区域延迟加载了。这对于用户体验来讲也是种损失。FR不等待订阅,而是注册订阅:

FlowRouter.route('/blog/:postId', {
    subscriptions: function(params) {
        console.log("subscribe and register this subscription as 'myPost'");
        this.register('myPost', Meteor.subscribe('blogPost', params.postId));
    },
    action: function(params) {
        console.log("Yeah! We are on the post:", params.postId);
    }
});

并且提供了几个helper来检测订阅的情况。这样就可以做到分区域延迟加载了:


分区域延迟加载
分区域延迟加载

好棒!这样就不用自己在IR的一堆钩子里模拟了!
FR还支持分组,比如:

//Ideapad.
P.routes.ideapad = FlowRouter.group({
    prefix: '/ideapad'
});
P.routes.ideapad.route('/', {
    action: function() {
        //xxx
    }
});
P.routes.ideapad.route('/new', {
    action: function() {
        //xxx
    }
});
P.routes.ideapad.route('/:_id', {
    subscriptions: function(params) {
        this.register('ideapadContent', P.subs.subscribe('ideapadContent', params._id));
    },
    action: function(params) { //We just fetch the data in template helpers
        //xxx
    },
});

而且还支持多层嵌套分组。

结论

你当然可以继续用着IR,因为上手非常容易。对用户体验要求不高并且不大介意有一堆多出来的用不着的代码,那尽可继续用着它。不过IR太臃肿,又因为IR的路径处理是响应性的,经常出现一些无限执行钩子的现象,甚至一些看起来很无关的小事都有可能导致无限执行钩子(比如import不存在的html)。这给调试也带来很大的麻烦。我建议诸君还是早日投靠FR大法,自己多写的内容也就是几行而已。感谢Arunoda的努力,使我们除了IR以外有了一个成熟的选择。
本文引用了IronRouter、FlowRouter的部分示例代码、Piet项目部分非关键代码、MeteorHacks的GIF图片。除FR分组的示例代码外,其他代码和图片均可遵守各自的协议使用。FR分组的示例代码来自Piet项目。Piet项目并不开源,此处引用已做处理,不允许将该代码用于任何未经授权的用途。

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

推荐阅读更多精彩内容