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 🙏

© 2025 – Pkg Stats / Ryan Hefner

lazy-koala

v2.0.1

Published

A simple and powerful request library based on axios.

Downloads

14

Readme

lazy-koala

lazy-koala 是一个功能强大的 TypeScript 工具库,旨在为现代前端开发提供两大核心能力:

  1. 一个基于 axios 的、高度可配置的 HTTP 客户端,简化网络请求和错误处理。
  2. 一套经过精心重构的、完全支持 Tree-Shaking 的前端工具函数集,涵盖了环境判断、数据格式化、Cookie 操作、函数防抖/节流等日常开发中的常见需求。

1. 安装

npm install lazy-koala axios --save

2. HTTP 客户端

lazy-koala 的 HTTP 客户端旨在通过提供统一的配置、自动化的加载和错误处理以及链式调用等现代 API,来简化和标准化前端的网络请求。

初始化

在您的项目入口或专门的 API 配置文件中,通过 createLazyKoala 创建一个实例。

// src/api.ts
import { createLazyKoala, LazyKoalaOptions } from 'lazy-koala';

const options: LazyKoalaOptions = {
  axiosConfig: { // 原生 Axios 配置
    baseURL: 'https://api.example.com',
    timeout: 30000,
    withCredentials: true, // 示例:开启跨域请求携带 cookies
    headers: { 'X-App-Version': '2.0.0' }
  },
  requestConfig: { // lazy-koala 全局默认请求配置
    loading: true,
    toast: true, // 默认所有请求失败时都弹窗提示
  },
  responseConfig: { // 响应成功/失败的判断标准
    status: [0, '0', '1', '0000', '000000', 'ok', 'success', 200, 'SUCCESS', 'OK'], // 定义成功的业务状态码列表
    codeKeys: ['errno', 'code', 'retcode', 'respCode', 'resultCode', 'status', 'errcode'], // 定义业务状态码在响应体中的 key 名称列表
    msgKeys: ['msg', 'message', 'desc', 'errmsg', 'respMsg', 'error', 'errorMsg'] // 定义业务消息在响应体中的 key 名称列表
  },
  onFailure: (response) => { // 业务失败时的全局回调
    console.log('业务失败:', response.data);
  },
  onError: (error) => { // 网络错误时的全局回调
    console.error('网络错误:', error.message);
  },
  loadingStart: () => { /* 自定义 Loading 开始的回调,例如显示全局 Loading 动画 */ },
  loadingEnd: (loadingId) => { /* 自定义 Loading 结束的回调,参数为 loadingStart 的返回值 */ },
  errToast: (msg) => { /* 自定义错误提示回调,参数为错误消息字符串 */ },
  processRequestConfig: (config) => { /* 在请求发出前的最后修改 Axios 配置的机会 */ return config; },
  processResponseData: (data, response) => { /* 在响应被处理前的最后修改响应数据的机会 */ return data; },
  strictHttpStatusCheck: false, // 严格 HTTP 模式
  returnFullResponse: false, // 设置为 true 以返回完整的 AxiosResponse 对象
};

export const api = createLazyKoala(options);

默认情况下,如未提供 loadingStartloadingEnderrToast,库会使用 alert 弹窗提示错误,并在控制台输出 Loading 的开始与结束日志,方便开箱即用(可按需替换为业务 UI)。

钩子 (Hooks)

lazy-koala 提供了两个强大的全局钩子,用于在请求的生命周期中注入自定义逻辑,例如统一的加解密。

  • processRequestConfig?: (config: AxiosRequestConfig) => Promise<AxiosRequestConfig> | AxiosRequestConfig

    • 前置钩子,在请求被发送前的最后一刻执行。
    • 场景: 异步获取最新 token 并添加到 headers,或对请求数据进行加密。
  • processResponseData?: (data: any, response: AxiosResponse) => Promise<any> | any

    • 后置钩子,在收到响应后、lazy-koala 内部逻辑处理前第一时间执行。
    • 场景: 对响应数据进行统一解密或格式转换。

