
Tujuan peti ini adalah untuk memberikan binding karat ke API web dan untuk memungkinkan tingkat interoperabilitas yang tinggi antara karat dan javascript.
Perangkat lunak ini dibawa kepada Anda berkat orang -orang luar biasa ini:
Terima kasih!
Anda dapat secara langsung menyematkan kode JavaScript ke dalam karat:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Penutupan juga didukung:
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.
}Anda juga dapat meneruskan struktur sewenang -wenang berkat 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." ) ;
} ;Peti ini juga memperlihatkan sejumlah API Web, misalnya:
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;" ; ) ;
}
} ) ;Mengekspos fungsi karat ke JavaScript juga didukung:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Kemudian Anda dapat melakukan ini dari Node.js:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; Atau Anda dapat mengambil file .js yang sama dan menggunakannya di browser web:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Jika Anda menggunakan parsel, Anda juga dapat menggunakan plugin paket eksperimental kami; Pertama lakukan ini dalam proyek parsel yang ada:
$ npm install --save parcel-plugin-cargo-web
Dan kemudian:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Lihatlah beberapa contoh:
examples/minimal - Contoh Minimal Yang Benar -benar Minimal Yang Memanggil Peringatanexamples/todomvc - Aplikasi TODOMVC yang diimplementasikan secara naif; menunjukkan cara memanggil domexamples/hasher - Menunjukkan cara mengekspor fungsi karat ke javascript dan cara memanggilnya dari lingkungan browser web vanilla atau dari nodeJSexamples/hasher-parcel - menunjukkan cara mengimpor dan menghubungi fungsi karat yang diekspor dalam proyek parselpinky-web - Emulator NES; Anda dapat bermain dengan versi yang sudah dikompilasi di siniDokumentasi API juga tersedia untuk Anda lihat.
Instal kargo-web:
$ cargo install -f cargo-web
Masuk ke examples/todomvc dan mulai contoh menggunakan salah satu perintah ini:
Kompilasi ke WebAssembly Menggunakan Backend WebsAssembly Asli Rust:
$ cargo web start --target=wasm32-unknown-unknown
Kompilasi ke ASM.JS Menggunakan Emscripten:
$ cargo web start --target=asmjs-unknown-emscripten
Kompilasi ke WebAssembly Menggunakan Emscripten:
$ cargo web start --target=wasm32-unknown-emscripten
Kunjungi http://localhost:8000 dengan browser Anda.
Untuk target *-emscripten cargo-web tidak diperlukan, namun penduduk asli wasm32-unknown-unknown yang tidak perlu emscripten membutuhkan cargo-web untuk bekerja!
stdweb 0.4.20
wasm-bindgen terbaruFullscreenChangeEvent stdweb 0.4.19
Document::fullscreen_enabledDocument::fullscreen_elementInputElement::selection_startInputElement::selection_endInputElement::set_selection_startInputElement::set_selection_endObject::to_iterWindow::confirm&Array sekarang dapat dikonversi menjadi Vec melalui TryFromfutures yang tidak stabil diperbarui untuk bekerja dengan malam terbarusyn diperbarui ke versi 1 stdweb 0.4.18
js! makro sekarang dapat diimpor dengan useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures yang tidak stabil diperbarui untuk bekerja dengan malam terbaru stdweb 0.4.16
wasm-bindgen Awal; Anda sekarang dapat menggunakan stdweb dalam proyek menggunakan wasm-bindgencargo-web sekarang 0,6,24 stdweb 0.4.15
futures yang tidak stabil diperbarui untuk bekerja dengan malam terbaruFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! Makro sekarang menghasilkan kode yang sedikit lebih efisien jika Anda tidak mengembalikan apa pun dari cuplikan JS Anda. Ini membuatnya tidak perlu untuk menambahkan anotasi @(no_return) di sebagian besar kasus.File stdweb 0.4.13
js! Penanganan whitespace makroITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown tanpa cargo-web stdweb 0.4.11
cargo-web sekarang 0,6,22wasm32-unknown-unknown sekarang secara resmi didukung pada karat stabilwasm32-unknown-unknown sekarang didukungjs! Makro sekarang sebagian diimplementasikan menggunakan makro proseduralDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector dan IParentNode::query_selector_all sekarang mengembalikan jenis kesalahan yang tepat 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() ) sekarang dapat dikonversi menjadi TypeErrorDrawImageError ) sekarang dapat di -serial melalui js! makroTypeError sekarang diperbaiki (itu salah diperlakukan sebagai DOMException )Number sekarang dapat dikonversi menjadi f64 dengan .into() / .from()Mut , yang merupakan jenis pembungkus baru untuk melewati penutupan FnMut dengan aman ke js! makro; Ini opsional untuk saat ini, namun penggunaan jenis pembungkus ini akan wajib di masa depan!FnMut tidak dapat disebut rekursif lagi#[derive(ReferenceType)] sekarang mendukung subset terbatas dari tipe generik#[async_test] baru makro (hanya malam hari)futures 0.3 (hanya malam hari) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S sekarang dapat dikonversi ke Option< Serde< T > > dengan try_intoi32 dan f64 untuk digunakankeyup Event sebagai KeyDownEvent karena hanya tipe JS acara yang diperiksa dan keyup dan keydown berbagi jenis JS yang sama ( KeyboardEvent ). Mulai sekarang di bidang type acara juga diperiksa, sehingga konversi seperti itu tidak diperbolehkan lagi. 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray dari Vec S dan ArrayBuffer s. 0.4.6
docs.rs lagiSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (semoga).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError dalam kasus kesalahan:Location::hashLocation::href 0.4.3
WeakMap harus didukung sekarang (misalnya beberapa objek terkait WebGL di bawah 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 , DrawImageError , GetImageDataErrorMouseOverEventMouseOutEventPointerOverEventPointerEnterEventPointerDownEventPointerMoveEventPointerUpEventPointerCancelEventPointerOutEventPointerLeaveEventGotPointerCaptureEventLostPointerCaptureEventIPointerEvent 0.4.2
CanvasRenderingContext2d::get_canvasFillRule yang terbuka dan SocketReadyStateIElementDate Baru 0.4.1
wasm32-unknown-unknownSocketBinaryType ENUM yang terbukaCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array dan Object dari Value ; ini sekarang diperlakukan sebagai Reference sValue memiliki varian tambahan: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new Now Take A u64 ArgumenInputElement::set_raw_value sekarang mengambil &str bukannya Into< Value >usize sekarang mengembalikan u32INode::remove_child sekarang mengembalikan Node dalam kasus Oku64 :ArrayBuffer::leni32 bukan 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 sekarang mengembalikan String alih -alih Option< String >InputElement::raw_value sekarang mengembalikan String bukan ValueINode::inner_text dipindahkan ke IHtmlElement::inner_textDocument::query_selector dan Document::query_selector_all dipindahkan ke IParentNodeIElement::query_selector dan IElement::query_selector_all dipindahkan ke IParentNodeDocument::get_element_by_id dipindahkan ke INonElementParentNodeTryFrom / TryInto telah dihapuscargo-web baru-baru ini tidak perlu menghubungi stdweb::initialize atau stdweb::event_loop lagicdylib Crates di wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType dan InstanceOf#[derive(ReferenceType)] di stdweb-derive crate; sekarang dimungkinkan untuk mendefinisikan binding API khusus di luar stdweb#[js_export] Atribut Prosedural ( wasm32-unknown-unknown )DomException dan Subtipe untuk Meneruskan Pengecualian JavaScriptIElement sekarang mewarisi dari INodeReferenceTypestdweb::traits untuk bertindak sebagai pendahuluan untuk use semua sifat antarmuka kamiconsole! makroPartialEq dan Eq 0.3
ErrorEvent yang dihapusLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray untuk nol biaya slice passing ke js!Once untuk melewati penutupan FnOnce ke js! Berlisensi di bawah salah satu dari
di pilihan Anda.
Cuplikan dokumentasi yang berasal dari jaringan pengembang mozilla dicakup dalam cc-by-sa, versi 2.5 atau lebih baru.
Lihat Contributing.md