นี่เป็นตัวอย่างที่ชัดเจนมากขึ้น
ฉันกำลังทำงานในโครงการที่มี 60 ไฟล์ เรามีโหมดการทำงานที่แตกต่างกัน 2 โหมด
โหลดรุ่นต่อเนื่องขนาดใหญ่ 1 ไฟล์ (การผลิต)
โหลดทั้งหมด 60 ไฟล์ (การพัฒนา)
เรากำลังใช้ตัวโหลดดังนั้นเราจึงมีเพียงหนึ่งสคริปต์ในหน้าเว็บ
<script src="loader.js"></script>
ค่าเริ่มต้นคือโหมด # 1 (โหลดไฟล์ที่ต่อกันขนาดใหญ่หนึ่งไฟล์) ในการรันในโหมด # 2 (ไฟล์แยก) เราได้ตั้งค่าสถานะบางอย่าง มันอาจเป็นอะไรก็ได้ คีย์ในสายอักขระแบบสอบถาม ในตัวอย่างนี้เราเพิ่งทำสิ่งนี้
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js มีลักษณะเช่นนี้
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
สคริปต์การสร้างเป็นเพียงไฟล์. sh ที่มีลักษณะเช่นนี้
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
ฯลฯ ...
หากมีการเพิ่มไฟล์ใหม่เราน่าจะใช้โหมด # 2 เนื่องจากเรากำลังทำการพัฒนาเราต้องเพิ่มinjectScript("somenewfile.js")
บรรทัดลงใน loader.js
หลังจากนั้นสำหรับการผลิตเรายังต้องเพิ่ม somenewfile.js ไปยังสคริปต์สร้างของเรา ขั้นตอนที่เรามักจะลืมแล้วได้รับข้อความแสดงข้อผิดพลาด
เมื่อเปลี่ยนเป็น AMD เราไม่จำเป็นต้องแก้ไข 2 ไฟล์ ปัญหาของการเก็บ loader.js และสคริปต์การสร้างในการซิงค์หายไป การใช้r.js
หรือwebpack
เพียงแค่อ่านรหัสเพื่อสร้างlarge-concantinated.js
นอกจากนี้ยังสามารถจัดการกับการพึ่งพาเช่นเราโหลด 2 ไฟล์ lib1.js และ lib2.js เช่นนี้
injectScript("lib1.js");
injectScript("lib2.js");
lib2 ต้องการ lib1 มันมีโค้ดข้างในที่ทำอะไรบางอย่าง
lib1Api.installPlugin(...);
แต่เนื่องจากสคริปต์ฉีดถูกโหลดแบบอะซิงโครนัสจึงไม่รับประกันว่าจะโหลดตามลำดับที่ถูกต้อง 2 สคริปต์เหล่านี้ไม่ใช่สคริปต์ของ AMD แต่การใช้ require.js เราสามารถบอกได้ว่ามันขึ้นกับอะไร
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
ฉันโมดูลของเราที่ใช้ lib1 เราทำเช่นนี้
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
ตอนนี้ require.js จะฉีดสคริปต์ให้เราและจะไม่ส่ง lib2 จนกว่าจะโหลด lib1 เนื่องจากเราบอกว่า lib2 ขึ้นอยู่กับ lib1 และจะไม่เริ่มโมดูลของเราที่ใช้ lib1 จนกว่าทั้ง lib2 และ lib1 จะโหลดแล้ว
สิ่งนี้ทำให้การพัฒนาเป็นไปได้อย่างดี (ไม่มีขั้นตอนการสร้างไม่ต้องกังวลเกี่ยวกับลำดับการโหลด) และทำให้การผลิตเป็นเรื่องดี (ไม่จำเป็นต้องอัปเดตสคริปต์สำหรับสร้างสำหรับเพิ่มสคริปต์แต่ละรายการ)
เป็นโบนัสที่เพิ่มเข้ามาเราสามารถใช้โปรแกรมเสริมของ babpack เพื่อเรียกใช้ babel บนโค้ดสำหรับเบราว์เซอร์รุ่นเก่าและอีกครั้งเราไม่จำเป็นต้องสร้างสคริปต์นั้น
โปรดทราบว่าหาก Chrome (เบราว์เซอร์ที่เราเลือก) เริ่มสนับสนุนimport
จริงเราอาจเปลี่ยนไปใช้เพื่อการพัฒนา แต่นั่นจะไม่เปลี่ยนแปลงอะไรเลย เรายังคงสามารถใช้ webpack เพื่อสร้างไฟล์ที่ต่อกันกันและเราสามารถใช้มันเพื่อเรียกใช้ babel บนโค้ดสำหรับเบราว์เซอร์ทั้งหมด
ทั้งหมดนี้ได้มาจากการไม่ใช้แท็กสคริปต์และการใช้ AMD