Halia를 사용한 플러그인 지향 설계

POD(Plugin Oriented Design)로 앱을 빌드하면 많은 이점이 있습니다(최근 에서 논의됨).

오늘은 앱에서 "플러그인"을 관리하기 위해 구축된 확장 가능한 TS/JS 종속성 주입 프레임워크인 "Halia"를 소개하려고 합니다.

플러그형 앱을 빌드하면 장점이 있지만 다른 코드를 변경하는 코드를 동적으로 가져올 때 체계적으로 유지하기 어려울 수 있습니다.

예를 들어 다른 기능(또는 여러 기능)에 의존하는 기능을 빌드하는 경우 앱 전체에서 기능을 "분할 및 확산"하게 될 수 있습니다.

Halia는 다음과 같이 도움을 줄 수 있습니다.

Halia - Extensible TS / JS Dependency Injection Framework



With Halia, your app's core is packaged as a Plugin, and features are packaged as Plugins. Each Plugin can then be extended by other Plugins.



또한 URL에서 플러그인을 동적으로 로드하고, 플러그인을 동적으로 활성화하고, 사용자 수준 관리(예: 플러그인 스토어), 크로스 스택 및 크로스 에코 플러그인, 계약(재사용 가능한 플러그인 빌드용)을 위한 도구를 구축하고 있습니다.

Halia는 이 플러그인 트리 관리를 담당합니다. 예를 들어 어떻게 작동하는지 살펴보겠습니다.

예시



모두가 좋아하는 오리가 있습니다.

//  duck-app.ts
export const getDuck = () => {
  return "Quack";
}


폴을 제외한 모든 사람. Paul은 특별한 🦄 Disco Duck 🦄을 원하므로 다음과 같이 업데이트합니다.

//  duck-app.ts
import { Paul } from 'client-list';
import { config } from 'config';
export const getDuck = () => {
  if (params.client === Paul) {
    return "Michael Quackson";
  }
  return "Quack";
}


코드는 Paul에게 적합하지만 더 복잡해지고 읽기 어려워지며 "클라이언트"개념과 결합됩니다.

대신 Halia 플러그인을 사용하여 이 기능을 캡슐화하고 주입할 수 있습니다.

//  duck-app-plugin.ts
import * as DuckApp from './duck-app';
export const DuckAppPlugin: HaliaPlugin = {
  id: "duckApp",
  name: "Duck App Plugin",
  install: () => ({
    setGetDuck: (getDuck) => DuckApp.getDuck = getDuck
  })
}



//  disco-duck-plugin.ts
import { Paul } from 'client-list';
import * as config from 'config';
export const DiscoDuckPlugin: HaliaPlugin = {
  id: "discoDuck",
  name: "Disco Duck Plugin",
  dependencies: [DuckAppPlugin.id],
  install: ({ duckApp }) => {
    if (config.client === Paul) {
      duckApp.setGetDuck (() => "Michael Quackson")
    }
  }
}


그런 다음 스택을 빌드하고 코드를 호출할 수 있습니다.

//  main.ts
import { HaliaStack } from Halia;
import { DuckApp } from './DuckApp';
import { DiscoFeature } from './DiscoFeature';

const buildApp = async () => {

  //  Initialize the Stack
  const appStack = new HaliaStack();

  //  Register Plugins
  appStack.register(DuckApp);
  appStack.register(DiscoFeature);

  //  Build the Stack
  await appStack.build();

  //  Call the Method
  const duckApp = appStack.getExports(DuckApp.id);
  duckApp.logNoise();
}

buildApp();


이를 통해 원래 코드는 그대로 유지되고 분리됩니다.

Paul이 더 이상 🦄 Disco Duck 🦄을 원하면 플러그인을 등록하지 않습니다. 추가 변경이 필요한 경우 고유한 요구 사항을 위한 전용 네임스페이스가 있습니다.

This is a simple example that can be solved in other ways. However, it demonstrates the general idea, and as features become more complex, we've found this pattern helps to keep things organized.



결론



종속성 주입 프레임워크(예: Angular, Nest 및 Halia)에 대한 자세한 내용은 다음 문서를 참조하세요.



패키지와 관련 개념을 즐기시기 바랍니다.

건배,
CR

이와 같은 기사를 더 보려면 Github , , , Reddit에서 저를 팔로우하세요.

좋은 웹페이지 즐겨찾기