찾다
웹 프론트엔드JS 튜토리얼JavaScript 플러그인 시스템을 설계하는 것은 매우 중요합니다.

JavaScript 플러그인 시스템을 설계하는 것은 매우 중요합니다.

【관련 학습 권장사항: javascript 비디오 튜토리얼

WordPress에는 플러그인이 있고, jQuery에는 플러그인이 있으며, Gatsby, Eleventy 및 Vue도 마찬가지입니다.

플러그인은 라이브러리와 프레임워크의 일반적인 기능이며, 그럴 만한 이유가 있습니다. 플러그인을 사용하면 개발자가 안전하고 확장 가능한 방식으로 기능을 추가할 수 있습니다. 이를 통해 핵심 프로젝트의 가치가 더욱 높아지고 커뮤니티가 구축됩니다. 이 모든 것이 추가적인 유지 관리 부담 없이 이루어집니다. 매우 좋은!

그렇다면 플러그인 시스템을 구축하는 방법은 무엇일까요? 이 질문에 답하기 위해 JavaScript로 자체 플러그인을 만들어 보겠습니다.

플러그인 시스템을 구축해 봅시다

BetaCalc라는 샘플 프로젝트부터 시작해 보겠습니다. BetaCalc는 다른 개발자가 "버튼"을 추가할 수 있는 최소한의 JavaScript 계산기를 목표로 합니다. 시작하기 위한 몇 가지 기본 코드는 다음과 같습니다.

// 计算器const betaCalc = {  currentValue: 0,
  
  setValue(newValue) {    this.currentValue = newValue;    console.log(this.currentValue);
  },
  
  plus(addend) {    this.setValue(this.currentValue + addend);
  },
  
  minus(subtrahend) {    this.setValue(this.currentValue - subtrahend);
  }
};// 使用计算器betaCalc.setValue(3); // => 3betaCalc.plus(3);     // => 6betaCalc.minus(2);    // => 4复制代码

우리는 일을 단순하게 유지하기 위해 계산기를 객관적인 것으로 정의합니다. 계산기는 결과를 console.log에 인쇄하여 작동합니다. console.log 打印结果来工作。

目前功能确实很有限。我们有一个 setValue 方法,该方法接受一个数字并将其显示在“屏幕”上。我们还有加法(plus)和减法(minus)方法,它们将对当前显示的值执行一个运算。

现在该添加更多功能了。首先创建一个插件系统。

世界上最小的插件系统

我们将从创建一个注册(register)方法开始,其他开发人员可以使用该方法向BetaCalc注册插件。该方法的工作很简单:获取外部插件,获取其 exec 函数,并将其作为新方法附加到我们的计算器上:

// 计算器const betaCalc = {  // ...其他计算器代码在这里

  register(plugin) {    const { name, exec } = plugin;    this[name] = exec;
  }
};复制代码

这是一个示例插件,为我们的计算器提供了一个“平方(squared)”按钮:

// 定义插件const squaredPlugin = {  name: 'squared',  exec: function() {    this.setValue(this.currentValue * this.currentValue)
  }
};// 注册插件betaCalc.register(squaredPlugin);复制代码

在许多插件系统中,插件通常分为两个部分:

  1. 要执行的代码
  2. 元数据(例如名称,描述,版本号,依赖项等)

在我们的插件中,exec 函数包含我们的代码,name 是我们的元数据。注册插件后,exec 函数将作为一种方法直接附加到我们的 betaCalc 对象,从而可以访问BetaCalc的 this

现在,BetaCalc有一个新的“平方”按钮,可以直接调用:

betaCalc.setValue(3); // => 3betaCalc.plus(2);     // => 5betaCalc.squared();   // => 25betaCalc.squared();   // => 625复制代码

这个系统有很多优点。该插件是一种简单的对象字面量,可以传递给我们的函数。这意味着插件可以通过npm下载并作为ES6模块导入。易于分发是超级重要的!

但是我们的系统有一些缺陷。

通过为插件提供访问BetaCalc的 this 权限,他们可以对所有BetaCalc的代码进行读/写访问。虽然这对于获取和设置 currentValue 很有用,但也很危险。如果插件要重新定义内部函数(如 setValue),则它可能会为BetaCalc和其他插件产生意外的结果。这违反了开放-封闭原则,即一个软件实体应该是开放的扩展,但封闭修改。

