Cập nhật 24/5/2018: Chúng tôi hiện là +3 phiên bản Angular từ bài đăng gốc của tôi và vẫn chưa có giải pháp khả thi cuối cùng. Lars Meijdam (@LarsMeijdam) đã đưa ra một cách tiếp cận thú vị mà chắc chắn đáng xem. (Do vấn đề độc quyền, anh ấy đã phải tạm thời xóa kho GitHub nơi anh ấy đã đăng mẫu ban đầu của mình. Tuy nhiên, bạn có thể nhắn tin trực tiếp cho anh ấy nếu bạn muốn có một bản sao. Vui lòng xem các bình luận bên dưới để biết thêm thông tin.)
Những thay đổi kiến trúc gần đây trong Angular 6 đã đưa chúng ta đến gần hơn với một giải pháp. Ngoài ra, các yếu tố góc ( https://angular.io/guide/elements ) cung cấp một số chức năng thành phần - mặc dù không hoàn toàn như những gì tôi mô tả ban đầu trong bài viết này.
Nếu bất cứ ai trong nhóm Angular tuyệt vời tình cờ bắt gặp điều này, xin lưu ý rằng dường như có nhiều người khác cũng rất quan tâm đến chức năng này. Nó có thể là giá trị xem xét cho các tồn đọng.
Tôi muốn thực hiện một (plug-in) khuôn khổ cắm trong một Angular 2
, Angular 4
, Angular 5
, hoặc Angular 6
ứng dụng.
(Trường hợp sử dụng cụ thể của tôi để phát triển khung có thể cắm này là tôi cần phát triển hệ thống quản lý nội dung thu nhỏ. Vì một số lý do không nhất thiết phải được xây dựng ở đây, Angular 2/4/5/6
là một sự phù hợp gần như hoàn hảo cho hầu hết các nhu cầu của hệ thống đó.)
Theo khung có thể cắm (hoặc kiến trúc trình cắm), tôi đặc biệt có nghĩa là một hệ thống cho phép các nhà phát triển bên thứ ba tạo hoặc mở rộng chức năng của ứng dụng chính thông qua việc sử dụng các thành phần có thể cắm được mà không cần truy cập trực tiếp hoặc hiểu biết về mã nguồn của ứng dụng chính hoặc hoạt động bên trong .
(Đó là cụm từ về " không có quyền truy cập trực tiếp hoặc kiến thức về mã nguồn hoặc hoạt động bên trong của ứng dụng " là mục tiêu cốt lõi.)
Ví dụ về các khung có thể cắm bao gồm các hệ thống quản lý nội dung phổ biến như WordPress
hoặc Drupal
.
Tình huống lý tưởng (như với Drupal) là đơn giản để có thể đặt các thành phần có thể cắm (hoặc plugin) này vào một thư mục, để ứng dụng tự động phát hiện hoặc khám phá chúng và giúp chúng hoạt động một cách kỳ diệu. Có điều này xảy ra theo một cách thức nào đó có thể cắm nóng, có nghĩa là trong khi ứng dụng đang chạy, sẽ là tối ưu.
Tôi hiện đang cố gắng xác định câu trả lời ( với sự giúp đỡ của bạn ) cho năm câu hỏi sau đây.
- Tính thực tiễn: Là một khung plugin cho một
Angular 2/4/5/6
ứng dụng thậm chí là thực tế? (Cho đến bây giờ, tôi chưa tìm thấy bất kỳ cách thực tế nào để tạo ra một khung thực sự có thể cắm đượcAngular2/4/5/6
.) - Những thách thức dự kiến: Những thách thức nào người ta có thể gặp phải khi triển khai khung plugin cho một
Angular 2/4/5/6
ứng dụng? - Chiến lược triển khai: Những kỹ thuật hoặc chiến lược cụ thể nào có thể được sử dụng để triển khai khung plugin cho
Angular 2/4/5/6
ứng dụng? - Thực tiễn tốt nhất: Thực tiễn tốt nhất để triển khai hệ thống plugin cho
Angular 2/4/5/6
ứng dụng là gì? - Các công nghệ thay thế: Nếu một khung plugin không thực tế trong một
Angular 2/4/5/6
ứng dụng, công nghệ tương đối nào (ví dụReact
) có thể phù hợp với một ứng dụng Web có tính phản ứng cao hiện đại ?
Nói chung, việc sử dụng Angular 2/4/5/6
là rất mong muốn bởi vì:
- nó tự nhiên cực kỳ nhanh - rực rỡ như vậy.
- nó tiêu thụ rất ít băng thông (sau khi tải ban đầu)
- nó có một dấu chân tương đối nhỏ (sau
AOT
vàtree shaking
) - và dấu chân đó tiếp tục co lại - nó có tính ứng dụng cao, và nhóm Angular và cộng đồng đang tiếp tục phát triển nhanh chóng hệ sinh thái của nó
- nó chơi tốt với nhiều công nghệ Web mới nhất và tốt nhất như
TypeScript
vàObservables
- Angular 5 hiện hỗ trợ nhân viên dịch vụ ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-proTHERive-web-apps-part-1-theory-37d7d7647cc7 )
- được hỗ trợ bởi
Google
, nó có khả năng sẽ được hỗ trợ và nâng cao trong tương lai
Tôi rất muốn sử dụng Angular 2/4/5/6
cho dự án hiện tại của tôi. Nếu tôi có thể sử dụng Angular 2/4/5/6
, tôi cũng sẽ sử dụng Angular-CLI
và có lẽ Angular Universal
(để kết xuất phía máy chủ.)
Dưới đây là những suy nghĩ của tôi, cho đến nay, liên quan đến các câu hỏi ở trên. Vui lòng xem xét và cung cấp thông tin phản hồi và giác ngộ của bạn.
Angular 2/4/5/6
các ứng dụng tiêu thụ các gói - nhưng điều này không nhất thiết giống như cho phép các plugin trong một ứng dụng. Một plugin trong các hệ thống khác (ví dụDrupal
) về cơ bản có thể được thêm bằng cách thả thư mục plugin vào thư mục mô-đun chung nơi hệ thống tự động "nhặt". TrongAngular 2/4/5/6
, một gói (như một plugin có thể) thường được cài đặt quanpm
, thêm vàopackage.json
, sau đó nhập thủ công vào ứng dụng - như trongapp.module
. Điều này phức tạp hơn nhiều so vớiDrupal
phương pháp bỏ thư mục và hệ thống tự động phát hiện gói. Việc cài đặt một plugin càng phức tạp thì càng ít khả năng mọi người sẽ sử dụng chúng.Sẽ tốt hơn nhiều nếu có một cách choAngular 2/4/5/6
để tự động phát hiện và cài đặt plugin. Tôi rất muốn tìm một phương pháp cho phép những người không phải là nhà phát triển cài đặtAngular 2/4/5/6
ứng dụng và cài đặt bất kỳ plugin nào được chọn mà không cần phải hiểu tất cả kiến trúc của ứng dụng.Nói chung, một trong những lợi ích của việc cung cấp kiến trúc có thể cắm được là rất dễ dàng cho các nhà phát triển bên thứ 3 mở rộng chức năng của hệ thống. Rõ ràng, các nhà phát triển này sẽ không quen thuộc với tất cả những điều phức tạp của mã cho ứng dụng mà họ đang cắm vào. Khi các plugin được phát triển, những người dùng ít kỹ thuật khác thậm chí có thể chỉ cần cài đặt ứng dụng và mọi plugin đã chọn. Tuy nhiên,
Angular 2/4/5/6
tương đối phức tạp và có thời gian học tập rất dài. Để điều phức tạp hơn nữa, hầu hết các sản xuấtAngular 2/4/5/6
các ứng dụng cũng sử dụngAngular-CLI
,Angular Universal
vàWebPack
. Ai đó đang thực hiện một plugin có thể phải có ít nhất một số kiến thức cơ bản về cách tất cả các plugin này khớp với nhau - cùng với kiến thức làm việc mạnh mẽ vềTypeScript
và một sự quen thuộc hợp lý vớiNodeJS
. Các yêu cầu về kiến thức có cực đoan đến mức không bên thứ ba nào muốn phát triển plugin không?Hầu hết các plugin có thể sẽ có một số thành phần phía máy chủ (ví dụ: để lưu trữ / truy xuất dữ liệu liên quan đến plugin) cũng như một số đầu ra phía máy khách.
Angular 2/4/5
cụ thể (và mạnh mẽ) không khuyến khích các nhà phát triển tiêm các mẫu riêng của họ khi chạy - vì điều này gây rủi ro bảo mật nghiêm trọng. Để xử lý nhiều loại đầu ra mà plugin có thể chứa (ví dụ: hiển thị biểu đồ), có vẻ như cho phép người dùng tạo nội dung được đưa vào luồng phản hồi, dưới dạng khác, có thể là cần thiết. Tôi tự hỏi làm thế nào có thể đáp ứng nhu cầu này mà không cần cắt xén theoAngular 2/4/5/6
cơ chế bảo mật.Hầu hết các
Angular 2/4/5/6
ứng dụng sản xuất được biên dịch trước bằng cách sử dụngAhead of Time
(AOT
) biên dịch. (Có lẽ tất cả nên như vậy.) Tôi không chắc chắn làm thế nào các plugin có thể được thêm vào (hoặc tích hợp với) các ứng dụng được biên dịch trước. Kịch bản tốt nhất sẽ liên quan đến việc biên dịch các plugin riêng biệt với ứng dụng chính. Tuy nhiên, tôi không chắc làm thế nào để làm cho công việc này. Một dự phòng có thể là biên dịch lại toàn bộ ứng dụng với bất kỳ plugin nào đi kèm nhưng điều đó làm phức tạp mọi thứ một chút cho người dùng quản trị, những người chỉ muốn cài đặt ứng dụng (trên máy chủ của chính mình) cùng với bất kỳ plugin nào được chọn.Trong một
Angular 2/4/5/6
ứng dụng, đặc biệt là một ứng dụng được biên dịch sẵn, một đoạn mã sai lầm hoặc xung đột có thể phá vỡ toàn bộ ứng dụng.Angular 2/4/5/6
các ứng dụng không phải lúc nào cũng dễ gỡ lỗi nhất. Áp dụng các plugin hành vi xấu có thể dẫn đến trải nghiệm rất khó chịu. Tôi hiện không biết về một cơ chế để xử lý các plugin có hành vi xấu.