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

better-webworker

v1.0.17

Published

[English](https://github.com/mchao123/better-webworker/blob/main/README.md) | [中文](https://github.com/mchao123/better-webworker/blob/main/README.zh-CN.md)

Readme

English | 中文

Better WebWorker

npm version npm downloads license

一个用于创建类型安全的Web Worker和iframe通信的库,提供更好的开发体验和类型安全。

特性

  • 类型安全的Worker/iframe通信
  • 双模式支持:WebWorker 或 iframe(API完全一致)
  • 支持函数传输和反序列化
  • 自动处理Worker/iframe生命周期
  • 内置超时控制和错误处理
  • 与Vite无缝集成

安装

npm install better-webworker

使用

主线程

import { useWorker } from 'better-webworker';

// 创建Worker实例
const worker = new Worker(new URL('./worker.ts', import.meta.url), {
  type: 'module'
});

// 获取类型安全的接口
const { methods, destroy } = useWorker<{
  add(a: number, b: number): number;
  fetchData(url: string): Promise<any>;
}>(worker);

// 调用Worker方法
const sum = await methods.add(1, 2); // 3
const data = await methods.fetchData('https://api.example.com/data');

// 使用完毕后清理资源
destroy();

Worker线程

import { defineReceive } from 'better-webworker';

export default defineReceive({
  add(a: number, b: number) {
    return a + b;
  },
  
  async fetchData(url: string) {
    const response = await fetch(url);
    return response.json();
  }
});

Vite配置

import { defineConfig } from 'vite';
import betterWorker from 'better-webworker/vite';

export default defineConfig({
  plugins: [
    // WebWorker 模式(默认)
    betterWorker() // 默认处理.worker.ts文件
    
    // iframe 模式 - 只需改变一个参数!
    // betterWorker(/\.worker\.ts$/, true)
    
    // 自定义文件匹配模式:
    // betterWorker(/\.worker\.(ts|js)$/)
  ]
});

关键特性:使用 iframe 模式(isIframe: true)时,插件名称会自动变更为 better-iframe 方便识别。Worker 文件代码保持完全相同 - defineReceive 会自动检测环境(Worker 或 iframe)并正确初始化!

iframe 模式使用

// example.iframe.ts - Worker 代码(与 WebWorker 完全相同!)
import { defineReceive } from 'better-webworker';

export default defineReceive({
  someTask() {
    return 'Task completed!';
  }
});
// main.ts - 导入编译后的 iframe worker
import createIframe from './example.iframe';

const { methods, destroy } = createIframe();

// API 与 WebWorker 模式完全一致
await methods.someTask();

// 使用完毕后清理资源
destroy();

重要提示

  • useIframe 不应该被用户直接调用 - 它由 Vite 插件自动处理
  • 使用 iframe 模式时,插件会自动生成 HTML 包装文件并管理 iframe 生命周期
  • Worker 代码在 Worker 和 iframe 模式之间保持完全相同

详细的 iframe 使用说明请参考 IFRAME_USAGE.md

自动编译

使用Vite插件时,.worker.ts(或 iframe 模式的 .iframe.ts)文件会被自动编译并生成类型安全的Worker/iframe实例。你只需要直接导入文件即可:

// main.ts
import worker from './example.worker';  // WebWorker 模式
// 或
import iframe from './example.iframe';  // iframe 模式

const { methods } = worker();  // 或 iframe()
await methods.someTask();

API

useWorker<T>(worker: Worker)

创建类型安全的Worker接口。

  • worker: Web Worker实例
  • 返回:包含methods的对象,methods包含所有Worker方法的类型安全接口,以及destroy()方法用于清理资源

useIframe<T>(url: string)

仅供内部使用 - 此函数由 Vite 插件自动调用,不应直接使用。当你导入 iframe worker 文件(例如 import createIframe from './example.iframe')时,插件会自动处理 iframe 的创建和初始化。

  • url: HTML 包装文件的 URL(由插件自动生成)
  • 返回:包含methods(与useWorker一致)和destroy()方法的对象

defineReceive<T>(handlers: T)

为 Worker 和 iframe 环境定义处理函数。自动检测环境(Worker 或 iframe)并正确初始化 - 无需使用不同的函数!

  • handlers: 包含处理函数的对象
  • 返回:Worker/iframe初始化函数

**这个函数在两种环境下都可以使用!**无需 defineWorkerReceivedefineIframeReceive

注意事项

  1. 确保Worker文件以.worker.ts结尾
  2. 使用Vite时,需要配置插件
  3. 传输函数时注意闭包问题
  4. 合理设置超时时间

示例

完整示例请参考examples目录