示例:统一加解密

// 伪代码:假设你已经有了加密和解密函数
async function encrypt(data: any): Promise<string> {
  // ... 你的加密逻辑
  return 'encrypted-string...';
}

async function decrypt(data: string): Promise<any> {
  // ... 你的解密逻辑
  return { original: 'data' };
}

const api = createLazyKoala({
  // ...
  // 1. 发送前:加密请求体
  async processRequestConfig(config) {
    if (config.data) {
      config.data = await encrypt(config.data);
    }
    return config;
  },

  // 2. 接收后:解密响应体
  async processResponseData(data, response) {
    // 假设只有成功的字符串响应需要解密
    if (response.status === 200 && typeof data === 'string') {
      return await decrypt(data);
    }
    return data;
  }
});

// 使用时,业务代码完全无感,仍然传递和接收普通对象
const decryptedResponse = await api.post('/secure-endpoint', { my: 'secret' });

发起请求

使用您创建的 api 实例来发起请求。配置单次请求请使用 .config() 链式调用。

import { api } from './api';

// GET 请求
api.get('/users', { page: 1 }).then(res => console.log(res));

// POST 请求
api.post('/users', { name: 'Koala' }).then(res => console.log(res));

// 使用 .config() 配置单次请求 (本次不显示 loading)
api.config({ loading: false })
   .get('/notifications')
   .then(res => { /* ... */ });

返回完整响应 (returnFullResponse)

默认情况下,为了方便,lazy-koala 的请求方法在成功后只返回响应体中的 data 部分。

如果您需要获取包括 HTTP 状态码、响应头在内的完整 AxiosResponse 对象,可以在初始化时将 returnFullResponse 设置为 true

// 默认行为 (returnFullResponse: false)
const data = await api.get('/user/1');
// data: { id: 1, name: 'Koala' }

// 开启新行为
const apiWithFullResponse = createLazyKoala({ returnFullResponse: true });
const response = await apiWithFullResponse.get('/user/1');
// response: {
//   status: 200,
//   headers: { ... },
//   data: { id: 1, name: 'Koala' }
// }

HTTP 客户端方法返回数据说明

  • get<T = any>(url: string, params?: any, axiosConfig?: AxiosRequestConfig): Promise<T>

  • post<T = any>(url: string, data?: any, axiosConfig?: AxiosRequestConfig): Promise<T>

  • upload<T = any>(url: string, data?: any, axiosConfig?: AxiosRequestConfig): Promise<T>

    • 说明: 这些方法在请求成功时,Promise 会解析为后端返回的业务数据 T(通常是响应体中的 data 部分)。如果发生业务失败或网络错误,Promise 会被拒绝,并返回相应的错误信息或业务数据。
  • download<T = any>(url: string, data?: any, method?: 'GET' | 'POST', axiosConfig?: AxiosRequestConfig): Promise<AxiosResponse<Blob> | T>

    • 说明: 默认以 POST 发送请求。若响应被识别为“流/附件”(见下文“响应判定流程”),Promise 会解析为完整的 AxiosResponse<Blob>;否则行为与 get/post 一致,直接返回业务数据 T

api.axiosInstance

  • readonly axiosInstance: AxiosInstance
    • 说明: 暴露内部使用的 Axios 实例,允许高级用户直接访问和配置 Axios 的原生功能,例如添加自定义拦截器等。

api 实例方法补充

  • cancel(key: string): void
    • 说明: 手动取消指定 key 的进行中请求。key 默认是请求 URL,也可以通过 .config({ id: 'your-request-id' }) 显式指定。
  • isPending(key: string): boolean
    • 说明: 判断指定 key 的请求是否仍在进行中。

api.config(tempConfig) 参数说明

