มันสมเหตุสมผลไหมที่จะใช้ Require.js กับ Angular.js? [ปิด]


443

ฉันเป็นมือใหม่สำหรับ Angular.js และพยายามเข้าใจว่ามันแตกต่างจาก Backbone.js อย่างไร ... เราใช้ในการจัดการการพึ่งพาแพคเกจของเรากับ Require.js ในขณะที่ใช้ Backbone มันสมเหตุสมผลไหมที่จะทำสิ่งเดียวกันกับ Angular.js?


โครงการบล็อกและเมล็ดพันธุ์อื่น: startersquad.com/blog/angularjs-requirejs
iwein

19
ไม่ - ไม่ต้องใช้ require.js หรือเบราว์เซอร์ด้วย Angular.JS ไม่จำเป็นต้องทำเช่นนั้น - AngularJS มีระบบโมดูลและการใช้ระบบโมดูลอื่นข้างต้นจะทำให้ชีวิตของคุณยากโดยไม่จำเป็น ฉันได้ทำตามคำตอบในกระทู้นี้และเสียเวลามากเกินไปกับบางสิ่งที่ไม่จำเป็นอย่างสมบูรณ์ โปรดอ่านบทความนี้เพื่ออธิบายว่าทำไมไม่: medium.com/@dickeyxxx/…
VitalyB

อ่านสิ่งนี้เพื่อทำความเข้าใจความแตกต่างระหว่างเชิงมุมและต้องการโมดูลjuristr.com/blog/2014/07/lazy-angular-modules
pilavdzice

1
นี่เป็นวิดีโอที่ยอดเยี่ยมที่อธิบายว่าทำไมมันเป็นความคิดที่ดีและแสดงให้เห็นถึงวิธีการใช้ requireJS กับ angularJS youtube.com/watch?v=4yulGISBF8w#t=142
gskalinskii

2
@VitalyB บทความดีดี! ฉันชอบโหลดแอปพลิเคชั่นเป็นชิ้นเล็ก ๆ มันจะไม่มีค่าใช้จ่ายเร็วพอ เฮ้ตอนนี้มันไม่เสียอะไรเลยสำหรับฉัน
dsign

คำตอบ:


224

ใช่มันเหมาะสมที่จะใช้angular.jsพร้อมกับที่require.jsนั้นคุณสามารถใช้require.jsสำหรับการทำส่วนประกอบโมดูล

มีเป็นโครงการเมล็ดพันธุ์both angular.js and require.jsที่ใช้


108
โครงการเมล็ดพันธุ์ที่กล่าวถึงข้างต้นยังไม่ได้สัมผัสเป็นเวลาหนึ่งปีดังนั้นฉันจึงสร้างใหม่โดยใช้ AngularJS และ RequireJS ล่าสุดพร้อมการสนับสนุนอย่างเต็มที่สำหรับการทดสอบที่ขับเคลื่อนด้วย testacular
tnajdek

2
@tnajdek ฉันได้อัปเดตลิงก์ในคำตอบของ Anshu เพื่อชี้ไปยังลิงก์ที่คุณแนะนำ
David Rivers

7
โปรดทราบว่าโครงการเมล็ดพันธุ์เหล่านั้นไม่ได้รับการรับรองจากทีม Angular จำเป็นต้องใช้เป็นรูปแบบที่ทำให้เข้าใจได้ง่ายขึ้นในบริบทอื่น ๆ และการใส่รองเท้าลงใน Angular ไม่ใช่ IMHO การปฏิบัติที่ดีที่สุด
XML

2
หนังสือ O'Reilly AngularJS โดย Brad Green & Shyam Seshadri (เปิดตัวเดือนเมษายนของปีนี้) ยังแนะนำให้เพิ่ม RequireJS ในช่วงต้นของการเติบโตของโครงการ Angular และวางรายละเอียดค่อนข้างชัดเจน
bjorke

1
ฉันอยากทำทุกอย่างที่เวลาสร้าง 1. browserify.org 2. npmjs.org/package/gulp-angular-filesort
A-Dubb

150

ในการทบทวนสิ่งที่ฉันคิดว่าคำถามของ OP คือ:

