Blockly ประกอบด้วยไฟล์ TypeScript กว่า 100 ไฟล์ โดยต้องคอมไพล์
โดยคอมไพเลอร์ TypeScript tsc เป็น JavaScript ก่อนจึงจะใช้ได้
ซึ่งจะสร้าง.jsจำนวนมากเท่ากัน ซึ่งเหมาะ
สำหรับการทดสอบในเครื่อง แต่การโหลดไฟล์จำนวนมากเช่นนี้ผ่านอินเทอร์เน็ต
จะทำให้ผู้ใช้ปลายทางได้รับประสบการณ์การใช้งานที่ช้า เราใช้ Closure Compiler เพื่อบีบอัด (ย่อ) และรวมไฟล์ต่างๆ เป็นไฟล์ 6 ไฟล์ ("Bundle" หรือ "Chunk") ที่มีขนาดรวมน้อยกว่าครึ่งหนึ่งของไฟล์ที่ไม่ได้บีบอัด เพื่อให้ Blockly โหลดได้เร็วขึ้น
ในกระบวนการนี้ โค้ดที่ใช้ฟีเจอร์ ECMAScript ล่าสุด ซึ่งอาจไม่ เข้ากันได้กับเบราว์เซอร์บางตัว จะได้รับการเปลี่ยนรูปแบบเป็น ES6 ซึ่งโดยทั่วไปจะเข้ากันได้กับเบราว์เซอร์ที่ใช้กันอย่างแพร่หลายส่วนใหญ่ ดังนั้น คุณจึงควรแสดงเฉพาะโค้ดที่ย่อขนาดแล้วต่อผู้ใช้ปลายทาง
ที่เก็บ RaspberryPiFoundation/blockly มี
เฉพาะซอร์สโค้ด ก่อนหน้านี้ยังรวมถึงผลิตภัณฑ์บิลด์ด้วย
แต่ตั้งแต่ปี 2019 เราได้เผยแพร่ชุดข้อมูลที่ย่อขนาดแล้วเป็นblocklyแพ็กเกจ NPM และตั้งแต่ปี 2022 เรายังแนบเป็นไฟล์ .tgz ไปกับแต่ละรุ่นใน GitHub ด้วย ดังนั้นจึงไม่จำเป็นต้องสร้าง Blockly เว้นแต่คุณจะแฮ็ก Blockly เอง โดยเฉพาะไฟล์ในไดเรกทอรี core, blocks, generators หรือ msg
กระบวนการสร้าง ทดสอบ และเผยแพร่ Blockly เป็นแบบอัตโนมัติโดยใช้สคริปต์ npm เพื่อเรียกใช้งาน Gulp หน้านี้จะบันทึกสคริปต์หลักและ สิ่งที่แต่ละสคริปต์ทำ
โหมดบีบอัดและโหมดไม่บีบอัด
การโหลด Blockly โดยตรงจากไฟล์ .js แต่ละไฟล์ที่คอมไพเลอร์ TypeScript สร้างขึ้นเรียกว่า "โหมดไม่บีบอัด" เนื่องจากหลีกเลี่ยงขั้นตอนการบิลด์ที่ช้าหลายขั้นตอน จึงช่วยให้วงจรการแก้ไข-คอมไพล์-เรียกใช้เป็นไปอย่างรวดเร็ว
นอกจากนี้ยังช่วยในการแก้ไขข้อบกพร่องเนื่องจากโค้ด JavaScript ที่ดำเนินการนั้นเกือบจะ
อ่านได้ง่ายเหมือนกับแหล่งที่มาของ TypeScript ต้นฉบับ จึงไม่จำเป็นต้องใช้
แผนที่แหล่งที่มา
การโหลด Blockly จากชุดรวมที่ย่อขนาดแล้วเรียกว่า "โหมดที่บีบอัด"
วิธีนี้เป็นวิธีที่ดีที่สุดในการทดสอบการเปลี่ยนแปลงใน Blockly เมื่อใช้เป็นทรัพยากร Dependency
ของแพ็กเกจอื่น เนื่องจากจะทดสอบ (เวอร์ชันที่ยังไม่ได้เผยแพร่) blockly
แพ็กเกจ npm
N.B.: ในที่เก็บ Blockly มีบางแห่งที่ใช้คำว่า "โหมดที่ไม่ได้คอมไพล์" และ "โหมดที่คอมไพล์แล้ว" เป็นคำพ้องความหมายของ "โหมดที่ไม่ได้บีบอัด" และ "โหมดที่บีบอัดแล้ว" ตามลำดับ การใช้งานนี้สมเหตุสมผลในอดีต เนื่องจากใช้ Closure Compiler เพื่อบีบอัด (ย่อ) โค้ด แต่ตอนนี้ จำเป็นต้องใช้คอมไพเลอร์ TypeScript เสมอ แม้ในโหมดที่ไม่ได้บีบอัด ดังนั้น คำศัพท์ทางเลือกนี้จึงอาจสร้างความสับสนและไม่แนะนำให้ใช้
คู่มือเริ่มต้นฉบับย่อ
หากคุณทำการเปลี่ยนแปลงในเครื่องและต้องการตรวจสอบว่าการเปลี่ยนแปลงดังกล่าวไม่ได้ทำให้บิลด์หรือการทดสอบใดๆ เสียหาย ให้เรียกใช้
npm testเพื่อสร้าง Blockly และเรียกใช้ชุดการทดสอบ
หากต้องการทดสอบการเปลี่ยนแปลงในเครื่องในเบราว์เซอร์ ให้เรียกใช้
npm startซึ่งจะคอมไพล์ Blockly และเปิดเว็บเบราว์เซอร์ที่ชี้ไปยังสนามเด็กเล่น Blockly ที่เรียกใช้ Blockly ในโหมดที่ไม่ได้บีบอัด
ไฟล์ใดๆ ใน
core/,blocks/และgenerators/ที่มีการแก้ไขจะ คอมไพล์ใหม่โดยอัตโนมัติ ให้โหลดแท็บเบราว์เซอร์ซ้ำเพื่อดูการเปลี่ยนแปลงหากต้องการสร้าง Blockly เวอร์ชันที่แก้ไขในเครื่องและทดสอบในโหมดที่บีบอัด เป็นทรัพยากร Dependency ของแพ็กเกจ npm อื่น ให้เรียกใช้
npm run packageเพื่อสร้างแพ็กเกจ Blockly จากนั้น
cd dist && npm linkเพื่อบอก npm ว่าจะค้นหาไฟล์ที่คอมไพล์แล้วได้จากที่ใด จากนั้นให้ไปที่
cdในไดเรกทอรีของโปรเจ็กต์ ก่อนที่จะเรียกใช้npm link blocklyเพื่อให้แพ็กเกจใช้ Blockly เวอร์ชันที่คอมไพล์ใหม่แทนแพ็กเกจ
blocklyที่เผยแพร่
การอ้างอิงสคริปต์โดยละเอียด
ส่วนนี้แสดงหลักการ scripts ในไฟล์ package.json ของ Blockly
พร้อมคำอธิบายสิ่งที่หลักการเหล่านั้นทำ
สคริปต์เหล่านี้จะสร้างไฟล์ใน 2 ที่ ดังนี้
- ไฟล์ใน
build/ไดเรกทอรีย่อยเป็นไฟล์ตัวกลางที่ใช้สำหรับการทดสอบในเครื่อง หรือส่วนอื่นๆ ของไปป์ไลน์การสร้างจะนำเข้า - ไฟล์ใน
dist/ไดเรกทอรีย่อยจะสร้างเนื้อหาของแพ็กเกจ npm ที่เผยแพร่
ทั้ง 2 ไดเรกทอรีนี้ไม่ได้ติดตามในที่เก็บ Git ของ Blockly
clean
npm run clean จะล้างข้อมูลบิลด์ก่อนหน้าโดยการลบไดเรกทอรี build/ และ
dist/ มีประโยชน์ในการแก้ไขการสร้างที่ล้มเหลวซึ่งเข้าใจยาก โดยเฉพาะอย่างยิ่ง
การสร้างที่เกิดจากการเปลี่ยนชื่อไฟล์ต้นฉบับ
messages
npm run messages จะอัปเดตไฟล์ข้อความใน msg/json/ ด้วยการเปลี่ยนแปลงใดๆ
ที่ทำกับ msg/messages.js และควรเรียกใช้หลังจาก
แก้ไขไฟล์นั้นทุกครั้ง
langfiles
npm run langfiles จะสร้างไฟล์ภาษาที่คอมไพล์แล้วใน build/msg/
จากไฟล์ข้อความใน msg/json
tsc
npm run tsc จะเรียกใช้คอมไพเลอร์ TypeScript กับเนื้อหาของไดเรกทอรี core/,
blocks/ และ generators/ และเอาต์พุตไฟล์ .js แต่ละไฟล์
ไปยัง build/src/
minify
npm run minify จะเรียกใช้ closure-make-deps และ closure-calculate-chunks
เพื่อกำหนดวิธีแบ่งไฟล์ .js ที่คอมไพล์แล้วออกเป็นก้อน (บิลด์ที่ย่อขนาดแล้ว)
หลังจากนั้นจะเรียกใช้ closure-compiler เพื่อสร้างก้อนดังนี้
- เนื้อหาของ
build/src/core/จะกลายเป็นdist/blockly_compressed.js - เนื้อหาของ
build/src/blocks/จะกลายเป็นdist/blocs_compressed.js - เนื้อหาของ
build/src/generators/javascript/(รวมถึงbuild/src/generators/javascript.js) จะกลายเป็นdist/javascript_compressed.js - และเช่นเดียวกันสำหรับ
dart,lua,phpและpython
Chuk ที่สร้างขึ้นจะใช้ Wrapper เพื่อให้มั่นใจว่าเข้ากันได้กับUniversal Module Definition จึงไม่จำเป็นต้องประมวลผลเพิ่มเติม ก่อนที่จะรวมไว้ในแพ็กเกจ
build
npm run build จะเรียกใช้งานงาน minify และ langfiles ซึ่งควรทำทุกอย่างที่จำเป็นเพื่อโหลดสนามเด็กเล่น Blockly ในโหมดบีบอัดหรือโหมดไม่บีบอัด
package
npm run package จะเรียกใช้ clean และ build จากนั้นจะดำเนินการต่อไปนี้
- ใช้ Wrapper UMD กับไฟล์ใน
build/msg/โดยวางเวอร์ชันที่ห่อไว้ในdist/msg/ - เพิ่มไฟล์สนับสนุนเพิ่มเติมต่างๆ ลงใน
dist/โดยมี Wrapper UMD ในกรณีที่ เกี่ยวข้อง
publish
npm run publish ใช้โดยทีม Blockly เพื่อเผยแพร่แพ็กเกจ blockly npm
โดยจะขึ้นอยู่กับโครงสร้างพื้นฐานภายในของ Google จึงไม่เป็นประโยชน์
ต่อนักพัฒนาแอปภายนอก
lint
npm run lint เรียกใช้ ESLint เพื่อทำการวิเคราะห์แบบคงที่
ของซอร์สโค้ด Blockly เพื่อค้นหาปัญหา
test
npm test (หรือ npm run test) จะเรียกใช้packageงาน แล้วเรียกใช้การทดสอบอัตโนมัติต่างๆ (รวมถึงการเรียกใช้ ESLint) ควรเรียกใช้และผ่านการทดสอบในโค้ดที่ส่งเป็นคำขอพุลต่อที่เก็บ Blockly