api.config() 方法接受一个 tempConfig 对象,用于为下一次请求设置临时的、一次性的配置。该对象的类型为 LazyKoalaRequestConfig,包含以下属性:

  • loading?: boolean

    • 说明: 本次请求是否触发全局 Loading。默认为 true
  • preventRepeat?: boolean

    • 说明: 是否阻止重复的、未完成的请求。默认为 true
  • id?: string

    • 说明: 手动指定请求的唯一 ID,用于防重/取消。如果未指定,将使用请求 URL 作为 ID。
  • 错误处理相关配置:

    • toastOnFailure?: boolean
      • 说明: 业务失败时是否自动弹窗提示。默认为 true
    • toastOnError?: boolean
      • 说明: 网络错误时是否自动弹窗提示。默认为 true
    • callbackOnFailure?: boolean
      • 说明: 业务失败时是否触发全局 onFailure 回调。默认为 true
    • callbackOnError?: boolean
      • 说明: 网络错误时是否触发全局 onError 回调。默认为 true
  • 快捷方式:

    • toast?: boolean
      • 说明: 快捷方式,同时设置 toastOnFailuretoastOnError。具体配置的优先级高于快捷方式。
    • callback?: boolean
      • 说明: 快捷方式,同时设置 callbackOnFailurecallbackOnError。具体配置的优先级高于快捷方式。
  • Loading 覆盖(单次请求):

    • loadingStart?: () => any / loadingEnd?: (loadingId: any) => void
      • 说明: 覆盖本次请求的 Loading 显示/关闭逻辑。loadingStart 的返回值会作为 loadingEnd 的参数传入。
  • 进阶:

    • processRequestConfig(位于全局 options 中)支持返回 Promise,axios 会等待其完成。

(关于 HTTP 客户端更详细的类型,请直接从本库导出的类型定义中查看,如 LazyKoalaOptionsLazyKoalaRequestConfigLazyKoalaInstance 等。)


2.1 进阶能力与内部机制

以下内容对应于 src/core 中的重构实现。

响应判定流程(JSON / Blob / 流)

  1. 识别为流/附件:如果响应头包含 Content-Disposition: attachment,或 Content-Type 为以下之一:
    • application/pdfapplication/zipapplication/x-tarapplication/gzipapplication/vnd.ms-excelapplication/csvapplication/octet-stream
    • 则直接返回完整 AxiosResponse<Blob>(常用于下载)。
  2. 非 JSON 且非 Blob:直接返回原始 data(不做业务码判断)。
  3. 严格 HTTP 模式开启strictHttpStatusCheck = true):直接返回 data(仅以 HTTP 状态码判定成败)。
  4. 默认(业务码判断)
    • 从响应体中按 codeKeys 寻找第一个存在的业务码字段(如 code/errno/status/...),若其值存在且包含于 status 白名单中,则视为成功,返回整个响应体 data
    • 否则按 msgKeys 找到业务消息(如 msg/message/error/...),根据 toastOnFailurecallbackOnFailure 调用 errToastonFailure,并 reject(data)

当响应体为 Blob 但内容其实是 JSON 错误(常见于下载接口),库会自动尝试将 Blob 转为文本再解析为 JSON 并按以上规则处理;若解析失败,则按“流/附件”成功返回。

请求去重与取消

  • 去重策略preventRepeat: true,默认开启):
    • id(未指定时为 url)作为请求唯一键。
    • 当检测到“相同键”的新请求发起时,会自动取消前一个未完成的相同请求(使用 AbortController),并继续执行最新请求。
    • 取消属于主动行为,不会触发 toast
  • 手动控制
    • api.cancel(key):手动取消指定键的请求。
    • api.isPending(key):查询指定键是否仍在进行中。

示例:

// 使用自定义请求键
api.config({ id: 'get-user' }).get('/user');
// 短时间内再次发起同键请求,将取消之前的请求
api.config({ id: 'get-user' }).get('/user');

Loading 行为

  • 全局聚合:当第一个请求开始时触发 loadingStart,最后一个请求结束时触发 loadingEnd(内部使用集合管理进行中的请求)。
  • 单次覆盖
    • 若在 .config() 中提供了 loadingStart/loadingEnd,则该次请求优先使用它们,并将 loadingStart 的返回值作为参数传入 loadingEnd
    • 若执行出错,将自动回退到全局 Loading 控制器。

