30次发布
使用旧的Rust 2015
| 0.4.20 | 2019年10月10日 |
|---|---|
| 0.4.18 | 2019年7月15日 |
| 0.4.15 | 2019年3月13日 |
| 0.4.12 | 2018年12月15日 |
| 0.0.0 | 2017年3月12日 |
#9 in #asmjs
165,833 每月下载
用于 少于 60 crates
1MB
16K SLoC
客户端Web的标准库
此crate的目标是提供对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." );
};
此crate还公开了一些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的情况下编写非平凡的网络应用程序。
- 允许Rust参与即将到来的WebAssembly(再次)革命。
- 使其能够轻松创建可以从JavaScript轻松调用的独立库。
入门
查看一些示例
examples/minimal- 一个完全最小的示例,调用alertexamples/todomvc- 一个原始实现的TodoMVC应用程序;显示如何调用DOMexamples/hasher- 展示如何将 Rust 函数导出到 JavaScript,以及如何在纯网页浏览器环境或 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 才能使用不需要 Emscripten 的本地 wasm32-unknown-unknown。
更新日志
-
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 已更新,以与最新的夜版本兼容 syn依赖项已更新到版本 1
- 新方法
-
stdweb0.4.18js!宏现在可以通过use导入- 新事件
BeforeUnloadEventUnloadEvent
- 新方法
IBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout
-
stdweb0.4.17- 与不稳定
futures相关的 API 已更新,以与最新的夜版本兼容
- 与不稳定
-
stdweb0.4.16- 初始
wasm-bindgen兼容性;现在您可以在使用wasm-bindgen的项目中使用stdweb - 最低支持的 Rust 版本是 1.33.0
- 最低要求的
cargo-web版本是 0.6.24
- 初始
-
stdweb0.4.15- 与不稳定
futures相关的 API 已更新,以与最新的夜版本兼容 - 新类型
FormDataFormDataEntryMouseButtonsState
- 新方法
Blob::new
- 与不稳定
-
stdweb0.4.14- 如果您的 JS 片段不返回任何内容,则
js!宏现在会生成更高效的代码。这使您在大多数情况下不需要添加@(no_return)注释。 - 新类型
File
- 如果您的 JS 片段不返回任何内容,则
-
stdweb0.4.13- 修复了过程化
js!宏的空白处理 - 新类型
ITouchEventTouchTouchType
- 新事件
TouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStart
- 新方法
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)]现在支持有限的一组泛型类型- 现在支持异步单元测试,使用新的
#[async_test]属性宏(仅限nightly版) - 更新到
futures 0.3(仅限nightly版)
- 新方法
-
stdweb 0.4.9,stdweb-derive 0.5.0- 性能改进;通过 serde 进行序列化现在快两倍
- 新事件
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEvent
- 新类型
DataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEvent
Value现在可以使用try_into转换为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::scroll_topElement::scroll_leftWindow::page_x_offsetWindow::page_y_offsetNodeList::itemDocument::bodyDocument::headDocument::titleDocument::set_titleIMouseEvent::offset_xIMouseEvent::offset_y
- 暴露更多与canvas相关的类型
CompositeOperationLineCapLineJoinRepetitionTextAlignTextBaseline
- 暴露与canvas相关的错误类型:
AddColorStopError,DrawImageError,GetImageDataError - 新事件
MouseOverEventMouseOutEventPointerOverEventPointerEnterEventPointerDownEventPointerMoveEventPointerUpEventPointerCancelEventPointerOutEventPointerLeaveEventGotPointerCaptureEventLostPointerCaptureEvent
- 新的指针事件接口:
IPointerEvent
- 现在应支持不能用作
-
0.4.2- 修复了解析引用时的泄漏问题
- 修复了
CanvasRenderingContext2d::get_canvas - 暴露了
FillRule和SocketReadyState - 向
IElement中添加了新的属性相关方法 - 添加了新的
Date绑定
-
0.4.1- 支持最新的夜间版Rust在
wasm32-unknown-unknown - 公开了
SocketBinaryType枚举 - 添加了新的画布API
- 为
CanvasRenderingContext2d添加了许多新方法 - 新类型:
CanvasGradient、CanvasPattern、CanvasStyle、ImageData、TextMetrics
- 为
- 添加了新的错误类型:
IndexSizeError、NotSupportedError、TypeError
- 支持最新的夜间版Rust在
-
0.4- (破坏性变更) 从
Value中删除了Array和Object变体;现在它们被视为Reference - (破坏性变更)
Value有一个额外的变体:Symbol - (破坏性变更) 删除了
InputElement::set_kindInputElement::files
- (破坏性变更) 重命名
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::len
- 以下现在返回一个
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 - 在
wasm32-unknown-unknown上支持cdylib链接库 - 新绑定
XmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElement
- 新事件类型
MouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEvent
- 对 Canvas APIs 的初步支持
- 新特性:
ReferenceType和InstanceOf - 在
stdweb-derive链接库中添加#[derive(ReferenceType)]注解;现在可以在stdweb之外定义自定义 API 绑定 - 添加
#[js_export]过程式属性(仅限wasm32-unknown-unknown) - 添加
DomException和其子类型,用于传递 JavaScript 异常 IElement现在继承自INode- 每个接口现在都继承自
ReferenceType - 添加
stdweb::traits模块,用作使用所有接口特性的预言 - 添加
console!宏 - 大多数类型现在实现了
PartialEq和Eq
- (破坏性变更) 从
-
0.3- (重大变更) 删除了
ErrorEvent方法 - (破坏性变更) 重命名
LoadEvent->ResourceLoadEventAbortEvent->ResourceAbortEventErrorEvent->ResourceErrorEvent
- 添加
UnsafeTypedArray用于在js!中以零成本传递切片 - 添加
Once用于将FnOnce闭包传递给js!
- (重大变更) 删除了
许可证
在以下许可证下获得许可:
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
任你选择。
来自 Mozilla 开发者网络 的文档片段受 CC-BY-SA, 版本 2.5 或更高版本的许可。
贡献
请参阅 CONTRIBUTING.md
依赖项
~1.6–2.5MB
~57K SLoC
