美文网首页Web开发程序员Meteor
浏览器端路由本该如此:meteorhacks:flow-rout

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

作者: 吕世博 | 来源:发表于2015-05-09 17:29 被阅读2260次

第一次写关于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项目并不开源,此处引用已做处理,不允许将该代码用于任何未经授权的用途。

相关文章

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

    第一次写关于Meteor的中文技术文,如果有些术语的翻译不妥请指正。 浏览器端路由概述 所谓浏览器端路由,即Cli...

  • express路由/后台(服务端)渲染、前台渲染、浏览器渲染

    express路由 后台(服务端)渲染、前台渲染、浏览器渲染 扩展

  • 说一说不依赖服务器的前端路由

    什么是前端路由? 所谓的前端路由,拥有这样一种能力:客户端浏览器可以不依赖服务端,根据不同的URL渲染不同的视图页...

  • web路由机制

    路由的含义 简单来说,路由就是URL到函数的映射。 路由的分类 服务端路由 客户端路由客户端静态路由客户端动态路由...

  • Tomcat结构原理详解

    客户端用户点击浏览器服务连接,浏览器通过客户端底层服务通过路由传送报文,目标服务器获取解析报文,Tomcat监听程...

  • 前端路由

    路由 路由这个概念最先是后端出现。 浏览器发出请求 服务端监听到80端口(或443)有请求过来,并解析URL 路径...

  • 移动端路由

    移动端路由层设计 什么是移动端路由层: 路由层的概念在服务端是指url请求的分层解析,将一个请求分发到对应的应用处...

  • 浏览器判断

    移动端 PC端 ios 微信浏览器 QQ浏览器

  • 移动 web 开发 —— 流式布局

    1.0 移动端基础 1.1 浏览器现状 PC 端常见浏览器:360 浏览器、谷歌浏览器、火狐浏览器、QQ 浏览器、...

  • 前端路由

    路由是什么 在网络原理中,路由指的是分组从源到目的地时,决定端到端路径的网络范围的进程,做成硬件叫路由器,在路由器...

网友评论

  • JohnSmith:謝謝推薦! IR 項目好像也已經停止更新了,FR 在理念上看上去更純粹,之後好好學習一下!

本文标题:浏览器端路由本该如此:meteorhacks:flow-rout

本文链接:https://www.haomeiwen.com/subject/hewgfttx.html