WebAssembly 启用 SIMD 后在 Vue 项目中报错怎么办?
我在 Vue 项目里尝试用 WebAssembly 的 SIMD 指令加速图像处理,本地开发能跑,但一构建上线就报 “SIMD is not supported”。明明浏览器支持 SIMD 啊,是不是我加载方式有问题?
我试过在 wasm 编译时加 -msimd128,也确认了 Chrome 版本支持,但还是不行。下面是我组件里加载 wasm 的代码:
<script setup>
import initWasm from '@/wasm/image_process_bg.js';
onMounted(async () => {
try {
const wasm = await initWasm();
wasm.process_pixels(new Uint8Array(1024));
} catch (e) {
console.error('WASM SIMD failed:', e);
}
});
</script>
两个检查点:
1. 确保 wasm 文件不被 terser 压缩,在 vite.config.js 里加:
2. 如果用的是 Emscripten 生成的胶水 JS,检查下 production 构建时是否意外走了精简版的 fallback 逻辑。最省心的做法是把 wasm 和 js 文件丢到 public 目录,直接 fetch 加载,别让构建工具掺和。
试试改成静态 import 或者在 Vite config 里配置 optimizeDeps 包含你的 wasm:
然后改一下组件里的加载方式,用 defineAsyncComponent 或者直接 import 整个模块,别动态 import:
如果还不行,看看构建后实际加载的 JS 文件里有没有 simd128 的 polyfill 代码,没有的话手动在 index.html 里引入一下。