Angular 2, 4, 5, 6에서 플러그인 아키텍처 / 플러그인 시스템 / 플러그 가능 프레임 워크 구현


133

2018 년 5 월 24 일 업데이트 : 우리는 이제 원래 게시물에서 +3 버전의 Angular를 사용하고 있으며 최종적으로 실행 가능한 솔루션이 없습니다. Lars Meijdam (@LarsMeijdam)은 확실히 볼만한 가치가있는 흥미로운 접근법을 고안했습니다. 독점 문제로 인해 원래 샘플을 게시 한 GitHub 리포지토리를 일시적으로 제거해야했습니다. 그러나 사본을 원하면 직접 메시지를 보낼 수 있습니다. 자세한 내용은 아래 주석을 참조하십시오.

Angular 6의 최근 아키텍처 변경으로 인해 솔루션에 더 가깝습니다. 또한 Angular Elements ( https://angular.io/guide/elements )는 몇 가지 구성 요소 기능을 제공하지만 원래이 게시물에서 설명한 것과는 다릅니다.

놀라운 Angular 팀의 누군가 가이 문제를 겪게되면이 기능에도 관심이 많은 다른 사람들이있는 것처럼 보입니다. 백 로그를 고려할 가치가 있습니다.


나는의 플러그 (플러그인) 프레임 워크 구현하고 싶은 Angular 2, Angular 4, Angular 5, 또는 Angular 6응용 프로그램을.

(플러그 가능한 프레임 워크를 개발하기위한 특정 사용 사례는 소형 컨텐츠 관리 시스템을 개발해야한다는 것입니다. 여기에서 자세히 설명 할 필요는없는 여러 가지 이유로 Angular 2/4/5/6해당 시스템의 대부분의 요구에 거의 완벽하게 맞습니다.)

플러그 가능한 프레임 워크 (또는 플러그인 아키텍처) 란 특히 타사 개발자가 기본 응용 프로그램의 소스 코드에 직접 액세스하거나 지식없이 플러그 가능 구성 요소 사용하여 기본 응용 프로그램의 기능을 만들거나 확장 할 수있는 시스템을 의미 합니다. 또는 내부 작업 .

( " 응용 프로그램의 소스 코드 나 내부 작업에 직접 액세스하거나 지식을 얻지 않고 "라는 문구 는 핵심 목표입니다.)

플러그 프레임 워크의 예는 같은 일반적인 콘텐츠 관리 시스템 포함 WordPress또는 Drupal.

Drupal과 같은 이상적인 상황은 이러한 플러그 가능 구성 요소 (또는 플러그인)를 폴더에 간단하게 배치하고 응용 프로그램이 자동으로 감지하거나 발견하게하고 마술처럼 "작동"하도록하는 것입니다. 앱이 실행되는 동안 핫 플러그 ​​가능한 방식으로 발생하는 것이 가장 좋습니다.

나는 현재 (답변 결정하기 위해 노력하고 여러분의 도움으로 다음과 같은 다섯 개 가지 질문을).

  1. 실용성 :Angular 2/4/5/6 애플리케이션을 위한 플러그인 프레임 워크는 실용적입니까? (지금까지는를 사용하여 진정한 플러그 가능한 프레임 워크를 만드는 실용적인 방법을 찾지 못했습니다 Angular2/4/5/6.)
  2. 예상되는 과제 :Angular 2/4/5/6 애플리케이션 의 플러그인 프레임 워크를 구현할 때 어떤 문제가 발생할 수 있습니까?
  3. 구현 전략 :Angular 2/4/5/6 애플리케이션 의 플러그인 프레임 워크를 구현하기 위해 어떤 특정 기술 또는 전략을 사용할 수 있습니까?
  4. 모범 사례 :Angular 2/4/5/6 애플리케이션 용 플러그인 시스템을 구현하기위한 모범 사례는 무엇입니까 ?
  5. 대체 기술 : 경우 플러그인 프레임 워크가 되지 에 실제 Angular 2/4/5/6응용 프로그램, 무엇을 상대적으로 동등한 기술 (예를 들어 React)이 적합 할 수있는 현대적인 반응성이 매우 높은 웹 응용 프로그램 ?

일반적으로 다음을 사용하는 Angular 2/4/5/6것이 매우 바람직합니다.

  • 당연히 엄청나게 빠릅니다.
  • (초기로드 후) 매우 적은 대역폭을 소비합니다.
  • 발자국이 비교적 작고 (후 AOTtree shaking) 발자국이 계속 줄어 듭니다.
  • 고도로 기능적이며 Angular 팀과 커뮤니티는 생태계의 빠른 성장을 계속하고 있습니다.
  • 이 같은 최고와 최신 웹 기술의 많은 잘 재생 TypeScriptObservables
  • Angular 5는 이제 서비스 워커를 지원합니다 ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
  • Google지원을 받으면 미래에 잘 지원되고 향상 될 것입니다.

Angular 2/4/5/6현재 프로젝트 에 사용 하고 싶습니다. 내가 사용 할 수 있어요 경우 Angular 2/4/5/6, 나는 또한 사용하는 것 Angular-CLI아마와 Angular Universal(서버 측 렌더링.)

위의 질문에 대한 지금까지 나의 생각은 다음과 같습니다. 피드백과 깨달음을 검토하고 제공하십시오.

  • Angular 2/4/5/6앱은 패키지를 사용하지만 이는 애플리케이션 내에서 플러그인을 허용하는 것과 반드시 ​​같을 필요는 없습니다. 다른 시스템 (예 Drupal:)의 플러그인은 플러그인 폴더를 공통 모듈 디렉토리에 드롭하여 시스템에 의해 자동으로 "픽업"되는 본질적으로 추가 될 수 있습니다. 에서 Angular 2/4/5/6(플러그인과 같은) 패키지는 일반적으로를 통해 설치 npm하고에 추가 package.json한 다음에 수동으로 앱으로 가져옵니다 app.module. Drupal폴더를 삭제하고 시스템에서 패키지를 자동으로 감지하는 방법 보다 훨씬 더 복잡 합니다. 플러그인을 설치하는 것이 복잡할수록 사람들이 플러그인을 사용할 가능성이 줄어 듭니다. 방법이 있다면 훨씬 좋을 것입니다Angular 2/4/5/6플러그인을 자동으로 감지하고 설치합니다. 개발자가 아닌 개발자가 Angular 2/4/5/6응용 프로그램의 모든 아키텍처를 이해하지 않고도 응용 프로그램을 설치하고 선택한 플러그인 을 설치할 수있는 방법을 찾고 싶습니다 .

  • 일반적으로 플러그 가능한 아키텍처를 제공함으로써 얻을 수있는 이점 중 하나는 타사 개발자가 시스템 기능을 확장하는 것이 매우 쉽다는 것입니다. 분명히, 이러한 개발자들은 그들이 연결하고있는 응용 프로그램에 대한 코드의 모든 복잡한 부분에 익숙하지 않을 것입니다. 일단 플러그인이 개발되면 기술을 덜 사용하는 다른 사용자도 단순히 애플리케이션과 선택한 플러그인을 설치할 수 있습니다. 그러나 Angular 2/4/5/6비교적 복잡하고 학습 시간이 매우 길다. 더 복잡한 일에, 대부분의 생산 Angular 2/4/5/6응용 프로그램도 활용 Angular-CLI, Angular UniversalWebPack. 플러그인을 구현하는 사람은 아마도 강력한 작업 지식과 함께 이들 모두가 어떻게 결합되는지에 대한 최소한의 기본 지식을 가지고 있어야 할 것입니다.TypeScript에 대한 합리적인 친숙 함 NodeJS. 지식 요구 사항이 너무 높아서 타사가 플러그인을 개발하기를 원하지 않습니까?

  • 대부분의 플러그인에는 일부 서버 측 구성 요소 (예 : 플러그인 관련 데이터 저장 / 검색)와 일부 클라이언트 측 출력이있을 수 있습니다. Angular 2/4/5특히 개발자는 런타임에 자체 템플릿을 주입하지 않아야합니다. 이는 심각한 보안 위험을 초래할 수 있습니다. 플러그인이 수용 할 수있는 많은 유형의 출력을 처리하려면 (예 : 그래프 표시) 사용자가 응답 스트림에 주입 된 콘텐츠를 다른 형식으로 만들 수 있도록 허용하는 것이 필요할 수 있습니다. 필자 Angular 2/4/5/6의 보안 메커니즘 을 비판적으로 파쇄하지 않고 어떻게 이러한 요구를 수용 할 수 있을지 궁금하다 .

  • 대부분의 프로덕션 Angular 2/4/5/6응용 프로그램은 Ahead of Time( AOT) 컴파일을 사용하여 사전 컴파일됩니다. (아마도 모두가 있어야합니다.) 플러그인이 사전 컴파일 된 응용 프로그램에 추가되거나 통합 될 수 있는지 확실하지 않습니다. 가장 좋은 시나리오는 기본 애플리케이션과 별도로 플러그인을 컴파일하는 것입니다. 그러나이 작업을 수행하는 방법을 잘 모르겠습니다. 폴백은 포함 된 플러그인을 사용하여 전체 애플리케이션을 다시 컴파일하는 것일 수 있지만 선택한 플러그인과 함께 애플리케이션을 자신의 서버에 설치하려는 관리 사용자에게는 약간 복잡합니다.

  • 에서 Angular 2/4/5/6응용 프로그램, 특히 미리 컴파일 된 하나, 잘못된의 한 조각 또는 충돌 코드 전체 응용 프로그램을 중단 할 수 있습니다. Angular 2/4/5/6응용 프로그램이 항상 디버그하기 가장 쉬운 것은 아닙니다. 잘못 작동하는 플러그인을 적용하면 매우 불쾌한 경험이 발생할 수 있습니다. 현재 동작하지 않는 플러그인을 정상적으로 처리하는 메커니즘을 알지 못합니다.


1
내 의견으로는, 각도 2 모듈은 플러그인입니다. @ angular / router, @ angular / forms, @ angular / http, @ angular / material, 이것들은 angular의 'plugins'입니다. 우리는 그들이 어떻게 'plugins'를 만드는지 확인할 수 있습니다.
Timathon

8
불행히도 @Timathon은 동일하지 않습니다. 플러그인 시스템을 사용하면 핵심 애플리케이션 코드를 수정하지 않고도 애플리케이션을 확장 할 수 있습니다. @ angular / router, @ angular / forms 등을 사용하려면 사용자가 응용 프로그램을 수정해야합니다. 그것들은 플러그인과 달리 실제로 라이브러리입니다. 개발자가 아닌 관리자가 응용 프로그램의 내부 세부 정보를 알지 않고도 가장 흥미로운 플러그인을 선택하여 사용할 수 있도록하는 데 더 관심이 있습니다.
앤서니 개 틀린

1
이것으로 어디서나 얻었습니까? 비슷한 것을 시도하고 싶습니다. Angular 2가 빌드되는 방식 (모듈 주위) 플러그인 타입 아키텍처가 실제로 잘 맞을 것이라고 생각했지만 어떤 예도 보이지 않습니다.
Joe

2
@ 조, 나는 여전히이 문제에 대한 좋은 해결책이 없습니다. 나는 당신과 같은 생각을했습니다.
Anthony Gatlin

2
도움이 될만한 솔루션으로 github에 리포지토리를 만들었습니다. UMD 번들 라이브러리를 느리게로드하는 Angular 6 라이브러리와 1 개의 기본 애플리케이션을 사용합니다. github.com/lmeijdam/angular-umd-dynamic-example 제안 사항이 있으시면 언제든지 추가하십시오!
Lars Meijdam

답변:


17

도움이 될만한 솔루션으로 github에 리포지토리를 만들었습니다. UMD 번들 라이브러리를 느리게로드하는 Angular 6 라이브러리와 1 개의 기본 애플리케이션을 사용합니다. https://github.com/lmeijdam/angular-umd-dynamic-example

제안이 있으시면 언제든지 추가하십시오!


2
다른 의견에서 언급했듯이 회사 정책으로 인해 리포지토리를 비공개로 만들어야했습니다. 토론이 진행되는 동안 나중에 온라인으로 되돌려
놓겠습니다

귀하의 솔루션을보고 싶습니다.
Subhan Ahmed

@Subhan, 현재 저장소를 다시 GH에 다시 배치하기 전에 저장소를 다시 작성하는 중입니다. 조금 더 시간을 줘. 그렇지 않으면 당신은 또한 저에게 직접 연락 할 수 있습니다! : D
Lars Meijdam 2016 년

@ lars-meijdam : 우리는 여전히 많이 기다릴 것입니다 : D ... 나도 매우 관심이 있습니다. 미리 감사드립니다
aguetat

17

Github 데모 앵귤러 플러그인 아키텍처

아이비는 무언가를 바꿀 수 있지만 당분간 Angular CLI Custom Builder를 사용하고 다음 요구 사항을 충족시키는 솔루션을 사용합니다.

  • AOT
  • 중복 코드를 피하십시오 (@ angular / core {common, forms, router}, rxjs, tslib와 같은 패키지)
  • 모든 플러그인에서 공유 라이브러리를 사용하지만 각 플러그인의 해당 공유 라이브러리에서 생성 된 팩토리를 출하하지 말고 라이브러리 코드 및 팩토리를 재사용하십시오.
  • Angular CLI가 제공하는 것과 동일한 수준의 최적화
  • 외부 모듈을 가져 오려면 번들 파일 경로 만 알아야합니다.
  • 코드는 모듈을 인식하고 플러그인을 페이지에 배치해야합니다.
  • 서버 측 렌더링 지원
  • 필요할 때만 모듈로드

사용법은 다음과 같이 간단합니다.

ng build --project plugins --prod --modulePath=./plugin1/plugin1.module#Plugin1Module 
         --pluginName=plugin1 --sharedLibs=shared --outputPath=./src/assets/plugins

내 기사에서 이에 대한 자세한 내용 :


좋은 예입니다! 하나의 질문. OAuthToken메인 앱에서 런타임에 라이브러리 서비스로 어떻게 전달할 수 있습니까?
yogen darji

@yurzui는 여러 각도 응용 프로그램이 있고 플러그인 1과 플러그인 2와 같은 모듈을 만드는 대신 전체 배포를 사용하는 경우 동일한 접근 방식을 사용할 수 있습니까?
Momin Shahzad

이 예제를 다시 방문하여 가까운 시일 내에 Ivy와 호환되도록 하시겠습니까? 원한다면 InjectionTokenAppModule에서 제공되고 다른 플러그인에 삽입 될 공유 서비스 및 공유의 예를 추가하십시오 . 감사!
Jyrkka

11

방금 책 " 앵귤러로 개발하기 "에 대한 새로운 장을 출판했습니다 Angular 2+의 플러그인 주제를 다루는 외부 플러그인을 구축하려는 사람들에게 큰 관심을 가져야합니다.

키 포인트:

  • 플러그인
  • 문자열 이름을 기반으로 구성 요소 작성
  • 외부 소스에서 구성로드
  • 동적으로 변화하는 응용 프로그램 경로
  • 외부 플러그인
  • 플러그인 라이브러리 생성
  • 애플리케이션에 플러그인로드
  • 플러그인 콘텐츠가 포함 된 동적 경로

이 책은 무료로 제공되며 "원하는 금액을 지불"모델이 있습니다. 사본을 들고 도움이되기를 바랍니다.


책에서 설명 된 플러그인 아키텍처로 하위 구성 요소를 바꾸려면 어떻게해야합니까? 템플릿을 바꾸거나 입력 속성 ecc를 추가 할 것입니다 ... 동시에 제공된 서비스를 재정의 / 확장하는 방법이 있는지 알아야합니다.
Matteo Calò

1
@Denis Vuyka,이 책은 훌륭해 보이지만 AoT 컴파일 지원과 같은 중요한 부분이 부족합니다.
Sergey Sokolov

7

작업 플러그인 시스템 예제 응용 프로그램합니다 (github에의 REPO를 설립하기위한 헤이스에 감사합니다!) https://github.com/PacktPublishing/Mastering-Angular-2-Components/tree/master/angular-2-components-chapter-10을 기반으로 eBook 마스터 링 Angular 2 구성 요소

  • 핵심 앱 구성 요소를 확장하는 플러그인 아키텍처
  • 파일 플러그인 시스템 (핵심 구성 파일을 편집하거나 애플리케이션을 다시 컴파일 할 필요없이 플러그인 디렉토리 / 파일을 추가하기위한 것입니다!)
  • 플러그인로드 및 동적 사용
  • 플러그인을 즉시 활성화 / 비활성화하기위한 기초 플러그인 관리자 빌드

건배, 니클라스


2
해당 링크에서 예제 코드를 볼 수 없습니다. Code Pen 또는 JSFiddle을 게시 할 수 있습니까?
Sean Chase


4
책을 읽었지만 플러그인 부분이 오래되었습니다. Angular는 Typescript와 Webpack을 목표로하는 반면 일반 JS와 SystemJS를 사용합니다. Webpack과 Typescript를 사용하면 달성 할 수없는 것 같습니다. 솔루션을 찾은 경우 질문을 게시했습니다. 여기 링크가 있습니다
Luigi Dallavalle


위의 작동 여부를 누군가가 확인할 수 있습니까? systemjs를 사용하고 싶지 않다면
django

5

당신이 찾고있는 것은 게으른 모듈 로딩입니다. 예를 들면 다음과 같습니다. http://plnkr.co/edit/FDaiDvklexT68BTaNqvE?p=preview

import {Component} from '@angular/core';
import {Router} from '@angular/router';

@Component({
  selector: 'my-app',
  template: `
    <a [routerLink]="['/']">Home</a> | 
    <a [routerLink]="['/app/home']">App Home</a> |
    <a [routerLink]="['/app/lazy']">App Lazy</a>

    <hr>
    <button (click)="addRoutes()">Add Routes</button>

    <hr>
    <router-outlet></router-outlet>
  `
})
export class App {
  loaded: boolean = false;
  constructor(private router: Router) {}

  addRoutes() {
    let routerConfig = this.router.config;

    if (!this.loaded) {
      routerConfig[1].children.push({
        path: `lazy`,
        loadChildren: 'app/lazy.module#LazyModule'
      });

      this.router.resetConfig(routerConfig);
      this.loaded = true;
    }
  }
}

최고 ... 톰


17
시간을내어 질문에 답변 해 주셔서 감사합니다. 지연로드 모듈에 익숙하지만 이것들은 내가 찾고있는 것이 아닙니다. 설계시 게으른로드 된 모듈을 계속 알고 있어야합니다. 원래 앱을 만들 때 알지 못하거나 상상하지 못한 실제 모듈과 기능을 추가 할 수 있기를 바랍니다. (내가 찾고있는 것은 약간 더 역동적 인 것입니다.) 확실히 이러한 구성 요소는 (일부 형태의) 게으른로드를 사용하지만 퍼즐의 작은 조각 일뿐입니다. 이 답변을 공유해 주셔서 다시 한 번 감사드립니다.
Anthony Gatlin

1
나는 이것이 질문에 대답하지 않는다는 것에 동의합니다. 지연 로딩은 디자인 타임에 필요하기 때문에 플러그인 아키텍처에 도움이되지 않습니다. 필요할 때까지 데이터를 클라이언트로 다운로드 / 전송하지 않습니다.
Joe

컴파일 타임에 앱이 사용 가능한 모든 플러그인 모듈에 대해 알게되면 어떨까요? 현재 플랫폼에 새 모듈을 추가하면이 모듈로 다시 컴파일해야합니다. 게으른 로딩 기능을 별도의 파일로 같은 모듈을 넣어 것하고 게으른 부하가, 난 그냥 ... 내 생각을 공유하지 않도록 경우 그냥 생각은 ... 확실하지 내가이 크게 JS 파일의 크기를 증가
블라디미르을 Prudnikov

@VladimirPrudnikov, 응용 프로그램이 컴파일 타임에 모든 플러그인에 대해 알 수 있다면 환상적입니다. 그러나 아이디어는 애플리케이션이 컴파일 된 후에 플러그인을 추가 할 수 있도록하는 것입니다. 이를 통해 모듈을 동적으로 연결할 수 있습니다. 그러나이를 위해서는 모듈을 배포 할 때 모듈을 사전 컴파일해야합니다. 어떻게 작동하는지 잘 모르겠습니다. 플러그인 모듈 버전을 Angular와 호환되게 유지하는 방법도 확실하지 않습니다.
Anthony Gatlin

2

부트 스트랩 시간에로드를 해킹하고 다른 모듈을 컴파일하지만 순환 종속성 문제를 해결하지 못했습니다.

 const moduleFile: any = require(`./${app}/${app}.module`),
                    module = moduleFile[Object.keys(moduleFile)[0]];

 route.children.push({
     path: app,
     loadChildren: (): Promise<any> => module
 });
 promises.push(this.compiler.compileModuleAndAllComponentsAsync(module));

그런 다음 AppModule에서 다음을 추가하십시오.

{
        provide: APP_INITIALIZER,
        useFactory: AppsLoaderFactory,
        deps: [AppsLoader],
        multi: true
},

2

나는 직장에서 엔터프라이즈 응용 프로그램을위한 RAD 환경을 개발하기 위해 각도 2/4의 플러그인 시스템을 찾고있었습니다. 몇 가지 연구를 한 후 데이터베이스 저장 pseudo-Angular 구성 요소 컬렉션을 구현하기로 결정했습니다.

데이터베이스 데이터베이스에 저장된 컴포넌트는 ng-dynamic을 기반으로 하며 주요 컴포넌트 구현은 다음과 유사합니다.

declare var ctx: any;

@Component({
    selector: 'my-template',
    template: `
<div>
    <div *dynamicComponent="template; context: { ctx: ctx };"></div>
</div>
  `,
    providers: [EmitterService],

})

export class MyTemplateComponent implements OnMount, AfterViewInit, OnChanges {


    // name
    private _name: string;
    get name(): string {
        return this._name;
    }
    @Input()
    set name(name: string) {
        this._name = name;        
        this.initTemplate();
    }

    template: string;
    ctx: any = null;

    private initTemplate() {

        this.templateSvc.getTemplate(this.name).subscribe(res => {
            // Load external JS with ctx implementation
            let promise1 = injectScript(res.pathJs);
            // Load external CCS
            let promise2 = injectScript(res.pathCss);

            Promise.all([promise1, promise2]).then(() => {

                // assign external component code
                this.ctx = ctx; //

                // sets the template
                this.template = res.template;

                this.injectServices();

                if (this.ctx && this.ctx.onInit) {
                    this.ctx.onInit();
                }

            });

        });

    }

외부 자바 스크립트 코드는 각도 구성 요소와 유사합니다.

var ctx = {

// injected    
_httpService: {},
_emitterService: null,

// properies
model: {
    "title": "hello world!",
},


// events
onInit() {
    console.log('onInit');
},

onDestroy() {
    console.log('onDestroy');
},

onChanges(changes) {
    console.log('changes', changes);
},

customFunction1() {
    console.log('customFunction1');
},

childTemplateName: string = 'other-component'; 

};

그리고 컴포넌트의 템플릿은 각도 템플릿과 같습니다.

<a (click)="customFunction1()">{{ ctx.model.title }}</a>
<input [(ngModel)]="ctx.model.title" type="text" />

그리고 중첩 될 수도 있습니다.

<a (click)="customFunction1()">{{ ctx.model.title }}</a>
<my-template [name]="childTemplateName"></my-template>

완벽하지는 않지만 사용자 지정 구성 요소 개발자는 angular2 / 4와 유사한 프레임 워크를 갖습니다.


2

"수동으로"수행 할 수 있습니다. 웹팩은 외부 (플러그인) 모듈에 대해 아무것도 모르기 때문에 번들에 포함 할 수 없습니다. 그래서 내가 한 일은 webpack에 의해 생성 된 코드를 보는 것입니다 .main.bundle.js 에서이 코드를 발견했습니다.

var map = {
"./dashboard/dashboard.module": ["../../../../../src/app/dashboard/dashboard.module.ts","dashboard.module"]}; 

해당 배열에 포함 된 내용을 검사 할 수 있습니다.

  1. "./dashboard/dashboard.module"- 예를 들어로드를 지연시키고 자하는 모듈 스위치의 라우팅 URL입니다. {path : 'dashboard', loadChildren : './dashboard/dashboard.module#DashboardModule'}
  2. "../../../../../src/app/dashboard/dashboard.module.ts"- 이것은 시작점 (contructor)에서 가져온 것입니다.
  3. "dashboard.module" -chunk.js가없는 실제 파일 이름 (예 : dashboard.module.chunk.js )

따라서 이론적으로지도 속성에 항목을 추가하면 라우팅을 구성하고 패턴을 따르는 경우 플러그인 시스템을 가질 수 있습니다. 이제 도전은 해당 맵 속성에서 항목을 추가하거나 제거하는 방법입니다. 분명히 각도 코드로 수행 할 수 없으며 외부 도구를 위해 수행해야합니다.


2

ABP, Angular 및 ASP.NET Core를 사용하는 플러그인 아키텍처를 구현하려고했습니다 : https://github.com/chanjunweimy/abp_plugin_with_ui

기본적으로 다른 각도 응용 프로그램을 사용하여 각도 플러그인을 개발 한 다음 동적으로 함께 추가합니다.

내가 달성하는 방법에 대한 추가 정보 :

2 개의 angular-cli 응용 프로그램이 있고 1은 주요 angular cli 응용 프로그램이고 다른 하나는 플러그인 angular cli 응용 프로그램입니다. Angular-cli 플러그인 아키텍처 접근 방식에서 직면하고있는 문제는이를 통합하는 방법입니다.

지금은 두 응용 프로그램에서 ng-build를 실행하여 "wwwroot"폴더에 넣은 다음 ASP.NET 코어 2.0 서버에서 호스팅했습니다. 이 아이디어를 보여주는 간단한 저장소는 Angular Multiple App입니다. https://github.com/chanjunweimy/angular-multiple-app

abp_plugin_with_ui는 백엔드와 Angular cli를 모두 포함하는 플러그인을 개발하는 저장소입니다. 백엔드의 경우, aspnetboilerplate 프레임 워크를 사용했습니다. 프론트 엔드는 다중 각도 CLI 애플리케이션을 사용하여 개발되었습니다.

메인 응용 프로그램을 플러그인 응용 프로그램과 통합하려면 두 응용 프로그램 모두에서 "ng-build"를 실행해야합니다 (플러그인 응용 프로그램의 href로 변경해야 함). 앵귤러 cli 응용 프로그램, 기본 응용 프로그램 "wwwroot"폴더로. 이 모든 것을 달성 한 후에 "dotnet run"을 실행하여 ASP.NET Core 2.0 웹 응용 프로그램에 "ng build"로 생성 된 정적 파일을 호스팅 할 수 있습니다.

잘하면 도움이됩니다. 모든 의견을 환영합니다! ^^


플러그인 문서를 따르려고하지만 문서가 몇 단계를 건너 뛰었다 고 생각합니다. 내가 잘못 읽고 있으면 사과드립니다. '플러그인 추가'전체 내용이 명확하지 않습니다. 이 단계를 단계별로 수행했지만 실제로 결과가 표시되지 않습니다. 전원 쉘을 실행 한 후 포트 4200에서 무엇을 볼 수 있습니까? /aspnet-core/src/Todo.MainProject.Web.Host/에 플러그인 폴더가 없습니다. powershell을 실행했는데 해당 폴더가 생성되지 않았습니다. 도움을 주셔서 감사합니다. 나는 당신의 접근 방식이 내가 필요로 생각하지만, 그것이 어떻게 작동하는지 조금 모호합니다.
Brian Kitt

확인. 나는 질문하기 전에 이것을 했어야했다. 디버깅에 시간을 보냈고 답을 알아 냈습니다. # 1) powershell은 .zip을 필요한 곳에 두지 않고 플러그인 폴더를 만들고 zip을 이동해야합니다. # 2) 각도 앱이 시작되면 로더를 동적으로 호출하고 플러그인을 webroot에 복사합니다. 그것은 철자가 되었으나 지금은 이해합니다. # 3) 플러그인을 호출하기 위해 URL을 사용해야하는데, 어디에도 나타나지 않습니다. 대시 보드에있을 것으로 예상했습니다. 귀하의 작업에 감사드립니다. 이것은 상당한 코드입니다.
Brian Kitt

2

약간의 주제이지만, 플러그인을 검색하는 일부 독자에게는 UI 구성 요소 라이브러리가 유용 할 수 있습니다.
https://medium.com/@nikolasleblanc/building-an-angular-4-component-library-with-the -각도-클리-앤 -ng- 패커 그 -53b2ade0701e

NativeScript에는 내장 UI 플러그인이 있습니다.
https://docs.nativescript.org/plugins/building-plugins
이러한 플러그인에는 Angular Wrapper가 필요합니다.
https://docs.nativescript.org/plugins/angular-plugin


2

나는 현재 당신과 같은 퀘스트를 수행하고 있습니다 .Pangable / Themable Version of Angular를 만들려고 시도하는 것은 사소한 문제가 아닙니다.

실제로 Genius Denys Vuyika개발 한 앵귤러 로 책을 읽고 꽤 좋은 해결책을 찾았 습니다 . 그는 실제로 책에서 꽤 좋은 해결책을 설명하고 책의 356 페이지에있는 외부 플러그인에 대해 이야기하고 Rollup.js를 사용합니다 . 를 하여 그런 다음 이전에 애플리케이션 외부에 빌드 된 외부 플러그인을 동적으로로드하도록 처리합니다.

이 결과를 달성하는 데 도움이되는 두 개의 다른 라이브러리 / 프로젝트가 있습니다 .Ngwl의 Agnular에 대한 ng-packagrNx 확장 은 후자를 구현하려고합니다. 예상 한 것처럼 부드럽 지 않습니다. 각도는 간단했습니다. 우리는 Angular가 어떻게 작동하는지에 대한 핵심 부분을 해결해야하며 NX ppls가 그중 최고입니다.

우리는 오픈 소스 프로젝트를 시작할 때만 Django + Mongo + Angular를 사용하고 있습니다 ( WebDjangular 를 호출하고 있으며이 답변에 대한 가능한 접근 방법 중 하나는 Django가 JSON 구성 파일을 작성하고 빌드해야한다는 것입니다. 새로운 플러그인 또는 테마가 설치되고 활성화 될 때마다

우리가 이미 성취 한 것은 데이터베이스에서 플러그인과 같은 구성 요소에 태그를 사용할 수 있으며 구성 요소가 화면에 인쇄됩니다! 다시 프로젝트는 매우 초기 단계에 있으며 Wordpress를 기반으로 아키텍처를 기반으로하며 꿈을 이루기 위해 더 많은 테스트를 수행합니다.

책이 당신을 도울 수 있기를 바랍니다. 그리고 Rollup.js를 사용하면이 사소한 문제를 해결할 수 있다는 것을 알고 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.