另外,“squared”函数通过产生副作用发挥作用。这在JavaScript中并不少见,但感觉并不好——特别是当其他插件可能处在同一内部状态的情况下。一种更实用的方法将大大有助于使我们的系统更安全、更可预测。

更好的插件架构

让我们再来看看一个更好的插件架构。下一个例子同时改变了计算器和它的插件API:

// 计算器const betaCalc = {  currentValue: 0,
  
  setValue(value) {    this.currentValue = value;    console.log(this.currentValue);
  }, 
  core: {    'plus': (currentVal, addend) => currentVal + addend,    'minus': (currentVal, subtrahend) => currentVal - subtrahend
  },  plugins: {},    

  press(buttonName, newVal) {    const func = this.core[buttonName] || this.plugins[buttonName];    this.setValue(func(this.currentValue, newVal));
  },

  register(plugin) {    const { name, exec } = plugin;    this.plugins[name] = exec;
  }
};  
// 我们得插件,平方插件const squaredPlugin = { 
  name: 'squared',  exec: function(currentValue) {    return currentValue * currentValue;
  }
};

betaCalc.register(squaredPlugin);// 使用计算器betaCalc.setValue(3);      // => 3betaCalc.press('plus', 2); // => 5betaCalc.press('squared'); // => 25betaCalc.press('squared'); // => 625复制代码

我们在这里做了一些值得注意的更改。

首先,我们将插件与“核心(core)”计算器方法(如plus和minus)分开,方法是将其放入自己的插件对象中。将我们的插件存储在plugins 对象中可使我们的系统更安全。现在,访问此plugins的插件将看不到BetaCalc属性,而只能看到 betaCalc.plugins 的属性。

其次,我们实现了一个 press 方法,该方法按名称查找按钮的功能,然后调用它。现在,当我们调用插件的 exec 函数时,我们将当前的计算器值(currentValue )传递给该函数,并期望它返回新的计算器值。

本质上,这个新的 press

현재 기능은 실제로 매우 제한적입니다. 숫자를 받아 "화면"에 표시하는 setValue 메소드가 있습니다. 또한 현재 표시된 값에 대해 연산을 수행하는 덧셈(plus) 및 뺄셈(minus) 메서드도 있습니다. 🎜🎜이제 더 많은 기능을 추가할 차례입니다. 먼저 플러그인 시스템을 만듭니다. 🎜

세계에서 가장 작은 플러그인 시스템🎜🎜다른 개발자가 BetaCalc 플러그인에 등록하는 데 사용할 수 있는 등록(register) 메서드를 만드는 것부터 시작하겠습니다. . 이 메서드가 수행하는 작업은 간단합니다. 외부 플러그인을 가져와 exec 함수를 가져온 다음 이를 계산기에 새 메서드로 연결합니다. 🎜rrreee🎜다음은 계산을 위한 샘플 플러그인입니다. 브라우저는 " 제곱(제곱)" 버튼: 🎜rrreee🎜많은 플러그인 시스템에서 플러그인은 일반적으로 두 부분으로 나뉩니다: 🎜
  1. 실행할 코드
  2. 메타데이터(예: 이름, 설명, 버전 번호, 종속성 등)
