Skip to content

Instantly share code, notes, and snippets.

@Valexr
Forked from manzt/README.md
Created March 12, 2023 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Valexr/d402462df0cd46758c79f9d863652cde to your computer and use it in GitHub Desktop.
Save Valexr/d402462df0cd46758c79f9d863652cde to your computer and use it in GitHub Desktop.
esbuild-plugin-inline-webworker

esbuild-plugin-inline-webworker

Usage

// ./index.ts
import workerSrc from 'inline-worker:./worker.ts';
let worker = new Worker(workerSrc);
worker.onmessage = e => console.log(e.data); // 'world'

// ./util.ts
export const hello = () => 'world';

// ./worker.ts
import { hello } from './util.ts';
postMessage(hello());
// ./build.js
import esbuild from 'esbuild';
import { PluginInlineWorker } from './plugin-inline-webworker.js';

esbuild.build({
  entryPoints: ['./index.ts'],
  bundle: true,
  format: 'esm',
  plugins: [PluginInlineWorker()],
})
node build
# // inline-worker:/Users/hms-manzt/demos/esbuild-plugin-inline-webworker/worker
# var worker_default = "data:application/javascript;base64,KCgpPT57dmFyIG89KCk9PiJ3b3JsZCI7cG9zdE1lc3NhZ2UobygpKTt9KSgpOwo=";
# 
# // index.ts
# var worker = new Worker(worker_default);
# worker.onmessage = (e) => console.log(e.data);
import esbuild from "esbuild";
import { resolve } from "path";
/**
* @param {Pick<import('esbuild').BuildOptions, 'minify' | 'format' | 'plugins'>}
* @return {import('esbuild').Plugin}
*/
export const PluginInlineWorker = (opt = {}) => {
const namespace = "inline-worker";
const prefix = `${namespace}:`;
return {
name: namespace,
setup(build) {
build.onResolve({ filter: new RegExp(`^${prefix}`) }, (args) => {
return {
path: resolve(args.resolveDir, args.path.slice(prefix.length)),
namespace,
};
});
build.onLoad({ filter: /.*/, namespace }, async (args) => {
const { outputFiles } = await esbuild.build({
entryPoints: [args.path],
bundle: true,
write: false,
format: opt.format || "iife",
minify: opt.minify || true,
target: build.initialOptions.target,
plugins: [
...(build.initialOptions.plugins || []),
...(opt.plugins || []),
],
});
if (outputFiles.length !== 1) {
throw new Error("Too many files built for worker bundle.");
}
const { contents } = outputFiles[0];
const base64 = Buffer.from(contents).toString("base64");
return {
loader: "js",
contents: `export default "data:application/javascript;base64,${base64}";`,
};
});
},
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment