
الهدف من هذا الصندوق هو توفير روابط الصدأ لواجهة برمجة تطبيقات الويب والسماح بدرجة عالية من التشغيل البيني بين الصدأ وجافا سكريبت.
تم تقديم هذا البرنامج إليك بفضل هؤلاء الأشخاص الرائعين:
شكرًا لك!
يمكنك تضمين رمز JavaScript مباشرة في الصدأ:
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." ) ;
} ;يكشف هذا الصندوق أيضًا عددًا من واجهات برمجة التطبيقات على الويب ، على سبيل المثال:
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 - تطبيق TODODVC تم تنفيذه بسذاجة ؛ يوضح كيفية الاتصال في DOMexamples/hasher - توضح كيفية تصدير وظائف الصدأ إلى JavaScript وكيفية الاتصال بهم من بيئة متصفح الويب الفانيليا أو من NodeJSexamples/hasher-parcel - توضح كيفية استيراد وظائف الصدأ المصدرة في مشروع الطرودpinky-web - محاكي NES ؛ يمكنك اللعب مع الإصدار المسبق هناوثائق API متاحة أيضًا لكي تنظر إليها.
تثبيت البضائع web:
$ cargo install -f cargo-web
انتقل إلى examples/todomvc وابدأ المثال باستخدام أحد هذه الأوامر:
التجميع إلى Webassembly باستخدام الواجهة الخلفية لـ Rust الأصلية:
$ 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 ، فإن 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 غير المستقرة المرتبطة بالعمل مع أحدث خطوط ليليةsyn إلى الإصدار 1 stdweb 0.4.18
js! يمكن الآن استيراد الماكرو useBeforeUnloadEventUnloadEventIBlob::sliceIBlob::slice_with_content_typeIWindowOrWorker::set_clearable_timeout stdweb 0.4.17
futures غير المستقرة المرتبطة بالعمل مع أحدث خطوط ليلية stdweb 0.4.16
wasm-bindgen الأولي ؛ يمكنك الآن استخدام stdweb في المشاريع باستخدام wasm-bindgencargo-web هو الآن 0.6.24 stdweb 0.4.15
futures غير المستقرة المرتبطة بالعمل مع أحدث خطوط ليليةFormDataFormDataEntryMouseButtonsStateBlob::new stdweb 0.4.14
js! يقوم Macro الآن بإنشاء رمز أكثر كفاءة قليلاً إذا كنت لا تعيد أي شيء من مقتطف 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] الجديد (Nightly فقط)futures 0.3 (ليلا فقط) stdweb 0.4.9 ، stdweb-derive 0.5.0
ScrollEventDragRelatedEventDragEventDragStartEventDragEndEventDragEnterEventDragLeaveEventDragOverEventDragExitEventDragDropEventDataTransferEffectAllowedDropEffectDataTransferItemListDataTransferItemDataTransferItemKindIDragEventValue s إلى Option< Serde< T > > مع try_intoi32 و f64 لاستخدامهاkeyup كحدث 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 التعدادCanvasRenderingContext2dCanvasGradient ، 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_textIParentNode التغيير) Document::query_selector Document::query_selector_allIElement::query_selector و IElement::query_selector_all تم نقله إلى IParentNodeDocument::get_element_by_id تم نقله إلى INonElementParentNodeTryFrom / TryIntocargo-web حديثة ، ليس من الضروري استدعاء stdweb::initialize أو stdweb::event_loop بعد الآنcdylib على wasm32-unknown-unknownXmlHttpRequestWebSocketMutationObserverHistoryTextAreaElementCanvasElementMouseDownEventMouseUpEventMouseMoveEventPopStateEventResizeEventReadyStateChangeSocketCloseEventSocketErrorEventSocketOpenEventSocketMessageEventReferenceType و InstanceOf#[derive(ReferenceType)] في قفص stdweb-derive ؛ من الممكن الآن تحديد روابط 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 أو أحدث.
انظر المساهمة