emcc -O3 --no-entry -o ./out/fibc.wasm ./src/fib.c
emcc -O3 -sMODULARIZE -o ./out/fibemccesm.mjs ./src/fib.c
//js:
import init from './out/fibemccesm.mjs'
问题: wasm 和 mjs 都是从一个文件编译过来的,
为什么需要 wasm 和 mjs 这两个编译结果,为什么init 会在 mjs 里面 ?
emcc -O3 --no-entry -o ./out/fibc.wasm ./src/fib.c
emcc -O3 -sMODULARIZE -o ./out/fibemccesm.mjs ./src/fib.c
//js:
import init from './out/fibemccesm.mjs'
问题: wasm 和 mjs 都是从一个文件编译过来的,
为什么需要 wasm 和 mjs 这两个编译结果,为什么init 会在 mjs 里面 ?
晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
WebAssembly是一种低级字节码,它可以在现代浏览器中提供接近本地代码的性能。而MJS是ES6模块所使用的模块化文件格式。它们之所以同时存在是因为:
WebAssembly具有较高的性能和二进制文件的小尺寸,适合处理一些性能要求高的计算操作。
MJS提供了更清晰的JS API和相对更加容易调用,适合处理在JS中构建的库和应用程序,以及更直观。
因此,对于一些需要复杂计算的模块和库,可以编译成WebAssembly的格式,使其在浏览器中得到更快的性能。对于一些比较通用和易于发展的库,可以编译成MJS格式,并通过import语句加载它们。 对于上述的问题,可以得出以下解决方案:
如果你需要在JS中引用C的库,就可以将C代码编译为WebAssembly格式,这样可以获得较高的性能。编译命令可以使用‘emcc -O3 --no-entry -o ./out/fibc.wasm ./src/fib.c’。
如果你需要通过import语句加载一个JS模块并在应用程序中使用它,则需要将JS代码编译为MJS。编译命令可以使用‘emcc -O3 -sMODULARIZE -o ./out/fibemccesm.mjs ./src/fib.c’。
使用import语句从MJS中加载模块,可以使用将ES6模块导入到模块对象的方式。如:import init from './out/fibemccesm.mjs'。
最终,可以通过同时使用WebAssembly和MJS两种文件格式, 在JS中使用更高效的计算操作,同时也可以通过import语句加载库和通用代码。