Blockly ประกอบด้วยไฟล์ TypeScript กว่า 100 ไฟล์ โดยต้องคอมไพล์
โดยคอมไพเลอร์ TypeScript tsc
เป็น JavaScript ก่อนจึงจะใช้ได้
ซึ่งจะสร้าง.js
จำนวนมากเท่ากัน ซึ่งเหมาะ
สำหรับการทดสอบในเครื่อง แต่การโหลดไฟล์จำนวนมากเช่นนี้ผ่านอินเทอร์เน็ต
จะทำให้ผู้ใช้ปลายทางได้รับประสบการณ์การใช้งานที่ช้า เราใช้ Closure Compiler เพื่อบีบอัด (ย่อ) และรวมไฟล์ต่างๆ เป็นไฟล์ 6 ไฟล์ ("Bundle" หรือ "Chunk") ที่มีขนาดรวมน้อยกว่าครึ่งหนึ่งของไฟล์ที่ไม่ได้บีบอัด เพื่อให้ Blockly โหลดได้เร็วขึ้น
ในกระบวนการนี้ โค้ดที่ใช้ฟีเจอร์ ECMAScript ล่าสุด ซึ่งอาจไม่ เข้ากันได้กับเบราว์เซอร์บางตัว จะได้รับการเปลี่ยนรูปแบบเป็น ES6 ซึ่งโดยทั่วไปจะเข้ากันได้กับเบราว์เซอร์ที่ใช้กันอย่างแพร่หลายส่วนใหญ่ ดังนั้น คุณจึงควรแสดงเฉพาะโค้ดที่ย่อขนาดแล้วต่อผู้ใช้ปลายทาง
ที่เก็บ google/blockly มี
เฉพาะซอร์สโค้ด ก่อนหน้านี้ยังรวมถึงผลิตภัณฑ์บิลด์ด้วย
แต่ตั้งแต่ปี 2019 เราได้เผยแพร่ชุดข้อมูลที่ย่อขนาดแล้วเป็นแพ็กเกจ
blockly
NPM และตั้งแต่ปี
2022 เรายังแนบเป็นไฟล์ .tgz
ไปกับแต่ละรุ่นใน GitHub ด้วย ดังนั้นจึงไม่จำเป็น
ต้องสร้าง Blockly เว้นแต่คุณจะแฮ็ก Blockly เอง โดยเฉพาะใน
ไฟล์ในไดเรกทอรี core
, blocks
, generators
หรือ msg
กระบวนการสร้าง ทดสอบ และเผยแพร่ Blockly เป็นแบบอัตโนมัติโดยใช้สคริปต์ npm เพื่อเรียกใช้งาน Gulp หน้านี้จะบันทึกสคริปต์หลักและ สิ่งที่แต่ละสคริปต์ทำ
โหมดบีบอัดและโหมดไม่บีบอัด
การโหลด Blockly โดยตรงจากไฟล์ .js
แต่ละไฟล์ที่คอมไพเลอร์ TypeScript สร้างขึ้นเรียกว่า "โหมดไม่บีบอัด" เนื่องจากหลีกเลี่ยงขั้นตอนการบิลด์ที่ช้าหลายขั้นตอน จึงช่วยให้วงจรการแก้ไข-คอมไพล์-เรียกใช้เป็นไปอย่างรวดเร็ว
นอกจากนี้ยังช่วยในการแก้ไขข้อบกพร่องเนื่องจากโค้ด JavaScript ที่ดำเนินการนั้นเกือบจะ
อ่านได้ง่ายเหมือนกับแหล่งที่มาของ TypeScript ต้นฉบับ จึงไม่จำเป็นต้องใช้
Sourcemap
การโหลด 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
task แล้วเรียกใช้การทดสอบอัตโนมัติต่างๆ (รวมถึงการเรียกใช้ ESLint) ควรเรียกใช้และผ่านการทดสอบในโค้ดที่ส่งเป็นคำขอพุลต่อที่เก็บ Blockly