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 🙏

© 2024 – Pkg Stats / Ryan Hefner

unstable

v0.5.15

Published

a experimental tool base

Downloads

31

Readme

unstable

unstable是一个工具库,正如其名,是不稳定的,请不要在生产环境中使用,仅供实验性开发和探索使用

安装

  npm install unstable

标志

下文所有参数类型加?为可选参数, 在代码中函数后方加的注释均为返回值

基本函数

isObject

检测目标是否是对象

(any) -> boolean
参数: (任意)

import { isObject } from "unstable";
isObject({}); // true
isObject([]); // true
isObject("string"); // false
isObject(null); // false

typeOf

获取目标的具体类型,值从 Object.prototype.toString 返回的结果中截取

(any) -> string
参数:(任意)

import { typeOf } from "unstable";
typeOf({}); // "Object"
typeOf([]); // "Array"
typeOf(new Map()); // "Map"
typeOf(new Set()); // "Set"
typeOf(new Promise(()=> {})); // "Promise"
typeOf(new Error()); // "Error"
typeOf(/\\/); // "RegExp"
// ...

merge

深度合并多个对象,不同于Object.assign,基本示例如下

(Array<object>) -> object
参数: (包含多个对象的数组)

import { merge } from "unstable";
merge(
  [
    { a: 1, b: 2, c: 3 },
    { a:2, d: 5 },
    { b: 3, g: 7 }
  ]
);
/*
  {a: 2, b: 3, c: 3, d: 5, g: 7}
*/

isJSON

检测是否是json

(string) -> boolean
参数:(要检测的字符串)

deepCopy

深复制

(object) -> object
参数:(要深复制的对象)

debounce

防抖

(function, number, object?) -> function
参数: (要防抖的函数, 最大间隔, this对象?);

import { debounce } from "unstable";
let debounced = debounce(function() {}, 100, {a: 1});

throttle

节流

(function, number, object?) -> function
参数: (要节流的函数, 最大间隔, this对象?);

import { throttle } from "unstable";
let throttled = throttle(function() {}, 100, {a: 1});

once

包装单次运行的函数

(function, object?) -> function
参数: (要单次运行的函数, this对象?);

import { once } from "unstable";
let onced = once(()=> console.log("runed"));
onced(); // "runed"
onced(); // 

浏览器可用函数

loadJs

从给定的源加载一个js文件

(string) -> void
参数:(uri地址)

removeElement

删除目标元素

(element) -> void
参数:(要删除的元素)

style方法

获取和设置style

getStyle

(element, string) -> string
参数:(DOM元素, 样式名)

setStyle

(element, object) -> string
参数:(DOM元素, 样式对象)

import { setStyle } from "unstable";
setStyle(element/* 目标元素 */, {
  width: "100px",
  height: "100px",
  "z-index": "10" 
});

cookie方法

读写cookie

getCookie

(string) -> string

setCookie

(string, string, number) -> void

import { getCookie, setCookie } from "unstable";
// 设置 cookie 的方法,第三个参数单位:天
setCookie("key", "value", 1); 
getCookie("key"); // "value"

readFileAsText

读取文件中的文本内容

(file) -> Promise<string>
参数:(从input标签中获取的文件)

drag

使目标元素可拖动到任意位置

(element) -> void
参数:(DOM元素)

额外函数

compileXMLToAST

将XML编译为AST,基础示例如下,在线使用

(string) -> object
参数:(XML字符串)

import { compileXMLToAST } from "unstable";
// <></>表示Fragment
compileXMLToAST(`
<>
  <input>
  <br />
  <div class="container">
    <span>content</span>
  </div>
</>
`);/*
{
  "props": {},
  "type": "Fragment",
  "nodeName": "",
  "children": [
    {
      "props": {},
      "type": "Tag",
      "nodeName": "input"
    },
    {
      "props": {},
      "type": "Tag",
      "nodeName": "br"
    },
    {
      "props": {
        "class": "container"
      },
      "type": "Tag",
      "nodeName": "div",
      "children": [
        {
          "props": {},
          "type": "Tag",
          "nodeName": "span",
          "children": [
            {
              "type": "String",
              "value": "content"
            }
          ]
        }
      ]
    }
  ]
}
*/

createElement

根据compileXMLToAST返回的对象创建元素及其子元素,返回创建的元素