配置合并与一次性 .config()

  • .config() 配置仅对下一次请求生效,请求发出后自动清空(链式安全)。
  • Headers 合并顺序(后者优先):
    1. 全局 axiosConfig.headers < 2) 单次请求的 axiosConfig.headers (即 api.get 等方法的第三个参数)。
  • GET 参数合并:多来源 params 会合并,后设置的键覆盖先前的值。

严格 HTTP 模式与 validateStatus

  • strictHttpStatusCheck = true
    • createLazyKoala 会设置 axios.validateStatus;若在 axiosConfig 中未提供 validateStatus,默认仅 status === 200 视为成功;
    • 成功分支中直接返回 data(不做业务码判断);
    • 失败分支:若存在 error.response,按 toastOnFailure/callbackOnFailure 处理;网络层错误则按 toastOnError/callbackOnError 处理。

导出的类型与常量

lazy-koala 包直接导出以下内容,便于类型标注与配置复用:

import {
  createLazyKoala,
  // 常量(可用于自定义 responseConfig)
  SUCCESS_STATUS_CODES,
  RESPONSE_CODE_KEYS,
  RESPONSE_MSG_KEYS,
  // 类型
  type LazyKoalaOptions,
  type LazyKoalaRequestConfig,
  type LazyKoalaInstance,
} from 'lazy-koala';

进阶示例

  • 异步修改请求配置(例如动态刷新 Token):
createLazyKoala({
  async processRequestConfig(config) {
    const token = await getFreshToken();
    return { ...config, headers: { ...config.headers, Authorization: `Bearer ${token}` } };
  }
});
  • 单次请求自定义 Loading:
api.config({
  loading: true,
  loadingStart: () => showGlobalBar(),
  loadingEnd: () => hideGlobalBar(),
}).get('/profile');
  • 下载文件(返回完整 AxiosResponse):
const res = await api.download('/export', { type: 'csv' });
// res.data 为 Blob,可用 URL.createObjectURL 保存到本地

3. 工具函数集

lazy-koala 提供了一系列开箱即用的工具函数。所有函数均为独立的命名导出,完美支持 Tree-Shaking。

统一导入方式:

import { getCookie, createDebounce, isMobileDevice } from 'lazy-koala/utils';

Clipboard (剪贴板)

提供安全、可靠的异步剪贴板复制功能。

  • copyToClipboard(text)
    • 功能: 异步地将文本复制到用户剪贴板。优先使用现代、安全的 navigator.clipboard API,并为旧浏览器或不安全环境(HTTP)提供回退方案。
    • 参数:
      • text: string: 需要被复制的文本内容。
    • 返回: Promise<void>
      • 一个不带任何返回值的 Promise。你可以通过 await.then() 来确认复制操作已完成,或通过 try...catch / .catch() 捕获可能发生的错误。
    • 注意: 只能在具有 navigatordocument 的浏览器环境中调用;在 SSR 或非安全上下文下会抛出错误。
    • 示例:
      import { copyToClipboard } from 'lazy-koala/utils';
      
      async function handleCopy(text) {
        try {
          await copyToClipboard(text);
          alert('复制成功!');
        } catch (error) {
          console.error('复制失败:', error.message);
        }
      }
      
      handleCopy('Hello, World!');

Cookie (Cookie 管理)