ถ้าฉันกำลังสร้างแอพพลิเคชั่นเป็นหลักใน Angular 1.x และ (โดยปริยาย) ทำเช่นนั้นในยุคของ Grunt / Gulp / Broccoli และ Bower / NPM และฉันอาจมีการพึ่งพาไลบรารีเพิ่มเติมสองสามอย่างต้องเพิ่มชัดเจนเฉพาะเจาะจง คุ้มค่าเกินกว่าที่ฉันจะได้รับจากการใช้ Angular โดยไม่ต้องใช้

หรือใช้วิธีอื่น:

"วานิลลาแองกูลาร์จำเป็นต้องใช้ในการจัดการการโหลดองค์ประกอบพื้นฐานอย่างมีประสิทธิภาพหรือไม่ถ้าฉันมีวิธีอื่นในการจัดการการโหลดสคริปต์พื้นฐาน "

และฉันเชื่อว่าคำตอบพื้นฐานคือ: "ไม่เว้นแต่คุณจะมีสิ่งอื่นเกิดขึ้นและ / หรือคุณไม่สามารถใช้เครื่องมือที่ใหม่กว่าและทันสมัยกว่านี้"

ชัดเจนตั้งแต่เริ่มต้น: RequireJS เป็นเครื่องมือที่ยอดเยี่ยมที่ช่วยแก้ไขปัญหาที่สำคัญบางอย่างและเริ่มต้นเราในเส้นทางที่เราไปสู่การใช้งานจาวาสคริปต์ที่ปรับขนาดได้และเป็นมืออาชีพมากขึ้น ที่สำคัญมันเป็นครั้งแรกที่หลายคนพบกับแนวคิดของการทำให้เป็นโมดูลและการทำให้สิ่งต่าง ๆ อยู่นอกขอบเขตของโลก ดังนั้นหากคุณกำลังจะสร้างแอพพลิเคชั่น Javascript ที่จำเป็นต้องปรับขนาดแล้วต้องใช้และรูปแบบ AMD ไม่ใช่เครื่องมือที่ไม่ดีสำหรับการทำเช่นนั้น

แต่มีอะไรเป็นพิเศษเกี่ยวกับ Angular ที่ทำให้ Require / AMD เหมาะสมอย่างยิ่งหรือไม่? ไม่ในความเป็นจริง Angular มีรูปแบบการทำให้เป็นโมดูลและการห่อหุ้มของคุณเอง และการรวมเอาโมดูล Angular เข้ากับรูปแบบของ AMD นั้นเป็นไปไม่ได้ แต่มันเป็นเรื่องที่ค่อนข้างยาก คุณจะต้องใช้เวลาในการทำให้ทั้งสองรูปแบบรวมเข้าด้วยกัน

สำหรับมุมมองบางอย่างจากทีม Angular นั้นมีสิ่งนี้จาก Brian Ford ผู้เขียน Angular Batarang และปัจจุบันเป็นสมาชิกของทีมหลักของ Angular:

ฉันไม่แนะนำให้ใช้ RequireJS กับ AngularJS แม้ว่าจะเป็นไปได้อย่างแน่นอน แต่ฉันไม่ได้เห็นอินสแตนซ์ใด ๆ ที่ RequireJS มีประโยชน์ในทางปฏิบัติ

ดังนั้นในคำถามที่เฉพาะเจาะจงมากของ AngularJS: Angular และ Require / AMD นั้นมีมุมฉากและในสถานที่ทับซ้อนกัน คุณสามารถใช้มันร่วมกันได้ แต่ไม่มีเหตุผลใดที่เกี่ยวข้องกับธรรมชาติ / รูปแบบของ Angular โดยเฉพาะ

แต่สิ่งที่เกี่ยวกับการจัดการขั้นพื้นฐานของการพึ่งพาภายในและภายนอกสำหรับแอปพลิเคชัน Javascript ที่ปรับขนาดได้? ไม่จำเป็นต้องทำสิ่งที่สำคัญยิ่งสำหรับฉันที่นั่นใช่ไหม

