npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

chanjs-hono

v1.0.4

Published

chanjs-hono 基于 Hono + Drizzle ORM 研发的轻量级 MVC 框架,API 镜像 chanjs,支持 pgsql / mysql / sqlite。

Readme

ChanJS-Hono

ChanJS 的 Hono 高性能分支,基于 Hono + Drizzle ORM 构建的标准 HMVC(NHMVC)后端框架,原生 ESM 纯 JavaScript 开发。 API 与 chanjs 保持一致,以模块自治 + 双通道跨模块协作为核心,约定优于配置,开箱即用,拒绝冗余复杂。

设计哲学

大道至简。 优秀的开发工具,应当化繁为简。ChanJS-Hono 摒弃过度设计与沉重抽象,回归纯粹 JavaScript,用最少的心智负担交付稳定高效的业务能力。

核心亮点

  • ⚡ 超快路由:Hono 高性能路由引擎,零依赖内置中间件(cors / cookie / jwt / logger)
  • 🗄️ 三库统一:Drizzle ORM 官方支持 PostgreSQL / MySQL / SQLite,配置切换零代码改动
  • 🪶 轻量精简:API 与目录结构镜像 chanjs,无额外心智负担、低侵入、上手门槛低
  • 🔌 边缘适配:app.fetch 纯函数,天然适配边缘运行 / Serverless 环境
  • 🛡️ 安全可控:内置多层防护能力,降低业务安全开发成本

特性

核心架构

  • 原生基于 Hono + @hono/node-server,app.fetch 支持 Serverless / 边缘部署
  • 最低运行环境 Node.js 22.0+
  • 全量 ES Modules(import / export)
  • 标准 HMVC 架构:模块自治 + 双通道跨模块协作
  • 约定优于配置,目录结构与 chanjs 完全一致

基础设施

  • 高性能日志:Pino 结构化日志输出
  • 国际化多语言:i18next,内存高速语言查找
  • 全局事件总线:轻量封装 Node.js EventEmitter,解耦业务事件
  • 定时任务调度:node-cron,自带异常捕获、停机安全回收
  • 数据库层:Drizzle ORM 三库统一(postgres-js / mysql2 / better-sqlite3),内置慢查询监控告警
  • 按需组件容器:Controller/Service 动态懒加载,成功实例永久缓存;缺失模块不缓存,修改文件即时生效
  • 优雅停机:统一信号监听,资源有序释放(HTTP → Task → 缓存 → DB → 事件总线),超时强制退出

内置安全能力

  • JWT 令牌签发 / 校验 / 吊销
  • AES-256-GCM 加解密
  • 接口请求限流
  • IP 网关(isTrustedIp / getClientIp)
  • XSS 过滤 / 敏感关键词检测

开箱即用基础设施

  • 统一响应体(success / fail / frame 适配器)
  • 业务状态码体系(CODE / getCodeMsg / CODE_*)
  • zod 参数校验中间件(validate / validateAll)
  • 全局异常捕获兜底(AppError 体系)
  • 多环境配置隔离(.env.dev / .env.prd)
  • Redis ⇄ 内存双后端缓存熔断降级
  • 内置通用工具函数库(tree / pages / request / file / time 等)

目录结构

|- app/
|   |- common/            # 公共业务路由
|   |- helper/            # 全局辅助工具函数
|   |- middleware/        # 应用级中间件
|   |- modules/           # 业务模块根目录
|   |   |- <module>/      # 单个业务模块
|   |       |- controller/
|   |       |- service/
|   |       |- middleware/
|   |       |- router.js
|   |- router.js          # 根路由聚合
|- config/                # 框架配置、环境变量加载
|- data/                  # 运行时持久化数据目录
|- doc/                   # 项目文档
|- lang/                  # i18n 语言资源(zh-CN/en-US/...)
|- public/                # 前端静态资源
|- view/                  # 视图模板文件
|- app.js                 # 项目业务入口
|- .env.dev / .env.prd    # 环境配置文件