提供功能全面、SSR 安全的 Cookie 操作方法。

  • setCookie(name, value, options?)

    • 功能: 设置一个 Cookie。
    • 参数:
      • name: string: Cookie 的名称。
      • value: string: Cookie 的值,函数会自动对其进行 URI 编码。
      • options?: CookieOptions: 一个包含额外选项的对象。
        • days?: number: Cookie 的有效期(天数)。
        • path?: string: Cookie 的有效路径,默认为 '/' (整个网站)。
        • domain?: string: Cookie 的有效域名。
        • secure?: boolean: 若为 true,则 Cookie 只在 HTTPS 连接中发送。
        • samesite?: 'Strict' | 'Lax' | 'None': 控制跨站请求伪造(CSRF)策略。
  • getCookie(name)

    • 功能: 获取指定名称的 Cookie。
    • 返回: string | null - 返回解码后的 Cookie 值,如果不存在则返回 null
  • getAllCookies()

    • 功能: 以对象形式获取所有 Cookie。
    • 返回: Record<string, string> - 包含所有 Cookie 键值对的对象。例如: { "user_id": "123", "theme": "dark" }
  • removeCookie(name, options?)

    • 功能: 删除一个 Cookie。注意: 必须提供与设置时相同的 pathdomain 才能保证成功删除。
  • clearAllCookies()

    • 功能: 尽力清除当前路径下的所有 Cookie。
  • 示例:

    import { setCookie, getCookie } from 'lazy-koala/utils';
    
    // 设置一个有效期为 7 天, 作用于根路径的 Cookie
    setCookie('user_id', '12345', { days: 7, path: '/' });
    
    // 读取 Cookie
    const userId = getCookie('user_id'); // -> "12345"

CountDown (倒计时)

一个精确、可控的倒计时函数。

  • createCountdown(options)

    • 功能: 创建一个新的倒计时实例。
    • 参数 (options): 类型为 CountDownOptions,包含以下属性:
      • totalSeconds: number: 倒计时的总秒数。
      • onTick?: (remainingSeconds: number) => void: (可选) 每秒钟触发一次的回调函数,它会接收到剩余的秒数作为参数。
      • onEnd?: () => void: (可选) 倒计时归零时触发的回调函数。
    • 返回: 一个包含以下方法的对象:
      • .start(): 开始或恢复倒计时。
      • .stop(): 暂停倒计时。
      • .reset(): 停止并将倒计时重置为初始总秒数。
      • .getRemainingSeconds(): 获取当前剩余的秒数。
  • 示例:

    import { createCountdown } from 'lazy-koala/utils';
    
    const countdown = createCountdown({
      totalSeconds: 60,
      onTick: (sec) => console.log(`剩余 ${sec} 秒`),
      onEnd: () => console.log('倒计时结束!'),
    });
    
    countdown.start();

Debounce (函数防抖)

  • createDebounce(func, delay?)

    • 功能: 创建一个防抖函数。该函数在被连续调用时,只有在最后一次调用结束、并经过 delay 毫秒后才会真正执行。
    • 参数:
      • func: Function: 需要进行防抖处理的原始函数。
      • delay?: number: 延迟的毫秒数,默认为 1000
    • 返回: 一个新的、经过防抖处理的函数。
  • 示例: (常用于搜索框输入)

    import { createDebounce } from 'lazy-koala/utils';
    
    // 假设这是我们的 API 请求函数
    const fetchSuggestions = (query) => {
      console.log('Fetching suggestions for:', query);
    };
    
    const debouncedFetch = createDebounce(fetchSuggestions, 500);
    
    // 在 input 元素的 oninput 事件中调用 debouncedFetch
    // <input oninput="debouncedFetch(event.target.value)" />
    // 只有当用户停止输入 500ms 后,才会打印日志

Environment (环境判断)

提供预先计算好的、用于判断当前环境的布尔常量。

  • isMobileDevice: true 如果用户代理是 iPhone 或 Android。

  • isWeChat: true 如果在微信内置浏览器中。

  • isAlipay: true 如果在支付宝内置浏览器中。

  • isCMCC: true 如果在和生活 App 环境中。

  • 示例:

    import { isMobileDevice, isWeChat } from 'lazy-koala/utils';
    
    if (isMobileDevice) {
      console.log('正在移动设备上运行。');
    }
    if (isWeChat) {
      // 可以在此调用微信 JSSDK
    }