(object)-> element
参数:(compileXMLToAST返回的对象)

reactivity 相关

这些功能与vue reactivity功能大致相同, 实现了 ref, isRef, toRef, toRefs, reactive, shallowReactive, isReactive, readonly, shallowReadonly, isReadonly, watch, watchEffect, computed
参考vue reactivity 文档

scheduler 相关

用于根据优先级调度任务的执行,减少因执行卡顿导致浏览器阻塞
当任务未到过期时间,如果浏览器需要渲染,则中断调度,待浏览器渲染后,任务将继续执行,这可以避免阻塞用户交互
当同时有多个任务,过期时间近的任务会被排在前面,过期时间远任务会被排在后面
当任务到达过期时间,会变成同步(阻塞)执行

scheduleExpireCallback

(number, function) -> void
参数:(过期时间-毫秒, 回调函数)

schedulePriorityCallback

(number, function) -> void
参数:(优先级变量, 回调函数)

优先级变量导出
immediatePriority 立即执行,过期时间 -1ms

userBlockingPriority 用户阻塞优先级,过期时间 250ms

normalPriority 一般优先级,过期时间 1000ms

lowPriority 低优先级,过期时间 10000ms

idlePriority 空闲优先级,过期时间 1073741823ms (v8最大整数)

parseq

一种异步控制流的方式,参考 douglas-crockford 的 parseq ,但有一些不同,并且提供了一些额外功能

概念
callback

一种用于传递异步操作结果的函数,便于理解,称之为回调函数(callback),下面的异步操作的返回值,指这里 (any, any)-> void 参数:(成功的值, 失败的原因)
返回值: 可选返回一个取消函数,用于取消异步操作
失败的原因一般来说是 Error 的实例,建议始终是 Error 实例

手动调用的时候,如果成功则只传入一个参数作为成功的值,比如 callback(value)
如果失败就传入两个参数,第一个为undefined,第二个为失败原因,一般返回捕获的Error,比如 callback(undefined, error)

requestor

一种接收一个回调函数,一个值的函数,便于理解,称之为请求器(requestor) (function, any?) -> function? 参数:(回调函数, 初始值)

请求器一般为自定义的用于异步操作的函数,里面可以有任意异步操作,如果异步操作结束,则调用 callback 结束这个异步操作,调用方式与上述相同,请求器可选返回一个取消函数,用于取消该异步操作,初始值在请求器调用的时候可在内部使用

方法

下述所有方法均返回一个新的请求器,一旦该请求器内产生错误,则调用其他所有请求器返回的取消方法(如果有的话)
借助下面的方法可以轻松组合许多请求器,从而产生强大的控制流

parallel

接收一组请求器,返回一个新的请求器 (Array<function>, number?, number?, string?) -> function 参数 (Array<请求器>, 时间限制?, 并发数?, 函数名称?) -> 请求器 参数详情

  • Array<请求器>: 一个请求器数组,包含了一组异步操作,每个请求器符合上述请求器的规范
  • 时间限制: 如果超时就会直接创建一个超时错误通过调用 callback(undefined, error) 传出
  • 并发数: 同时运行请求器的最大数量
  • 函数名称:函数的名称,一般不需要传,仅用于错误信息生成

该方法的动作类似于 Promise.all , 只要有一个失败,那么就会以这个失败抛出,成功则返回成功结果数组

race

和上述 parallel 方法参数相同

该方法的动作类似于 Promise.race , 只要有一个完成(不论成功或失败),那么就会完成(不论成功或失败)

any

和上述 parallel 方法参数相同

该方法的动作类似于 Promise.any , 只要有一个成功 ,那么就会成功,如果所有的都失败了,则抛出失败

allSettled

和上述 parallel 方法参数相同

该方法的动作类似于 Promise.allSettled , 不论成功或者失败(不超时),都会返回结果数组,如果超时,则返回超时错误

sequence

串行执行请求器,会依次执行请求器,并且以前面请求器的结果作为后面请求器的参数,全部成功则返回最后一个请求器的结果,失败则返回失败的那个请求器的失败原因
(Array<function>, number?, string?) -> function
参数 (Array<请求器>, 时间限制?, 函数名称?) -> 请求器

该方法的动作类似于 promise.then(xx).then(xx).then(xx)