🎜플러그인에서 exec 함수에는 name는 우리의 메타데이터입니다. 플러그인을 등록한 후 <code>exec 함수는 betaCalc 개체에 메서드로 직접 연결되어 BetaCalc의 this에 대한 액세스를 제공합니다. 🎜🎜이제 BetaCalc에는 직접 호출할 수 있는 새로운 "사각형" 버튼이 있습니다. 🎜rrreee🎜이 시스템에는 많은 장점이 있습니다. 플러그인은 함수에 전달될 수 있는 간단한 객체 리터럴입니다. 이는 플러그인을 npm을 통해 다운로드하고 ES6 모듈로 가져올 수 있음을 의미합니다. 배포의 용이성은 매우 중요합니다! 🎜🎜하지만 우리 시스템에는 몇 가지 결함이 있습니다. 🎜🎜플러그인에 BetaCalc의 권한에 대한 액세스 권한을 부여하면 모든 BetaCalc 코드에 대한 읽기/쓰기 액세스 권한을 가질 수 있습니다. 이는 currentValue를 가져오고 설정하는 데 유용하지만 위험할 수도 있습니다. 플러그인이 내부 기능(예: setValue)을 재정의하는 경우 BetaCalc 및 기타 플러그인에 대해 예상치 못한 결과가 발생할 수 있습니다. 이는 소프트웨어 엔터티가 확장에는 개방되어야 하지만 수정에는 폐쇄되어야 한다는 개방-폐쇄 원칙을 위반합니다. 🎜🎜또한 "제곱" 기능은 부작용을 발생시켜 작동합니다. 이는 JavaScript에서 드문 일이 아니지만 기분이 좋지 않습니다. 특히 다른 플러그인이 동일한 내부 상태에 있을 수 있는 경우에는 더욱 그렇습니다. 보다 실용적인 접근 방식은 시스템을 더욱 안전하고 예측 가능하게 만드는 데 큰 도움이 될 것입니다. 🎜

더 나은 플러그인 아키텍처🎜🎜더 나은 플러그인 아키텍처를 살펴보겠습니다. 다음 예에서는 계산기와 해당 플러그인 API를 모두 변경합니다. 🎜rrreee🎜 여기서 몇 가지 눈에 띄는 변경 사항을 적용했습니다. 🎜🎜먼저, 플러그인을 자체 플러그인 개체에 넣어 "핵심" 계산기 메서드(예: 플러스 및 마이너스)와 분리합니다. 플러그인을 plugins 개체에 저장하면 시스템이 더욱 안전해집니다. 이제 이 플러그인에 액세스하는 플러그인은 BetaCalc 속성을 볼 수 없고 betaCalc.plugins의 속성만 볼 수 있습니다. 🎜🎜둘째, 버튼의 기능을 이름으로 조회한 후 호출하는 press 메서드를 구현했습니다. 이제 플러그인의 exec 함수를 호출할 때 현재 계산기 값(currentValue)을 함수에 전달하고 함수가 새 계산기 값을 반환할 것으로 예상합니다. 🎜🎜기본적으로 이 새로운 press 메서드는 모든 계산기 버튼을 순수 함수로 변환합니다. 값을 가져와 작업을 수행하고 결과를 반환합니다. 여기에는 많은 이점이 있습니다: 🎜
  • API를 단순화합니다.
  • BetaCalc와 플러그인 자체 모두에 대해 테스트가 더 쉬워집니다.
  • 시스템의 종속성을 줄이고 더 느슨하게 결합되도록 만듭니다.

이 새로운 아키텍처는 첫 번째 예보다 제한적이지만 잘 작동합니다. 우리는 기본적으로 플러그인 작성자를 위한 가드레일을 배치하여 그들이 원하는 변경을 수행하지 못하도록 제한합니다.

사실 너무 엄격할 수도 있어요! 현재 계산기 플러그인은 currentValue에서만 작동합니다. 플러그인 작성자가 고급 기능(예: "기억" 버튼 또는 기록 추적 방법)을 추가하려는 경우 할 수 있는 일이 많지 않습니다.

아마도 이게 좋을 것 같아요. 플러그인 작성자에게 부여하는 힘은 섬세한 균형입니다. 너무 많은 권한을 부여하면 프로젝트의 안정성에 영향을 미칠 수 있습니다. 그러나 그들에게 너무 적은 전력을 주면 그들 자신의 문제를 해결하기 어려울 것입니다. 이 경우에는 플러그를 연결하지 않는 것이 좋습니다.

또 무엇을 할 수 있나요?

시스템을 개선하려면 아직 해야 할 일이 많습니다.

플러그인 작성자가 이름이나 반환 값 정의를 잊어버린 경우 이를 알리기 위해 오류 처리를 추가할 수 있습니다. QA 개발자처럼 생각하고 이러한 상황을 사전에 처리할 수 있도록 시스템이 어떻게 손상될 수 있는지 상상해 보는 것이 좋습니다.

