mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析
前言
本次課程的學(xué)習(xí)目標(biāo):
- 了解 mitt、tiny-emitter 作用和使用場(chǎng)景、應(yīng)用場(chǎng)景
- 學(xué)習(xí) 發(fā)布訂閱 設(shè)計(jì)模式
資源:
- mitt:https://github.com/developit/mitt
- tiny-mitt:https://github.com/scottcorgan/tiny-emitter
- clipboard.js:clipboard.js 源碼的第26行使用了 tiny-emitter
mitt
Mitt 是一個(gè)功能性 事件發(fā)射器,用于在 JavaScript 中進(jìn)行事件發(fā)布和訂閱。它體積小巧,壓縮后只有 200 字節(jié),且無(wú)需依賴其他庫(kù)。它具有類似于 Node.js 中的 EventEmitter 的功能,并支持使用通配符“*”來(lái)監(jiān)聽(tīng)所有事件。Mitt 可以在瀏覽器和其他 JavaScript 運(yùn)行時(shí)中使用,并支持 IE9+。
下面是使用 Mitt 進(jìn)行事件發(fā)布和訂閱的示例代碼:
// 創(chuàng)建一個(gè) mitt 實(shí)例 const emitter = mitt(); // 訂閱 'myEvent' 事件 emitter.on('myEvent', (data) => { console.log('myEvent triggered with data:', data); }); // 發(fā)布 'myEvent' 事件 emitter.emit('myEvent', { foo: 'bar' }); // 輸出: myEvent triggered with data: { foo: 'bar' }
你還可以使用通配符 *
來(lái)監(jiān)聽(tīng)所有事件:
emitter.on('*', (event, data) => { console.log(`event "${event}" triggered with data:`, data); }); emitter.emit('myEvent', { foo: 'bar' }); // 輸出: event "myEvent" triggered with data: { foo: 'bar' } emitter.emit('anotherEvent', { baz: 'qux' }); // 輸出: event "anotherEvent" triggered with data: { baz: 'qux' }
你還可以使用 emitter.off
方法取消訂閱特定事件:
const handler = (data) => { console.log('myEvent triggered with data:', data); }; emitter.on('myEvent', handler); emitter.emit('myEvent', { foo: 'bar' }); // 輸出: myEvent triggered with data: { foo: 'bar' } emitter.off('myEvent', handler); emitter.emit('myEvent', { foo: 'bar' }); // 不會(huì)輸出任何內(nèi)容
tiny-emitter
tiny-emitter 同樣是一個(gè)小型的事件發(fā)射器庫(kù),可以用于在 JavaScript 中進(jìn)行事件發(fā)布和訂閱。
使用 tiny-emitter 的示例代碼如下:
// 創(chuàng)建一個(gè) tiny-emitter 實(shí)例 const emitter = new TinyEmitter(); // 訂閱 'myEvent' 事件 emitter.on('myEvent', (data) => { console.log('myEvent triggered with data:', data); }); // 發(fā)布 'myEvent' 事件 emitter.emit('myEvent', { foo: 'bar' }); // 輸出: myEvent triggered with data: { foo: 'bar' }
Mitt 與 tiny-emitter的異同
Mitt 和 tiny-emitter 都是 JavaScript 事件發(fā)射器庫(kù),可以用于在 JavaScript 中進(jìn)行事件發(fā)布和訂閱。但是,它們有一些明顯的區(qū)別:
- 體積:Mitt 比 tiny-emitter 更小,壓縮后僅有 200 字節(jié)。tiny-emitter 的體積略大,壓縮后約為 2.2 KB。
- 支持的瀏覽器版本:Mitt 支持 IE9+,而 tiny-emitter 支持 IE6+。
盡管它們有一些區(qū)別,Mitt 和 tiny-emitter 都是功能強(qiáng)大且易于使用的事件發(fā)射器庫(kù)。選擇哪個(gè)庫(kù)取決于你的應(yīng)用程序的特定需求和偏好。
發(fā)布訂閱模式
發(fā)布-訂閱模式(也稱為觀察者模式)是一種軟件設(shè)計(jì)模式,允許對(duì)象(稱為發(fā)布者)向多個(gè)對(duì)象(稱為訂閱者)發(fā)布信息,并允許訂閱者獲取這些信息。這種模式通常用于在不同組件之間進(jìn)行通信,并且不需要組件之間直接交互。
在發(fā)布-訂閱模式中,發(fā)布者通常是一個(gè)對(duì)象,負(fù)責(zé)維護(hù)訂閱者的列表并發(fā)布信息。訂閱者通常是另一個(gè)對(duì)象,負(fù)責(zé)訂閱特定的信息并執(zhí)行相應(yīng)的操作。訂閱者通常會(huì)實(shí)現(xiàn)一個(gè)回調(diào)函數(shù),在收到發(fā)布者發(fā)布的信息時(shí)調(diào)用。
發(fā)布-訂閱模式的優(yōu)點(diǎn)在于它允許組件之間松散耦合,并且易于擴(kuò)展。發(fā)布者無(wú)需知道哪些訂閱者訂閱了信息,訂閱者也無(wú)需知道哪些發(fā)布者發(fā)布了信息。這使得發(fā)布者和訂閱者可以獨(dú)立變化和擴(kuò)展。
示例:
class Publisher { constructor() { this.subscribers = []; } register(subscriber) { this.subscribers.push(subscriber); } unregister(subscriber) { this.subscribers = this.subscribers.filter(s => s !== subscriber); } notify(message) { this.subscribers.forEach(subscriber => subscriber.update(message)); } } class Subscriber { update(message) { console.log('Received message:', message); } } const publisher = new Publisher(); const subscriber1 = new Subscriber(); const subscriber2 = new Subscriber(); publisher.register(subscriber1); publisher.register(subscriber2); publisher.notify('Hello, world!'); // Output: "Received message: Hello, world!" publisher.unregister(subscriber1); publisher.notify('Hello, again!'); // Output: "Received message: Hello, again!"
在這個(gè)示例中,我們定義了一個(gè) Publisher
類和一個(gè) Subscriber
類。Publisher
類維護(hù)了一個(gè)訂閱者列表,可以注冊(cè)和取消訂閱者,并且可以向所有訂閱者發(fā)送消息。Subscriber
類實(shí)現(xiàn)了一個(gè) update
方法,用于接收來(lái)自發(fā)布者的消息。
在示例中,我們創(chuàng)建了一個(gè)發(fā)布者實(shí)例和兩個(gè)訂閱者實(shí)例,并將訂閱者注冊(cè)到發(fā)布者中。然后,我們使用發(fā)布者的 notify
方法向所有訂閱者發(fā)送消息,并使用 unregister
方法取消一個(gè)訂閱者的注冊(cè)。
總結(jié)
發(fā)布-訂閱模式是一種有用的設(shè)計(jì)模式,可以解決許多對(duì)象或組件之間的協(xié)作問(wèn)題。它使得對(duì)象或組件之間能夠更加靈活地協(xié)作,同時(shí)也能解除耦合,使得系統(tǒng)更加穩(wěn)定和可擴(kuò)展。
以上就是mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析的詳細(xì)內(nèi)容,更多關(guān)于mitt tiny-emitter發(fā)布訂閱的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS前端錯(cuò)誤監(jiān)控捕獲以及上報(bào)方法詳解
這篇文章主要為大家介紹了前端錯(cuò)誤監(jiān)控捕獲以及上報(bào)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01JavaScript?API?ResizeObserver使用示例
這篇文章主要為大家介紹了JavaScript?API?ResizeObserver的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

ECharts框架分段視覺(jué)映射在移動(dòng)端適配