ค้นหาเว็บไซต์

angular - แชร์โมดูลภายนอกระหว่างโมดูลที่โหลดแบบขี้เกียจใน angular2


แอปของฉันมีคอมโพเนนต์ที่ใช้แพ็กเกจภายนอกขนาดใหญ่ (ag-grid, ประมาณ 1MB) ซึ่งถูกจัดเตรียมมาเป็นโมดูลของ Angular2 (AgGridModule) ฉันต้องการโหลดแพ็กเกจนี้เฉพาะเมื่อคอมโพเนนต์ที่ใช้งานมันถูกเรียกใช้ ดังนั้น ContentModule และซับโมดูลทั้งหมดของมันจะถูกโหลดแบบ lazy-loaded โครงสร้างทั้งหมดมีลักษณะดังนี้:

อย่างไรก็ตาม เมื่อฉันนำเข้า AgGridModule ทั้งใน Submodule1 และ Submodule3 มันจึงถูกรวมอยู่ในไฟล์ JS ที่คอมไพล์แล้วสองครั้ง ทำให้ทั้ง 1.chunk.js และ 3.chunk.js มีขนาดใหญ่ ฉันได้ลองนำเข้ามันใน ContentModule แต่กระนั้น submodules ก็ไม่รู้จักคอมโพเนนต์ที่รวมอยู่ใน AgGridModule แม้ว่าฉันจะระบุพวกมันในพร็อพเพอร์ตี้ exports ของ ContentModule ก็ตาม

@NgModule({
  imports: [
    ContentRoutingModule,
    SomeOtherModule,
    AgGridModule.withComponents([])
  ],
  exports: [
    // this is the component from AgGridModule that I use
    AgGridNg2
  ]
})
export class ContentModule { }

มีวิธีใดบ้างในการแชร์โมดูลระหว่างโมดูลที่โหลดแบบขี้เกียจ หรือเพื่อเปิดเผยบางส่วนของโมดูลที่นำเข้ากับลูกที่โหลดแบบขี้เกียจ?

อัปเดต: การสร้างโมดูลแชร์และนำเข้าไปในซับโมดูลไม่ช่วยอะไร ยังคงมีสองชิ้นส่วนประมาณ 1MB แต่ละชิ้น:

UPD2: ฉันแก้ปัญหาได้ชั่วคราวโดยการรวม Submodule1 และ Submodule3 เป็นโมดูลเดียว

คำตอบ #1

คุณจำเป็นต้องสร้าง SharedAgGridModule:

@NgModule({
  imports: [
    AgGridModule.withComponents([])
  ],
  exports: [
    ContentModule,
    AgGridModule
  ]
})
export class SharedAgGridModule{}

ดังนั้นคุณควรนำเข้ามอดูลนี้เฉพาะสำหรับซับมอดูลที่ใช้ AgGrid เท่านั้น ไม่จำเป็นต้องนำเข้า ContentModule ในซับมอดูลเหล่านั้นด้วย เพราะมันถูกส่งออกในมอดูลนี้แล้ว

คำตอบ #2

คุณสามารถใช้ SharedModule ที่คุณ import รวมถึง export AgGridModule คุณต้อง export โมดูลทั้งหมด AgGridModule ไม่ใช่แค่คอมโพเนนต์ที่คุณใช้

จากนั้นคุณก็สามารถ import SharedModule ใน Submodule1 และ Submodule3 ได้อย่างง่ายดาย

บทความที่เกี่ยวข้อง