Неверный или неожиданный токен в WebAssembly - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь запустить программу WebAssembly (написанную на Rust, пример программы из https://rustwasm.github.io/book/game-of-life/hello-world.html) с Rocket. WebAssembly компилируется с помощью wasm-pack и использует wasm_bindgen. Двоичный файл wasm представлен в виде content::JavaScript<Vec<u8>> в Rocket, и кажется, что это «рабочее» решение. Двоичный файл «правильно» выбран, однако Chrome печатает Uncaught SyntaxError: Invalid или неожиданный токен. Это связано с представлением в content::JavaScript<Vec<u8>>, что существуетошибка во время выборки (хотя байты отправки совпадают с байтами в файле wasm) или это ошибка в другом месте?

Я надеюсь, что кто-то может объяснить мне, почему в сгенерированном двоичном файле есть ошибка синтаксиса.

1 Ответ

0 голосов
/ 23 декабря 2018

Хорошо, теперь я думаю, что знаю, что пошло не так: файл js, сгенерированный из пакета wasm, пытается загрузить WebAssembly как модуль.Модуль должен иметь MIME Javascript, иначе он потерпит неудачу (поэтому я попытался отправить файл wasm как content::JavaScript<Vec<u8>>), но, очевидно, загрузка wasm как модуля не поддерживается (поправьте меня, если я ошибаюсь), так что, конечно,он найдет недопустимый токен в двоичном файле, потому что он пытается интерпретировать его как простой javascript.Что я на самом деле сейчас использую, так это тип Option<NamedFile> от Rocket, у которого есть application/wasm mime.
Мне нужно было немного изменить сгенерированный js-файл: WebAssembly инициализируется с помощью WebAssembly.instatiateStreaming(fetch(...), importObjects), тогда импорт модуля должен бытьудален.importObjects тоже был немного хитрым, потому что передача стрингов в WebAssembly немного неудобна.Для функции оповещения, которую можно вызвать из WebAssembly, importObjects выглядело так:
let importObjects = {'./wasm_test': { __wbg_alert_3d9cbee15c16469e: __wbg_alert_3d9cbee15c16469e }};.
Имена взяты из двоичного файла wasm: (import "./wasm_test" "__wbg_alert_3d9cbee15c16469e" (func $__wbg_alert_3d9cbee15c16469e (type $t0)))
Функция __wbg_alert_3d9cbee15c16469e создаетсяWasm-Pack.Последнее, что нужно изменить, - это объект, который был изначально импортирован с помощью оператора import.Теперь у меня есть переменная с содержимым из obj.instance.exports, которая установлена ​​в операторе then из WebAssembly.instatiateStreaming(fetch(...), importObjects).then(obj => { wasm = obj.instance.exports; })
. С этими изменениями она работала для меня (отправка и чтение строк в / из WebAssembly)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...