repo: https://github.com/CicholGricenchos/Mrouter
最近遇到用 ngx_mruby 匹配路由的需求,我们网站曾经有两三百条为了 SEO 做的 url,大概是这个样子:
get 'office-supplies(.:format)' => 'catalog#category', :id => 2, :lang=>'en', :version => 'v1'
get 'computers-and-parts(.:format)' => 'catalog#category', :id => 3, :lang=>'en', :version => 'v1'
get 'accessories(.:format)' => 'catalog#category', :id => 4, :lang=>'en', :version => 'v1'
get 'office-supplies/:name(.:format)' => 'catalog#category', :id => 2, :lang=>'en', :version => 'v1'
get 'computers-and-parts/:name(.:format)' => 'catalog#category', :id => 3, :lang=>'en', :version => 'v1'
现在要做前后端分离的手机版,老板不想放弃这些链接,把这些都打包进 js 又会增加体积,干脆就在 nginx 上匹配了。
mruby 目前还没有现成的 router,看了一下 mustermann,用了新语法不好移植。而且 mustermann 是用正则一行一行匹配,在我们这种用例可能动不动就要匹配三百多次,性能也不好。我觉得用前缀树做是比较合适的,以后可能还可以搞成 dfa,所以就自己造了个轮子。
性能测试下来,匹配单行路由耗时是 mustermann 的 9 倍左右,但是当总路由数到几十以上,优势就比较明显了。有空的话改用 c 写应该更好一些。
虽然这个 gem 是为 mruby 搞的,但是 ruby 也是能用的,当然现在功能还很简单,有需要再加吧。。。