Павел Дадыкин, ROGII
Павел Дадыкин
ROGII
-s DYNAMIC_EXECUTION=0 -s ENVIRONMENT=worker
-s MODULARIZE=1 -s ALLOW_MEMORY_GROWTH=1 --bind
Debug
Release
-fsanitize=address –g2 компиляторуEmscripten на выходе даёт 2 файла:
Добавить в начало JS-файла комментарий
/*
Version: 1.3.0
Commit: 681def4aefb99c9de5357617dc138b66e6ae1d0b
Pipeline: 103990
*/
"dependencies": {
"@nexus-npm/wasm": "0.9.0-Release",
}
{
test: /\.wasm$/,
type: "javascript/auto",
use: [{
loader: "file-loader",
options: { name: "wasm/[name].[hash].[ext]" }
}]
}
import wasm from 'math-js.wasm';
const response = await client.get(wasm, {
responseType: 'arraybuffer'
});
const wasmBinary = response.data;
Asset Modules
на замену file-loader
syncWebAssembly / asyncWebAssembly
Refused to compile or instantiate WebAssembly module because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src https:".
Content-Security-Policy: script-src 'wasm-unsafe-eval'
JS
C/C++
const pointer = instance._malloc(size * Float64Array.BYTES_PER_ELEMENT);
instance.HEAPF64.set(
new Float64Array(size),
pointer / Float64Array.BYTES_PER_ELEMENT,
);
instance._free(trajectory.mdArray.pointer);
convertToJSObject<WasmType, JSArrayType>(data)
convertFromJSObject<JSArrayType, WasmType>(data)
freeCollection(data)
В TypeScript мы можем написать
type X = number | undefined
В C/C++ так нельзя!
Из функций расчёта в этом случае нам возвращается NaN
// Преобразование для передачи в модуль расчёта
point.data ?? NaN
// Проверка на наличие значения
if (!isNaN(point.data))
for (const element of elements) {
const point = calculatePoint(element.x);
points.push(point);
}
const xArray = elements.map((element) => element.x);
const points = wasm.calculatePoints(xArray);
import { readFileSync } from 'fs';
const wasmBinary = readFileSync(
'node_modules/path-to-wasm/math.wasm',
);
instance = await createModule({ wasmBinary });
Павел Дадыкин
ROGII
https://meloman4eg.github.io/wasm-fc-2024/