Format (格式化)

  • formatDate(date, formatStr?)

    • 功能: 将 Date 对象格式化为指定字符串。
    • 参数:
      • date: Date: 需要格式化的 Date 对象。
      • formatStr?: string: 格式化模板,默认为 'YYYY-MM-DD HH:mm:ss'
    • 返回: string - 格式化后的日期字符串。例如: '2023-10-26 15:45:05'
  • formatPrice(amount, locale?)

    • 功能: 使用浏览器内置的 Intl.NumberFormat API 将数字格式化为带千位分隔符的价格字符串。
    • 参数:
      • amount: number | string: 需要格式化的金额。
      • locale?: string: (可选) 语言环境代码,如 'en-US''de-DE'。默认为浏览器当前环境。
    • 返回: string - 格式化后的价格字符串。例如: '12,345.67'
  • 示例:

    import { formatDate, formatPrice } from 'lazy-koala/utils';
    
    console.log(formatDate(new Date())); // -> "2025-10-14 10:30:00" (示例)
    console.log(formatPrice(12345.67)); // -> "12,345.67"

File Operations (文件操作)

  • selectFile(options?)

    • 功能: 编程式地打开一个文件选择对话框。
    • 参数 (options):
      • accept?: string: 允许的文件类型,与 <input type="file">accept 属性相同。例如: 'image/*', '.pdf', 'image/png,image/jpeg'
      • multiple?: boolean: 若为 true,则允许用户选择多个文件。
      • capture?: 'user' | 'environment': (仅限移动端) 用于直接调用摄像头,'user' 为前置,'environment' 为后置。
    • 返回: Promise<File | FileList> - 如果 multiplefalse,则解析为单个 File 对象;如果为 true,则解析为 FileList 对象。
  • saveFile(fileData, fileName)

    • 功能: 在浏览器中触发一个文件下载操作。
    • 参数:
      • fileData: BlobPart: 文件内容,可以是字符串、Blob、ArrayBuffer 等。
      • fileName: string: 下载时预设的文件名。
  • 示例:

    import { selectFile, saveFile } from 'lazy-koala/utils';
    
    // 异步选择图片
    async function chooseImage() {
      try {
        const file = await selectFile({ accept: 'image/*' });
        console.log('Selected file:', file.name);
      } catch (error) {
        console.log('用户取消了选择');
      }
    }
    
    // 保存一个文本文件
    saveFile('Hello, World!', 'greeting.txt');

Random (随机数)

  • randomInt(min, max)

    • 功能: 生成一个在 minmax 之间的随机整数(包含 minmax)。
    • 返回: number - 一个整数。
  • randomElement(array)

    • 功能: 从数组中随机取出一个元素及其索引。
    • 返回: { value: T, index: number } | null - 一个包含值和索引的对象,如果数组为空则返回 null
  • 示例:

    import { randomInt, randomElement } from 'lazy-koala/utils';
    
    console.log(randomInt(1, 10)); // -> 可能是 1 到 10 之间的任何整数
    
    const fruits = ['apple', 'banana', 'cherry'];
    const fruit = randomElement(fruits);
    // fruit 可能为 { value: 'banana', index: 1 }

Storage (本地存储)

localStoragesessionStorage 的一层安全封装,提供自动的 JSON 序列化/反序列化,并支持 SSR 环境下静默失败。

  • localStore: 封装 localStorage

  • sessionStore: 封装 sessionStorage

  • .setItem(name, value)

    • 参数: name: string, value: any (任何可被 JSON 序列化的值,如对象、数组、字符串等)。
  • .getItem<T>(name)

    • 返回: T | null - 返回经过 JSON 解析后的原始类型数据,如果不存在则返回 null
  • .removeItem(name): 移除一个存储项。

  • .clear(): 清空所有由该库创建的存储项。

  • 示例:

    import { localStore } from 'lazy-koala/utils';
    
    const user = { name: 'Koala', id: 1 };
    localStore.setItem('currentUser', user);
    
    const savedUser = localStore.getItem<{ name: string, id: number }>('currentUser');
    console.log(savedUser.name); // -> "Koala"

