โหลดเส้นทางล่วงหน้าก่อนเวลาเพื่อเร่งความเร็วในการไปยังส่วนต่างๆ ของผู้ใช้
การแยกโค้ดระดับเส้นทางช่วยลดเวลาในการโหลดเริ่มต้นของแอปพลิเคชันโดยการเลื่อนเวลา JavaScript ที่เชื่อมโยงกับเส้นทางที่ไม่จําเป็นในตอนแรก วิธีนี้จะช่วยให้ Angular Router รอจนกว่าผู้ใช้จะไปยังเส้นทางหนึ่งๆ ก่อนจึงจะเรียกใช้คําขอเครือข่ายเพื่อดาวน์โหลด JavaScript ที่เชื่อมโยง
แม้ว่าเทคนิคนี้จะยอดเยี่ยมสำหรับการโหลดหน้าเว็บครั้งแรก แต่อาจทําให้การนําทางช้าลง ทั้งนี้ขึ้นอยู่กับเวลาในการตอบสนองและแบนด์วิดท์ของเครือข่ายของผู้ใช้ วิธีหนึ่งที่จะช่วยแก้ปัญหานี้ได้คือการโหลดเส้นทางล่วงหน้า เมื่อใช้การโหลดล่วงหน้า เมื่อผู้ใช้อยู่ที่เส้นทางหนึ่งๆ คุณจะดาวน์โหลดและแคช JavaScript ที่เชื่อมโยงกับเส้นทางที่อาจมีการใช้ในลำดับถัดไปได้ รูทเตอร์ Angular มีฟังก์ชันการทำงานนี้ให้ใช้งานตั้งแต่แกะกล่อง
ในโพสต์นี้ คุณจะได้เรียนรู้วิธีเพิ่มความเร็วในการไปยังส่วนต่างๆ เมื่อใช้การแยกโค้ดระดับเส้นทางโดยใช้ประโยชน์จากการโหลด JavaScript ล่วงหน้าใน Angular
กลยุทธ์การโหลดเส้นทางล่วงหน้าใน Angular
รูทเตอร์ Angular มีพร็อพเพอร์ตี้การกําหนดค่าชื่อ preloadingStrategy
ซึ่งกําหนดตรรกะสําหรับการโหลดล่วงหน้าและการประมวลผลโมดูล Angular ที่โหลดแบบเลื่อนเวลา เราจะพูดถึงกลยุทธ์ 2 แบบที่เป็นไปได้ ดังนี้
PreloadAllModules
ซึ่งจะโหลดเส้นทางแบบ Lazy Load ทั้งหมดไว้ล่วงหน้าตามชื่อที่ระบุQuicklinkStrategy
ซึ่งจะโหลดเส้นทางที่เชื่อมโยงกับลิงก์ในหน้าปัจจุบันไว้ล่วงหน้าเท่านั้น
ส่วนที่เหลือของโพสต์นี้เกี่ยวข้องกับแอป Angular ตัวอย่าง ซึ่งคุณดูซอร์สโค้ดได้ใน GitHub
การใช้กลยุทธ์ PreloadAllModules
แอปตัวอย่างมีเส้นทางแบบโหลดล่าช้าหลายเส้นทาง หากต้องการโหลดล่วงหน้าทั้งหมดโดยใช้กลยุทธ์ PreloadAllModules
ซึ่งฝังอยู่ใน Angular ให้ระบุกลยุทธ์ดังกล่าวเป็นค่าสำหรับพร็อพเพอร์ตี้ preloadingStrategy
ในการกำหนดค่าเราเตอร์ ดังนี้
import { RouterModule, PreloadAllModules } from '@angular/router';
// …
RouterModule.forRoot([
…
], {
preloadingStrategy: PreloadAllModules
})
// …
ตอนนี้ให้แสดงแอปพลิเคชันและดูที่แผงเครือข่ายในเครื่องมือสําหรับนักพัฒนาเว็บใน Chrome
- กดแป้น Control+Shift+J (หรือ Command+Option+J ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์
- คลิกแท็บเครือข่าย
คุณควรเห็นว่าเราเตอร์ดาวน์โหลด nyan-nyan-module.js
และ about-about-module.js
ในเบื้องหลังเมื่อเปิดแอปพลิเคชัน
นอกจากนี้ เราเตอร์ยังลงทะเบียนประกาศเส้นทางของโมดูลด้วย เพื่อให้การเปลี่ยนเส้นทางเป็นไปอย่างรวดเร็วเมื่อคุณไปยัง URL ที่เชื่อมโยงกับโมดูลที่โหลดไว้ล่วงหน้า
การใช้กลยุทธ์การโหลด Quicklink ล่วงหน้า
PreloadAllModules
มีประโยชน์ในหลายกรณี อย่างไรก็ตาม เมื่อคุณมีโมดูลหลายสิบรายการ การโหลดล่วงหน้าที่มากเกินไปอาจทำให้การใช้เครือข่ายเพิ่มขึ้นอย่างมาก นอกจากนี้ เนื่องจากเราเตอร์ต้องลงทะเบียนเส้นทางในโมดูลที่โหลดไว้ล่วงหน้าทั้งหมด จึงอาจทำให้เกิดการประมวลผลอย่างหนักในเธรด UI และทำให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ช้า
ไลบรารีลิงก์ด่วนเป็นกลยุทธ์ที่ดีกว่าสําหรับแอปขนาดใหญ่ โดยใช้ IntersectionObserver API เพื่อโหลดโมดูลที่เชื่อมโยงกับลิงก์ที่แสดงอยู่ในหน้าเว็บล่วงหน้าเท่านั้น
คุณเพิ่มลิงก์ด่วนลงในแอป Angular ได้โดยใช้แพ็กเกจ ngx-quicklink เริ่มต้นด้วยการติดตั้งแพ็กเกจจาก npm โดยทำดังนี้
npm install --save ngx-quicklink
เมื่อพร้อมใช้งานในโปรเจ็กต์แล้ว คุณจะใช้ QuicklinkStrategy
ได้โดยระบุ preloadingStrategy
ของเราเตอร์และนําเข้า QuicklinkModule
ดังนี้
import {QuicklinkStrategy, QuicklinkModule} from 'ngx-quicklink';
…
@NgModule({
…
imports: [
…
QuicklinkModule,
RouterModule.forRoot([…], {
preloadingStrategy: QuicklinkStrategy
})
],
…
})
export class AppModule {}
ตอนนี้เมื่อเปิดแอปพลิเคชันอีกครั้ง คุณจะเห็นว่าเราเตอร์โหลด nyan-nyan-module.js
ล่วงหน้าเท่านั้น เนื่องจากปุ่มตรงกลางหน้าเว็บมีลิงก์ไปยังเราเตอร์ และเมื่อเปิดการนําทางด้านข้าง คุณจะเห็นว่าเราเตอร์โหลดเส้นทาง "เกี่ยวกับ" ไว้ล่วงหน้าแล้ว
การใช้กลยุทธ์การโหลด Quicklink ล่วงหน้าในหลายข้อบังคับการโหลดแบบเลื่อนเวลา
ตัวอย่างข้างต้นใช้ได้กับแอปพลิเคชันพื้นฐาน แต่หากแอปพลิเคชันมีโมดูลที่โหลดแบบเลื่อนเวลาไว้หลายรายการ คุณจะต้องนําเข้า QuicklinkModule
ไปยังโมดูลที่แชร์ ส่งออก แล้วนําเข้าโมดูลที่แชร์ไปยังโมดูลที่โหลดแบบเลื่อนเวลาไว้
ก่อนอื่น ให้นําเข้า QuicklinkModule
จาก ngx-quicklink
ไปยังข้อบังคับที่แชร์และส่งออก โดยทําดังนี้
import { QuicklinkModule } from 'ngx-quicklink';
…
@NgModule({
…
imports: [
QuicklinkModule
],
exports: [
QuicklinkModule
],
…
})
export class SharedModule {}
จากนั้นนําเข้า SharedModule
ไปยังโมดูลที่โหลดแบบเลื่อนเวลาทั้งหมดโดยทำดังนี้
import { SharedModule } from '@app/shared/shared.module';
…
@NgModule({
…
imports: [
SharedModule
],
…
});
ตอนนี้ Quicklinks
จะพร้อมใช้งานในโมดูลที่โหลดแบบเลื่อนลงแล้ว
ประโยชน์เพิ่มเติมจากการโหลดล่วงหน้าขั้นพื้นฐาน
แม้ว่าการโหลดล่วงหน้าแบบเลือกผ่าน Quick Link จะช่วยเพิ่มความเร็วในการไปยังส่วนต่างๆ ได้อย่างมาก แต่คุณยังทำให้กลยุทธ์การโหลดล่วงหน้ามีประสิทธิภาพมากขึ้นด้วยการใช้การโหลดล่วงหน้าแบบคาดการณ์ ซึ่งติดตั้งใช้งานโดย Guess.js เมื่อวิเคราะห์รายงานจาก Google Analytics หรือผู้ให้บริการข้อมูลวิเคราะห์รายอื่น Guess.js จะคาดการณ์เส้นทางการไปยังส่วนต่างๆ ของผู้ใช้ และโหลดล่วงหน้าเฉพาะกลุ่ม JavaScript ที่อาจมีการใช้ในลำดับถัดไป
ดูวิธีใช้ Guess.js กับ Angular ได้ในหน้านี้จากเว็บไซต์ Guess.js
บทสรุป
วิธีเร่งความเร็วในการไปยังส่วนต่างๆ เมื่อใช้การแยกโค้ดระดับเส้นทาง
- เลือกกลยุทธ์การโหลดล่วงหน้าที่เหมาะสมตามขนาดของแอปพลิเคชัน ดังนี้
- แอปพลิเคชันที่มีโมดูลไม่มากนักสามารถใช้กลยุทธ์
PreloadAllModules
ในตัวของ Angular ได้ - แอปพลิเคชันที่มีโมดูลจํานวนมากควรใช้กลยุทธ์การโหลดล่วงหน้าที่กําหนดเอง เช่น Quicklink ของ Angular หรือการโหลดล่วงหน้าแบบคาดการณ์ตามที่ติดตั้งใช้งานใน Guess.js
- แอปพลิเคชันที่มีโมดูลไม่มากนักสามารถใช้กลยุทธ์
- กําหนดค่ากลยุทธ์การโหลดล่วงหน้าโดยการตั้งค่าพร็อพเพอร์ตี้
preloadStrategy
ของเราเตอร์ Angular