Angular 5 - โหลดโมดูล (ที่ไม่รู้จัก ณ เวลาคอมไพล์) แบบไดนามิก ณ รันไทม์

เป็นไปได้ไหมที่ Angular 5 จะโหลดโมดูล / ส่วนประกอบที่ไม่รู้จัก ณ เวลาคอมไพล์ แต่ระหว่างรันไทม์แบบไดนามิก

ฉันเดาว่านี่จะใช้ไม่ได้กับ webpack แต่อาจใช้ system.js ใช่ไหม

แก้ไข:

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


person user2818430    schedule 02.02.2018    source แหล่งที่มา


คำตอบ (2)


ถึงแม้ว่าจะมีความซับซ้อน แต่คุณสามารถลองได้ ฉันเดาว่าขึ้นอยู่กับฐานรหัสของคุณ เราเตอร์แสดงคุณสมบัติ config เก็บการกำหนดค่าปัจจุบันไว้ และวิธี resetConfig(routes: Routes) สำหรับการรีเซ็ตการกำหนดค่า คุณสามารถเริ่มต้นจากตรงนั้น และเพิ่มส่วนประกอบต่างๆ ได้ทันที

แม้ว่าส่วนประกอบต่างๆ จะต้องเข้าถึงได้ อาจสร้างขึ้นแบบไดนามิกดังที่กล่าวไว้ในคำตอบอื่น ๆ หรืออีกทางหนึ่ง การกำหนดค่าของคุณอาจมีดังนี้:

constructor(private router: Router) {}

private addPlugin(routePath, pluginName, pluginPath) {
    const currentConfig = this.router.config;
    currentConfig.push({
        path: routePath,
        loadChildren: `precompiled-modules/${pluginPath}#${pluginName}`,
    });
    this.router.resetConfig(currentConfig);
}

คุณจะต้องได้รับ PluginPath และ PluginName ด้วยวิธีใดวิธีหนึ่ง - อาจคำนวณตามแบบแผน อาจเป็นผู้ช่วยแบ็กเอนด์ของ Lil ที่ได้รับสิ่งนี้ อาจมีอาร์เรย์ของอาร์เรย์ที่กำหนดค่าไว้ล่วงหน้าและโหลดแล้วหรือคล้ายกัน ฉันยังถือว่าคุณจะมีระบบทดสอบที่ดีจริงๆ เพื่อให้แน่ใจว่าปลั๊กอินของคุณ "เข้ากันได้" และสุดท้าย สอน webpack/systemjs ถึงวิธีเตรียมโมดูลให้พร้อม โดยรวมแล้วมันไม่ใช่เรื่องที่เป็นไปไม่ได้ แต่มันต้องมีรากฐานบางอย่าง

ดังที่กล่าวไปแล้ว Angular 6 ใกล้เข้ามาแล้ว และด้วยองค์ประกอบเชิงมุม Elements จะให้วิธีการรวบรวมโมดูลของคุณเป็นส่วนประกอบของเว็บและ "ส่งออก" เพื่อให้สามารถใช้งานได้ทุกที่ (ไม่จำเป็นในแอป Angular) ลองนึกถึงปลั๊กอิน jQuery - มีฐาน jQuery.min.js ที่คุณต้องโหลด แต่นอกเหนือจากนั้น คุณไม่คิดถึงมันอีกต่อไป คุณเพียงแค่ใช้องค์ประกอบใหม่ของคุณ มันคล้ายกับ Angular Elements - คุณส่งออกสิ่งที่เป็นส่วนประกอบของเว็บโดยพื้นฐาน มีส่วน "ตัวโหลด" (เทียบเท่า jquery.min.js) และชุดองค์ประกอบของคุณ แต่ส่วนประกอบของคุณก็เป็นเพียงโหนด HTML อื่น ที่มีคุณสมบัติ แอตทริบิวต์ การเชื่อมโยง เหตุการณ์ คุณจะไม่สนใจอีกต่อไป เช่นเดียวกับที่คุณไม่ได้สนใจอินพุต

มันอาจจะคุ้มค่ากับการรอคอย ลองดูและตัดสินใจด้วยตัวเอง

