
Le but de cette caisse est de fournir des liaisons rouillées aux API Web et de permettre un degré élevé d'interopérabilité entre la rouille et le JavaScript.
Ce logiciel vous a été apporté grâce à ces gens merveilleux:
Merci!
Vous pouvez intégrer directement le code JavaScript dans la rouille:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Les fermetures sont également soutenues:
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.
}Vous pouvez également passer des structures arbitraires grâce à 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." ) ;
} ;Cette caisse expose également un certain nombre d'API Web, par exemple:
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;" ; ) ;
}
} ) ;Exposer les fonctions de rouille à JavaScript est également prise en charge:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Ensuite, vous pouvez le faire à partir de node.js:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; Ou vous pouvez prendre le même fichier .js et l'utiliser dans un navigateur Web:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Si vous utilisez des colis, vous pouvez également utiliser notre plugin de colis expérimental; Faites-le d'abord dans votre projet de colis existant:
$ npm install --save parcel-plugin-cargo-web
Et puis simplement:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Jetez un œil à certains des exemples:
examples/minimal - un exemple totalement minimal qui appelle alerteexamples/todomvc - Une application TODOMVC implémentée naïvement; montre comment appeler le domexamples/hasher - montre comment exporter les fonctions de rouille vers JavaScript et comment les appeler à partir d'un environnement de navigateur Web Vanilla ou à partir de Nodejsexamples/hasher-parcel - montre comment importer et appeler des fonctions de rouille exportées dans un projet de colispinky-web - un émulateur NES; Vous pouvez jouer avec la version précompilée iciLa documentation de l'API est également disponible pour vous.
Installez le web cargo:
$ cargo install -f cargo-web
Allez dans examples/todomvc et démarrez l'exemple en utilisant l'une de ces commandes:
Compilez à WebAssembly en utilisant le backend WebAssembly natif de Rust:
$ cargo web start --target=wasm32-unknown-unknown
Compiler avec Asm.js à l'aide d'Emscripten:
$ cargo web start --target=asmjs-unknown-emscripten
Compiler à webassembly à l'aide d'Emscripten:
$ cargo web start --target=wasm32-unknown-emscripten
Visitez http://localhost:8000 avec votre navigateur.
Pour les cibles *-emscripten cargo-web n'est pas nécessaire, mais le natif wasm32-unknown-unknown qui n'a pas besoin que Emscripten nécessite cargo-web pour fonctionner!
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 tableaux peuvent désormais être convertis en Vec via TryFromfutures -liées ont été mises à jour pour travailler avec les derniers nocturnessyn a été mise à jour vers la version 1 stdweb 0.4.18
js! La macro peut désormais être importée avec une useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures -liées ont été mises à jour pour travailler avec les derniers nocturnes stdweb 0.4.16
wasm-bindgen ; Vous pouvez maintenant utiliser stdweb dans des projets en utilisant wasm-bindgencargo-web est maintenant de 0,6,24 stdweb 0.4.15
futures -liées ont été mises à jour pour travailler avec les derniers nocturnesFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! La macro génère désormais un code légèrement plus efficace si vous ne retournez rien de votre extrait JS. Cela rend inutile d'ajouter l'annotation @(no_return) dans la grande majorité des cas.File stdweb 0.4.13
js! manipulation des espaces de macroITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown sans cargo-web stdweb 0.4.11
cargo-web est maintenant de 0,6,22wasm32-unknown-unknown est désormais officiellement soutenu sur la rouille stablewasm32-unknown-unknown est maintenant pris en chargejs! La macro est désormais partiellement implémentée à l'aide d'une macro procéduraleDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector et 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() ) est désormais convertible en TypeErrorDrawImageError ) sont désormais sérialisables via le js! macroTypeError est maintenant fixe (il a été mal traité comme une DOMException )Number peut désormais être converti en f64 avec .into() / .from()Mut , qui est un nouveau type de wrapper pour passer en toute sécurité les fermetures FnMut dans le js! macro; Il est facultatif pour l'instant, mais l'utilisation de ce type de wrapper sera obligatoire à l'avenir!FnMut ne peuvent plus être appelées récursives#[derive(ReferenceType)] prend désormais en charge un sous-ensemble limité de types génériques#[async_test] (Nightly Only)futures 0.3 (Nightly uniquement) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S peut désormais être convertie en Option< Serde< T > > avec try_intoi32 et f64keyup en tant que KeyDownEvent , car seul le type JS de l'événement a été vérifié et que keyup et keydown partagent le même type JS ( KeyboardEvent ). À partir de maintenant, le champ type de l'événement est également vérifié, de sorte que de telles conversions ne sont plus autorisées. 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray S à partir de Vec S et ArrayBuffer S. 0.4.6
docs.rsSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (espérons-le).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError dans le cas d'erreur:Location::hashLocation::href 0.4.3
WeakMap doivent être pris en charge maintenant (par exemple, certains des objets liés à WebGL sous 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 exposée et SocketReadyStateIElementDate 0.4.1
wasm32-unknown-unknownSocketBinaryType exposéCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array et Object de Value ; Ceux-ci sont désormais traités comme Reference sValue a une variante supplémentaire: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new Now prend un argument u64InputElement::set_raw_value maintenant &str au lieu de Into< Value >usize Renvoie maintenant u32INode::remove_child renvoie maintenant Node dans le cas Oku64 :ArrayBuffer::leni32 au lieu de 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 renvoie maintenant une String au lieu de Option< String >InputElement::raw_value renvoie maintenant une String au lieu de ValueINode::inner_text a été déplacé vers IHtmlElement::inner_textDocument::query_selector and Document::query_selector_all IParentNodeIElement::query_selector et IElement::query_selector_all ont été déplacés vers IParentNodeDocument::get_element_by_id a été déplacé vers INonElementParentNodeTryFrom / TryInto a été supprimécargo-web récent, il n'est pas nécessaire d'appeler stdweb::initialize ni stdweb::event_loopcdylib sur wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType et InstanceOf#[derive(ReferenceType)] dans stdweb-derive Crate; Il est maintenant possible de définir les liaisons API personnalisées en dehors de stdweb#[js_export] ( wasm32-unknown-unknown uniquement)DomException et les sous-types pour faire le passage des exceptions JavaScriptIElement hérite maintenant d' INodeReferenceTypestdweb::traits pour agir comme un prélude pour use -ing tous nos traits d'interfaceconsole! macroPartialEq et Eq 0.3
ErrorEvent suppriméesLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray pour le passage de tranche à coûts zéro à js!Once pour passer des fermetures FnOnce à js! Sous licence sous l'un ou l'autre des
à votre option.
Les extraits de documentation qui proviennent du réseau de développeurs Mozilla sont couverts par le CC-by-SA, la version 2.5 ou version ultérieure.
Voir contribution.md