Menci / vite-plugin-wasm

Add WebAssembly ESM integration (aka. Webpack's `asyncWebAssembly`) to Vite and support `wasm-pack` generated modules.
MIT License
281 stars 16 forks source link

`Could not resolve`, `missing default export` errors in some packages #34

Closed mima0815 closed 1 year ago

mima0815 commented 1 year ago

Hi, i got stuck when using this plugin to use packages with wasm files and vite.

Don't know if the issue is in this plugin or in the package i use.

Here is a repo to reproduce the issue: https://github.com/mima0815/vitewasm with the package: @swagger-api/apidom-parser-adapter-openapi-json-3-0

if i import this https://github.com/mima0815/vitewasm/blob/main/src/components/HelloWorld.vue#L3 and use it here: https://github.com/mima0815/vitewasm/blob/main/src/components/HelloWorld.vue#L10

i get the following errors when building or using the vitejs dev mode:

✘ [ERROR] Could not resolve "env"

    vite-plugin-wasm-namespace:/Users/mima0815/dev/mima0815/vitewasm/2/node_modules/@swagger-api/apidom-parser-adapter-json/wasm/tree-sitter-json.wasm:43:183:
      43 │ ..._base as __vite__wasmImport_0_1, memory as __vite__wasmImport_0_2, __indirect_function_table as __vite__wasmImport_0_3 } from "env";
         ╵                                                                                                                                  ~~~~~

  You can mark the path "env" as external to exclude it from the bundle, which will remove this
  error.

✘ [ERROR] Could not resolve "env"

    vite-plugin-wasm-namespace:/Users/mima0815/dev/mima0815/vitewasm/2/node_modules/web-tree-sitter/tree-sitter.wasm:43:579:
      43 │ ...se as __vite__wasmImport_0_10, memory as __vite__wasmImport_0_11, __indirect_function_table as __vite__wasmImport_0_12 } from "env";
         ╵                                                                                                                                  ~~~~~

  You can mark the path "env" as external to exclude it from the bundle, which will remove this
  error.

✘ [ERROR] Could not resolve "wasi_snapshot_preview1"

    vite-plugin-wasm-namespace:/Users/mima0815/dev/mima0815/vitewasm/2/node_modules/web-tree-sitter/tree-sitter.wasm:44:122:
      44 │ ...te as __vite__wasmImport_1_0, fd_close as __vite__wasmImport_1_1, fd_seek as __vite__wasmImport_1_2 } from "wasi_snapshot_preview1";
         ╵                                                                                                               ~~~~~~~~~~~~~~~~~~~~~~~~

  You can mark the path "wasi_snapshot_preview1" as external to exclude it from the bundle, which
  will remove this error.

✘ [ERROR] Could not resolve "GOT.mem"

    vite-plugin-wasm-namespace:/Users/mima0815/dev/mima0815/vitewasm/2/node_modules/web-tree-sitter/tree-sitter.wasm:45:54:
      45 │ import { __heap_base as __vite__wasmImport_2_0 } from "GOT.mem";
         ╵                                                       ~~~~~~~~~

  You can mark the path "GOT.mem" as external to exclude it from the bundle, which will remove this
  error.

adding this to the vite.config.json, removes the errors:

  build: {
    rollupOptions:{
      external:['env','wasi_snapshot_preview1','GOT.mem']
    }
  },

but then it fails later with an missing default export:

"default" is not exported by "node_modules/web-tree-sitter/tree-sitter.wasm", imported by "node_modules/@swagger-api/apidom-parser-adapter-json/es/lexical-analysis/browser-patch.js".
file: /Users/mima0815/dev/mima0815/vitewasm/2/node_modules/@swagger-api/apidom-parser-adapter-json/es/lexical-analysis/browser-patch.js:4:7
2: import { isString, isFunction } from 'ramda-adjunct';
3: // @ts-ignore
4: import treeSitterWasm from 'web-tree-sitter/tree-sitter.wasm';
          ^
5: 
6: // patch fetch() to let emscripten load the WASM file
error during build:
RollupError: "default" is not exported by "node_modules/web-tree-sitter/tree-sitter.wasm", imported by "node_modules/@swagger-api/apidom-parser-adapter-json/es/lexical-analysis/browser-patch.js".
    at error (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:2124:30)
    at Module.error (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:13463:16)
    at Module.traceVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:13884:29)
    at ModuleScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:12429:39)
    at TrackingScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
    at BlockScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
    at ReturnValueScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
    at ChildScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
    at TrackingScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
    at BlockScope.findVariable (file:///Users/mima0815/dev/mima0815/vitewasm/2/node_modules/rollup/dist/es/shared/node-entry.js:6965:38)
error Command failed with exit code 1.

The packages are in use and are able to be loaded e.g. here: https://editor-next.swagger.io/

I never worked with wasm dependencies before, could it be that those packages are not compatible with vite+this plugin? or do i need to configure Vite in some way?

Could be a similar issue like here: https://github.com/Menci/vite-plugin-wasm/issues/31

Menci commented 1 year ago

The WASM file you attempted to import tree-sitter-json.wasm is NOT an ESM WebAssembly file. It has an import named env but not a real package to import. Handling it with this plugin is like there's a JS file writing import env from "env";.

$ node --experimental-wasm-modules
Welcome to Node.js v18.11.0.
Type ".help" for more information.
> await import("/Users/Menci/vitewasm/node_modules/@swagger-api/apidom-parser-adapter-json/wasm/tree-sitter-json.wasm")
(node:67004) ExperimentalWarning: Importing WebAssembly modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
Uncaught:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'env' imported from /Users/Menci/vitewasm/node_modules/@swagger-api/apidom-parser-adapter-json/wasm/tree-sitter-json.wasm
    at __node_internal_captureLargerStackTrace (node:internal/errors:484:5)
    at new NodeError (node:internal/errors:393:5)
    at packageResolve (node:internal/modules/esm/resolve:860:9)
    at moduleResolve (node:internal/modules/esm/resolve:909:20)
    at defaultResolve (node:internal/modules/esm/resolve:1124:11)
    at nextResolve (node:internal/modules/esm/loader:163:28)
    at ESMLoader.resolve (node:internal/modules/esm/loader:841:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18) {
  code: 'ERR_MODULE_NOT_FOUND'
}