ฉันขอแนะนำให้ตรวจสอบ Bower และ NPM และโดยเฉพาะอย่างยิ่ง NPM ฉันไม่ได้พยายามที่จะเริ่มสงครามศักดิ์สิทธิ์เกี่ยวกับประโยชน์เปรียบเทียบของเครื่องมือเหล่านี้ ฉันแค่อยากจะบอกว่า: มีวิธีอื่น ๆ ในการดูแลแมวและวิธีการเหล่านั้นอาจดีกว่า AMD / ต้องการ (แน่นอนพวกเขามีโมเมนตัมที่เป็นที่นิยมมากขึ้นในช่วงปลายปี 2015 โดยเฉพาะ NPM รวมกับโมดูล ES6 หรือ CommonJS ดูคำถาม SO ที่เกี่ยวข้อง )

สิ่งที่เกี่ยวกับการโหลดขี้เกียจ?

โปรดทราบว่าการโหลดที่ขี้เกียจและการดาวน์โหลดที่ขี้เกียจนั้นแตกต่างกัน การโหลดแบบสันหลังยาวของ Angular ไม่ได้หมายความว่าคุณจะดึงมันโดยตรงจากเซิร์ฟเวอร์ ในแอปพลิเคชันสไตล์ Yeoman ที่มีระบบอัตโนมัติ javascript คุณกำลังเชื่อมต่อและทำให้ shebang ทั้งหมดรวมกันเป็นไฟล์เดียว มีอยู่ แต่ไม่ถูกเรียกใช้ / อินสแตนซ์จนกว่าจะมีความจำเป็น การปรับปรุงความเร็วและแบนด์วิดท์ที่คุณได้รับจากการทำเช่นนี้มหาศาลเกินกว่าการปรับปรุงที่ถูกกล่าวหาอย่างมากจากการดาวน์โหลดตัวควบคุม 20 บรรทัดที่ขี้เกียจ ในความเป็นจริงเวลาแฝงของเครือข่ายที่สูญเปล่าและโอเวอร์เฮดการส่งข้อมูลสำหรับคอนโทรลเลอร์นั้นจะเป็นลำดับที่มีขนาดใหญ่กว่าขนาดของคอนโทรลเลอร์

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

แต่สิ่งที่เกี่ยวกับระหว่างการพัฒนาในกล่อง dev ท้องถิ่นของฉัน

ฉันจะโหลดไฟล์สคริปต์หลายสิบ / ร้อยไฟล์ทั้งหมดโดยไม่ต้องแนบไฟล์ทั้งหมดกับ index.html ด้วยตนเองได้อย่างไร

ดูที่เครื่องกำเนิดไฟฟ้าย่อยในเครื่องกำเนิดไฟฟ้าเชิงมุมของ Yeoman หรือที่รูปแบบระบบอัตโนมัติเป็นตัวเป็นตนในgenerator-gulp-angularหรือที่ Webpack automation มาตรฐานสำหรับการตอบสนอง สิ่งเหล่านี้มอบวิธีที่สะอาดและปรับขนาดได้ให้กับคุณ: แนบไฟล์โดยอัตโนมัติในเวลาที่ส่วนประกอบนั่งร้านหรือจะจับพวกมันทั้งหมดโดยอัตโนมัติหากมีอยู่ในโฟลเดอร์ / จับคู่รูปแบบกลมบางอย่าง คุณไม่จำเป็นต้องคิดถึงการโหลดสคริปต์ของคุณเองอีกเมื่อคุณมีตัวเลือกหลัง

ด้านล่างบรรทัด?

ต้องการเป็นเครื่องมือที่ดีสำหรับบางสิ่ง แต่ไปกับธัญพืชทุกครั้งที่ทำได้และแยกความกังวลของคุณออกไปได้ ให้ Angular กังวลเกี่ยวกับรูปแบบการทำให้เป็นโมดูลของ Angular และพิจารณาใช้โมดูล ES6 หรือ CommonJS เป็นรูปแบบการทำให้เป็นโมดูลทั่วไป ให้เครื่องมืออัตโนมัติที่ทันสมัยกังวลเกี่ยวกับการโหลดสคริปต์และการจัดการการพึ่งพา และดูแล async ขี้เกียจโหลดในลักษณะละเอียดมากกว่าโดยพันกันอีกสองข้อกังวล

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

