close
  • 简体中文
  • Web Workers

    Rslib 支持在库中使用 Web Worker。当 Rslib 遇到 new Worker(new URL(..., import.meta.url)) 时,会将引用的模块输出为独立的 Web Worker chunk,并重写 URL 以指向生成的文件。

    Warning

    Rslib 的 Web Worker 功能面向 ESM 产物,不支持 CJS 产物。

    使用

    Web Worker 请求必须可以被静态分析。请在 new URL() 中直接使用相对路径字符串和 import.meta.url

    src/index.ts
    src/my.worker.ts
    src/helper.ts
    export const worker = new Worker(new URL('./my.worker.ts', import.meta.url));

    Bundle 模式

    在 bundle 模式下,无需额外配置。Web Worker 模块及其依赖会被打包到独立的 Web Worker chunk 中:

    dist/
    ├── index.js
    └── <worker-chunk>.js

    Bundleless 模式

    在 bundleless 模式下,source.entry 匹配的每个源文件都会被视为一个入口。Web Worker 文件必须从入口 glob 中排除,因为它们会被单独输出为 Web Worker chunk。

    使用 .worker.ts 命名约定可以方便地排除所有 Web Worker 文件:

    rslib.config.ts
    export default {
      lib: [
        {
          bundle: false,
          source: {
            entry: {
              index: ['./src/**/*.ts', '!./src/**/*.worker.ts'],
            },
          },
        },
      ],
    };

    使用上面示例中的源文件时,Rslib 会将 index.tshelper.ts 输出为常规 bundleless 产物。Web Worker chunk 会被单独输出,并引用生成的 helper.js

    dist/
    ├── index.js
    ├── helper.js
    └── <worker-chunk>.js
    <worker-chunk>.js
    import { message } from './helper.js';
    
    console.log(message);