高性能的 Router, 可以同时在 Deno, Nodejs, Browser 中使用

项目链接

特征

  • 基于 radix tree: 与基于正则表达式的路由器相比,在大多数情况下,我们都有更好的性能,这可以显着提高项目速度,并且随着项目规模的增加,性能也将成倍增加。

  • 愚蠢的规则: 我们将始终根据 “Static > Param > Any” 的规则进行匹配。对于 Static 路由,我们始终匹配严格相等的字符串。

用法

Deno

参考 zhmushan/abc

Nodejs

安装:

npm i zhmushan/router#v1.0.0

创建 index.js:

import { createServer } from "http";
import { Node } from "router";

const root = new Node();

root.add("/:user", (p) => {
  return p.get("user");
});

createServer((req, res) => {
  const [h, p] = root.find(req.url);

  if (h) {
    const result = h(p);
    res.end(result);
  } else {
    res.end("Not Found");
  }
}).listen(8080);

console.log("server listening on http://localhost:8080");

确保已在 package.json 中设置 type: module,然后执行:

node index.js

打开 http://localhost:8080/your_name ,你应该在页面上看到 “your_name”。

Browser

<body>
  <button id="change_path">Change Path</button>
  <button id="home">Home</button>
  <script type="module">
    import { Node } from "https://deno.land/x/router@v1.0.0/mod.js";

    const root = new Node();
    root.add("/:random_string", (c) => {
      console.log(c.get("random_string"));
    });

    change_path.onclick = () => {
      const path = `/${randomStr()}`;
      const [func, params] = root.find(path);
      if (func) {
        func(params);
        history.replaceState(undefined, "", path);
      }
    };

    home.onclick = () => {
      history.replaceState(undefined, "", "/");
    };

    function randomStr() {
      return Math.random().toString(32).split(".")[1];
    }
  </script>
</body>
2 个赞

对 Node.js 和 Browser 的版本要求太高了吧,private fields

emmm 其实是顺便支持的,直接用的 deno bundle, 之后我打算基于这个路由, 写一个 React 的路由, 会编译到 ES5

es6 就够了,只要是 umd 就行

棒!正好需要一个 router

是用在Pagic上面吗 :joy:

Pagic 需要路由吗?

我不知道hhhh, 当我瞎说

以单页应用模式输出静态网站时,需要 router,不过这个功能还在开发中,还不确定会用哪个模块、会怎么设计。