플러그인의 기능을 확장할 수 있습니다. 현재 BetaCalc 플러그인은 버튼을 추가할 수 있습니다. 하지만 특정 수명 주기 이벤트(예: 계산기가 값을 표시하려고 하는 경우)에 대한 콜백도 등록할 수 있다면 어떻게 될까요? 아니면 여러 상호 작용에 걸쳐 상태를 저장할 특별한 장소가 있다면 어떨까요? 이로 인해 새로운 사용 사례가 열릴까요?

플러그인 등록 기능도 확장할 수 있습니다. 초기 설정을 통해 플러그인을 등록할 수 있다면 어떨까요? 이로 인해 플러그인이 더 유연해졌나요? 플러그인 작성자가 "BetaCalc Stats Package"와 같은 단일 버튼 대신 전체 버튼 세트를 등록하고 싶다면 어떻게 해야 할까요? 이를 지원하려면 어떤 변경이 필요합니까?

플러그인 시스템

BetaCalc와 플러그인 시스템은 매우 간단합니다. 프로젝트 규모가 더 크다면 다른 플러그인 아키텍처를 살펴보는 것이 좋습니다.

좋은 출발점은 성공적인 플러그인 시스템의 예를 찾기 위해 기존 프로젝트를 살펴보는 것입니다. JavaScript의 경우 이는 jQuery, Gatsby, D3, CKEditor 등을 의미할 수 있습니다. 또한 다양한 JavaScript 디자인 패턴에 익숙해지고 싶을 수도 있습니다. 각 디자인 패턴은 서로 다른 인터페이스와 결합 정도를 제공하여 여러 가지 좋은 플러그인 아키텍처 선택을 제공합니다. 이러한 옵션을 이해하면 프로젝트를 사용하는 모든 사람의 요구 사항의 균형을 더 잘 맞추는 데 도움이 됩니다.

패턴 자체 외에도 그러한 결정을 내리기 위해 활용할 수 있는 좋은 소프트웨어 개발 원칙이 많이 있습니다. 나는 이미 몇 가지 접근 방식(개방-폐쇄 원칙 및 느슨한 결합 등)을 언급했지만 다른 관련 접근 방식에는 디미터 법칙 및 종속성 주입이 포함됩니다.

많이 들리겠지만 조사를 해봐야 합니다. 플러그인 아키텍처를 변경해야 하기 때문에 모든 사람이 플러그인을 다시 작성하도록 하는 것보다 더 고통스러운 것은 없습니다. 이는 신뢰를 잃고 사람들이 미래 기여에 대한 신뢰를 잃게 만드는 빠른 방법입니다.

요약

좋은 플러그인 아키텍처를 처음부터 작성하는 것은 어렵습니다! 모든 사람의 요구 사항을 충족하는 시스템을 구축하려면 많은 고려 사항의 균형을 맞춰야 합니다. 충분히 간단합니까? 기능이 강력할 수 있나요? 장기적으로 효과가 있을까요?

하지만 좋은 플러그인 시스템을 갖는 것은 모든 사람에게 도움이 되고 개발자는 문제를 자유롭게 해결할 수 있다는 점에서 그만한 가치가 있습니다. 최종 사용자가 선택할 수 있는 옵션 기능이 많이 있습니다. 프로젝트를 중심으로 생태계와 커뮤니티를 구축할 수 있습니다. 그것은 윈윈(win-win) 상황이다.

위 내용은 JavaScript 플러그인 시스템을 설계하는 것은 매우 중요합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 juejin에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Python vs. JavaScript : 개발 환경 및 도구Python vs. JavaScript : 개발 환경 및 도구Apr 26, 2025 am 12:09 AM

개발 환경에서 Python과 JavaScript의 선택이 모두 중요합니다. 1) Python의 개발 환경에는 Pycharm, Jupyternotebook 및 Anaconda가 포함되어 있으며 데이터 과학 및 빠른 프로토 타이핑에 적합합니다. 2) JavaScript의 개발 환경에는 Node.js, VScode 및 Webpack이 포함되어 있으며 프론트 엔드 및 백엔드 개발에 적합합니다. 프로젝트 요구에 따라 올바른 도구를 선택하면 개발 효율성과 프로젝트 성공률이 향상 될 수 있습니다.

