과학 및 기술 배경
💻 NOCOBASE DEVELOPER GUIDE

개발가이드 플러그인 개발 및 심층 맞춤

빠른숙달노코베이스플러그인개발 및 심층맞춤기능

아키텍처노코베이스 아키텍처 설계에 대해 자세히 알아보기

플러그인개발완전한 플러그인 개발 프로세스

심층맞춤: 확장을 통한 시스템 수준 맞춤

🏗️ 핵심 아키텍처 🔌 플러그인개발 🛠️ 심층맞춤 📝 모범 사례

🏗️ 핵심 아키텍처

노코베이스의 아키텍처 설계에 대한 심층적인 이해, 플러그인 개발 및 맞춤화를 위한 기반 마련

아키텍처 개요

NocoBase모듈식 아키텍처로 설계, 주로 다음과 같이 구성됩니다. 핵심 부분적으로 구성됩니다:

  • 모듈(코어)사용자 인증, 권한 관리 등 기본 프레임워크 및 핵심 기능을 제공합니다.
  • 플러그인시스템(Plugin System)노코베이스의 핵심 기능인 플러그인 확장 기능!
  • 데이터 라이브러리 추상화 계층(데이터베이스 추상화)여러 데이터 라이브러리, 제공 통합 운영 인터페이스 지원
  • 프런트엔드 프레임워크(프론트엔드)리액트 기반 프론트엔드 구현, 시각화 구성 인터페이스 제공
  • API 레이어:제공RESTful API,프론트엔드 및 백엔드 분리를 지원하고서드파티통합

플러그인시스템

노코베이스의 플러그인 시스템의 확장성 핵심, 주요 기능은 다음과 같습니다:

  • 모듈식 설계: 각 플러그인모두 별도의 모듈입니다. 별도로 설치 및 제거 가능
  • 종속성: 플러그인종속성은 다음 사이에 선언할 수 있습니다. 시스템이 자동으로 로딩 순서를 처리합니다!
  • 후크 시스템플러그인 지정 시간에 코드 실행이 가능한 후크가 풍부하게 제공됩니다.
  • 구성플러그인직접 구성 항목을 정의할 수 있습니다. 관리용 시스템 인터페이스
  • 프런트엔드 통합플러그인은 백엔드 로직 및 프론트엔드 컴포넌트를 동시에 포함할 수 있어 완벽한 기능을 실현합니다.

아키텍처 계층

계층 구조

프론트엔드 애플리케이션 레이어 React + Ant Design
API 계층 RESTful API
비즈니스 로직 계층 모듈 + 플러그인
데이터 액세스 계층 데이터 라이브러리 추상화 계층
스토리지 계층 PostgreSQL / MySQL

🔌 플러그인개발튜토리얼

완전한 플러그인 개발 프로세스, 제작부터 퍼블리싱까지

플러그인개발프로세스

1

플러그인 생성

노코베이스가 제공하는 플러그인 스캐폴딩으로 새로운 플러그인을 만들어 보세요!

# 노코베이스 프로젝트 루트 디렉토리에서 실행합니다. npm 실행 create-plugin 내-플러그인
2

플러그인 구조

플러그인 기본 구조 및 구성 파일 이해

my-plugin/ ├── package.json # 플러그인 구성 ├── src/ │ ├── server/ # 백엔드 코드 │ ├── client/ # 프론트엔드 코드 │ └── index.ts # 플러그인 포털 └── README.md # 플러그인 설명
3

백엔드 기능 구현

서버 카탈로그에서 백엔드 로직 구현하기

// src/server/index.ts '@nocobase/server'에서 { 플러그인 }을 가져옵니다; export class MyPlugin extends Plugin { async load() { // API 경로 등록 this.app.router.get('/api/my-plugin/hello', async (ctx) => { ctx.body = { message: '내 플러그인에서 안녕하세요!} }); // 훅 등록 this.app.on('beforeLoad', async () => { // 플러그인 로딩 전 로직 }); } } 기본 마이플러그인 내보내기.
4

프런트엔드 기능 구현

클라이언트 프론트엔드의 카탈로그 구현 컴포넌트

// src/client/index.tsx 'react'에서 React를 임포트합니다; '@nocobase/client'에서 { Plugin }을 임포트합니다; export class MyPluginClient extends Plugin { async load() { // 프론트엔드 라우터 등록 this.app.router.add('my-plugin', { 경로: '/my-플러그인', 컴포넌트: () => my-플러그인', { component: ()=>
My Plugin Page
}). // 메뉴 등록 this.app.menu.add('my-plugin', { name: '내 플러그인', icon: '설정', { 아이콘: '설정', 경로: '/my-플러그인', } 경로: '/my-플러그인' }); } } 기본 MyPluginClient 내보내기.
5

구성플러그인

package.json에서 플러그인 정보 구성하기

// package.json { "name": "my-plugin", "version": "1.0.0", "description": "My NocoBase plugin", "main": "lib/index.js", "nocobase": { "type": "plugin", "name": "my-plugin", "title": "My Plugin", "description": "This is my plugin", "icon": "Settings" }, "dependencies": { "@nocobase/server": "^1.0.0", "@nocobase/client": "^1.0.0" } }
6

축구 및 설치

노코베이스에 설치하세요!

# 구축플러그인 cd 내-플러그인 npm 설치 npm 실행 빌드 # 노코베이스에 설치 cd ... npm 설치 . /packages/plugins/my-plugin # 노코베이스 시작 npm 실행 개발

