Pembaruan 5/24/2018: Kami sekarang +3 versi Angular dari pos asli saya dan masih belum memiliki solusi final yang bisa diterapkan. Lars Meijdam (@LarsMeijdam) telah datang dengan pendekatan yang menarik yang tentunya patut dilihat. (Karena masalah kepemilikan, ia harus menghapus sementara repositori GitHub tempat ia memposting sampelnya. Namun, Anda dapat mengirim pesan kepadanya secara langsung jika Anda ingin salinannya. Silakan lihat komentar di bawah ini untuk info lebih lanjut.)
Perubahan arsitektur terbaru di Angular 6 memang membawa kita lebih dekat ke solusi. Selain itu, Elemen Sudut ( https://angular.io/guide/elements ) menyediakan beberapa fungsionalitas komponen - meskipun tidak cukup seperti yang saya jelaskan di posting ini.
Jika ada orang dari tim Angular yang luar biasa menemukan ini, harap perhatikan bahwa tampaknya ada banyak orang lain yang juga sangat tertarik dengan fungsi ini. Mungkin layak dipertimbangkan untuk jaminan simpanan.
Saya ingin menerapkan pluggable (plug-in) kerangka dalam Angular 2
, Angular 4
, Angular 5
, atau Angular 6
aplikasi.
(Kasus penggunaan spesifik saya untuk mengembangkan kerangka kerja pluggable ini adalah bahwa saya perlu mengembangkan sistem manajemen konten mini. Untuk sejumlah alasan yang tidak perlu diuraikan di sini, Angular 2/4/5/6
sangat cocok untuk sebagian besar kebutuhan sistem itu.)
Dengan kerangka kerja pluggable (atau arsitektur plug-in), secara khusus saya maksudkan sistem yang memungkinkan pengembang pihak ketiga untuk membuat atau memperluas fungsionalitas aplikasi primer melalui penggunaan komponen pluggable tanpa memiliki akses langsung ke atau pengetahuan kode sumber aplikasi utama atau kerja batin .
(Ungkapan tentang " tanpa memiliki akses langsung ke atau pengetahuan tentang kode sumber aplikasi atau pekerjaan dalam " adalah tujuan inti.)
Contoh kerangka kerja pluggable termasuk sistem manajemen konten umum seperti WordPress
atau Drupal
.
Situasi yang ideal (seperti dengan Drupal) adalah sederhana untuk dapat menempatkan komponen-komponen yang dapat dicolokkan ini (atau plug-in) ke dalam folder, membuat aplikasi mendeteksi secara otomatis atau menemukannya, dan secara ajaib "bekerja". Setelah ini terjadi dalam semacam hot-pluggable, yang berarti ketika aplikasi sedang berjalan, akan lebih optimal.
Saat ini saya mencoba menentukan jawaban ( dengan bantuan Anda ) untuk lima pertanyaan berikut.
- Kepraktisan: Apakah kerangka kerja plugin untuk suatu
Angular 2/4/5/6
aplikasi bahkan praktis? (Sampai sekarang, saya belum menemukan cara praktis untuk membuat kerangka kerja yang benar-benar dapat dicocokkan denganAngular2/4/5/6
.) - Tantangan yang Diharapkan: Tantangan apa yang mungkin dihadapi seseorang dalam mengimplementasikan kerangka kerja plugin untuk suatu
Angular 2/4/5/6
aplikasi? - Strategi Implementasi: Teknik atau strategi spesifik apa yang dapat digunakan untuk mengimplementasikan kerangka kerja plugin untuk suatu
Angular 2/4/5/6
aplikasi? - Praktik Terbaik: Apa praktik terbaik untuk menerapkan sistem plugin untuk
Angular 2/4/5/6
aplikasi? - Teknologi Alternatif: Jika kerangka kerja plugin tidak praktis dalam suatu
Angular 2/4/5/6
aplikasi, teknologi apa yang relatif setara (mis.React
) Mungkin cocok untuk aplikasi Web modern yang sangat reaktif ?
Secara umum, penggunaan Angular 2/4/5/6
sangat diinginkan karena:
- secara alami sangat cepat - sangat menyenangkan.
- ini mengkonsumsi bandwidth yang sangat sedikit (setelah beban awal)
- ia memiliki jejak yang relatif kecil (setelah
AOT
dantree shaking
) - dan jejak itu terus menyusut - ini sangat fungsional, dan tim Angular dan komunitas terus tumbuh pesat dalam ekosistemnya
- ini bekerja dengan baik dengan banyak teknologi Web terbaik dan terbaru seperti
TypeScript
danObservables
- Angular 5 sekarang mendukung pekerja layanan ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- didukung oleh
Google
, kemungkinan akan didukung dan ditingkatkan hingga masa depan
Saya sangat ingin menggunakan Angular 2/4/5/6
untuk proyek saya saat ini. Jika saya dapat menggunakan Angular 2/4/5/6
, saya juga akan menggunakan Angular-CLI
dan mungkin Angular Universal
(untuk rendering sisi server.)
Inilah pemikiran saya, sejauh ini, mengenai pertanyaan di atas. Harap tinjau dan berikan umpan balik dan pencerahan Anda.
Angular 2/4/5/6
aplikasi mengkonsumsi paket - tetapi ini tidak selalu sama dengan mengizinkan plugin dalam suatu aplikasi. Plugin di sistem lain (misalnyaDrupal
) pada dasarnya dapat ditambahkan dengan menjatuhkan folder plugin ke direktori modul umum di mana ia secara otomatis "diambil" oleh sistem. DalamAngular 2/4/5/6
, sebuah paket (seperti plugin mungkin) biasanya diinstal melaluinpm
, ditambahkan kepackage.json
, dan kemudian diimpor secara manual ke dalam aplikasi - seperti padaapp.module
. Ini jauh lebih rumit daripadaDrupal
metode menjatuhkan folder dan memiliki sistem yang secara otomatis mendeteksi paket. Semakin rumit menginstal plugin, semakin kecil kemungkinan orang akan menggunakannya. Akan jauh lebih baik jika ada jalan untuk ituAngular 2/4/5/6
untuk secara otomatis mendeteksi dan menginstal plugin. Saya sangat tertarik untuk menemukan metode yang memungkinkan non-pengembang untuk menginstalAngular 2/4/5/6
aplikasi dan menginstal plugin apa pun yang dipilih tanpa harus memahami semua arsitektur aplikasi.Secara umum, salah satu manfaat dari menyediakan arsitektur pluggable, adalah sangat mudah bagi pengembang pihak ke-3 untuk memperluas fungsionalitas sistem. Jelas, pengembang ini tidak akan terbiasa dengan semua seluk-beluk kode untuk aplikasi yang mereka gunakan. Setelah plugin dikembangkan, pengguna lain yang bahkan kurang teknis dapat menginstal aplikasi dan plugin yang dipilih. Namun,
Angular 2/4/5/6
ini relatif rumit dan memiliki kurva belajar yang sangat panjang. Untuk hal-hal menyulitkan lanjut, sebagian besar produksiAngular 2/4/5/6
aplikasi juga memanfaatkanAngular-CLI
,Angular Universal
danWebPack
. Seseorang yang menerapkan plugin mungkin harus memiliki setidaknya beberapa pengetahuan dasar tentang bagaimana semua ini cocok bersama - bersama dengan pengetahuan kerja yang kuat tentangTypeScript
dan keakraban yang wajar denganNodeJS
. Apakah persyaratan pengetahuan sangat ekstrem sehingga tidak ada pihak ketiga yang ingin mengembangkan plugin?Sebagian besar plugin kemungkinan memiliki beberapa komponen sisi server (misalnya untuk menyimpan / mengambil data terkait plugin) serta beberapa output sisi klien.
Angular 2/4/5
secara khusus (dan sangat) mencegah pengembang dari menyuntikkan templat mereka sendiri pada saat runtime - karena ini menimbulkan risiko keamanan yang serius. Untuk menangani banyak jenis output yang dapat ditampung oleh plugin (misalnya tampilan grafik), tampaknya memungkinkan pengguna untuk membuat konten yang disuntikkan ke aliran respons, dalam satu bentuk yang lain, mungkin diperlukan. Saya bertanya-tanya bagaimana mungkin untuk mengakomodasi kebutuhan ini tanpaAngular 2/4/5/6
mekanisme keamanan yang sobek-sobek .Sebagian besar
Angular 2/4/5/6
aplikasi produksi sudah dikompilasi menggunakan kompilasiAhead of Time
(AOT
). (Mungkin semua harus.) Saya tidak yakin bagaimana plugin dapat ditambahkan ke (atau diintegrasikan dengan) aplikasi yang telah dikompilasi. Skenario terbaik akan melibatkan kompilasi plugin secara terpisah dari aplikasi utama. Namun, saya tidak yakin bagaimana membuat ini bekerja. Sebuah fallback mungkin untuk mengkompilasi ulang seluruh aplikasi dengan plugin yang disertakan tetapi hal itu sedikit mempersulit pengguna administratif yang hanya ingin menginstal aplikasi (di servernya sendiri) bersama dengan plugins yang dipilih.Dalam suatu
Angular 2/4/5/6
aplikasi, terutama yang sudah dikompilasi sebelumnya, satu bagian kode yang salah atau bertentangan dapat merusak seluruh aplikasi.Angular 2/4/5/6
aplikasi tidak selalu paling mudah untuk di-debug. Penerapan plugin yang berperilaku buruk dapat menghasilkan pengalaman yang sangat tidak menyenangkan. Saat ini saya tidak mengetahui mekanisme untuk menangani plugin yang berperilaku buruk.