
Цель этого ящика состоит в том, чтобы обеспечить привязок ржавчины для веб -API и обеспечить высокую степень взаимодействия между Rust и JavaScript.
Это программное обеспечение было принесено вам благодаря этим замечательным людям:
Спасибо!
Вы можете напрямую внедрить код JavaScript в Rust:
let message = "Hello, 世界!" ;
let result = js ! {
alert ( @ { message } ) ;
return 2 + 2 * 2 ;
} ;
println ! ( "2 + 2 * 2 = {:?}" , result ) ;Также поддерживаются закрытия:
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.
}Вы также можете пройти произвольные структуры благодаря 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." ) ;
} ;Например, этот ящик также раскрывает ряд веб -API:
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;" ; ) ;
}
} ) ;Выявление функций ржавчины на JavaScript также поддерживается:
# [ js_export ]
fn hash ( string : String ) -> String {
let mut hasher = Sha1 :: new ( ) ;
hasher . update ( string . as_bytes ( ) ) ;
hasher . digest ( ) . to_string ( )
}Тогда вы можете сделать это из node.js:
var hasher = require ( "hasher.js" ) ; // Where `hasher.js` is generated from Rust code.
console . log ( hasher . hash ( "Hello world!" ) ) ; Или вы можете взять тот же файл .js и использовать его в веб -браузере:
< script src =" hasher.js " > </ script >
< script >
Rust . hasher . then ( function ( hasher ) {
console . log ( hasher . hash ( "Hello world!" ) ) ;
} ) ;
</ script >Если вы используете посылку, вы также можете использовать наш экспериментальный плагин посылки; Сначала сделайте это в своем существующем проекте посылок:
$ npm install --save parcel-plugin-cargo-web
А потом просто:
import hasher from "./hasher/Cargo.toml" ;
console . log ( hasher . hash ( "Hello world!" ) ) ; Взгляните на некоторые примеры:
examples/minimal - совершенно минимальный пример, который вызывает предупреждениеexamples/todomvc - наивно внедренное приложение; показывает, как вызвать DOMexamples/hasher - показывает, как экспортировать функции ржавчины в JavaScript и как позвонить их из ванильной среды веб -браузера или из Nodejsexamples/hasher-parcel - показывает, как импортировать и вызовать экспортированные функции ржавчины в проекте посылкиpinky-web - эмулятор NES; Вы можете играть с предварительной версией здесьДокументация API также доступна для вас.
Установите грузовой пакет:
$ cargo install -f cargo-web
Зайдите в examples/todomvc и запустите пример, используя одну из этих команд:
Скомпилируйте Webassembly с использованием нативного бэкэнда rust vebassembly:
$ cargo web start --target=wasm32-unknown-unknown
Скомпилируйте ASM.JS, используя Emscripten:
$ cargo web start --target=asmjs-unknown-emscripten
Скомпилируйте Webassembly с использованием emscripten:
$ cargo web start --target=wasm32-unknown-emscripten
Посетите http://localhost:8000 с вашим браузером.
Для *-emscripten TARGETS cargo-web не требуется, однако местный wasm32-unknown-unknown , который не нуждается в EMSCRIPTEN, требует работы cargo-web !
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 теперь можно преобразовать в Vec S через TryFromfutures API были обновлены, чтобы работать с последними ночными людьмиsyn -зависимость была обновлена до версии 1 stdweb 0.4.18
js! Макро теперь можно импортировать с помощью useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures API были обновлены, чтобы работать с последними ночными людьми stdweb 0.4.16
wasm-bindgen ; Теперь вы можете использовать stdweb в проектах, используя wasm-bindgencargo-web теперь 0,6,24 stdweb 0.4.15
futures API были обновлены, чтобы работать с последними ночными людьмиFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! Макро теперь генерирует немного более эффективный код, если вы ничего не возвращаете из своего фрагмента JS. Это делает ненужным добавление аннотации @(no_return) в подавляющем большинстве случаев.File stdweb 0.4.13
js! Обработка макросаITouchEventTouchTouchTypeTouchEventTouchMoveTouchLeaveTouchEnterTouchEndTouchCancelTouchStartXmlHttpRequest::set_response_type stdweb 0.4.12
wasm32-unknown-unknown без cargo-web stdweb 0.4.11
cargo-web теперь 0,6,22wasm32-unknown-unknown теперь официально поддерживается на стабильной ржавчинеwasm32-unknown-unknown теперь поддерживаютсяjs! Макро теперь частично реализован с использованием процедурного макросаDocument::import_nodeIElement::slotIElement::attach_shadowIElement::shadow_rootISlotableShadowRootShadowRootModeTemplateElementSlotElementSlotChangeEventIParentNode::query_selector и 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() ) теперь конвертируется в TypeErrorDrawImageError ) теперь сериализуются через js! макроTypeError теперь фиксирован (он был неправильно рассматривается как DOMException )Number теперь может быть преобразовано в f64 с .into() / .from()Mut , который является новым типом обертки для безопасного передачи закрытия FnMut в js! макро; Это необязательно на данный момент, однако использование этого типа обертки будет обязательным в будущем!FnMut больше нельзя называться рекурсивно#[derive(ReferenceType)] теперь поддерживает ограниченное подмножество общих типов#[async_test] (только ночью)futures 0.3 (только ночи) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S теперь можно преобразовать в Option< Serde< T > > с помощью try_intoi32 и f64keyup в качестве KeyDownEvent , так как был проверен только тип JS события, а keyup и keydown имеют один и тот же тип JS ( KeyboardEvent ). Отныне также проверяется поля type события, поэтому такие преобразования больше не допускаются. 0.4.8
wasm32-unknown-unknownPointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectTypedArray S из Vec S и ArrayBuffer S. 0.4.6
docs.rs сноваSubmitEventIChildNodeCanvasElement::to_data_url 0.4.5
DocumentFragmentSelectElementOptionElementHtmlCollectionNode::from_htmlValue::is_nullSocketMessageDataNodeTypefutures 0,2 0.4.4
docs.rs (надеюсь).Location::originLocation::protocolLocation::hostLocation::hostnameLocation::portLocation::pathnameLocation::searchSecurityError в случае ошибки:Location::hashLocation::href 0.4.3
WeakMap должны быть поддержаны сейчас (например, некоторые из объектов, связанных с WebGL в 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 и SocketReadyStateIElementDate 0.4.1
wasm32-unknown-unknownSocketBinaryType enumCanvasRenderingContext2dCanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array и Object из Value ; Сейчас они рассматриваются как ReferenceValue имеет дополнительный вариант: SymbolInputElement::set_kindInputElement::filesKeydownEvent -> KeyDownEventKeyupEvent -> KeyUpEventKeypressEvent -> KeyPressEventReadyState -> FileReaderReadyStateInputElement::value -> InputElement::raw_valueInputElement::set_value -> InputElement::set_raw_valueArrayBuffer::new Now принимает аргумент u64InputElement::set_raw_value теперь принимает &str вместо Into< Value >usize теперь возвращает u32INode::remove_child теперь возвращает Node в случае Oku64 :ArrayBuffer::leni32 вместо 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 теперь возвращает String вместо Option< String >InputElement::raw_value теперь возвращает String вместо ValueINode::inner_text был перенесен на IHtmlElement::inner_textDocument::query_selector и Document::query_selector_all были перемещены в IParentNodeIElement::query_selector и IElement::query_selector_all были перемещены в IParentNodeDocument::get_element_by_id был перенесен в INonElementParentNodeTryFrom / TryInto был удаленcargo-web нет необходимости звонить stdweb::initialize и stdweb::event_loop большеcdylib на wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType и InstanceOf#[derive(ReferenceType)] в stdweb-derive crate; Теперь можно определить пользовательские привязки API за пределами stdweb#[js_export] процедурный атрибут (только wasm32-unknown-unknown )DomException и подтипы для передачи исключений JavaScriptIElement теперь наследует от INodeReferenceTypestdweb::traits , чтобы выступить в качестве прелюдии для use -все наши черты интерфейсаconsole! макроPartialEq и Eq 0.3
ErrorEventLoadEvent -> ResourceLoadEventAbortEvent -> ResourceAbortEventErrorEvent -> ResourceErrorEventUnsafeTypedArray для среза нулевой стоимости, проходящего в js!Once для передачи закрытия FnOnce к js! Лицензирован под одним из
на вашем варианте.
Фрагменты документации, которые поступают из сети разработчиков Mozilla, охватываются под CC-By-SA, версия 2.5 или более поздней версии.
См. Appling.md