การรวบรวมแฮนด์บาร์-เทมเพลตลงในรหัส C# สำหรับการแสดงผล HTML เซิร์ฟเวอร์ที่ปลอดภัยและประเภท
คอมไพเลอร์นี้เป็นผลมาจากวิทยานิพนธ์ปริญญาตรีของ Jakob Demler ซึ่งครอบคลุมถึงวิธีการตัดสินใจออกแบบรายละเอียดการใช้งานและการประเมินผลและสามารถพบได้ที่นี่
โครงการนี้อยู่ในช่วงเบต้า
การเปรียบเทียบประสิทธิภาพเกิดขึ้นกับ microbenchmarks จากที่เก็บ handlebars.js: https://github.com/wycats/handlebars.js/tree/master/bench
| microbenchmark | handlebars.js | compiledhandlebars | การเร่งความเร็ว |
|---|---|---|---|
| รัศมี | 391 OPS/MS | 3039 OPS/MS | 7.77 |
| ซับซ้อน | 120 OPS/MS | 1180 OPS/MS | 9.83 |
| ข้อมูล | 295 OPS/MS | 1333 OPS/MS | 4.51 |
| ความลึก 1 | 228 OPS/MS | 3693 OPS/MS | 16.20 |
| ความลึก 2 | 63 OPS/MS | 1515 OPS/MS | 24.04 |
| การคืนค่าบางส่วน | 125 OPS/MS | 1895 OPS/MS | 15.16 |
| บางส่วน | 211 OPS/MS | 905 OPS/MS | 4.29 |
| เส้นทาง | 2060 OPS/MS | 4646 OPS/MS | 2.25 |
| สาย | 5563 OPS/MS | 13964 OPS/MS | 2.51 |
| ตัวแปร | 1991 OPS/MS | 4027 OPS/MS | 2.02 |
เพียงติดตั้งแพ็คเกจ VSIX จากโครงการ CustomTool และรีสตาร์ท Visual Studio เพิ่มเทมเพลต HandleBars ใหม่ลงในโซลูชันของคุณ (ลงท้ายด้วย .HBS) จากนั้นเพิ่ม "HandleBarsCompiler" ลงในคุณสมบัติ CustomTool ของไฟล์ คอมไพเลอร์จะถูกเรียกใช้ทุกครั้งที่เทมเพลตแฮนด์บาร์ถูกบันทึกและจะสร้างไฟล์ {templatename} .hbs.cs ที่มีรหัสที่สร้างขึ้น
มือจับมือทุกตัวต้องการประเภทที่แสดงผล เป็นตัวอย่างชั้นเรียนที่ชื่อ "PersonModel" จะให้บริการ:
namespace ViewModels
{
public class PersonModel
{
public string FirstName { get ; set ; }
public string LastName { get ; set ; }
public int Age { get ; set ; }
public List < string > EMailAddresses { get ; set ; }
}
}ตอนนี้เราต้องสื่อสารประเภทไปยัง HandleBarsCompiler ที่จุดเริ่มต้นของมือจับแต่ละอันต้องมี modeltoken socalled:
สำหรับตัวอย่างของเรานั่นจะเป็น:
โปรดทราบว่าประเภทภายใน ModelToken สามารถเป็นคลาสพื้นฐานหรืออินเทอร์เฟซของ ViewModel จริงที่ส่งผ่านไปยังเทมเพลต
ส่วนที่เหลือของแฮนด์บาร์-เทมเพลตจะติดตามไวยากรณ์แฮนด์บาร์ร์มาตรฐานและความหมาย นี่คือตัวอย่างเต็ม:
ไม่จำเป็นต้องลงทะเบียน Partials เพียงให้แน่ใจว่าได้รวบรวมบางส่วนก่อนที่แฮนด์บาร์-เทมเพลตที่ใช้บางส่วนนั้น สำหรับทุกสิ่งที่ใช้มาตรฐาน legic js js ใช้
CompiledHandleBars อนุญาตให้ใช้ฟังก์ชั่นผู้ช่วย สิ่งเหล่านี้จะต้องคงที่ส่งคืนสตริงและมีคำอธิบายประกอบโดยแอตทริบิวต์ มีการตรวจสอบพารามิเตอร์หากจับคู่ในเวลาคอมไพล์เพื่อให้มากเกินไป นอกเหนือจากนั้นพวกเขาไม่มีข้อ จำกัด ใด ๆ ที่สามารถวางได้ทุกที่ใน codebase ของคุณ
[ CompiledHandlebarsHelperMethod ]
pulic static string FullName ( PersonModel model )
{
return string . Concat ( model . FirstName , " " , model . LastName ) ;
} CompiledHandleBars มีฟังก์ชั่นที่แตกต่างกันเกี่ยวกับเลย์เอาต์: handlabarstemplate ใด ๆ สามารถแสดงผลภายใน handlebarslayout HandleBarSlayouts แตกต่างจาก handleBarstemplates ปกติเนื่องจากโทเค็น {{body}} พิเศษ:
ในการแสดงผล HandleBars-Template ในเค้าโครงนั้นให้ใช้โทเค็น {{{layout}} ทันทีหลังจากโทเค็น {{{model}}:
ผลลัพธ์ของเทมเพลตนั้นเท่ากับเทมเพลตต่อไปนี้:
เนื่องจากวิธีการที่แตกต่างกันไปยังรุ่น handlebars.js (เช่น handlebars-templates ที่พิมพ์แบบคงที่) คอมไพเลอร์จำเป็นต้องรู้ว่าตัวพิมพ์แฮนด์ของคุณมีความหมาย ข้อมูลนี้สื่อสารกับคอมไพเลอร์โดย ModelToken พิเศษ ไวยากรณ์ตรงไปตรงมา:
ตัวอย่างเช่น:
โทเค็นนี้จะต้องเป็นจุดเริ่มต้นของมือจับมือทุกตัว
จำเป็นต้องมีสิ่งที่จำเป็นต้องมีเพื่อให้สามารถสร้างโซลูชันได้: