
이 상자의 목표는 웹 API에 녹 바인딩을 제공하고 녹과 자바 스크립트 사이에 높은 수준의 상호 운용성을 허용하는 것입니다.
이 소프트웨어는이 훌륭한 사람들 덕분에 당신에게 가져 왔습니다.
감사합니다!
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;" ; ) ;
}
} ) ;Rust 기능을 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 순진하게 구현 된 TODOMVC 응용 프로그램; DOM으로 전화하는 방법을 보여줍니다examples/hasher - Rust 기능을 JavaScript로 내보내는 방법과 바닐라 웹 브라우저 환경 또는 Nodejs에서 전화하는 방법을 보여줍니다.examples/hasher-parcel - 소포 프로젝트에서 내보낸 Rust 기능을 가져오고 호출하는 방법을 보여줍니다.pinky-web NES 에뮬레이터; 여기에서 선행 버전으로 재생할 수 있습니다API 문서도 볼 수 있습니다.
화물 웹 설치 :
$ cargo install -f cargo-web
examples/todomvc 로 이동하여 다음 명령 중 하나를 사용하여 예제를 시작하십시오.
Rust의 기본 WebAssembly 백엔드를 사용하여 WebAssembly로 컴파일 :
$ cargo web start --target=wasm32-unknown-unknown
emscripten을 사용하여 ASM.JS로 컴파일 :
$ cargo web start --target=asmjs-unknown-emscripten
emscripten을 사용하여 webAssembly로 컴파일 :
$ cargo web start --target=wasm32-unknown-emscripten
브라우저와 함께 http://localhost:8000 방문하십시오.
*-emscripten targets의 경우 cargo-web cargo-web 가 필요하지 않은 Native wasm32-unknown-unknown 작동하기 위해 필요합니다 !
stdweb 0.4.20
wasm-bindgen 과의 호환성FullscreenChangeEvent stdweb 0.4.19
Document::fullscreen_enabledDocument::fullscreen_elementInputElement::selection_startInputElement::selection_endInputElement::set_selection_startInputElement::set_selection_endObject::to_iterWindow::confirm&Array 은 이제 TryFrom 통해 Vec s로 변환 될 수 있습니다.futures 관련 API는 최신 야간과 함께 작동하도록 업데이트되었습니다.syn 의존성은 버전 1으로 업데이트되었습니다 stdweb 0.4.18
js! 이제 매크로를 use 하여 가져올 수 있습니다BeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures 관련 API는 최신 야간과 함께 작동하도록 업데이트되었습니다. stdweb 0.4.16
wasm-bindgen 호환성; 이제 wasm-bindgen 사용하는 프로젝트에서 stdweb 사용할 수 있습니다cargo-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
cargo-web 없이 wasm32-unknown-unknown 대상을 컴파일하려고 할 때 개선 된 진단 stdweb 0.4.11
cargo-web 버전은 이제 0.6.22입니다wasm32-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() )을 사용할 때) 이제 TypeError 로 변환 할 수 있습니다.DrawImageError )은 이제 js! 매크로TypeError 는 이제 고정되었습니다 ( DOMException 으로 잘못 처리되었습니다).into() / .from() 으로 Number 로 변환 할 수 있습니다 f64FnMut 클로저를 JS로 안전하게 전달하기위한 새로운 래퍼 유형 인 Mut 추가했습니다 js! 매크로; 현재는 선택 사항이지만이 래퍼 유형의 사용은 향후 필수적입니다 !FnMut 클로저는 더 이상 재귀 적으로 호출 할 수 없습니다#[derive(ReferenceType)] 이제 제한된 일반 유형의 서브 세트를 지원합니다#[async_test] 속성 매크로 (nightly only)로 지원됩니다.futures 0.3 (야간 만) stdweb 0.4.9 , stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue S는 이제 try_into 사용하여 Option< Serde< T > > 으로 변환 할 수 있습니다.i32 및 f64 이외의 유형을 사용할 수 있도록합니다.keyup 및 keydown 이 동일한 JS 유형 ( KeyboardEvent )을 공유하기 때문에 이전에 keyup event를 키우 KeyDownEvent 로 삼을 수있었습니다. 지금부터 이벤트의 type 필드에서도 확인되므로 이러한 전환은 더 이상 허용되지 않습니다. 0.4.8
wasm32-unknown-unknown 타겟팅 할 때 최신 밤의 편집 수정PointerLockChangeEventPointerLockErrorEventMouseWheelEventMouseWheelDeltaModeXhrResponseTypeXmlHttpRequest::raw_responseWindow::device_pixel_ratioDocument::pointer_lock_elementDocument::exit_pointer_lock 0.4.7
AuxClickEventMouseEnterEventMouseLeaveEventContextMenuEventSelectionChangeEventFileListFileReaderReadyStateGamepadGamepadButtonGamepadButtonMappingGamepadEventCanvasRenderingContext2d::clear_rectVec S 및 ArrayBuffer 에서 TypedArray 를 만들 때 누출이 수정되었습니다. 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 에서 키로 사용할 수없는 객체는 이제 지원되어야합니다 (예 : Firefox의 WebGL 관련 객체 중 일부)Element::get_bounding_client_rectElement::scroll_topElement::scroll_leftWindow::page_x_offsetWindow::page_y_offsetNodeList::itemDocument::bodyDocument::headDocument::titleDocument::set_titleIMouseEvent::offset_xIMouseEvent::offset_yCompositeOperationLineCapLineJoinRepetitionTextAlignTextBaselineDrawImageError GetImageDataError AddColorStopError 노출MouseOverEventMouseOutEventPointerOverEventPointerEnterEventPointerDownEventPointerMoveEventPointerUpEventPointerCancelEventPointerOutEventPointerLeaveEventGotPointerCaptureEventLostPointerCaptureEventIPointerEvent 0.4.2
CanvasRenderingContext2d::get_canvasFillRule 및 SocketReadyStateIElement 에 추가되었습니다Date 바인딩 0.4.1
wasm32-unknown-unknown 의 최신 야간 녹에 대한 지원SocketBinaryType 열거CanvasRenderingContext2d 위한 수많은 새로운 방법CanvasGradient , CanvasPattern , CanvasStyle , ImageData , TextMetricsIndexSizeError , NotSupportedError , TypeError 0.4
Array 및 Object 변형이 Value 에서 제거되었습니다. 이들은 현재 Reference 로 취급됩니다Value 에는 추가 변형이 있습니다 : SymbolInputElement::set_kindInputElement::filesKeydownEvent > KeyDownEventKeyupEvent > KeyUpEventKeypressEvent > KeyPressEventReadyState > FileReaderReadyStateInputElement::value > InputElement::raw_valueInputElement::set_value > InputElement::set_raw_valueArrayBuffer::new Now는 u64 인수를 취합니다InputElement::set_raw_value 이제 Into< Value > 대신 &str 가져옵니다.usize 반환 한 모든 방법은 이제 u32 반환합니다INode::remove_child 이제 Ok 케이스에서 Node 반환합니다u64 반환합니다.ArrayBuffer::lenf64 대신 i32 반환합니다.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 이제 Option< String > 대신 String 반환합니다.InputElement::raw_value 이제 Value 대신 String 반환합니다INode::inner_text IHtmlElement::inner_text 로 이동했습니다Document::query_selector 및 Document::query_selector_all 이 IParentNode 로 이동되었습니다IElement::query_selector 및 IElement::query_selector_all 이 IParentNode 로 이동했습니다Document::get_element_by_id INonElementParentNode 로 이동되었습니다TryFrom / TryInto 사용하여 임의의 참조와 유사한 물체들 사이를 변환하기위한 담요 임시 제거가 제거되었습니다.cargo-web 사용하여 구축 할 때는 stdweb::initialize 또는 stdweb::event_loop 호출 할 필요가 없습니다.wasm32-unknown-unknown 에서의 cdylib 상자에 대한 지원XmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType 및 InstanceOfstdweb-derive crate에서 #[derive(ReferenceType)] 추가합니다. 이제 stdweb 외부에 맞춤형 API 바인딩을 정의 할 수 있습니다.#[js_export] 절차 속성 ( wasm32-unknown-unknown 만 해당)DomException 및 하위 유형을 추가하십시오IElement 이제 INode 에서 상속됩니다ReferenceType 에서 상속됩니다stdweb::traits 모듈을 추가하여 모든 인터페이스 특성을 use 위한 서막 역할을합니다.console! 매크로PartialEq 및 Eq 구현합니다 0.3
ErrorEvent 방법LoadEvent > ResourceLoadEventAbortEvent > ResourceAbortEventErrorEvent > ResourceErrorEventjs! 로 전달되는 제로 비용 슬라이스에 대한 UnsafeTypedArray 추가하십시오!js! 에 FnOnce 클로저를 통과하려면 Once 추가하십시오! 어느 쪽에도 라이센스가 부여되었습니다
귀하의 선택에.
Mozilla Developer Network에서 나오는 문서 스 니펫은 CC-By-SA, 버전 2.5 이상에 적용됩니다.
Contributing.md를 참조하십시오