
El objetivo de esta caja es proporcionar enlaces de óxido a las API web y permitir un alto grado de interoperabilidad entre Rust y JavaScript.
Este software fue traído a usted gracias a estas maravillosas personas:
¡Gracias!
Puede incrustar directamente el código JavaScript en Rust:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Los cierres también son compatibles:
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.
}También puede pasar estructuras arbitrarias gracias a 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." ) ;
} ;Esta caja también expone una serie de API web, por ejemplo:
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;" ; ) ;
}
} ) ;Exponer las funciones de óxido a JavaScript también es compatible:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Entonces puedes hacer esto desde Node.js:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; O puede tomar el mismo archivo .js y usarlo en un navegador web:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Si está utilizando el paquete, también puede usar nuestro complemento de parcela experimental; Primero haga esto en su proyecto de paquete existente:
$ npm install --save parcel-plugin-cargo-web
Y luego simplemente:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Eche un vistazo a algunos de los ejemplos:
examples/minimal : un ejemplo totalmente mínimo que llama alertaexamples/todomvc : una aplicación ingenuamente implementada ToDomVC; Muestra cómo llamar al DOMexamples/hasher : muestra cómo exportar funciones de óxido a JavaScript y cómo llamarlos desde un entorno de navegador web de vainilla o desde NodeJSexamples/hasher-parcel : muestra cómo importar y llamar a las funciones de óxido exportadas en un proyecto de paquetepinky-web : un emulador NES; Puedes jugar con la versión precompilada aquíLa documentación de la API también está disponible para que pueda ver.
Instale Cargo-Web:
$ cargo install -f cargo-web
Entra en examples/todomvc y comience el ejemplo usando uno de estos comandos:
Compilar a WebAssembly utilizando el backend nativo de Rust WebAssembly:
$ cargo web start --target=wasm32-unknown-unknown
Compilar a asm.js usando Emscripten:
$ cargo web start --target=asmjs-unknown-emscripten
Compilar a WebAssembly usando Emscripten:
$ cargo web start --target=wasm32-unknown-emscripten
Visite http://localhost:8000 con su navegador.
Para los objetivos *-emscripten cargo-web no es necesaria, sin embargo, el wasm32-unknown-unknown que no necesita Emscripten requiere que cargo-web funcione.
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 ahora se puede convertir a Vec s a través de TryFromfutures inestable se actualizaron para trabajar con los últimos nochessyn se actualizó a la versión 1 stdweb 0.4.18
js! La macro ahora se puede importar con un useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures inestable se actualizaron para trabajar con los últimos noches stdweb 0.4.16
wasm-bindgen ; Ahora puede usar stdweb en proyectos utilizando wasm-bindgencargo-web ahora es 0.6.24 stdweb 0.4.15
futures inestable se actualizaron para trabajar con los últimos nochesFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! Macro ahora genera un código un poco más eficiente si no está devolviendo nada de su fragmento JS. Esto hace que sea innecesario agregar la anotación @(no_return) en la gran mayoría de los casos.File stdweb 0.4.13
js! Manejo de espacios en blanco de macroITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown sin cargo-web stdweb 0.4.11
cargo-web ahora es 0.6.22wasm32-unknown-unknown ahora es oficialmente compatible con el óxido establewasm32-unknown-unknown se admite ahorajs! La macro ahora se implementa parcialmente utilizando una macro de procedimientoDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector e IParentNode::query_selector_all Ahora devuelva un tipo de error adecuado 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() ) ahora es convertible en un TypeErrorDrawImageError ) ahora son serializables a través de js! macroTypeError ahora es fijo (fue tratado incorrectamente como una DOMException )Number ahora se puede convertir en f64 con .into() / .from()Mut , que es un nuevo tipo de envoltorio para pasar de forma segura los cierres FnMut al js! macro; ¡Es opcional por ahora, sin embargo, el uso de este tipo de envoltorio será obligatorio en el futuro!FnMut ya no se pueden llamar recursivamente#[derive(ReferenceType)] ahora admite un subconjunto limitado de tipos genéricos#[async_test] (solo nocturno)futures 0.3 (solo nocturno) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue s ahora se puede convertir en Option< Serde< T > > con try_intoi32 y f64keyup como un KeyDownEvent , ya que solo se verificó el tipo JS del evento y tanto keyup como keydown comparten el mismo tipo JS ( KeyboardEvent ). A partir de ahora, el campo type del evento también se verifica, por lo que tales conversiones ya no están permitidas. 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray S de Vec S y ArrayBuffer s. 0.4.6
docs.rs nuevamenteSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (con suerte).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError en el caso de error:Location::hashLocation::href 0.4.3
WeakMap deben ser compatibles ahora (por ejemplo, algunos de los objetos relacionados con WebGL bajo 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 expuesto y SocketReadyStateIElementDate 0.4.1
wasm32-unknown-unknownSocketBinaryType enum expuestoCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array y Object del Value ; Estos ahora se tratan como Reference sValue tiene una variante adicional: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new ahora toma un argumento u64InputElement::set_raw_value ahora toma &str en lugar de Into< Value >usize ahora devuelve u32INode::remove_child ahora devuelve Node en el caso Oku64 :ArrayBuffer::leni32 en lugar 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 ahora devuelve una String en lugar de Option< String >InputElement::raw_value ahora devuelve una String en lugar de ValueINode::inner_text se movió a IHtmlElement::inner_textDocument::query_selector y Document::query_selector_all se trasladaron a IParentNodeIElement::query_selector e IElement::query_selector_all se trasladaron a IParentNodeDocument::get_element_by_id se trasladó a INonElementParentNodeTryFrom / TryIntocargo-web ya no es necesario llamar stdweb::initialize ni stdweb::event_loopcdylib en wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType e InstanceOf#[derive(ReferenceType)] en stdweb-derive caj; Ahora es posible definir las enlaces de API personalizados fuera de stdweb#[js_export] Atributo de procedimiento ( wasm32-unknown-unknown ONDNOWN)DomException y subtipos para pasar excepciones de JavaScriptIElement ahora hereda de INodeReferenceTypestdweb::traits para actuar como un preludio para use todos nuestros rasgos de interfazconsole! macroPartialEq y Eq 0.3
ErrorEvent eliminadosLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray para una porción de costo cero pasando a js!Once para pasar cierres FnOnce a js! Con licencia bajo cualquiera de
a tu opción.
Los fragmentos de documentación que provienen de la red de desarrolladores de Mozilla están cubiertos por el CC-by-SA, versión 2.5 o posterior.
Ver contribuyente.md