Tailor เป็นบริการเลย์เอาต์ที่ใช้สตรีมเพื่อเขียนเว็บเพจจากบริการแฟรกเมนต์ O'Reilly อธิบายไว้ในชื่อของโพสต์บล็อกนี้เป็น "ไลบรารีที่มีมิดเดิลแวร์ที่คุณสามารถรวมเข้ากับเซิร์ฟเวอร์ Node.js ใด ๆ " มันได้รับแรงบันดาลใจบางส่วนจาก BigPipe ของ Facebook แต่พัฒนาขึ้นในบริบทอีคอมเมิร์ซ
คุณสมบัติและประโยชน์บางอย่างของช่างตัดเสื้อ:
Tailor เป็นส่วนหนึ่งของ Project Mosaic ซึ่งมีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาสร้างไมโครเซิร์ตสำหรับส่วนหน้า โมเสคยังรวมถึงเราเตอร์ HTTP ที่ขยายได้สำหรับองค์ประกอบบริการ (Skipper) ที่มี API ที่เกี่ยวข้องที่เกี่ยวข้องซึ่งเก็บเส้นทาง (Innkeeper); ส่วนประกอบเพิ่มเติมอยู่ในท่อสำหรับการเปิดตัวสาธารณะ หากทีมงานส่วนหน้าของคุณกำลังเปลี่ยนรูปแบบ monolith-to-microservices คุณอาจพบว่าช่างตัดเสื้อและพี่น้องที่มีประโยชน์
Microservices ได้รับแรงฉุดมากในวันนี้ พวกเขาอนุญาตให้หลายทีมทำงานอย่างอิสระจากกันเลือกสแต็คเทคโนโลยีของตัวเองและสร้างวงจรการวางจำหน่ายของตัวเอง น่าเสียดายที่การพัฒนาส่วนหน้ายังไม่ได้รับประโยชน์อย่างเต็มที่จากประโยชน์ที่ไมโครไซต์เสนอ แนวทางปฏิบัติทั่วไปสำหรับการสร้างเว็บไซต์ยังคงเป็น“ เสาหิน”: codebase ส่วนหน้าเดียวที่ใช้ API หลายตัว
ถ้าเรามีไมโครเซิร์ตในส่วนหน้าล่ะ? สิ่งนี้จะช่วยให้นักพัฒนาส่วนหน้าทำงานร่วมกับแบ็กเอนด์ของพวกเขาในคุณสมบัติเดียวกันและปรับใช้ส่วนต่าง ๆ ของเว็บไซต์อย่างอิสระ -“ ชิ้นส่วน” เช่นส่วนหัวผลิตภัณฑ์และส่วนท้าย การนำ microservices ไปยังส่วนหน้าต้องใช้บริการเลย์เอาต์ที่ประกอบด้วยเว็บไซต์จากชิ้นส่วน ช่างตัดเสื้อได้รับการพัฒนาเพื่อแก้ปัญหาความต้องการนี้
เริ่มใช้ช่างตัดเสื้อด้วย:
yarn add node-tailor const http = require ( 'http' ) ;
const Tailor = require ( 'node-tailor' ) ;
const tailor = new Tailor ( { /* Options */ } ) ;
const server = http . createServer ( tailor . requestHandler ) ;
server . listen ( process . env . PORT || 8080 ) ; fetchContext(request) - ฟังก์ชั่นที่ส่งคืนสัญญาของบริบทนั่นคือวัตถุที่แม Promise.resolve({}) ส่วน ID ส่วนกับ URL ชิ้นส่วนเพื่อให้สามารถแทนที่ URL ของชิ้นส่วนบนหน้าfetchTemplate(request, parseTemplate) - ฟังก์ชั่นที่ควรดึงเทมเพลตโทร parseTemplate และส่งคืนสัญญาของผลลัพธ์ มีประโยชน์ในการใช้วิธีของคุณเองในการดึงและแคชเทมเพลตเช่นจาก S3 การใช้งานเริ่มต้น lib/fetch-template.js ดึงแม่แบบจากระบบไฟล์templatesPath - เพื่อระบุเส้นทางที่จัดเก็บเทมเพลตในเครื่องให้เป็นค่าเริ่มต้นเป็น /templates/fragmentTag - ชื่อของแท็กแฟรกเมนต์ค่าเริ่มต้นเป็น fragmenthandledTags - อาร์เรย์ของแท็กที่กำหนดเองตรวจ tests/handle-tag สำหรับข้อมูลเพิ่มเติมhandleTag(request, tag, options, context) - รับแท็กหรือปิดแท็กและทำให้เป็นอนุกรมไปยังสตริงหรือส่งคืนสตรีมfilterRequestHeaders(attributes, request) - ฟังก์ชั่นที่กรองส่วนหัวคำขอที่ส่งผ่านไปยังการร้องขอ lib/filter-headers ตรวจสอบการใช้งานเริ่มต้นfilterResponseHeaders(attributes, headers) - ฟังก์ชั่นที่แมปส่วนหัวการตอบกลับที่กำหนดจากคำขอส่วนหลักไปจนถึงการตอบกลับขั้นสุดท้ายmaxAssetLinks - จำนวนคำสั่งส่วนหัว Link สำหรับ CSS และ JS ที่เคารพต่อชิ้นส่วน - ค่าเริ่มต้นเป็น 1requestFragment(filterHeaders)(url, attributes, request) - ฟังก์ชั่นที่ส่งคืนคำสัญญาของการร้องขอไปยังเซิร์ฟเวอร์ lib/request-fragmentamdLoaderUrl - URL ไปยัง AMD Loader เราใช้ requirejs จาก cdnjs เป็นค่าเริ่มต้นpipeInstanceName - ชื่ออินสแตนซ์ท่อที่มีอยู่ในหน้าต่างเบราว์เซอร์สำหรับการบริโภคตะขอส่วนหน้าpipeAttributes(attributes) - ฟังก์ชั่นที่ส่งคืนชุดแอตทริบิวต์ชิ้นส่วนที่น้อยที่สุดที่มีอยู่ในตะขอส่วนหน้าtracer - การใช้งานการติดตามตามมาตรฐานของ Opentracing Tailor ใช้ Parse5 เพื่อแยกวิเคราะห์เทมเพลตซึ่งจะแทนที่แต่ละ fragmentTag ด้วยสตรีมจากเซิร์ฟเวอร์แฟรกเมนต์และ handledTags ด้วยผลลัพธ์ของฟังก์ชั่น handleTag
< html >
< head >
< script type =" fragment " src =" http://assets.domain.com " > </ script >
</ head >
< body >
< fragment src =" http://header.domain.com " > </ fragment >
< fragment src =" http://content.domain.com " primary > </ fragment >
< fragment src =" http://footer.domain.com " async > </ fragment >
</ body >
</ html >id - ตัวระบุเฉพาะทางเลือก (Autogenerated)src - URL ของชิ้นส่วนprimary - หมายถึงชิ้นส่วนที่ตั้งค่ารหัสการตอบกลับของหน้าtimeout - การหมดเวลาการหมดเวลาของชิ้นส่วนในมิลลิวินาที (ค่าเริ่มต้นคือ 3000)async - เลื่อนชิ้นส่วนจนกระทั่งสิ้นสุดแท็กตัวถังpublic - เพื่อป้องกันไม่ให้ช่างตัดเสื้อจากการส่งต่อส่วนหัวคำขอที่กรองจากต้นน้ำไปยังชิ้นส่วนfallback-src - URL ของชิ้นส่วนทางเลือกในกรณีที่หมดเวลา/ข้อผิดพลาดในส่วนปัจจุบันอนุญาตให้ใช้แอตทริบิวต์อื่น ๆ และจะถูกส่งผ่านไปยังฟังก์ชั่นที่เกี่ยวข้อง (เช่น
filterRequestHeaders,filterResponseHeadersฯลฯ )
แฟรกเมนต์เป็นเซิร์ฟเวอร์ HTTP (S) ที่แสดงผลเฉพาะส่วนหนึ่งของหน้าและตั้งส่วนหัว Link เพื่อให้ URLs ไปยังทรัพยากร CSS และ JavaScript ตรวจสอบ examples/basic-css-and-js/index.js สำหรับการใช้งานแบบร่าง
จาวาสคริปต์ของแฟรกเมนต์เป็นโมดูล AMD ที่ส่งออกฟังก์ชั่น init ซึ่งจะถูกเรียกด้วยองค์ประกอบ DOM ของชิ้นส่วนเป็นอาร์กิวเมนต์
ช่างตัดเสื้อจะไม่ติดตามการเปลี่ยนเส้นทางแม้ว่าการตอบสนองของชิ้นส่วนจะมีส่วนหัว 'ตำแหน่ง' ซึ่งมีวัตถุประสงค์ตามการเปลี่ยนเส้นทางสามารถแนะนำเวลาแฝงที่ไม่พึงประสงค์ ชิ้นส่วนที่มีแอตทริบิวต์ primary สามารถเปลี่ยนเส้นทางได้เนื่องจากมันควบคุมรหัสสถานะของหน้า
หมายเหตุ: สำหรับความเข้ากันได้กับ AWS ส่วนหัว Link สามารถส่งผ่านเป็น x-amz-meta-link
โดยค่าเริ่มต้นคำขอขาเข้าจะถูกใช้เพื่อเลือกเทมเพลต
ดังนั้นเพื่อรับเทมเพลต index.html ที่คุณไปที่ /index
หากคุณต้องการฟัง /product/my-product-123 เพื่อไปที่เทมเพลต product.html คุณสามารถเปลี่ยน req.url เป็น /product
ส่วนหัวทุกตัวจะถูกกรองโดยค่าเริ่มต้นเพื่อหลีกเลี่ยงการรั่วไหลของข้อมูล แต่คุณสามารถให้ URI ดั้งเดิมและโฮสต์โดยเพิ่มลงในส่วนหัว, x-request-host และ x-request-uri จากนั้นอ่านส่วนหัวเพื่อทราบว่าผลิตภัณฑ์ใดที่จะดึงและแสดงผล
http
. createServer ( ( req , res ) => {
req . headers [ 'x-request-uri' ] = req . url
req . url = '/index'
tailor . requestHandler ( req , res ) ;
} )
. listen ( 8080 , function ( ) {
console . log ( 'Tailor server listening on port 8080' ) ;
} ) ;แนวคิดบางอย่างในช่างตัดเสื้อมีการอธิบายรายละเอียดเกี่ยวกับเอกสารเฉพาะ
Tailor มีเครื่องมือติดตามการติดตามแบบกระจายกับ opentracing มันจะรับบริบทการขยายใด ๆ ในคำขอ Ingress HTTP และเผยแพร่ไปยังการเรียกขั้นตอนระยะไกลที่มีอยู่ (RPCs)
ปัจจุบันมีเพียงการดึงชิ้นส่วนเท่านั้นที่มีการจัดเตรียมรายละเอียดเพิ่มเติมเช่นแท็กแฟรกเมนต์แอตทริบิวต์และการบันทึกบางส่วนเช่นการติดตามสแต็กสำหรับข้อผิดพลาด
# Get a copy of the repository
git clone https://github.com/zalando/tailor.git
# Change to the folder
cd tailor
# Install dependencies
yarnnode examples/basicnode examples/basic-css-and-jsnode examples/multiple-fragments-with-custom-amdnode examples/fragment-performanceไปที่ http: // localhost: 8080/ดัชนีหลังจากเรียกใช้ตัวอย่างเฉพาะ
หมายเหตุ: โปรดเรียกใช้ตัวอย่างด้วยเวอร์ชันโหนด> 6.0.0
นอกจากนี้ยังมีตัวอย่างแอปพลิเคชันหน้าเดียว:
ในการเริ่มต้นใช้งานเบนช์มาร์กเรียกใช้ npm run benchmark และรอสองสามวินาทีเพื่อดูผลลัพธ์
โปรดตรวจสอบแนวทางการสนับสนุนที่นี่