
O objetivo deste caixote é fornecer ligações de ferrugem às APIs da Web e permitir um alto grau de interoperabilidade entre ferrugem e JavaScript.
Este software foi trazido a você graças a essas pessoas maravilhosas:
Obrigado!
Você pode incorporar diretamente o código JavaScript na Rust:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Os fechamentos também são suportados:
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.
}Você também pode passar estruturas arbitrárias graças 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 caixa também expõe uma série de APIs da Web, por exemplo:
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;" ; ) ;
}
} ) ;Expondo funções de ferrugem ao JavaScript também é suportado:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Então você pode fazer isso no Node.js:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; Ou você pode pegar o mesmo arquivo .js e usá -lo em um navegador da web:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Se você estiver usando o pacote, também pode usar nosso plug -in experimental de encomendas; Primeiro faça isso no seu projeto de encomenda existente:
$ npm install --save parcel-plugin-cargo-web
E então simplesmente:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Dê uma olhada em alguns dos exemplos:
examples/minimal - um exemplo totalmente mínimo que chama de alertaexamples/todomvc - um aplicativo TODOMVC ingenuamente implementado; mostra como chamar o DOMexamples/hasher - mostra como exportar funções de ferrugem para JavaScript e como chamá -las de um ambiente de navegador de baunilha ou do NodeJSexamples/hasher-parcel - mostra como importar e chamar funções de ferrugem exportadas em um projeto de encomendaspinky-web - um emulador NES; Você pode brincar com a versão pré -compilada aquiA documentação da API também está disponível para você olhar.
Instale o Cargo-Web:
$ cargo install -f cargo-web
Entre em examples/todomvc e inicie o exemplo usando um desses comandos:
Compilar com a montagem de Web usando o back -end de Memembly Native de Rust:
$ cargo web start --target=wasm32-unknown-unknown
Compilar com asm.js usando o emscriptten:
$ cargo web start --target=asmjs-unknown-emscripten
Compilar com o WebAssembly usando o Emscriptten:
$ cargo web start --target=wasm32-unknown-emscripten
Visite http://localhost:8000 com seu navegador.
Para os alvos *-emscripten cargo-web não é necessário, no entanto, o nativo wasm32-unknown-unknown que não precisa do EMSCRIPTEN, exige 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 agora pode ser convertido em Vec s através de TryFromfutures instáveis foram atualizadas para trabalhar com os mais recentes noturnossyn foi atualizada para a versão 1 stdweb 0.4.18
js! A macro agora pode ser importada com useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures instáveis foram atualizadas para trabalhar com os mais recentes noturnos stdweb 0.4.16
wasm-bindgen ; Agora você pode usar stdweb em projetos usando wasm-bindgencargo-web necessária é agora 0,6.24 stdweb 0.4.15
futures instáveis foram atualizadas para trabalhar com os mais recentes noturnosFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! A Macro agora gera código um pouco mais eficiente se você não estiver retornando nada do seu trecho JS. Isso torna desnecessário adicionar a anotação @(no_return) na grande maioria dos casos.File stdweb 0.4.13
js! Manuseio de espaço em branco da macroITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown sem cargo-web stdweb 0.4.11
cargo-web necessária é agora 0,6.22wasm32-unknown-unknown agora é oficialmente apoiado em ferrugem estávelwasm32-unknown-unknown agora é suportadojs! A macro agora é parcialmente implementada usando uma macro processualDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector e IParentNode::query_selector_all agora retorna um tipo de erro adequado 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() ) agora é conversível em um TypeErrorDrawImageError ) agora são serializáveis através do js! macroTypeError agora é corrigido (foi tratado incorretamente como uma DOMException )Number agora pode ser convertido em f64 com .into() / .from()Mut , que é um novo tipo de invólucro para passar o fechamento FnMut com segurança para o js! macro; É opcional por enquanto, no entanto, o uso desse tipo de invólucro será obrigatório no futuro!FnMut não podem mais ser chamados recursivamente#[derive(ReferenceType)] agora suporta um subconjunto limitado de tipos genéricos#[async_test] Macro (somente noturno)futures 0.3 (somente noturno) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S agora pode ser convertido em Option< Serde< T > > com try_intoi32 e f64 sejam usadoskeyup como um KeyDownEvent , já que apenas o tipo JS do evento foi verificado e keyup e keydown compartilham o mesmo tipo JS ( KeyboardEvent ). A partir de agora, o campo type do evento também é verificado, portanto, essas conversões não são mais 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 e ArrayBuffer S. 0.4.6
docs.rs novamenteSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0.2 0.4.4
docs.rs (espero).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError no caso de erro:Location::hashLocation::href 0.4.3
WeakMap devem ser suportados agora (por exemplo, alguns dos objetos relacionados ao WebGL no 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 e SocketReadyState expostosIElementDate 0.4.1
wasm32-unknown-unknownSocketBinaryType expostoCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array e variantes de Object do Value ; Estes agora são tratados como Reference sValue tem uma variante extra: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new Now leva um argumento u64InputElement::set_raw_value agora leva &str em vez de Into< Value >usize agora retorna u32INode::remove_child agora retorna Node no caso Oku64 :ArrayBuffer::leni32 em vez 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 agora retorna uma String em vez de Option< String >InputElement::raw_value agora retorna uma String em vez de ValueINode::inner_text foi movido para IHtmlElement::inner_textDocument::query_selector e Document::query_selector_all foram movidos para IParentNodeIElement::query_selector e IElement::query_selector_all foram movidos para IParentNodeDocument::get_element_by_id foi movido para INonElementParentNodeTryFrom / TryInto foi removidocargo-web recente stdweb::initialize não é stdweb::event_loop ligar maiscdylib no wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType e InstanceOf#[derive(ReferenceType)] em Crate stdweb-derive ; Agora é possível definir ligações de API personalizadas fora do stdweb#[js_export] atributo processual (somente wasm32-unknown-unknown )DomException e subtipos para passar as exceções de JavaScriptIElement agora herda do INodeReferenceTypestdweb::traits para agir como um prelúdio para use -auros de todos os nossos traços de interfaceconsole! macroPartialEq e Eq 0.3
ErrorEvent excluídosLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray por fatia de custo zero para js!Once para passar o fechamento FnOnce para js! Licenciado sob qualquer um de
por sua opção.
Os trechos de documentação provenientes da Mozilla Developer Network são cobertos pelo CC-BY-SA, versão 2.5 ou posterior.
Consulte Contribuindo.md