แต่อย่างอื่น ... เมื่อเริ่มต้นด้วยแอปพลิเคชัน Angular ใหม่และความยืดหยุ่นในการสร้างสภาพแวดล้อมระบบอัตโนมัติที่ทันสมัย ​​... คุณมีตัวเลือกอื่น ๆ อีกมากมายมีความยืดหยุ่นและตัวเลือกที่ทันสมัยกว่า

(อัปเดตซ้ำ ๆ เพื่อให้ทันกับฉาก JS ที่พัฒนาขึ้น)


1
โครงการเมล็ดพันธุ์ NG-Boilerplate ( github.com/ngbp/ngbp ) สร้าง webapp หน้าเดียวพร้อมไฟล์ js หนึ่งไฟล์ การใช้รายการ HTML5 ทำให้แน่ใจว่าไฟล์นี้จะถูกโหลดหนึ่งครั้งต่อหนึ่งรุ่นเท่านั้น
Federico Elles

2
แม้ว่าเช่นเคย <i> มันขึ้นอยู่กับ </i> หลายคนใช้ต้องการสำหรับสถาปัตยกรรมทั้งหมดของพวกเขาและจำเป็นต้องรวม Angular เข้ากับระบบนิเวศ เป็นสถานการณ์ที่แตกต่างจากตอนที่คุณกำลังสร้างแอพแยก
Dave Nichol

2
ตกลง แต่แรงผลักดันของ OP น่าจะเป็น: "ถ้าฉันสร้างแอพพลิเคชั่นเป็นหลักในแองกูลาร์และ (โดยปริยาย) การทำเช่นนั้นในยุคของ Grunt และบางทีฉันอาจมีการพึ่งพาห้องสมุดเพิ่มเติมอีกสองสามครั้ง สิ่งที่ฉันได้รับจากการใช้ Angular โดยไม่ต้องใช้ และฉันเชื่อว่าคำตอบคือ: ไม่ หากคุณมีแอปพลิเคชันขนาดใหญ่ที่มีการพึ่งพาภายนอก 40 รายการหรือคุณไม่สามารถควบคุมสภาพแวดล้อม CI ของคุณหรือเจ้านายของคุณชื่นชอบ Need หรือคุณชื่นชอบ Need หรือ Angular เป็นแอปพลิเคชั่นขนาดใหญ่เพียงชิ้นเดียว ฯลฯ เป็นต้น YMMV
XML

1
แต่เนื่องจากเขาไม่ได้ถามคำถามเหล่านั้นและเนื่องจากเขาเพียงกล่าวถึงบริบททางเลือกของแอป Backbone เขาจึงถามว่า: "วานิลลาแองกูลาร์ต้องการการจัดการองค์ประกอบอย่างมีประสิทธิภาพหรือไม่" และคำตอบก็คือ: "ไม่เว้นแต่คุณจะมีสิ่งอื่นเกิดขึ้น" นอกจากนี้คำถามนี้มาจากการเคลื่อนไหวของ Javascript CI ซึ่งเรามีวิธีที่ดีกว่ามากในการจัดการ 'การโหลดสคริปต์' พื้นฐานทางกายภาพ หากคุณมีปัญหานั้นได้รับการแก้ไขจำเป็นต้องมีพื้นฐานเกี่ยวกับการจับคู่อ้างอิงและการห่อหุ้ม Angular ทำทั้งสองอย่างให้คุณ
XML

Google ใช้การโหลดแบบสันหลังยาวในบางโครงการของ AngularJS เพราะมิฉะนั้นผู้ใช้จะดาวน์โหลดไฟล์ 24mb ในการโหลดหน้าแรก (และนี่คือไฟล์ที่อัปโหลดและต่อกัน) ใช่แล้วในแอปพลิเคชันที่ซับซ้อนมันไม่ได้แค่เชื่อมต่อทุกส่วนเมื่อมีส่วนผู้ใช้จะไม่สามารถเปิดได้ทุกครั้ง
ngDeveloper

136

ใช่มันสมเหตุสมผลแล้ว

โมดูลเชิงมุมไม่พยายามแก้ปัญหาการสั่งโหลดสคริปต์หรือการดึงสคริปต์ที่ขี้เกียจ เป้าหมายเหล่านี้เป็นมุมฉากและทั้งสองโมดูลสามารถอยู่เคียงข้างกันและบรรลุเป้าหมาย