JavaScript가 C로 작성 되었습니까? 증거를 검토합니다JavaScript가 C로 작성 되었습니까? 증거를 검토합니다Apr 25, 2025 am 12:15 AM

예, JavaScript의 엔진 코어는 C로 작성되었습니다. 1) C 언어는 효율적인 성능과 기본 제어를 제공하며, 이는 JavaScript 엔진 개발에 적합합니다. 2) V8 엔진을 예를 들어, 핵심은 C로 작성되며 C의 효율성 및 객체 지향적 특성을 결합하여 C로 작성됩니다.

JavaScript의 역할 : 웹 대화식 및 역동적 인 웹JavaScript의 역할 : 웹 대화식 및 역동적 인 웹Apr 24, 2025 am 12:12 AM

JavaScript는 웹 페이지의 상호 작용과 역학을 향상시키기 때문에 현대 웹 사이트의 핵심입니다. 1) 페이지를 새로 고치지 않고 콘텐츠를 변경할 수 있습니다. 2) Domapi를 통해 웹 페이지 조작, 3) 애니메이션 및 드래그 앤 드롭과 같은 복잡한 대화식 효과를 지원합니다. 4) 성능 및 모범 사례를 최적화하여 사용자 경험을 향상시킵니다.

C 및 JavaScript : 연결이 설명되었습니다C 및 JavaScript : 연결이 설명되었습니다Apr 23, 2025 am 12:07 AM

C 및 JavaScript는 WebAssembly를 통한 상호 운용성을 달성합니다. 1) C 코드는 WebAssembly 모듈로 컴파일되어 컴퓨팅 전력을 향상시키기 위해 JavaScript 환경에 도입됩니다. 2) 게임 개발에서 C는 물리 엔진 및 그래픽 렌더링을 처리하며 JavaScript는 게임 로직 및 사용자 인터페이스를 담당합니다.

웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션Apr 22, 2025 am 12:02 AM

JavaScript는 웹 사이트, 모바일 응용 프로그램, 데스크탑 응용 프로그램 및 서버 측 프로그래밍에서 널리 사용됩니다. 1) 웹 사이트 개발에서 JavaScript는 HTML 및 CSS와 함께 DOM을 운영하여 동적 효과를 달성하고 jQuery 및 React와 같은 프레임 워크를 지원합니다. 2) 반응 및 이온 성을 통해 JavaScript는 크로스 플랫폼 모바일 애플리케이션을 개발하는 데 사용됩니다. 3) 전자 프레임 워크를 사용하면 JavaScript가 데스크탑 애플리케이션을 구축 할 수 있습니다. 4) node.js는 JavaScript가 서버 측에서 실행되도록하고 동시 요청이 높은 높은 요청을 지원합니다.

Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Apr 21, 2025 am 12:01 AM

Python은 데이터 과학 및 자동화에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 데이터 처리 및 모델링을 위해 Numpy 및 Pandas와 같은 라이브러리를 사용하여 데이터 과학 및 기계 학습에서 잘 수행됩니다. 2. 파이썬은 간결하고 자동화 및 스크립팅이 효율적입니다. 3. JavaScript는 프론트 엔드 개발에 없어서는 안될 것이며 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축하는 데 사용됩니다. 4. JavaScript는 Node.js를 통해 백엔드 개발에 역할을하며 전체 스택 개발을 지원합니다.

JavaScript 통역사 및 컴파일러에서 C/C의 역할JavaScript 통역사 및 컴파일러에서 C/C의 역할Apr 20, 2025 am 12:01 AM

C와 C는 주로 통역사와 JIT 컴파일러를 구현하는 데 사용되는 JavaScript 엔진에서 중요한 역할을합니다. 1) C는 JavaScript 소스 코드를 구문 분석하고 추상 구문 트리를 생성하는 데 사용됩니다. 2) C는 바이트 코드 생성 및 실행을 담당합니다. 3) C는 JIT 컴파일러를 구현하고 런타임에 핫스팟 코드를 최적화하고 컴파일하며 JavaScript의 실행 효율을 크게 향상시킵니다.

자바 스크립트 행동 : 실제 예제 및 프로젝트자바 스크립트 행동 : 실제 예제 및 프로젝트Apr 19, 2025 am 12:13 AM

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기