2个版本
使用旧的Rust 2015
| 0.1.1 | 2019年9月29日 |
|---|---|
| 0.1.0 | 2019年4月15日 |
8在#stdweb中排名
每月161次下载
在stdweb中使用
2KB
客户端Web的标准库
此包的目的是提供对Web API的Rust绑定,并允许Rust和JavaScript之间实现高度的互操作性。
捐赠
赞助者
这些可爱的人们带来了这款软件
- Embark Studios
- Joe Narvaez
- Eduard Knyshov
- Anselm Eickhoff
- Johan Andersson
- Stephen Sugden
- is8ac
谢谢!
示例
您可以直接将JavaScript代码嵌入Rust
let message = "Hello, 世界!";
let result = js! {
alert( @{message} );
return 2 + 2 * 2;
};
println!( "2 + 2 * 2 = {:?}", result );
闭包也得到支持
let print_hello = |name: String| {
println!( "Hello, {}!", name );
};
js! {
var print_hello = @{print_hello};
print_hello( "Bob" );
print_hello.drop(); // Necessary to clean up the closure on Rust's side.
}
您还可以通过serde传递任意结构
#[derive(Serialize)]
struct Person {
name: String,
age: i32
}
js_serializable!( Person );
js! {
var person = @{person};
console.log( person.name + " is " + person.age + " years old." );
};
此包还公开了多个Web API,例如
let button = document().query_selector( "#hide-button" ).unwrap().unwrap();
button.add_event_listener( move |_: ClickEvent| {
for anchor in document().query_selector_all( "#main a" ) {
js!( @{anchor}.style = "display: none;"; );
}
});
支持将Rust函数暴露给JavaScript
#[js_export]
fn hash( string: String ) -> String {
let mut hasher = Sha1::new();
hasher.update( string.as_bytes() );
hasher.digest().to_string()
}
然后您可以从Node.js这样做
var hasher = require( "hasher.js" ); // Where `hasher.js` is generated from Rust code.
console.log( hasher.hash( "Hello world!" ) );
或者您可以将相同的.js文件用于Web浏览器
<script src="hasher.js"></script>
<script>
Rust.hasher.then( function( hasher ) {
console.log( hasher.hash( "Hello world!" ) );
});
</script>
如果您使用Parcel,您还可以使用我们的实验性Parcel插件;首先在现有的Parcel项目中这样做
$ npm install --save parcel-plugin-cargo-web
然后只需这样
import hasher from "./hasher/Cargo.toml";
console.log( hasher.hash( "Hello world!" ) );
设计目标
- 公开浏览器公开的全套Web API。
- 尽可能地遵循原始的JavaScript约定和结构,除非这样做会产生明显更好的设计。
- 成为构建块,从它可以构建高级框架和库。
- 使其方便且易于将JavaScript代码直接嵌入Rust,并在两者之间进行数据序列化。
- 与更广泛的Rust生态系统集成,例如支持实现serde的Serializable的结构体的序列化。
- 让Rust成为驾驶席,在没有触及JavaScript的情况下编写非平凡Web应用程序。
- 允许Rust参与即将到来的WebAssembly(重新)革命。
- 使其能够轻松创建独立的库,这些库可以从JavaScript中轻松调用。
入门指南
查看一些示例
examples/minimal- 一个完全简化的示例,调用 alertexamples/todomvc- 一个简单实现的 TodoMVC 应用程序;展示了如何调用DOMexamples/hasher- 展示了如何将Rust函数导出到JavaScript,以及如何在纯Web浏览器环境或Nodejs中调用它们examples/hasher-parcel- 展示了如何在 Parcel 项目中导入和调用导出的Rust函数pinky-web- 一个NES模拟器;你可以在这里尝试预编译版本 (点击此处)
API文档 也可以供你查看。
运行示例
-
安装 cargo-web
$ cargo install -f cargo-web -
进入
examples/todomvc并使用以下命令之一启动示例-
使用Rust的本地WebAssembly后端将代码编译为 WebAssembly
$ cargo web start --target=wasm32-unknown-unknown -
使用 Emscripten 将代码编译为 asm.js
$ cargo web start --target=asmjs-unknown-emscripten -
使用 Emscripten 将代码编译为 WebAssembly
$ cargo web start --target=wasm32-unknown-emscripten
-
-
使用你的浏览器访问
https://:8000
对于 *-emscripten 目标,不需要 cargo-web,但是需要 cargo-web 才能使本地 wasm32-unknown-unknown(不需要Emscripten)工作!
变更日志
-
stdweb0.4.20- 与最新版本的
wasm-bindgen兼容 - 新事件
FullscreenChangeEvent
- 与最新版本的
-
stdweb0.4.19- 新方法
Document::fullscreen_enabledDocument::fullscreen_elementInputElement::selection_startInputElement::selection_endInputElement::set_selection_startInputElement::set_selection_endObject::to_iterWindow::confirm
&Array现在可以通过TryFrom转换为Vec- 运行时现在应与新版本的 Emscripten 兼容
- 不稳定的与
futures相关的API已更新,以与最新的nightlies兼容 syn依赖项已更新到版本1
- 新方法
-
stdweb0.4.18js!宏现在可以通过use导入- 新事件
BeforeUnloadEventUnloadEvent
- 新方法
IBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout
-
stdweb0.4.17- 不稳定的与
futures相关的API已更新,以与最新的nightlies兼容
- 不稳定的与
-
stdweb0.4.16- 初始
wasm-bindgen兼容性;你现在可以在使用wasm-bindgen的项目中使用stdweb - 最低支持的 Rust 版本是 1.33.0
- 最低要求的
cargo-web版本是 0.6.24
- 初始
-
stdweb0.4.15- 不稳定的与
futures相关的API已更新,以与最新的nightlies兼容 - 新类型
FormDataFormDataEntryMouseButtonsState
- 新方法
Blob::new
- 不稳定的与
-
stdweb0.4.14js!宏现在在您从JS代码片段中不返回任何内容时生成更高效的代码。这使得在大多数情况下添加@(no_return)注释变得不必要。- 新类型
文件
-
stdweb0.4.13- 修复了
js!宏的空白处理 - 新类型
ITouchEvent触摸触摸类型
- 新事件
触摸事件触摸移动触摸离开触摸进入触摸结束触摸取消触摸开始
- 新方法
XmlHttpRequest::set_response_type
- 修复了
-
stdweb0.4.12- 在没有
cargo-web的情况下尝试编译为wasm32-unknown-unknown目标时的诊断得到了改进
- 在没有
-
stdweb0.4.11- 现在所需的最低Rust版本是1.30.1
- 现在所需的最低
cargo-web版本是0.6.22 wasm32-unknown-unknown现在官方支持稳定版Rust- 现在支持在
wasm32-unknown-unknown上的调试构建 js!宏现在部分使用过程宏实现- 由于使用了本地编解码器API,字符串解码/编码现在要快得多
- 新方法
Document::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_root
- 新类型
ISlotableShadowRootShadowRootModeTemplateElementSlotElement
- 新事件
SlotChangeEvent
IParentNode::query_selector和IParentNode::query_selector_all现在返回一个合适的错误类型
-
stdweb 0.4.10,stdweb-derive 0.5.1- 新方法
IElement::insert_adjacent_htmlIElement::insert_html_beforeIElement::insert_html_afterIElement::prepend_htmlIElement::append_htmlIElement::namespace_uriIElement::closestDocument::create_element_nsWindow::get_selection
- 新类型
AbortErrorSelectionTypeSelectionRange
- 失败的类型转换的错误消息现在得到了改进
- 失败转换的错误类型(当使用
.try_into()/.try_from())现在可以转换为TypeError - 聚合错误类型(例如
DrawImageError)现在可以通过js!宏进行序列化 TypeError现在已修复(它被错误地处理为DOMException)Number现在可以用.into()/.from()转换为f64- 添加了
Mut,这是一个新的包装类型,用于安全地将FnMut闭包传递到js!宏;目前这是可选的,但将来使用此包装类型 将是强制性的! FnMut闭包不能再递归调用#[derive(ReferenceType)]现在支持有限的一组泛型类型- 现在支持异步单元测试,通过新的
#[async_test]属性宏(仅限夜间构建)。 - 更新到
futures 0.3(仅限夜间构建)
- 新方法
-
stdweb 0.4.9,stdweb-derive 0.5.0- 性能改进;通过 serde 进行序列化现在快了两倍
- 新事件
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEvent
- 新类型
DataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEvent
- 现在可以使用
try_into将Value转换为Option< Serde< T > > - 现在在大多数情况下,通过 serde 进行数字反序列化现在可以工作,允许使用除
i32和f64之外的类型 - 现在所有的事件都具有更强的类型
- 之前可以反序列化例如
keyup事件为KeyDownEvent,因为只检查了事件的 JS 类型,而keyup和keydown共享相同的 JS 类型(KeyboardEvent)。从现在起,还会检查事件的type字段,因此不再允许此类转换。
- 之前可以反序列化例如
-
0.4.8- 在针对
wasm32-unknown-unknown进行目标编译时,修复了最新的夜间构建时的编译问题 - 新事件
PointerLockChangeEventPointerLockErrorEventMouseWheelEvent
- 新类型
MouseWheelDeltaModeXhrResponseType
- 新方法
XmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock
- 在针对
-
0.4.7- 新事件
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEvent
- 新类型
FileListFileReaderReadyState
- 实现游戏手柄 API
GamepadGamepadButtonGamepadButtonMappingGamepadEvent
- 修复了
CanvasRenderingContext2d::clear_rect - 修复了从
Vec和ArrayBuffer创建TypedArray时的内存泄漏问题。
- 新事件
-
0.4.6- 再次修复
docs.rs - 新类型
SubmitEventIChildNode
- 修复了
CanvasElement::to_data_url
- 再次修复
-
0.4.5- 新类型
DocumentFragmentSelectElementOptionElementHtmlCollection
- 新方法
Node::from_htmlValue::is_null
- 公开枚举
SocketMessageDataNodeType
- 更新到
futures0.2
- 新类型
-
0.4.4- 希望修复
docs.rs - 新方法
Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::search
- 这些现在在错误情况下返回
SecurityErrorLocation::hashLocation::href
- 希望修复
-
0.4.3- 现在应该支持不能用作
WeakMap键的对象(例如,Firefox 下的一些 WebGL 相关对象) - 新方法
Element::get_bounding_client_rectElement::滚动顶部Element::滚动左侧Window::页面X偏移量Window::页面Y偏移量NodeList::项目Document::主体Document::头部Document::标题Document::设置标题IMouseEvent::偏移XIMouseEvent::偏移Y
- 公开更多与画布相关的类型
合成操作线条端点线条连接重复文本对齐文本基线
- 公开与画布相关的错误类型:
AddColorStopError、DrawImageError、GetImageDataError - 新事件
鼠标悬停事件鼠标移出事件指针悬停事件指针进入事件指针按下事件指针移动事件指针抬起事件指针取消事件指针移出事件指针离开事件捕获指针事件失去指针捕获事件
- 为指针事件提供新的接口:
IPointerEvent
- 现在应该支持不能用作
-
0.4.2- 修复了解析引用时的泄漏问题
- 修复了
CanvasRenderingContext2d::get_canvas - 公开了
FillRule和SocketReadyState - 为
IElement添加了相关的新方法 - 添加了新的
Date绑定
-
0.4.1- 支持最新的 nightly Rust,在
wasm32-unknown-unknown上 - 公开了
SocketBinaryType枚举 - 新的画布API
- 为
CanvasRenderingContext2d添加了许多新方法 - 新类型:
CanvasGradient、CanvasPattern、CanvasStyle、ImageData、TextMetrics
- 为
- 新的错误类型:
IndexSizeError、NotSupportedError、TypeError
- 支持最新的 nightly Rust,在
-
0.4- (破坏性更改) 从
Value中移除了Array和Object变体;现在它们被视为Reference - (破坏性更改)
Value添加了一个额外的变体:Symbol - (破坏性更改) 移除了
InputElement::设置类型InputElement::文件
- (破坏性更改) 重命名
KeydownEvent->KeyDownEventKeyupEvent->KeyUpEventKeypressEvent->KeyPressEventReadyState->FileReaderReadyStateInputElement::value->InputElement::raw_valueInputElement::set_value->InputElement::set_raw_value
- (破坏性更改)
ArrayBuffer::new现在需要u64参数 - (破坏性更改)
InputElement::set_raw_value现在需要&str而不是Into< Value > - (破坏性更改) 修改了返回类型
- 所有返回
usize的方法现在返回u32 INode::remove_child现在在Ok情况下返回Node- 以下现在返回
u64ArrayBuffer::长度
- 以下现在返回
i32而不是f64IMouseEvent::client_xIMouseEvent::client_yIMouseEvent::movement_xIMouseEvent::movement_yIMouseEvent::screen_xIMouseEvent::screen_y
- 以下现在返回
ResultINode::insert_beforeINode::replace_childINode::clone_nodeStringMap::insertTokenList::addTokenList::removeDocument::create_elementIEventTarget::dispatch_eventFileReader::read_as_textFileReader::read_as_array_bufferFileReader::read_as_textHistory::replace_stateHistory::goHistory::backHistory::forwardLocation::hrefLocation::hashCanvasElement::to_data_urlCanvasElement::to_blobArrayBuffer::new
INode::base_uri现在返回String而不是Option< String >InputElement::raw_value现在返回String而不是Value
- 所有返回
- (破坏性更改)
INode::inner_text已移动到IHtmlElement::inner_text - (破坏性更改)
Document::query_selector和Document::query_selector_all已移动到IParentNode - (破坏性更改)
IElement::query_selector和IElement::query_selector_all已移动到IParentNode - (破坏性更改)
Document::get_element_by_id已移动到INonElementParentNode - (破坏性更改) 移除了使用
TryFrom/TryInto在任意引用类型对象之间转换的泛型实现 - 当使用最近的
cargo-web构建时,不再需要调用stdweb::initialize或stdweb::event_loop - 支持
cdylib在wasm32-unknown-unknown上的包 - 新增绑定
XmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElement
- 新增事件类型
MouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEvent
- 对 Canvas APIs 的初始支持
- 新增特性:
ReferenceType和InstanceOf - 在
stdweb-derive包中添加#[derive(ReferenceType)]注解;现在可以在stdweb之外定义自定义 API 绑定 - 添加
#[js_export]程序化属性(仅限wasm32-unknown-unknown) - 添加
DomException和子类型,以便传递 JavaScript 异常 IElement现在继承自INode- 每个接口现在都继承自
ReferenceType - 将
stdweb::traits模块添加为use所有接口特质的预处理器 - 添加
console!宏 - 现在大多数类型都实现了
PartialEq和Eq
- (破坏性更改) 从
-
0.3- (破坏性更改) 删除了
ErrorEvent方法 - (破坏性更改) 重命名
LoadEvent->ResourceLoadEventAbortEvent->ResourceAbortEventErrorEvent->ResourceErrorEvent
- 为传递给
js!的切片提供零成本,添加了UnsafeTypedArray - 为将
FnOnce闭包传递给js!添加了Once
- (破坏性更改) 删除了
许可证
根据您的要求,许可协议为以下之一
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
。
来自 Mozilla 开发者网络 的文档片段受 CC-BY-SA,版本 2.5 或更高版本的版权和许可协议的保护。
贡献
依赖关系
~82KB