ที่มา: เว็บไซต์ทางการของ Angular JS


6
หากคุณใช้หนึ่งโมดูลต่อไฟล์ js คุณสามารถโหลดโมดูลเชิงมุมของคุณในลำดับใดก็ได้ แต่ถ้าคุณต้องการใส่บริการต่าง ๆ ในไฟล์ js ที่แตกต่างกัน แต่คุณต้องการแนบในโมดูลเชิงมุมเดียวกันคุณต้องโหลดการประกาศโมดูลก่อนการประกาศบริการ นี่คือการตัดสินใจทางสถาปัตยกรรม
Matohawk

@Tiago: โปรดระบุลิงก์ไปยังตำแหน่งที่คุณจัดหามาจาก ฉันไม่พบที่ใดก็ได้ ฉันเดาว่ามันมาจากเอกสาร Angular รุ่นก่อนหน้านี้ก่อนที่รูปแบบของ Angular จะได้รับการยอมรับเช่นกันและก่อนที่มันจะชัดเจนว่ามีข้อดีที่สำคัญในการหลีกเลี่ยงความต้องการอย่างน้อยสำหรับส่วนประกอบของ Angular
XML

@XMLilley: คุณสามารถให้ลิงค์ที่อธิบายถึงข้อดีของการหลีกเลี่ยงการต้องใช้เมื่อใช้ Angular ได้หรือไม่? ฉันตัดสินใจว่าจะใช้หรือไม่ต้องการใช้ในโครงการของฉันและดูเหมือนว่าจะเป็นประโยชน์หรือไม่
เทรเวอร์

1
ฉันไม่ชัดเจนในภาษาของฉันที่นี่: มีข้อดีที่สำคัญในการใช้ประโยชน์จากโมดุลเดอร์โมดูลในตัวของแองกูลาร์และไปกับลายของแองกูลาร์ คำถามไม่ใช่ว่าจะหลีกเลี่ยงต้องการหรือไม่ แต่มีค่าที่จะเพิ่มเลเยอร์ความซับซ้อนเพิ่มเติมหรือไม่ สิ่งที่ชัดเจนคือรูปแบบในตัวของแองกูลาร์นั้นจะตอบสนองความต้องการการโหลดโมดูลของแองกูลาร์ได้อย่างสวยงามและสวยงาม ถ้าต้องการทำหน้าที่จุดประสงค์ในการโหลดโมดูลนอกบริบทของ Angular ดังนั้นไม่ว่าจะเป็น แต่การใช้ Require for Angular นั้นไม่สำคัญ
XML

6
@XMLilley แองกูลาร์ทั้งหมดไม่ให้ฉีดพึ่งพาคุณ การโหลดโมดูลที่แท้จริงเป็นความรับผิดชอบของคุณ คุณสามารถทำได้โดยเพิ่มแท็กสคริปต์มีสคริปต์สร้างหรือใช้ requirejs ระบบโมดูล Angulars ไม่มีความคิดเห็นในเรื่องนี้
gillesruppert

57

ฉันเชื่อว่านี่เป็นคำถามเชิงอัตวิสัยดังนั้นฉันจะให้ความเห็นส่วนตัวของฉัน

Angular มีกลไกการทำให้เป็นโมดูลในตัวเมื่อคุณสร้างแอพของคุณสิ่งแรกที่คุณต้องทำคือ

var app = angular.module("myApp");

แล้ว

app.directive(...);

app.controller(...);

app.service(...);

หากคุณดูที่แองกูลาร์ - เมล็ดซึ่งเป็นแอพเริ่มต้นที่เรียบร้อยสำหรับแองกูลาร์พวกเขาได้แยกคำสั่งบริการผู้ควบคุม ฯลฯ ออกเป็นโมดูลที่แตกต่างกันแล้วโหลดโมดูลเหล่านั้นเป็นการพึ่งพาในแอพหลัก

สิ่งที่ต้องการ :