Throttle (函数节流)

  • createThrottle(func, delay?)

    • 功能: 创建一个节流函数。在指定的时间间隔 delay 内,该函数最多只会被执行一次。
    • 参数:
      • func: Function: 需要进行节流处理的原始函数。
      • delay?: number: 时间间隔的毫秒数,默认为 1000
    • 返回: 一个新的、经过节流处理的函数。
  • 示例: (常用于监听滚动、窗口缩放等高频事件)

    import { createThrottle } from 'lazy-koala/utils';
    
    const handleScroll = () => {
      console.log('Window is scrolling!');
    };
    
    const throttledScrollHandler = createThrottle(handleScroll, 1000);
    
    // window.addEventListener('scroll', throttledScrollHandler);
    // 日志每秒最多只会打印一次

URL Params (URL 参数)

提供一系列函数用于方便地获取 URL 中的 search (查询字符串) 和 hash 参数。

  • getParams(paramString, key?)

    • 功能: 解析任意形态的查询字符串(例如来自后端或手动拼接的 foo=bar&baz=1)。
    • 参数:
      • paramString: string: 待解析的原始查询字符串,支持是否包含开头的 ?
      • key?: string: (可选) 指定单个 key 时直接返回对应的值。
    • 返回: 未提供 key 时返回 Record<string, string>;提供时返回 string | null
  • searchParams(key?)

    • 功能: 获取 location.search (? 后面的部分) 中的参数。
    • 参数: key?: string - (可选) 如果提供 key,则返回该 key 对应的单个值。
    • 返回: 如果提供 key,返回 string | null;如果不提供 key,返回 Record<string, string> (包含所有参数的键值对对象)。
  • hashParams(key?)

    • 功能: 获取 location.hash (# 后面的部分) 中的参数。
  • urlParams(key?)

    • 功能: 一个便捷函数,优先从 search 中获取,若无则从 hash 中获取。
  • 示例:

    import { getParams, searchParams, urlParams } from 'lazy-koala/utils';
    
    // 假设当前 URL 是 https://example.com?user=koala&id=123#token=abc
    const parsed = getParams('?user=koala&id=123'); // -> { user: 'koala', id: '123' }
    
    const userId = searchParams('id'); // -> "123"
    const allSearchParams = searchParams(); // -> { user: 'koala', id: '123' }
    
    const token = urlParams('token'); // -> "abc"

UUID

  • generateUUID()

    • 功能: 生成一个 v4 版本的 UUID (通用唯一标识符) 字符串。
    • 返回: string - 一个 UUID 字符串。例如: '123e4567-e89b-12d3-a456-426614174000'
  • 示例:

    import { generateUUID } from 'lazy-koala/utils';
    
    const uniqueId = generateUUID();

Validation (数据校验)

提供一系列常用的数据格式校验函数,全部返回布尔值 truefalse

  • isMobileNumber(str): 检查字符串是否为 11 位、以 '1' 开头的手机号。

  • isSMS(str, len?): 检查字符串是否为指定长度的纯数字验证码 (默认长度为 6)。

  • isEmail(str): 检查字符串是否为合法的 Email 格式。

  • isURL(str): 检查字符串是否为合法的 URL。

  • isEmpty(value): 检查一个值是否为空。null, undefined, 空字符串 (''), 空数组 ([]), 空对象 ({}) 均被视为空。

  • isIdCard(str): 检查字符串是否为合法的 18 位中国身份证号(包含最后一位的校验位检查)。

  • 示例:

    import { isEmail, isEmpty } from 'lazy-koala/utils';
    
    console.log(isEmail('[email protected]')); // -> true
    console.log(isEmail('[email protected]')); // -> false
    
    console.log(isEmpty([])); // -> true
    console.log(isEmpty({})); // -> true
    console.log(isEmpty(' ')); // -> true