Rails Rails 5 架构深入理解之 ActionDispath::Joureny

lilijreey · 2016年08月29日 · 最后由 lilijreey 回复于 2016年08月30日 · 2644 次阅读

ActionDispath::Joureny

Joureny 的核心功能是实现 Rails 路由描述 DSL 的解析功能 一个 path. e.g. /page/:id(/:action)(.:format)

DSL 语法解析器使用的是 Ruby 标准库中的 Racc,自动生成的 整个 lib 的核心是 parser.y 这个文件 这个文件定义了 Rails 路由 DSL 的 BNF 解析的过程和一般语言的一样,token 化,语法解析,从源码生成 AST AST 中的每个节点都定义了一个 class 在 nodes/node.rb 中定义 每个节点都是一个终结符号。(要搞懂 joureny 最主要的还是需要你有一定的编译原理知识, 和懂得.y 文件的语法)

  • token 化的工作也就是 (词法分析功能) 是由 scanner.rb 文件实现的.里面使用了 ruby 标准库中的 strscan
  • 解析好的 ast 连同 controller, action 的信息一起存放在 Journey::Path::Pattern 中 (path/pattern.rb)
  • route.rb 定义的 Route 用来表示一条完整的路由信息,还提供了一些匹配查询方法
  • router.rb 是整个路由分发的入口,从 server 函数开始,对每一个 HTTP 请求匹配路由表 Router 类本身也是一个 Rake 中间件

这就是 Joureny 和核心功能.剩下的 gtg/, nfa/ 和 visitors.rb 文件完成了另一个功能 是路由表的解析过程可视化功能.会把路由的匹配转换为 NFA 的状态转换图.使用 svg 绘图生成 对应的 html 文件. 这一部分没有细看.

上述理解只是个人看法.可能有错误.欢迎拍砖吐槽.

lilijreey Rails 5 架构深入理解 提及了此话题。 08月29日 22:30

建议把草稿打在自己本地,等整理好了再发上来。

#2 楼 @gyorou 要吐槽请先打草稿

zhuoerri Rails 路由 Journey 与 有限状态自动机 提及了此话题。 03月04日 13:01
需要 登录 后方可回复, 如果你还没有账号请 注册新账号