Quiero construir una biblioteca híbrida (es decir, un paquete NPM) usando JavaScript (TypeScript) + WebAssembly (Rust). Y quiero admitir múltiples paquetes, no solo Webpack. Esto parece difícil, ya que cada paquete utiliza un enfoque ligeramente diferente para importar WASM:
// Webpack (experiments.asyncWebAssembly) import { hello } from './my-lib.wasm' hello() // Rollup (using @rollup/plugin-wasm) import init from './my-lib.wasm' init().then(({ instance }) => { instance.exports.hello() }) // Parcel import { hello } from './my-lib.wasm' hello() // ...or, if you want a promise import('./my-lib.wasm').then(exports => { exports.hello() }) // Vite (note: this will be removed in v3.0, // see https://github.com/vitejs/vite/discussions/7763) import init from './my-lib.wasm' init().then(exports => { exports.hello() }) // alternatively, use vite-plugin-wasm, which is the preferred approach for v3+ import { hello } from './my-lib.wasm' hello()No puedo confiar en los enlaces JS generados por wasm-bindgen, ya que AFAIK solo es compatible con Webpack.
// JS bindings generated by wasm-bindgen import * as wasm from './my-lib_bg.wasm' export function hello() { wasm.hello() }Las aplicaciones web no tienen este problema porque pueden elegir su propio paquete, pero no sé qué paquete procesará mi código de antemano.
¿Cómo puedo escribir un paquete que admita múltiples paquetes? ¿Puedo generar de alguna manera diferentes puntos de entrada para cada paquete?
Creo que el objetivo del bundler es la respuesta para el futuro, es decir, con la integración de WASM ESM . Actualmente es compatible con Webpack y Vite (con mi complemento que mencionaste). En el futuro habrá soporte nativo en el navegador y Node.js. Pero actualmente es posible que sea necesario crear complementos para admitirlos en otros paquetes.
Otra opción por ahora es usar el objetivo web , que requiere que el usuario de su paquete obtenga la URL del archivo WASM del paquete e inicialice su complemento con él.