我正在使用 rust、WASM 和 yew 作为前端框架。我正在围绕 materialize-css 构建一个包装器,以在 yew 上使用它作为可重用组件的依赖项。
要使用一些 materialize-css 组件,必须对其进行初始化。例如,使用 sidenav
document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.sidenav');
var instances = M.Sidenav.init(elems, options);
});
问题是我正在尝试使用 wasm-bindgen 运行它,如 wasm-bindgen 文档中所述,但它不起作用。或者也许我真的不明白发生了什么。
根据文档,这应该有效:
#[wasm_bindgen( module = "/materialize/js/bin/materialize.js", js_namespace = ["M","Sidenav"] )]
extern "C" {
fn init(el: JsValue, options: JsValue);
}
pub unsafe fn init_sidenav(el: &str, options: &str) {
init(
JsValue::from(document().get_element_by_id(el).expect("not found")),
JsValue::from(options),
);
}
//to use it on yew component
unsafe { materialize::sidenav::init_sidenav(self.props.el_id, &options) };
或这个:
#[wasm_bindgen( module = "/materialize/js/bin/materialize.js", js_namespace = M )]
extern "C" {
#[wasm_bindgen]
type Sidenav;
#[wasm_bindgen( static_method_of = Sidenav )]
fn init(el: JsValue, options: JsValue);
}
pub unsafe fn init_sidenav(el: &str, options: &str) {
Sidenav::init(
JsValue::from(document().get_element_by_id(el).expect("not found")),
JsValue::from(options),
);
}
//to use it on yew component
unsafe { materialize::sidenav::init_sidenav(self.props.el_id, &options) };
但是它们都不起作用......在这两种情况下,代码编译都没有问题,但是在浏览器中执行时会跳转错误。
在第一种情况下,错误是Uncaught SyntaxError: import not found: init lib.js:1:9
在第二种情况下,错误是Uncaught SyntaxError: import not found: Sidenav lib.js:1:9
老实说,我不明白为什么会这样。几天来,我一直在 MDN 文档中寻找有关 WASM 和 wasm_bindgen 文档的信息,但我找不到任何对我有帮助的东西。
此外
我正在使用 --target 网络标志
我的项目结构
-
|Cargo.toml
|materialize/ (source of materialize-css dist)
|src/
|-components/ (wrappings of components on yew)
|-materialize/ (wasm-bindgen bindings of materialize)
|-lib.rs
|-...
...