เฟรมเวิร์กส่วนใหญ่ (ทั้งหมด) ที่คุณกำลังมองหาแก้ปัญหาเดียวกัน แต่พวกเขาทำในรูปแบบที่แตกต่างกันเล็กน้อยโดยมีเป้าหมายแตกต่างกันเล็กน้อย
ฉันคิดว่ามันยุติธรรมที่จะบอกว่าโครงการเหล่านี้ทั้งหมดจะแก้ปัญหาในประเภทเหล่านี้:
- ระบุชุดค่าเริ่มต้นที่สมเหตุสมผล
- ลดรหัสสำเร็จรูป
- จัดเตรียมโครงสร้างแอปพลิเคชันที่ด้านบนของโครงสร้างบล็อก BackboneJS
- แยกรูปแบบที่ผู้เขียนใช้ในแอพ
หุ่นกระบอกซึ่งฉันสร้างมาตั้งแต่เดือนธันวาคม 2554 มีเป้าหมายและอุดมคติที่แตกต่างกันอยู่สองสามประการเช่นกัน:
- สถาปัตยกรรมแอปพลิเคชันแบบรวม
- รูปแบบการส่งข้อความขององค์กรมีอิทธิพล
- ตัวเลือกการทำให้เป็นโมดูล
- การใช้งานที่เพิ่มขึ้น (ไม่มีข้อกำหนดทั้งหมดหรือไม่มีเลย)
- ไม่มีการล็อคอินเซิร์ฟเวอร์
- ทำให้ง่ายต่อการเปลี่ยนค่าเริ่มต้นเหล่านั้น
- รหัสเป็นการกำหนดค่า / การกำหนดค่ามากกว่า
ฉันไม่ได้บอกว่ากรอบอื่น ๆ ไม่มีเป้าหมายเดียวกันนี้ แต่ฉันคิดว่าเอกลักษณ์ของมาริโอเน็ตต์มาจากการผสมผสานของเป้าหมายเหล่านี้
สถาปัตยกรรมแอพลิเคชันคอมโพสิต
ฉันใช้เวลามากกว่า 5 ปีในการทำงานกับไคลเอนต์หนาระบบซอฟต์แวร์แบบกระจายโดยใช้ WinForms และ C # ฉันสร้างแอพสำหรับเดสก์ท็อปแล็ปท็อป (ไคลเอนต์สมาร์ท) อุปกรณ์มือถือและเว็บแอปพลิเคชันทั้งหมดแบ่งปันชุดฟังก์ชั่นหลักและทำงานกับเซิร์ฟเวอร์เดียวกันแบ็คเอนด์หลายครั้ง ในเวลานี้ฉันเรียนรู้คุณค่าของการทำให้เป็นโมดูลและย้ายไปอย่างรวดเร็วในเส้นทางของการออกแบบแอพพลิเคชั่นคอมโพสิต
แนวคิดพื้นฐานคือ "เขียน" ประสบการณ์รันไทม์ของแอปพลิเคชันของคุณและประมวลผลจากชิ้นส่วนเล็ก ๆ ที่ไม่จำเป็นต้องรู้ซึ่งกันและกัน พวกเขาลงทะเบียนตัวเองกับระบบแอปพลิเคชันโดยรวมแล้วพวกเขาก็สื่อสารผ่านวิธีการต่าง ๆ ของข้อความแยกและการโทร
ฉันได้เขียนเล็กน้อยเกี่ยวกับสิ่งนี้ในบล็อกของฉันแนะนำ Marionette เป็นสถาปัตยกรรมแอปพลิเคชันแบบรวมสำหรับ Backbone:
คิวข้อความ / รูปแบบ
ระบบกระจายแบบกระจายขนาดใหญ่เดียวกันก็ใช้ประโยชน์จากการจัดคิวข้อความรูปแบบการรวมองค์กร (รูปแบบการส่งข้อความ) และบัสบริการเพื่อจัดการกับข้อความ สิ่งนี้มีอิทธิพลอย่างมากต่อแนวทางการพัฒนาซอฟต์แวร์ของฉัน ฉันเริ่มเห็นแอปพลิเคชั่น WinForms ในหน่วยประมวลผลเดียวจากมุมมองนี้และในไม่ช้าการพัฒนาด้านเซิร์ฟเวอร์และแอปพลิเคชันเว็บของฉันก็ได้รับอิทธิพลจากสิ่งนี้
สิ่งนี้ได้แปลโดยตรงไปยังวิธีที่ฉันดูการออกแบบแอปพลิเคชันของ Backbone ฉันให้ตัวรวบรวมเหตุการณ์ใน Marionette สำหรับทั้งแอปพลิเคชันระดับสูงและสำหรับแต่ละโมดูลที่คุณสร้างภายในแอปพลิเคชัน
ฉันคิดถึงข้อความที่ฉันสามารถส่งระหว่างโมดูลได้: ข้อความคำสั่งข้อความเหตุการณ์และอื่น ๆ ฉันยังคิดถึงการสื่อสารด้านเซิร์ฟเวอร์เป็นข้อความที่มีรูปแบบเดียวกันนี้ รูปแบบบางอย่างได้เข้ามาใน Marionette แล้ว แต่ก็ยังไม่มี
modularization
การทำให้เป็นโมดูลของโค้ดนั้นมีความสำคัญอย่างมาก การสร้างแพคเกจขนาดเล็กที่ห่อหุ้มอย่างดีซึ่งมีโฟกัสเอกพจน์พร้อมจุดเข้า - ออกที่กำหนดไว้อย่างดีเป็นสิ่งจำเป็นสำหรับระบบใด ๆ ที่มีขนาดและความซับซ้อนที่สำคัญ
Marionette นำเสนอการทำให้เป็นโมดูลโดยตรงผ่านmodule
คำจำกัดความของมัน แต่ฉันก็จำได้ว่าบางคนชอบ RequireJS และต้องการใช้สิ่งนั้น ดังนั้นฉันจึงให้ทั้งบิลด์มาตรฐานและบิลด์ที่เข้ากันได้กับ RequireJS
MyApp = new Backbone.Marionette.Application();
MyApp.module("MyModule", function(MyModule, MyApp, Backbone, Marionette, $, _){
// your module code goes here
});
(ยังไม่มีการโพสต์บล็อกสำหรับสิ่งนี้)
การใช้งานที่เพิ่มขึ้น
นี่คือหนึ่งในปรัชญาหลักที่ฉันอบเข้าไปในส่วนต่างๆของหุ่นกระบอกที่ฉันทำได้: ไม่มีข้อกำหนด "ทั้งหมด - หรือ - ไม่มี" สำหรับการใช้หุ่นกระบอก
Backbone นั้นใช้วิธีการที่เพิ่มมากขึ้นและเป็นแบบแยกส่วนกับวัตถุของบล็อกทั้งหมด คุณมีอิสระที่จะเลือกสิ่งที่คุณต้องการใช้เมื่อใด ฉันเชื่อมั่นอย่างยิ่งในหลักการนี้และพยายามทำให้แน่ใจว่า Marionette ทำงานในลักษณะเดียวกัน
ด้วยเหตุนี้ชิ้นส่วนใหญ่ที่ฉันได้สร้างในหุ่นกระบอกจะถูกสร้างขึ้นเพื่อยืนอยู่คนเดียวทำงานกับแกนหลักของ Backbone และทำงานร่วมกันได้ดียิ่งขึ้น
ตัวอย่างเช่นแอปพลิเคชัน Backbone เกือบทุกตัวต้องแสดงมุมมอง Backbone แบบไดนามิกในสถานที่เฉพาะบนหน้าจอ แอพจำเป็นต้องจัดการกับการปิดมุมมองเก่าและล้างหน่วยความจำเมื่อมีการสร้างใหม่ นี่คือสิ่งที่ Marionette เข้าRegion
มาเล่น ภูมิภาคจัดการกับรหัสสำเร็จรูปของการดูเรียกการแสดงผลและการบรรจุผลใน DOM สำหรับคุณ จากนั้นจะปิดมุมมองนั้นและล้างข้อมูลให้คุณหากมุมมองของคุณมีวิธี "ปิด"
MyApp.addRegions({
someRegion: "#some-div"
});
MyApp.someRegion.show(new MyView());
แต่คุณไม่จำเป็นต้องใช้มุมมองของ Marionette เพื่อใช้พื้นที่ ข้อกำหนดเพียงอย่างเดียวคือคุณกำลังขยายจาก Backbone ดูในบางจุดในห่วงโซ่ต้นแบบของวัตถุ หากคุณเลือกที่จะให้close
วิธีการonShow
วิธีการหรือภูมิภาคอื่น ๆ ของ Marionette จะโทรหาคุณในเวลาที่เหมาะสม
ไม่มีเซิร์ฟเวอร์ล็อคอิน
ฉันสร้างแอป Backbone / Marionette บนเทคโนโลยีเซิร์ฟเวอร์ที่หลากหลาย:
- ASP.NET MVC
- ทับทิมบนราง
- ทับทิม / ซินาตร้า
- NodeJS / ExpressJS
- PHP / Slim
- ชวา
- Erlang
- ... และอื่น ๆ
JavaScript คือ JavaScript เมื่อมีการเรียกใช้ในเบราว์เซอร์ JavaScript ฝั่งเซิร์ฟเวอร์นั้นยอดเยี่ยมเช่นกัน แต่ไม่มีผลกระทบหรือไม่มีอิทธิพลต่อวิธีที่ฉันเขียน JavaScript ตามเบราว์เซอร์
เนื่องจากความหลากหลายในโครงการที่ฉันสร้างและเทคโนโลยีแบ็คเอนด์ที่ลูกค้าของฉันใช้ฉันไม่สามารถและจะไม่ล็อค Marionette เข้ากับเทคโนโลยีกองเซิร์ฟเวอร์ฝั่งเดียวด้วยเหตุผลใดก็ตาม ฉันจะไม่ให้โครงการสำเร็จรูป ฉันจะไม่ให้พลอยทับทิมหรือแพ็คเกจ npm ฉันต้องการให้คนเข้าใจว่า Marionette ไม่ต้องการเซิร์ฟเวอร์ด้านหลังเฉพาะ มันเป็น JavaScript ที่ใช้เบราว์เซอร์และส่วนแบ็คเอนด์ก็ไม่สำคัญ
แน่นอนฉันสนับสนุนผู้อื่นอย่างเต็มที่ในการจัดหาแพ็คเกจสำหรับภาษาและกรอบงาน ฉันแสดงรายการแพ็คเกจเหล่านั้นใน Wiki และหวังว่าผู้คนจะสร้างแพ็คเกจต่อไปตามที่เห็นว่าจำเป็น แต่นั่นคือการสนับสนุนจากชุมชนไม่ใช่การสนับสนุนโดยตรงจากหุ่นเชิด
เปลี่ยนค่าเริ่มต้นได้อย่างง่ายดาย
ในความพยายามของฉันเพื่อลดรหัสต้นแบบและให้ค่าเริ่มต้นที่สมเหตุสมผล (ซึ่งเป็นความคิดที่ว่าฉัน "ยืม" โดยตรงจาก LayoutManager ของ Tim Branyen) ฉันยอมรับความต้องการของนักพัฒนาอื่น ๆ ที่จะใช้การใช้งานที่แตกต่างกันเล็กน้อยกว่าที่ฉันทำ
ฉันให้การแสดงผลตาม<script>
แท็กอินไลน์สำหรับเทมเพลตโดยใช้ Underscore.js templating เป็นค่าเริ่มต้น แต่คุณสามารถแทนที่สิ่งนี้ได้โดยการเปลี่ยนRenderer
และ / หรือTempalteCache
วัตถุในหุ่นกระบอก วัตถุทั้งสองนี้เป็นแกนหลักของความสามารถในการแสดงผลและมีหน้าวิกิที่แสดงวิธีการเปลี่ยนแปลงสิ่งนี้สำหรับเอ็นจิ้นการสร้างเทมเพลตเฉพาะและวิธีการโหลดเทมเพลตที่แตกต่างกัน
ด้วย v0.9 ของ Marionette มันจะง่ายขึ้นกว่าเดิม ตัวอย่างเช่นหากคุณต้องการแทนที่การใช้บล็อกสคริปต์เทมเพลตแบบอินไลน์ด้วยเทมเพลตที่รวบรวมไว้ล่วงหน้าคุณจะต้องแทนที่หนึ่งวิธีใน Renderer เท่านั้น:
Backbone.Marionette.Renderer.render = function(template, data){
return template(data);
};
และตอนนี้แอปพลิเคชันทั้งหมดจะใช้เทมเพลตที่รวบรวมไว้ล่วงหน้าซึ่งคุณแนบไปกับtemplate
แอตทริบิวต์ของมุมมองของคุณ
ฉันยังมี Add-on ของ Marionette ด้วย Async กับ v0.9 ที่ให้คุณสนับสนุนมุมมองการเรนเดอร์แบบอะซิงโครนัส ฉันพยายามอย่างต่อเนื่องที่จะทำให้มันง่ายที่สุดเท่าที่จะทำได้เพื่อแทนที่พฤติกรรมเริ่มต้นในหุ่นกระบอก
รหัสเป็นการกำหนดค่า
ฉันเป็นแฟนตัวยงของ "การประชุมเรื่องการกำหนดค่า" ในบางบริบท มันเป็นวิธีที่ทรงพลังในการทำสิ่งต่างๆให้สำเร็จและ Marionette ให้สิ่งนี้เล็กน้อย - แม้ว่าจะไม่มากเกินไปโดยสุจริต เฟรมเวิร์กอื่น ๆ อีกมากมาย - โดยเฉพาะ LayoutManager - ให้การประชุมมากกว่าการตั้งค่ามากกว่าที่ Marionette ทำ
สิ่งนี้ทำโดยมีจุดประสงค์และความตั้งใจ
ฉันสร้างปลั๊กอินเฟรมเวิร์กส่วนเสริมและแอปพลิเคชัน JavaScript ให้เพียงพอเพื่อทราบถึงความเจ็บปวดในการพยายามจัดระเบียบเพื่อให้ทำงานได้อย่างมีความหมายและรวดเร็ว มันสามารถทำได้ด้วยความเร็ว แต่โดยทั่วไปแล้วจะมีความสามารถในการเปลี่ยนแปลง
ด้วยเหตุนี้ฉันจึงใช้วิธี "รหัสเป็นการกำหนดค่า" กับหุ่นกระบอก ฉันไม่มี API "การกำหนดค่า" จำนวนมากที่คุณสามารถจัดเตรียมวัตถุตามตัวอักษรด้วยค่าคงที่ที่เปลี่ยนแนวพฤติกรรม แต่ฉันทำเอกสารวิธีการที่แต่ละวัตถุมี - ทั้งผ่านซอร์สโค้ดที่มีคำอธิบายประกอบและผ่านเอกสาร API จริง - ด้วยความตั้งใจที่จะบอกคุณว่าจะเปลี่ยนหุ่นกระบอกให้ทำงานตามที่คุณต้องการ
โดยการให้ API ที่สะอาดและชัดเจนสำหรับวัตถุ Marionette ฉันสร้างสถานการณ์ที่แทนที่พฤติกรรมของวัตถุเฉพาะหรือ Marionette โดยรวมนั้นค่อนข้างง่ายและยืดหยุ่นมาก ฉันเสียสละการกำหนดค่า API แบบ "ง่าย" เพื่อความยืดหยุ่นในการให้รหัสของคุณเองเพื่อให้สิ่งต่าง ๆ ทำงานได้อย่างที่คุณต้องการ
คุณจะไม่พบ API "กำหนดค่า" หรือ "ตัวเลือก" ในหุ่นกระบอก แต่คุณจะพบว่ามีวิธีการมากมายที่แต่ละจุดให้บริการมีจุดประสงค์ที่เฉพาะเจาะจงมากด้วยลายเซ็นที่สะอาดซึ่งทำให้ง่ายต่อการเปลี่ยนวิธีการทำงานของหุ่นกระบอก