
Das Ziel dieser Kiste ist es, Rostbindungen an die Web -APIs bereitzustellen und ein hohes Maß an Interoperabilität zwischen Rost und JavaScript zu ermöglichen.
Diese Software wurde Ihnen dank dieser wunderbaren Menschen zu Ihnen gebracht:
Danke schön!
Sie können JavaScript -Code direkt in Rust einbetten:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Schließungen werden ebenfalls unterstützt:
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.
}Sie können auch dank Serde auch willkürliche Strukturen bestehen:
# [ derive ( Serialize ) ]
struct Person {
name : String ,
age : i32
}
js_serializable ! ( Person ) ;
js ! {
var person = @ { person } ;
console . log ( person . name + " is " + person . age + " years old." ) ;
} ;Diese Kiste enthüllt auch eine Reihe von Web -APIs, zum Beispiel:
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;" ; ) ;
}
} ) ;Auch die Rostfunktionen für JavaScript auszusetzen, wird auch unterstützt:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Dann können Sie dies von node.js tun:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; Oder Sie können die gleiche .js -Datei einnehmen und sie in einem Webbrowser verwenden:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Wenn Sie Parzel verwenden, können Sie auch unser experimentelles Parzell -Plugin verwenden. Tun Sie dies zunächst in Ihrem vorhandenen Paketprojekt:
$ npm install --save parcel-plugin-cargo-web
Und dann einfach:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Schauen Sie sich einige der Beispiele an:
examples/minimal - ein völlig minimales Beispiel, das Alarm aufruftexamples/todomvc - eine naiv implementierte Tomvc -Anwendung; zeigt, wie man in die DOM aufruftexamples/hasher - zeigt, wie Sie Rostfunktionen in JavaScript exportieren und sie in einer Vanilla -Webbrowser -Umgebung oder aus NodeJs aufrufen könnenexamples/hasher-parcel - zeigt, wie exportierte Rostfunktionen in einem Paketprojekt importiert und aufrufen.pinky-web - ein NES -Emulator; Sie können hier mit der vorkompilierten Version spielenDie API -Dokumentation steht Ihnen auch zur Verfügung.
Ladung einbauen:
$ cargo install -f cargo-web
Gehen Sie in examples/todomvc und starten Sie das Beispiel mit einem dieser Befehle:
Kompilieren Sie mit der WebAssembly mit dem nativen Backend von Rust's WebAssembly:
$ cargo web start --target=wasm32-unknown-unknown
Kompilieren Sie mit EMSCIPTEN zu ASM.JS:
$ cargo web start --target=asmjs-unknown-emscripten
Kompilieren Sie mit EMSCIPTEN zur WebAssembly:
$ cargo web start --target=wasm32-unknown-emscripten
Besuchen Sie http://localhost:8000 mit Ihrem Browser.
Für die *-emscripten -Ziele ist cargo-web nicht erforderlich, aber der native wasm32-unknown-unknown , für das Emscripten nicht erforderlich ist, benötigt cargo-web , um zu arbeiten!
stdweb 0.4.20
wasm-bindgenFullscreenChangeEvent stdweb 0.4.19
Document::fullscreen_enabledDocument::fullscreen_elementInputElement::selection_startInputElement::selection_endInputElement::set_selection_startInputElement::set_selection_endObject::to_iterWindow::confirm&Array S kann jetzt durch TryFrom in Vec S konvertiert werdenfutures -bezogenen APIs wurden aktualisiert, um mit den neuesten Nachtlies zusammenzuarbeitensyn -Abhängigkeit wurde auf Version 1 aktualisiert stdweb 0.4.18
js! Makro kann jetzt mit einer use importiert werdenBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures -bezogenen APIs wurden aktualisiert, um mit den neuesten Nachtlies zusammenzuarbeiten stdweb 0.4.16
wasm-bindgen Kompatibilität; Sie können jetzt stdweb in Projekten mit wasm-bindgen verwendencargo-web Version ist jetzt 0,6,24 stdweb 0.4.15
futures -bezogenen APIs wurden aktualisiert, um mit den neuesten Nachtlies zusammenzuarbeitenFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! Makro generiert jetzt etwas effizienterer Code, wenn Sie nichts von Ihrem JS -Snippet zurückgeben. Dies macht es unnötig, in den meisten Fällen die Annotation @(no_return) hinzuzufügen.File stdweb 0.4.13
js! Makros Whitespace -HandlingITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown Ziel ohne cargo-web zu kompilieren stdweb 0.4.11
cargo-web Version beträgt jetzt 0,6,22wasm32-unknown-unknown wird jetzt offiziell von stabilem Rost unterstütztwasm32-unknown-unknown die jetzt unterstützt werdenjs! Makro wird jetzt teilweise mit einem prozeduralen Makro implementiertDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector und IParentNode::query_selector_all geben jetzt einen richtigen Fehlertyp zurück 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() ) ist nun in ein TypeError umwandelbarDrawImageError ) sind jetzt durch die js! MakroTypeError ist jetzt festgelegt (es wurde falsch als DOMException behandelt)Number kann jetzt in f64 mit .into() / .from() konvertiert werdenMut hinzugefügt, ein neuer Wrapper -Typ, um FnMut -Schließungen sicher in die js! Makro; Es ist vorerst optional, die Verwendung dieses Wrapper -Typs wird jedoch in Zukunft obligatorisch sein !FnMut -Schließungen können nicht mehr rekursiv bezeichnet werden#[derive(ReferenceType)] unterstützt nun eine begrenzte Teilmenge generischer Typen#[async_test] Attribut -Makro unterstützt (nur Nacht)futures 0.3 (nur Nacht) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S kann jetzt in Option< Serde< T > > mit try_into konvertiert werdeni32 und f64 verwendet werden könnenkeyup -Ereignis als KeyDownEvent zu deaktivieren, da nur der JS -Typ des Ereignisses überprüft wurde und sowohl keyup als auch keydown denselben JS -Typ ( KeyboardEvent ) teilen. Von nun an ist auch im type des Typs des Ereignisses überprüft, sodass solche Conversions nicht mehr zulässig sind. 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray S von Vec S und ArrayBuffer S behoben. 0.4.6
docs.rs erneutSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (hoffentlich).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError im Fehlerfall zurück:Location::hashLocation::href 0.4.3
WeakMap verwendet werden können, sollten jetzt unterstützt werden (z. B. einige der WebGL-verwandten Objekte unter 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 und SocketReadyStateIElement hinzugefügtDate 0.4.1
wasm32-unknown-unknownSocketBinaryType -EnumCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array und Object vom Value ; Diese werden jetzt als Reference S behandeltValue hat eine zusätzliche Variante: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new Now nimmt ein u64 -Argument einInputElement::set_raw_value nimmt jetzt &str anstatt Into< Value >usize zurückgegeben hat, gibt jetzt u32 zurückINode::remove_child nun gibt Node im Ok -Fall zurücku64 zurück:ArrayBuffer::leni32 anstelle von f64 zurück:IMouseEvent::client_xIMouseEvent::client_yIMouseEvent::movement_xIMouseEvent::movement_yIMouseEvent::screen_xIMouseEvent::screen_yResult zurück: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 gibt jetzt eine String anstelle von Option< String > zurückInputElement::raw_value gibt jetzt eine String anstelle von Value zurückINode::inner_text wurde in IHtmlElement::inner_text verschobenDocument::query_selector und Document::query_selector_all wurden zu IParentNode verschobenIElement::query_selector und IElement::query_selector_all wurden zu IParentNode verschobenDocument::get_element_by_id wurde auf INonElementParentNode verschobenTryFrom / TryInto wurde entferntcargo-web ist es nicht erforderlich stdweb::initialize oder stdweb::event_loop mehr zu initialisierencdylib Kisten auf wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType und InstanceOf#[derive(ReferenceType)] in stdweb-derive Kiste; Es ist jetzt möglich, benutzerdefinierte API -Bindungen außerhalb von stdweb zu definieren#[js_export] prozedurales Attribut hinzu (nur wasm32-unknown-unknown )DomException und Subtypen hinzu, um JavaScript -Ausnahmen zu umgebenIElement erbt jetzt von INodeReferenceTypestdweb::traits Merkmalmodul hinzu, um als Auftakt für use von allen unseren Schnittstellenmerkmalen zu fungierenconsole! MakroPartialEq und Eq 0.3
ErrorEvent MethodenLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray hinzu, um keine Kosten zu geben, die an js!Once hinzu, um FnOnce -Schließungen an js! Lizenziert unter einem von
nach Ihrer Option.
Dokumentationsausschnitte, die vom Mozilla Developer Network stammen, werden unter die CC-by-SA, Version 2.5 oder höher abgedeckt.
Siehe Beitrag.md