快速开始

npm install chanjs-hono --save
import Chan from "chanjs-hono";

const chan = new Chan();

// 注册启动前置钩子(事件、定时任务等初始化)
chan.beforeStart(() => {
});

await chan.start();        // 加载配置、i18n、数据库、中间件、路由
chan.run((port) => {       // 启动 HTTP 服务
  console.log(`ChanJS-Hono running on ${port}`);
});

核心能力详解

1. 日志系统(Pino)

开发环境彩色控制台输出;生产环境输出 JSON 结构化日志,适配 PM2 采集。API 向下完全兼容。

import logger, { createLogger } from "chanjs-hono";

// 全局日志实例
logger.info("启动完成");
logger.error("查询失败", err);   // 自动识别 Error 对象

// 创建带业务标签的子日志
const dbLog = createLogger("DB");
dbLog.warn("慢查询");

2. 事件总线(EventBus)

基于 Node.js 原生 EventEmitter 封装的全局单例事件中心,用于业务解耦。

import { event, EventBus } from "chanjs-hono";

// 使用全局事件实例
const off = event.on("user.login", (uid) => {
  logger.info(`用户 ${uid} 登录`);
});
event.emit("user.login", 1001);
off();  // 解绑监听

// 创建独立隔离的事件实例
const localBus = new EventBus();

3. 定时任务(Task)

基于 node-cron 封装,内置 cron 表达式校验、任务异常捕获、优雅停机回收。

import Chan from "chanjs-hono";

const chan = new Chan();

chan.beforeStart(() => {
  // 注册定时任务,框架启动后自动运行
  chan.task.add("clear-log", "0 3 * * *", async () => {
    await chan.db.run(sql`DELETE FROM logs WHERE created_at < NOW() - INTERVAL 7 DAY`);
  });
});

await chan.start();
chan.run();

4. 国际化(i18next)

服务启动时一次性扫描加载 lang/ 全部语言资源至内存,运行时 O(1) 快速读取翻译文本。

lang/
  zh-CN/
    common.json    # { "user.welcome": "欢迎,{{name}}" }
  en-US/
    common.json    # { "user.welcome": "Welcome, {{name}}" }
import { initLang } from "chanjs-hono";

const i18n = await initLang("zh-CN");
i18n.t("user.welcome", { name: "张三" });  // → "欢迎,张三"

5. 数据库(Drizzle ORM · 三库统一)

支持 PostgreSQL / MySQL / SQLite 三库统一连接管理,自动开启慢查询与 SQL 异常监控。

// 框架启动自动读取 config.db 注册数据库连接(数组首个连接为默认连接)
// 业务代码内可通过 this.db / getApp().db 获取默认连接

// 运行时动态调整慢查询告警阈值(毫秒)
chan.dbManager.setSlowThreshold(500);
// config 配置示例(任选一库)
export default {
  db: [
    {
      key: "primary",          // 连接标识(多库时用于切换)
      driver: "postgres",      // postgres / mysql / sqlite
      host: "127.0.0.1",
      port: 5432,
      user: "root",
      password: "***",
      database: "chancms",
      pool: { max: 10 },
    },
    // SQLite 只需指定文件路径:
    // { key: "lite", driver: "sqlite", file: "data/chancms.db" }
  ],
};

6. 组件容器 · 双通道跨模块调用

Controller / Service 继承容器基类,内置 this.get() 方法,通过「模块名 + 组件名」动态加载跨模块业务组件。

加载成功后实例永久缓存;组件文件缺失不缓存,新增文件无需重启即可识别。

// 同一模块调用 Service
const cat = await this.get("book", "BookCategory");

// 跨模块调用 Service(推荐,HMVC 双通道-服务通道)
const book = await this.get("book", "Book", "service");
const special = await this.get("cms", "Special", "service");
  • 返回实例或 null,异步调用必须 await
  • 内置名称校验、路径越界安全防护
  • 跨模块业务复用优先使用容器调用,摒弃超长相对路径 import

