ความแตกต่างระหว่างโหมดการผลิตและโหมดการพัฒนาใน Angular2 คืออะไร?


คำตอบ:


77

ในโหมดการพัฒนาการตรวจจับการเปลี่ยนแปลงจะรันครั้งที่สองทันทีหลังจากการรันครั้งแรกและสร้างข้อผิดพลาดหากค่าที่ถูกผูกไว้มีการเปลี่ยนแปลงระหว่างการรันครั้งแรกและครั้งที่สอง สิ่งนี้ช่วยในการค้นหาจุดบกพร่องที่การตรวจสอบค่ามีผลข้างเคียงหรือฟิลด์หรือฟังก์ชั่นไม่คืนค่าเดียวกันในการโทรครั้งต่อ ๆ ไปซึ่งทำลายการตรวจจับการเปลี่ยนแปลงของ Angular

ในโหมดการพัฒนาในระหว่างการดำเนินการตรวจจับการเปลี่ยนแปลงครั้งที่สอง Angular ยังทำการเปรียบเทียบวัตถุเชิงลึกบางอย่างที่จะไม่ทำในการผลิตเพื่อตรวจจับการเปลี่ยนแปลงโมเดลที่ไม่ได้รับอนุญาต

อัปเดต:

ในโหมดการพัฒนาคำแนะนำนี้จะพิมพ์ไปยังคอนโซลเมื่อบริการเจลทำความสะอาด HTML แถบค่าจากการผูกหรือ[innerHTML]="..." [ngStyle]="..."ดูเพิ่มเติม: ใน RC.1 บางสไตล์ไม่สามารถเพิ่มโดยใช้ไวยากรณ์การผูก


5
ฉันจะตรวจสอบได้อย่างไรว่ากำลังทำงานในโหมดการผลิตหรือโหมดการพัฒนา

ฉันเคยเห็นสิ่งนี้ถูกถามแล้ว แต่ฉันยังไม่เห็นคำตอบ คุณต้องเปิดใช้งานโหมดการผลิตอย่างชัดเจนและคุณสามารถตั้งค่าตัวแปรส่วนกลางบางอย่างได้เช่นกันเมื่อคุณเปิดใช้งาน prodMode ที่สามารถตรวจสอบในโค้ดของคุณเพื่อให้ทราบว่าโหมดใดทำงานอยู่
GünterZöchbauer

6
นอกจากนี้หากคุณกำลังทำงานในโหมด dev และเปิดคอนโซลในเบราว์เซอร์ของคุณมันจะมีข้อความที่พิมพ์ว่า "Angular 2 กำลังทำงานในโหมดการพัฒนาโปรดเรียก enableProdeMode () เพื่อเปิดใช้งานโหมดการผลิต" หากคุณอยู่ในโหมดการผลิตอยู่แล้วคุณจะไม่เห็นอะไรเลยที่นี่
c.dunlap

36

เอกสารสำหรับสถานะApplicationRef.tick () :

ในโหมดการพัฒนาtick()ยังดำเนินการรอบการตรวจจับการเปลี่ยนแปลงที่สอง (TTL = 2) เพื่อให้แน่ใจว่าไม่มีการตรวจพบการเปลี่ยนแปลงเพิ่มเติม หากมีการเปลี่ยนแปลงเพิ่มเติมในรอบที่สองนี้การเชื่อมโยงในแอปจะมีผลข้างเคียงที่ไม่สามารถแก้ไขได้ในการตรวจจับการเปลี่ยนแปลงครั้งเดียว ในกรณีนี้ Angular จะแสดงข้อผิดพลาดเนื่องจากแอปพลิเคชัน Angular สามารถมีการตรวจจับการเปลี่ยนแปลงได้เพียงครั้งเดียวในระหว่างที่การตรวจจับการเปลี่ยนแปลงทั้งหมดจะต้องเสร็จสมบูรณ์

สาเหตุที่เราไม่สามารถเปลี่ยนแปลงเพิ่มเติมได้เนื่องจากในโหมดการใช้งานจริงการตรวจจับการเปลี่ยนแปลงจะทำงานเพียงครั้งเดียวซึ่งหมายความว่าทุกส่วนประกอบในโครงสร้างส่วนประกอบจะถูกตรวจสอบเพียงครั้งเดียว (TTL = 1) ... จากด้านบนในเชิงลึกก่อน ใบสั่ง. ดังนั้นหากการเปลี่ยนแปลงคุณสมบัติอินพุตของคอมโพเนนต์ย่อยทำให้เกิดการเปลี่ยนแปลงกับคุณสมบัติอื่น ๆ ที่คอมโพเนนต์พาเรนต์ผูกไว้ในมุมมอง / เทมเพลตมุมมองของคอมโพเนนต์พาเรนต์จะไม่ถูกอัพเดต (เนื่องจากการตรวจจับการเปลี่ยนแปลงจะไม่กลับมา องค์ประกอบหลักในโหมดการใช้งานจริง ... เนื่องจากการข้ามต้นไม้แบบ "one pass") มันจะได้รับการอัปเดตในครั้งถัดไปที่มีเหตุการณ์บางอย่างเกิดขึ้นและการตรวจจับการเปลี่ยนแปลงจะดำเนินการอีกครั้ง แต่ก็สายเกินไป!

นี่คือPlunkerที่ละเมิดกฎ - องค์ประกอบลูกมีsetวิธีการในคุณสมบัติอินพุตที่แก้ไขคุณสมบัติอินพุตอื่น ใช่เป็นตัวอย่างที่สร้างขึ้น แต่เข้าใจง่ายกว่าตัวอย่างถัดไป:

อีกสถานการณ์หนึ่งที่คุณอาจประสบปัญหานี้คือท่อที่มีสถานะ ตรวจสอบคำตอบนี้ว่าเป็นปัญหาของคุณหรือไม่

คุณควรอธิบายปัญหาของคุณ (ในคำถาม SO อื่น) น่าจะมีวิธีแก้ไขได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.