var app = angular.module("myApp",["Directives","Controllers","Services"];

Angular ยังขี้เกียจโหลดโมดูลเหล่านี้ (ในหน่วยความจำ) ไม่ใช่ไฟล์สคริปต์

ในแง่ของการโหลดไฟล์สคริปต์ที่ขี้เกียจตรงไปตรงมาเว้นแต่ว่าคุณกำลังเขียนสิ่งที่มีขนาดใหญ่มากมันจะเกินความจริงเพราะมุมของมันจะลดจำนวนรหัสที่คุณเขียนลงไปมาก แอพทั่วไปที่เขียนในกรอบอื่น ๆ ส่วนใหญ่อาจคาดว่าจะลดลงประมาณ 30-50% ใน LOC หากเขียนเป็นมุม


5
แท้จริงแล้วมันเป็นการกำหนดค่าบริการใน Angular.js ดีกว่าโหลดโมดูลที่มี Require.js สิ่งนี้ทำให้การเล่นกับขอบเขตและบริการ $ ง่ายขึ้นขณะที่ฉันเล่นกับ Socket.io
Marco Godínez

33

การใช้ RequireJS กับ AngularJS นั้นสมเหตุสมผล แต่ถ้าคุณเข้าใจว่าแต่ละคนทำงานอย่างไรเกี่ยวกับการฉีดขึ้นอยู่กับว่าทั้งคู่ฉีดการพึ่งพาพวกเขาฉีดสิ่งต่าง ๆ มาก

AngularJS มีระบบการพึ่งพาของตัวเองที่ให้คุณฉีดโมดูล AngularJS ไปยังโมดูลที่สร้างขึ้นใหม่เพื่อนำการใช้งานกลับมาใช้ใหม่ สมมติว่าคุณสร้างโมดูล "แรก" ที่ใช้ตัวกรอง AngularJS "ทักทาย":

angular
  .module('first', [])
  .filter('greet', function() {
    return function(name) {
      return 'Hello, ' + name + '!';
    }
  });

และตอนนี้สมมติว่าคุณต้องการใช้ตัวกรอง "ทักทาย" ในโมดูลอื่นที่เรียกว่า "วินาที" ซึ่งใช้ตัวกรอง "ลาก่อน" คุณสามารถทำการฉีดโมดูล "แรก" ไปยังโมดูล "ที่สอง":

angular
  .module('second', ['first'])
  .filter('goodbye', function() {
    return function(name) {
      return 'Good bye, ' + name + '!';
    }
  });

สิ่งนี้คือเพื่อให้การทำงานนี้ถูกต้องโดยไม่ต้องใช้ RequireJS คุณต้องตรวจสอบให้แน่ใจว่าโหลดโมดูล AngularJS "แรก" บนหน้าก่อนที่คุณจะสร้างโมดูล AngularJS "ที่สอง" เอกสารอ้างอิง:

ขึ้นอยู่กับโมดูลที่บอกเป็นนัยว่าจำเป็นต้องโหลดโมดูลก่อนที่จะโหลดโมดูลที่ต้องการ

ในกรณีดังกล่าวนี่คือที่ RequireJS สามารถช่วยคุณได้เนื่องจาก RequireJS มีวิธีที่สะอาดในการแทรกสคริปต์ลงในหน้าเพื่อช่วยให้คุณจัดระเบียบสคริปต์ที่ต้องพึ่งพาซึ่งกันและกัน

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

// firstModule.js file
define(['angular'], function(angular) {
  angular
    .module('first', [])
    .filter('greet', function() {
      return function(name) {
        return 'Hello, ' + name + '!';
      }
    });
});
// secondModule.js file
define(['angular', 'firstModule'], function(angular) {
  angular
    .module('second', ['first'])
    .filter('goodbye', function() {
      return function(name) {
        return 'Good bye, ' + name + '!';
      }
    });
});

คุณจะเห็นว่าเราขึ้นอยู่กับไฟล์ "firstModule" ที่จะถูกฉีดก่อนที่เนื้อหาของการเรียกกลับ RequireJ สามารถดำเนินการได้ซึ่งต้องการโมดูล AngularJS "แรก" ที่จะโหลดเพื่อสร้างโมดูล "ที่สอง"

หมายเหตุด้านข้าง: การฉีด "angular" ในไฟล์ "firstModule" และ "secondModule" เป็นสิ่งจำเป็นสำหรับการพึ่งพาเพื่อใช้ AngularJS ภายในฟังก์ชันการเรียกกลับ RequireJS และต้องกำหนดค่าใน RequireJS config เพื่อแม็พ "angular" กับโค้ดไลบรารี คุณอาจโหลด AngularJS ไปยังหน้าเว็บด้วยวิธีดั้งเดิมเช่นกัน (แท็กสคริปต์) แม้ว่าจะเอาชนะผลประโยชน์ RequireJS

รายละเอียดเพิ่มเติมเกี่ยวกับการรองรับ RequireJS จาก AngularJS core จากรุ่น 2.0 ในโพสต์บล็อกของฉัน

ขึ้นอยู่กับการโพสต์บล็อกของฉัน"ทำให้ความรู้สึกของ RequireJS กับ AngularJS"นี่คือการเชื่อมโยง


2
จะเป็นการดีที่สุดเมื่อรวมลิงค์เพื่อสรุปเนื้อหาของลิงค์ที่นี่ใน Stack Overflow หากลิงก์ของคุณเคยพังซึ่งลิงก์ทำบนอินเทอร์เน็ตคำตอบของคุณที่นี่จะไร้ประโยชน์กับผู้เยี่ยมชมในอนาคต พิจารณาการแก้ไขเพื่อนำมาสรุปและปรับปรุงโพสต์นี้ โชคดี!
jmort253

3
ไปแล้วขอบคุณ jmort253
leog

ขอบคุณสำหรับการแก้ไขเหล่านี้และอธิบายว่า RequireJS สามารถช่วยจัดการการพึ่งพาเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับ Angular ที่พยายามโหลดสิ่งที่ยังไม่มีอยู่ได้อย่างไร
jmort253

ฉันเห็นด้วยอย่างยิ่งที่ดีที่สุดคือการใช้วิธีการนี้สำหรับแอปพลิเคชันขนาดใหญ่หากไม่คุณจะมีแท็ก <script> หลายรายการในแอปพลิเคชันของคุณ
I.Tyger

21

ในฐานะที่เป็น @ganaraj กล่าวถึง AngularJS มีการฉีดพึ่งพาที่แกนกลางของมัน เมื่อสร้างแอปพลิเคชั่นของเล่นที่มีและไม่มี RequireJS ฉันพบว่า RequireJS นั้นอาจเกินความจำเป็นสำหรับกรณีการใช้งานส่วนใหญ่

นั่นไม่ได้หมายความว่า RequireJS นั้นไม่ได้มีประโยชน์สำหรับความสามารถในการโหลดสคริปต์และทำให้ codebase ของคุณสะอาดระหว่างการพัฒนา การรวมเครื่องมือเพิ่มประสิทธิภาพ r.js ( https://github.com/jrburke/r.js ) กับอัลมอนด์ ( https://github.com/jrburke/almond ) สามารถสร้างเรื่องราวการโหลดสคริปต์ที่บางเฉียบได้ อย่างไรก็ตามเนื่องจากคุณสมบัติการจัดการการพึ่งพาไม่สำคัญกับแองกูลาร์ที่เป็นแกนหลักของแอปพลิเคชันของคุณคุณยังสามารถประเมินด้านไคลเอนต์อื่น ๆ (HeadJS, LABjs, ... ) หรือแม้แต่ฝั่งเซิร์ฟเวอร์ (MVC4 Bundler, ... ) สำหรับแอปพลิเคชันเฉพาะของคุณ


17

ใช่มันเป็นพิเศษสำหรับสปาขนาดใหญ่มาก

ในบางสถานการณ์ต้องใช้ JJ เป็นสิ่งจำเป็น ตัวอย่างเช่นฉันพัฒนาแอปพลิเคชัน PhoneGap โดยใช้ AngularJS ซึ่งใช้ Google Map API ด้วย หากไม่มีตัวโหลด AMD เช่น RequireJS แอปจะหยุดทำงานทันทีที่เปิดตัวเมื่อออฟไลน์เนื่องจากไม่สามารถจัดหาสคริปต์ Google Map API ได้ ตัวโหลด AMD ให้โอกาสฉันในการแสดงข้อความแสดงข้อผิดพลาดแก่ผู้ใช้

อย่างไรก็ตามการรวมระหว่าง AngularJS และ RequireJS นั้นค่อนข้างยุ่งยาก ฉันสร้าง angularAMD เพื่อทำให้กระบวนการเจ็บปวดน้อยลง:

http://marcoslin.github.io/angularAMD/



7

มันสมเหตุสมผลที่จะต้องใช้ requirejs กับ angularjs ถ้าคุณวางแผนเกี่ยวกับตัวควบคุมการโหลดแบบขี้เกียจและคำสั่งอื่น ๆ ในขณะที่ยังรวมการพึ่งพาแบบอิงหลาย ๆ อย่างเข้าด้วยกันเป็นไฟล์สคริปต์เดี่ยว RequireJS มีเครื่องมือเพิ่มประสิทธิภาพที่ทำให้การรวมเป็นเรื่องง่าย ดูhttp://ify.io/using-requirejs-with-optimisation-for-lazy-loading-angularjs-artefacts/


7

ใช่มันสมเหตุสมผลแล้วที่จะใช้ requireJS กับ Angular ฉันใช้เวลาหลายวันในการทดสอบโซลูชันทางเทคนิคหลายอย่าง

ฉันสร้าง Angular Seed ด้วย RequireJS ทางฝั่งเซิร์ฟเวอร์ ง่ายมาก ฉันใช้สัญลักษณ์ SHIM สำหรับโมดูล AMD และไม่ใช่ AMD เพราะฉันคิดว่ามันยากมากที่จะจัดการกับระบบฉีดพึ่งพาสองแบบที่แตกต่างกัน

ฉันใช้ grunt และ r.js เพื่อเชื่อมไฟล์ js บนเซิร์ฟเวอร์ขึ้นอยู่กับไฟล์คอนฟิกูเรชัน SHIM (การพึ่งพา) ดังนั้นฉันจึงอ้างถึงไฟล์ js เดียวในแอปของฉัน

สำหรับข้อมูลเพิ่มเติมไปที่เมล็ดพันธุ์ Angular ของฉัน Github: https://github.com/matohawk/angular-seed-requirejs


3

ฉันจะหลีกเลี่ยงการใช้ Require.js แอพที่ฉันเห็นแล้วว่าทำสิ่งนี้ให้ยุ่งเหยิงไปกับสถาปัตยกรรมรูปแบบโมดูลหลายประเภท เอเอ็มดีเผยรสชาติที่แตกต่างกันของ IIFE ฯลฯ มีวิธีอื่น ๆ เพื่อโหลดตามความต้องการเช่นเป็นmod loadOnDemand เชิงมุม การเพิ่มสิ่งอื่น ๆ เพียงเติมรหัสของคุณเต็มไปด้วย cruft และสร้างอัตราส่วนสัญญาณต่อสัญญาณรบกวนต่ำและทำให้รหัสของคุณอ่านยาก


2

นี่คือวิธีที่ฉันใช้: http://thaiat.github.io/blog/2014/02/26/angularjs-and-requirejs-for-very-large-applications/

หน้าแสดงการใช้งานที่เป็นไปได้ของ AngularJS + RequireJS โดยที่โค้ดจะถูกแบ่งตามคุณสมบัติแล้วประเภทส่วนประกอบ


3
แม้ว่าลิงก์จะให้ข้อมูลเพื่อตอบคำถามคำอธิบายของหน้าเว็บที่แสดงว่าเป็นแนวปฏิบัติที่ดีที่สุด
juliocesar


0

ฉันคิดว่ามันขึ้นอยู่กับความซับซ้อนของโครงการของคุณเนื่องจากเชิงมุมนั้นถูกทำให้เป็นโมดูลมาก คอนโทรลเลอร์ของคุณสามารถแมปและคุณสามารถนำเข้าคลาส JavaScript เหล่านั้นในหน้า index.html ของคุณ

แต่ในกรณีที่โครงการของคุณใหญ่ขึ้น หรือคุณคาดการณ์สถานการณ์ดังกล่าวคุณควรรวมเชิงมุมกับ requirejs ในนี้บทความที่คุณสามารถดูแอปสาธิตเพื่อบูรณาการดังกล่าว

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