HMVC 标准实现说明

传统教程常将「控制器嵌套发起子 HTTP 请求」当作 HMVC 的标准,该方式混淆了实现手段和架构本质。

HMVC 的核心 = 分层解耦 + 模块自治 + 跨模块业务复用。

ChanJS-Hono 提供双通道协作模式,回归 HMVC 本质:

  1. 控制器通道:await this.get("模块", "Controller")
  2. 服务通道(推荐):await this.get("模块", "Service", "service")

7. Hono Handler 序列化适配(frame)

本框架特色:业务 handler 的返回值统一由 frame 适配器转成 Hono Response。

import { frame } from "chanjs-hono";

// 返回 Response:直接透传
// 返回 { success, code, msg, data }:序列化为 JSON(HTTP 200,业务码在 body)
// 返回其他对象:包裹为 data 返回
const route = frame(async (c) => {
  return { data: { id: 1 }, msg: "成功" };
});

8. 优雅停机

统一监听 SIGTERM / SIGINT / SIGQUIT 退出信号,按顺序逐级释放资源:

HTTP 服务 → 定时任务 → 缓存存储 → 数据库连接 → 事件总线

单个资源关闭失败不会阻断其余回收流程,超时后进程强制退出。

环境变量配置

| 变量 | 说明 | 默认值 | | --- | --- | --- | | NODE_ENV | 运行环境标识(dev/prd) | dev | | PORT | HTTP 监听端口 | 3000 | | HOST | 监听地址 | 0.0.0.0 | | LOCALE | 默认语言 | zh-CN | | LOG_LEVEL | 日志输出级别 | dev:debug / prd:info | | SHUTDOWN_TIMEOUT | 优雅停机超时时间(ms) | 5000 | | REDIS_ENABLED | 是否开启 Redis | false |

项目依赖清单

运行依赖

  • hono ^4.7.0
  • @hono/node-server ^1.14.0
  • drizzle-orm ^0.44.0
  • pino ^9.5.0
  • i18next ^24.2.0
  • node-cron ^3.0.3
  • art-template ^4.13.4
  • ioredis ^5.4.2
  • zod ^3.24.0
  • dayjs ^1.11.13
  • dotenv ^16.4.7
  • 数据库驱动(按所选数据库安装):postgres ^3.4.5 / mysql2 ^3.12.0 / better-sqlite3 ^12.2.0

可选 Peer 依赖

  • zod(参数校验)

SQLite 驱动为 Node.js ≥22.5 内置的 node:sqlite,运行时零第三方依赖、无 native 编译;低版本 Node 下 pg/mysql 不受影响,仅使用 sqlite 时报明确错误。

ChanJS 标准版本

chanjs 为 ChanJS 标准版本,基于 Express 5 + Knex 构建,API 与本框架保持一致。

npm install chanjs

详细文档

| 文档 | 说明 | | --- | --- | | doc/00-README.md | 安装 / 目录结构 / 技术选型对比 | | doc/01-架构设计与Chanjs差异.md | 逐条分析 chanjs 不足 + 本框架改进方案 | | doc/02-数据库适配.md | pg / mysql / sqlite 三库适配设计与迁移 | | doc/03-核心类.md | BaseComponent / Controller / Service / Repository 全部方法与用法 | | doc/04-响应与错误.md | 统一响应、业务状态码、错误体系 | | doc/05-安全模块.md | JWT / AES / 限流 / IP 网关 / XSS / 敏感词 | | doc/06-存储与缓存.md | Store 统一门面、内存 LRU、Redis ⇄ 内存双后端熔断降级 | | doc/07-工具与校验.md | zod 校验中间件 + 时间/文件/HTML/请求/树/分页等工具函数 | | doc/08-应用生命周期.md | Chan 启动流程、中间件/路由、钩子、优雅停机、Paths | | doc/09-事件-定时任务-国际化.md | 事件总线 / Task 定时任务 / i18next 国际化 |

文档 & 生态资源

开源协议

ISC