
เป้าหมายของลังนี้คือการให้การผูกสนิมกับเว็บ API และเพื่อให้สามารถทำงานร่วมกันได้ในระดับสูงระหว่างสนิมและจาวาสคริปต์
ซอฟต์แวร์นี้มาถึงคุณต้องขอบคุณผู้คนที่ยอดเยี่ยมเหล่านี้:
ขอบคุณ!
คุณสามารถฝังรหัส 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." ) ;
} ;ลังนี้ยังเปิดเผยจำนวนของเว็บ 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;" ; ) ;
}
} ) ;การเปิดเผยฟังก์ชั่นสนิมไปยัง 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 เดียวกันและใช้ในเว็บเบราว์เซอร์:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >หากคุณใช้พัสดุคุณสามารถใช้ปลั๊กอินพัสดุการทดลองของเรา ก่อนอื่นทำในโครงการพัสดุที่มีอยู่ของคุณ:
$ npm install --save parcel-plugin-cargo-web
แล้วเพียงแค่:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; ดูตัวอย่างบางอย่าง:
examples/minimal - ตัวอย่างน้อยที่สุดที่เรียกการแจ้งเตือนexamples/todomvc - แอปพลิเคชัน TODOMVC ที่ใช้งานอย่างไร้เดียงสา; แสดงวิธีการโทรไปยัง DOMexamples/hasher - แสดงวิธีการส่งออกฟังก์ชั่นสนิมไปยังจาวาสคริปต์และวิธีเรียกพวกเขาจากสภาพแวดล้อมเว็บเบราว์เซอร์วานิลลาหรือจาก nodejsexamples/hasher-parcel - แสดงวิธีการนำเข้าและโทรออกฟังก์ชั่นการส่งออกสนิมในโครงการพัสดุpinky-web - An NES Emulator; คุณสามารถเล่นกับเวอร์ชันที่คอมไพล์ได้ที่นี่เอกสาร API ยังมีให้คุณดู
ติดตั้ง WARGON-WEB:
$ cargo install -f cargo-web
ไปที่ examples/todomvc และเริ่มต้นตัวอย่างโดยใช้หนึ่งในคำสั่งเหล่านี้:
รวบรวมไปยัง WebAssembly โดยใช้แบ็กเอนด์ webassembly ดั้งเดิมของ Rust:
$ cargo web start --target=wasm32-unknown-unknown
รวบรวมเป็น ASM.JS โดยใช้ emscripten:
$ cargo web start --target=asmjs-unknown-emscripten
รวบรวมไปยัง WebAssembly โดยใช้ Emscripten:
$ cargo web start --target=wasm32-unknown-emscripten
เยี่ยมชม http://localhost:8000 กับเบราว์เซอร์ของคุณ
สำหรับ *-emscripten เป้าหมาย cargo-web ไม่จำเป็นต้องใช้อย่างไรก็ตาม wasm32-unknown-unknown ของพื้นเมืองซึ่งไม่จำเป็นต้องใช้ Emscripten ต้องใช้ cargo-web ในการทำงาน!
stdweb 0.4.20
wasm-bindgen ใหม่ล่าสุดFullscreenChangeEvent stdweb 0.4.19
Document::fullscreen_enabledDocument::fullscreen_elementInputElement::selection_startInputElement::selection_endInputElement::set_selection_startInputElement::set_selection_endObject::to_iterWindow::confirm&Array s สามารถแปลงเป็น Vec S ผ่าน TryFromfutures ที่ไม่แน่นอนได้รับการปรับปรุงให้ทำงานกับ Nightlies ล่าสุดsyn ได้รับการอัปเดตเป็นเวอร์ชัน 1 stdweb 0.4.18
js! ตอนนี้สามารถนำเข้ามาโครได้ด้วย useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures ที่ไม่แน่นอนได้รับการปรับปรุงให้ทำงานกับ Nightlies ล่าสุด stdweb 0.4.16
wasm-bindgen เริ่มต้น; ตอนนี้คุณสามารถใช้ stdweb ในโครงการโดยใช้ wasm-bindgencargo-web ที่จำเป็นขั้นต่ำตอนนี้คือ 0.6.24 stdweb 0.4.15
futures ที่ไม่แน่นอนได้รับการปรับปรุงให้ทำงานกับ Nightlies ล่าสุดFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! ตอนนี้มาโครสร้างรหัสที่มีประสิทธิภาพมากขึ้นเล็กน้อยหากคุณไม่ได้ส่งคืนอะไรจากตัวอย่าง JS ของคุณ สิ่งนี้ทำให้ไม่จำเป็นต้องเพิ่มคำอธิบายประกอบ @(no_return) ในกรณีส่วนใหญ่File stdweb 0.4.13
js! การจัดการช่องว่างของแมโครITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown โดยไม่ต้องใช้ cargo-web stdweb 0.4.11
cargo-web ขั้นต่ำที่จำเป็นคือ 0.6.22wasm32-unknown-unknown ได้รับการสนับสนุนอย่างเป็นทางการในการเกิดสนิมที่มั่นคงwasm32-unknown-unknown ได้รับการสนับสนุนแล้วjs! ตอนนี้มาโครมีการใช้งานบางส่วนโดยใช้มาโครขั้นตอนDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::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_selectionAbortErrorSelectionTypeSelectionRange.try_into() / .try_from() ) ตอนนี้สามารถแปลงสภาพเป็น TypeErrorDrawImageError ) ตอนนี้สามารถส่งต่อได้ผ่าน js! มาโครTypeError ได้รับการแก้ไขแล้ว (ได้รับการปฏิบัติอย่างไม่ถูกต้องเป็น DOMException )Number เป็น f64 ด้วย .into() / .from()Mut ซึ่งเป็น wrapper ประเภทใหม่สำหรับการผ่าน FnMut อย่างปลอดภัยใน js! มาโคร; เป็นทางเลือกสำหรับตอนนี้อย่างไรก็ตามการใช้งานของ wrapper ประเภทนี้ จะเป็นข้อบังคับ ในอนาคต!FnMut ไม่สามารถเรียกได้ซ้ำอีกต่อไป#[derive(ReferenceType)] ตอนนี้รองรับชุดย่อยที่ จำกัด ของประเภททั่วไป#[async_test] ใหม่ (ทุกคืนเท่านั้น)futures 0.3 (ทุกคืนเท่านั้น) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S สามารถแปลงเป็น Option< Serde< T > > ด้วย try_intoi32 และ f64keyup เป็น KeyDownEvent เนื่องจากมีการตรวจสอบประเภท JS ของเหตุการณ์เท่านั้นและทั้ง keyup และ keydown แบ่งปันประเภท JS เดียวกัน ( KeyboardEvent ) จากนี้ไปในฟิลด์ type ของเหตุการณ์ก็ถูกตรวจสอบดังนั้นจึงไม่อนุญาตให้มีการแปลงดังกล่าวอีกต่อไป 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray S จาก Vec S และ ArrayBuffer S 0.4.6
docs.rs อีกครั้งSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (หวังว่า)Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError ในขณะนี้ในกรณีข้อผิดพลาด:Location::hashLocation::href 0.4.3
WeakMap ควรได้รับการสนับสนุนในขณะนี้ (เช่นวัตถุที่เกี่ยวข้องกับ WebGL บางส่วนภายใต้ Firefox)Element::get_bounding_client_rectElement::scroll_topElement::scroll_leftWindow::page_x_offsetWindow::page_y_offsetNodeList::itemDocument::bodyDocument::headDocument::titleDocument::set_titleIMouseEvent::offset_xIMouseEvent::offset_yCompositeOperationLineCapLineJoinRepetitionTextAlignTextBaselineAddColorStopError GetImageDataError DrawImageError กับผืนผ้าMouseOverEventMouseOutEventPointerOverEventPointerEnterEventPointerDownEventPointerMoveEventPointerUpEventPointerCancelEventPointerOutEventPointerLeaveEventGotPointerCaptureEventLostPointerCaptureEventIPointerEvent 0.4.2
CanvasRenderingContext2d::get_canvasFillRule และ SocketReadyStateIElementDate ใหม่ 0.4.1
wasm32-unknown-unknownSocketBinaryType ที่เปิดเผยCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array และตัวแปร Object ออกจาก Value ; ตอนนี้ได้รับการปฏิบัติเป็น Reference SValue มีตัวแปรพิเศษ: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new ตอนนี้ใช้อาร์กิวเมนต์ u64InputElement::set_raw_value ตอนนี้ใช้ &str แทน Into< Value >usize ตอนนี้ส่งคืน u32INode::remove_child ตอนนี้ส่งคืน Node ในกรณี Oku64 :ArrayBuffer::leni32 แทน f64 :IMouseEvent::client_xIMouseEvent::client_yIMouseEvent::movement_xIMouseEvent::movement_yIMouseEvent::screen_xIMouseEvent::screen_yResult :INode::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::newINode::base_uri ส่งคืน String แทน Option< String >InputElement::raw_value ส่งคืน String แทน ValueINode::inner_text ถูกย้ายไปที่ IHtmlElement::inner_textDocument::query_selector และ Document::query_selector_all ถูกย้ายไปที่ IParentNodeIElement::query_selector และ IElement::query_selector_all ถูกย้ายไปที่ IParentNodeDocument::get_element_by_id ถูกย้ายไปที่ INonElementParentNodeTryFrom / TryInto ถูกลบออกไปcargo-web ล่าสุดไม่จำเป็นต้องโทรหา stdweb::initialize หรือ stdweb::event_loop อีกต่อไปcdylib Clates บน wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType และ InstanceOf#[derive(ReferenceType)] ในลัง stdweb-derive ; ตอนนี้เป็นไปได้ที่จะกำหนดการผูก API ที่กำหนดเองนอก stdweb#[js_export] แอตทริบิวต์ขั้นตอน ( wasm32-unknown-unknown เท่านั้น)DomException และชนิดย่อยสำหรับผ่านข้อยกเว้น JavaScriptIElement สืบทอดมาจาก INodeReferenceTypestdweb::traits ที่จะทำหน้าที่เป็นโหมโรงสำหรับ use คุณสมบัติส่วนต่อประสานทั้งหมดของเราconsole! มาโครPartialEq และ Eq 0.3
ErrorEvent ที่ถูกลบLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray สำหรับชิ้นส่วนที่ไม่มีค่าใช้จ่ายผ่านไปยัง js!Once สำหรับการส่ง FnOnce ปิดไปยัง js! ได้รับใบอนุญาตภายใต้
ตามตัวเลือกของคุณ
ตัวอย่างของเอกสารที่มาจากเครือข่ายนักพัฒนา Mozilla นั้นครอบคลุมภายใต้ CC-by-SA เวอร์ชัน 2.5 หรือใหม่กว่า
ดูการสนับสนุน. md