Open zhangyuang opened 2 years ago
optimizeDeps.exclude
workaround works when just starting vite
. But not for vite build
unfortunately, the wasm file gets excluded. Was there another workaround for the build side?
An ugly practice is move wasm package
to current project rather than node_modules
for get correct path
For my test, with vite build
is succeed with exclude wasm package
, vite will copy .wasm
file to dist
I updated some of my npm packages to a later version and it copied the wasm file for me too on build. 😸 Thank goodness for that.
@yyx990803 @patak-dev When you plan to resolve the issue?
Is this the same issue on esbuild?
In short: import.meta.url
is not transformed so, when modules are bundled into a single location, the expected .url
has changed.
// file at ./foo/bar.js
export default import.meta.url; // should be /full/foo/bar.js
// file at ./index.js
import url from './foo/bar.js';
console.log(url); // should still be /full/foo/bar.js
// file at ./dist/index.js
const barDefaultExport = import.meta.url;
console.log(barDefaultExport);
which prints full/dist/index.js
instead of /full/dist/foo/bar.js
Confirming that I have this problem with importing https://github.com/rive-app/rive-wasm. They also import their wasm file from unpkg which might also be another curve ball. I tried the workaround above with optimizeDeps.exclude
but still don't see he wasm file show up in in watch/dev only build
Leaving some notes about the current status of this issue.
import.meta.url
is https://github.com/evanw/esbuild/issues/1492
Got a similar issue:
const template = new URL('./some.txt', import.meta.url)
return readFileSync(template, 'utf-8')
Results in
const s = new URL("data:text/plain;base64,...", self.location);
return g(s, "utf-8");
With the error self is not defined
.
We just ran into this issue where we convert absolute paths into relative ones for consistent snapshots in Vitest. for anyone interested, you can use this hack to mimic the transform with the following setup code:
// correctly resolve assets referenced in optimized dependencies
// https://github.com/vitejs/vite/issues/8427
const transformUrlBase = (base?: string): typeof base => {
const { config } = (globalThis as any).__vitest_worker__;
const cacheFileUrl = pathToFileURL(
path.join(config.root, config.deps.cacheDir),
);
if (base?.toString().startsWith(cacheFileUrl.href)) {
return new URL('/@fs/node_modules/', location.href).href;
}
return base;
};
const URL = globalThis.URL;
globalThis.URL = class VitestURL extends URL {
constructor(url: string, base?: string) {
super(url, transformUrlBase(base));
}
} as typeof URL;
I am trying to import wasm from argon2d package, but even if I set:
optimizeDeps: {
exclude: ["argon2id"],
}
I still get:
[vite] Internal server error: Failed to parse source for import analysis because the content contains invalid JS syntax. You may need to install appropriate plugins to handle the .wasm?url= file format, or if it's an asset, add "**/*.wasm?url=" to `assetsInclude` in your configuration.
Plugin: vite:import-analysis
OK, adding assetsInclude: ["**/argon2id/dist/*.wasm"]
worked.
I just ran in to this myself, with a deeply transitive library trying to use WASM
Describe the bug
Now, i use wasm-pack for build WASM file and WASM with JavaScript glue layer like this。
The glue layer code contains below code
In Vite, after esbuild optimize third party,
import.meta.url
cannot be optimize succeed. Ref Vite Docs, even if setbuild.target
toes2020
is still the problemAfter preprocess
node_modules/color-thief-wasm-web/color_thief_wasm.js
will be transform tonode_modules/.vite/deps/color_thief_wasm.js
which load.wasm
file byimport.meta.url
receive incorrect path isnode_modules/.vite/deps/xxx.wasm
finally, the correct path isnode_modules/color-thief-wasm-web/xxx.wasm
One of the solutions is set
optimizeDeps.exclude
to exclude third party module like thisReproduction
https://stackblitz.com/edit/vite-rkrfzu?file=src%2FApp.vue,vite.config.js
System Info
Used Package Manager
npm
Logs
Validations