Caliber.js - 为现代油猴脚本开发而生
Caliber.js 是一个旨在帮助开发者快速构建功能强大、可维护、可动态配置的现代油猴脚本的框架。
在传统的脚本开发中,随着功能增多,代码会迅速变得混乱:全局变量冲突、事件监听难以管理、缺乏统一的配置界面、在单页应用(SPA)网站上难以正确管理功能启停…… Caliber.js 的诞生就是为了解决这些痛点。
它提供了一套优雅的架构和丰富的内置工具,让您能像开发一个小型应用程序一样来组织您的脚本代码,使您专注于实现创意,而非繁琐的底层细节。
核心特性
- ⚡️ 真正的模块化 (True Modularity)
所有功能都被封装在独立的 - Module类中,拥有清晰的生命周期方法 (- onEnable,- onDisable)。这使得代码高度内聚、易于管理和复用。
 
- 🎨 自动化的UI设置面板 (Automated UI)
您只需在模块中以声明式的方式定义 - defaultConfig对象,框架便会自动为您生成一个功能完善、外观精美、支持亮/暗模式的设置面板。无需手动编写任何UI代码。
 
- 🔄 响应式生命周期管理 (Reactive Lifecycle)
通过简单的 - match属性(支持字符串、正则表达式),您可以精确控制每个模块在哪些页面上运行。框架会自动监听URL变化(包括SPA的路由切换),并智能地启用或禁用相应模块,彻底解决了在现代网站上管理脚本状态的难题。
 
- 🛠️ 强大的内置核心服务 (Powerful Core Services) - 
-   高性能DOM调度器 (scheduler): 基于MutationObserver,用高效、批量的方式处理动态添加到页面的DOM元素,性能远超传统的setInterval轮询。
-   网络请求拦截器 (interceptor): 以一种极其简单和安全的方式拦截和修改fetch请求,或读取API的响应数据,是实现数据增强类功能的利器。
-   页面作用域执行器 (executor): 安全地在宿主页面(unsafeWindow)的上下文中执行代码并异步返回结果,轻松调用页面自身的JS函数或变量。
-   内存泄漏审计员 (ModuleAuditor): 在开发模式下,自动追踪模块的事件监听、定时器等副作用,并在模块禁用后报告任何未被清理的资源,确保脚本的健壮性。
 
快速上手 (Hello, World!)
使用Caliber框架只需两步:@require 框架库,然后创建您的应用。
第1步:在您的脚本元数据中 @require 本库
// ==UserScript==
// @name         我的第一个Caliber脚本
// @namespace    Your Namespace
// @version      0.1
// @match        *://*/*
// @require      https://greasyfork.org/scripts/XXXXXX-caliber-js-framework-library/code/Caliberjs%20Framework%20Library.js?version=YYYYYY
// @grant        GM.registerMenuCommand
// @grant        unsafeWindow
// ==/UserScript==
注意: 请将上面的 @require URL替换为本脚本的实际URL。
第2步:编写您的应用脚本
一个最简单的 "Hello World" 脚本如下所示:
// my-first-script.js
// 1. 定义一个功能模块
// 所有模块都必须继承自 Caliber.Module
class HelloWorldModule extends Caliber.Module {
  // 模块的唯一ID,用于内部管理
  id = 'helloWorld';
  // 模块在设置面板中显示的名称
  name = '问候世界模块';
  // 模块的功能描述
  description = '当启用时,在控制台打印一条问候信息。';
  // 模块的默认配置 (会自动生成UI)
  defaultConfig = {
    // 'enabled' 是一个特殊键,控制模块是否默认开启
    enabled: true, 
  };
  // 当模块被启用时,框架会自动调用此方法
  onEnable() {
    // this._logger 是框架注入的、带标签的日志记录器
    this._logger.log('Hello, World! This module is now active.');
  }
  // 当模块被禁用时,框架会自动调用此方法
  onDisable() {
    this._logger.log('Goodbye, World! This module has been disabled.');
  }
}
// 2. 启动应用
// 在IIFE中以保护作用域
(function() {
    'use strict';
    // 确保 Caliber 框架已加载
    if (typeof Caliber === 'undefined') {
        console.error('Caliber Framework not found!');
        return;
    }
    // 定义应用的全局选项
    const appOptions = {
        appName: '我的应用',
        // 将您所有的模块类放入这个数组
        modules: [
            HelloWorldModule,
            // ...可以添加更多模块
        ],
        // 提供平台相关的服务适配器
        // 框架通过这些适配器与油猴环境交互
        services: {
            command: {
                register: (name, callback) => GM.registerMenuCommand(name, callback),
            }
            // storage, style 等服务若不提供,框架会使用浏览器原生API作为后备
        }
    };
    // 调用 createApp,一切便会自动运行!
    Caliber.createApp(appOptions);
})();
发生了什么?
-  您定义了一个简单的 HelloWorldModule模块。
-  您调用了 Caliber.createApp,并把您的模块和必要的服务传了进去。
-  框架会自动处理剩下的所有事情:
-   在页面右侧生成一个设置按钮。
-   点击按钮,会弹出一个包含“问候世界模块”开关的设置面板。
-   当您切换开关时,框架会自动调用 onEnable或onDisable方法。
-   所有的配置状态都会被自动保存和加载。
 
现在,您可以开始构建更复杂的模块,并享受Caliber带来的开发便利了!