person Zlatko    schedule 19.02.2018
comment
คุณทำให้มันใช้งานได้ในรันไทม์หรือไม่? ฉันลองใช้วิธีแก้ปัญหาหลายวิธี แต่ webpack (cli) สร้าง chunkfiles สำหรับทุกการอ้างอิงโมดูลที่กล่าวถึงในคุณสมบัติ loadChildren หากฉันจะขยายเราเตอร์เมื่อฉันอยู่ที่รันไทม์แล้ว ฉันจะได้รับโมดูลที่ไม่พบข้อยกเว้นและแอปพลิเคชันล้มเหลว Angular Elements ดูมีแนวโน้มว่าจะโหลดองค์ประกอบต่างๆ ได้ทันที! แต่ในโครงการของเรา ส่วนใหญ่จะกำหนดเส้นทางไปยัง 'โมดูล' ใหม่และ/หรือที่อัปเดต - person Lars Meijdam; 03.05.2018
comment
ไม่ ไม่ได้ลองทำสิ่งนี้กับบิลด์ที่ใช้งานจริง ในส่วนของ Angular Elements ก็มีวางจำหน่ายแล้วในตอนนี้ แต่เป็นการรวมกลุ่มที่ค่อนข้างใหญ่ (เช่น 1mb) สำหรับ webpack คุณต้องสร้างการกำหนดค่าและเล่นสักหน่อยเพื่อให้ได้บันเดิลที่เหมาะสมซึ่งสามารถโหลดได้ด้วยวิธีนี้ และคุณต้องสอนบันเดิลหลักเกี่ยวกับส่วนเสริมเหล่านี้ นั่นอาจจะเกี่ยวข้องกับการทำงานด้วยตนเองด้วย อาจจะไม่คุ้มค่าสำหรับกรณีส่วนใหญ่ แต่ถ้าคุณเป็นหนึ่งในกรณีที่คุ้มค่า มันก็คุ้มที่จะยุ่งกับมันทั้งหมดด้วยตนเอง - person Zlatko; 03.05.2018
comment
ขอบคุณ! จะเจาะลึกลงไปมากกว่านี้ ในระหว่างนี้ฉันก็โพสต์คำถามเกี่ยวกับเรื่องนี้ด้วย stackoverflow.com/questions/50149016/ เกี่ยวกับ AE จริง ๆ แล้วไฟล์ยังคงมีขนาดค่อนข้างใหญ่ แต่ก็ยังค่อนข้าง 'ยังเด็ก' :) - person Lars Meijdam; 03.05.2018

คุณสามารถดูการโหลดส่วนประกอบแบบไดนามิก: https://angular.io/guide/dynamic-component-loader

ช่วยให้คุณสามารถเพิ่มส่วนประกอบแบบไดนามิกขณะรันไทม์ได้

person DeborahK    schedule 02.02.2018
comment
มันจะใช้งานได้ในสถานการณ์นี้หรือไม่ โดยที่ฉันสร้างแอปเชิงมุม ปรับใช้ และสร้างส่วนประกอบเดียวในภายหลัง วางลงในโฟลเดอร์แอป จากนั้นแอปเชิงมุมจะเลือกมันโดยไม่ต้องคอมไพล์แอปพลิเคชันทั้งหมดใหม่และปรับใช้ใหม่ - person user2818430; 02.02.2018
comment
ป.ล. ขอบคุณสำหรับหลักสูตร Angular ที่ยอดเยี่ยมบน Pluralsight :) - person user2818430; 02.02.2018
comment
คุณเคยเห็นการสนทนาที่นี่หรือไม่: stackoverflow.com/questions/41438198/ - person DeborahK; 02.02.2018
comment
ฉันสร้างพื้นที่เก็บข้อมูลบน GitHub ด้วยวิธีแก้ปัญหาที่อาจช่วยได้ มันใช้ไลบรารี Angular 6 และแอปพลิเคชั่นพื้นฐาน 1 ตัวซึ่งโหลดไลบรารี่ที่รวม UMD อย่างเกียจคร้าน github.com/lmeijdam/angular-umd-dynamic-example หากคุณมี ข้อเสนอแนะใด ๆ โปรดเพิ่ม! - person Lars Meijdam; 09.05.2018