🛠️ 심층맞춤

복잡한 비즈니스 요구 사항을 충족하는 시스템 수준 맞춤 및 확장 기능

모듈 핵심 맞춤

핵심 기능 수정

를 통해 핵심 모듈의 메서드를 재작성하거나 확장하여 기능 맞춤을 구현합니다.

후크 시스템

시스템 제공을 이용한 훅, 특정 시간에 사용자 지정 로직 실행하기

데이터 맞춤

확장된 데이터 라이브러리 모델, 사용자 지정 필드 및 관계 추가

프론트엔드 맞춤

맞춤형 컴포넌트

개발자가 정의한 종단 컴포넌트, 기본값 교체 또는 확장 컴포넌트

테마 맞춤

색상, 글꼴, 레이아웃 등으로 시스템 테마를 사용자 지정하세요!

라우팅 맞춤

사용자 지정 프런트엔드 라우팅, 새 페이지 및 네비게이션 추가

예제

예 1: 사용자 지정 API 추가하기

// 플러그인의 server/index.ts에서 '@nocobase/server'에서 { 플러그인 }을 가져옵니다. 내보내기 클래스 MyPlugin 확장 플러그인 { async load() { // 사용자 정의 API 경로 추가 this.app.router.get('/api/custom/hello', async (ctx) => { // 사용자 지정 로직 구현 const { name } = ctx.query; ctx.body = { message: `Hello, ${name || 'world'}! `, timestamp: new Date(); ctx.body = { message timestamp: new Date().toISOString() } }); // 인증이 필요한 API 추가 this.app.router.post('/api/custom/protected', this.app.authMiddleware(), async (ctx) => { // 인증사용자만 const user = ctx.state.currentUser; ctx.body = { 메시지: '이것은 보호된 API입니다', user: { id: user.id, username: user.username 사용자명: 사용자.사용자명 } }; } }); } } 기본 마이플러그인 내보내기.

예제 2: 사용자 지정 프런트엔드 컴포넌트

// 클라이언트/컴포넌트/MyComponent.tsx의 플러그인에서 'react'에서 React를 가져옵니다. 'antd'에서 { 버튼, 카드, 타이포그래피 }를 가져옵니다; const { 제목, 단락 } = 타이포그래피. export const MyComponent: React.FC = () => { const [count, setCount] = React.useState(0); 반환 ( Counter Current count: {count} ); }. // 플러그인의 client/index.tsx에 등록하기 '@nocobase/client'에서 { 플러그인 }을 임포트합니다; import { MyComponent } from '. /components/MyComponent'; export class MyPluginClient extends Plugin { async load() { // 컴포넌트 등록 this.app.components.register('MyComponent', MyComponent); // 경로 추가 this.app.router.add('my-plugin', { 경로: '/my-플러그인', component: MyComponent }); } } 기본 내보내기 MyPluginClient.

📝 모범 사례

플러그인 개발 및 맞춤, 코드품질 및 유지보수성 보장 모범 사례

개발 규범

코드 사양

  • ESLint 및 Prettier 사양 준수
  • TypeScript를 사용하여 유형 보안 보장
  • 명확한 메모를 작성하고문서

플러그인 디자인

  • 단일 책임 원칙, 각 플러그인은 한 가지 일만 수행합니다.
  • 합리적인 기본 구성 제공
  • 플러그인의 테스트 가능성 고려

성능 최적화

프런트엔드 최적화

  • React.memo 및 useMemo로 렌더링 최적화하기
  • 사용 콜백 캐시 함수의 올바른 사용
  • 컴포넌트 구조 최적화, 불필요한 재렌더링 방지

백엔드 최적화

  • 데이터 라이브러리 인덱스를 사용한 쿼리 최적화
  • 캐싱을 올바르게 사용하여 데이터 라이브러리 조회
  • 너무 많은 데이터를 반환하지 않도록 API 응답 최적화하기

일반적인 문제

질문: 플러그인 개발 시 디버깅은 어떻게 하나요?

A: NocoBase의 개발 모드를 사용하여 다음을 실행합니다.npm run dev핫 리로드를 지원하는 런처 개발 서비스 웨어. 프론트엔드는 Chrome 개발자 도구를 사용하여 디버깅할 수 있으며, 백엔드는 VS 코드에서 디버깅을 위한 중단점 설정에서 찾을 수 있습니다.

Q: 플러그인사이즈의 종속성은 어떻게 처리하나요?

A: 플러그인의 package.json을 통해 종속성을 선언하면 노코베이스가 플러그인의 로딩 순서를 자동으로 처리합니다. 플러그인에서 기타 확인 방법플러그인이 이미 로드되었는지 확인할 수도 있습니다.

질문: 플러그인은 데이터 라이브러리에 어떻게 액세스하나요?

A: 통해this.app.db데이터 라이브러리 인스턴스에 액세스하려면 데이터 라이브러리 작업용 시퀄라이즈 ORM을 사용할 수 있습니다. 예시:const User = this.app.db.getModel('users');

질문: 플러그인 마켓플레이스에 플러그인을 게시하려면 어떻게 해야 하나요?

A: 먼저 플러그인이 릴리스 사양을 충족하는지 확인한 다음, 노코베이스 플러그인 마켓플레이스에 계정을 등록하고 가이드라인에 따라 플러그인을 제출하세요. 플러그인 이름, 설명, 버전 정보 및 구축 제품을 제공해야 합니다.