# nanoevents
**Repository Path**: mirrors_ai/nanoevents
## Basic Information
- **Project Name**: nanoevents
- **Description**: Simple and tiny (107 bytes) event emitter library for JavaScript
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-01-26
- **Last Updated**: 2025-08-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Nano Events
Simple and tiny event emitter library for JavaScript.
* Only **108 bytes** (minified and brotlied).
It uses [Size Limit] to control size.
* The `on` method returns `unbind` function. You don’t need to save
callback to variable for `removeListener`.
* TypeScript and ES modules support.
* No aliases, just `emit` and `on` methods.
No Node.js [EventEmitter] compatibility.
```js
import { createNanoEvents } from 'nanoevents'
const emitter = createNanoEvents()
const unbind = emitter.on('tick', volume => {
summary += volume
})
emitter.emit('tick', 2)
summary //=> 2
unbind()
emitter.emit('tick', 2)
summary //=> 2
```
[EventEmitter]: https://nodejs.org/api/events.html
[Size Limit]: https://github.com/ai/size-limit
---
Made at Evil Martians, product consulting for developer tools.
---
## Table of Contents
- [Table of Contents](#table-of-contents)
- [Install](#install)
- [TypeScript](#typescript)
- [Mixing to Object](#mixing-to-object)
- [Add Listener](#add-listener)
- [Remove Listener](#remove-listener)
- [Execute Listeners](#execute-listeners)
- [Events List](#events-list)
- [Once](#once)
- [Remove All Listeners](#remove-all-listeners)
## Install
```sh
npm install nanoevents
```
## TypeScript
Nano Events accepts interface with event name
to listener argument types mapping.
```ts
interface Events {
set: (name: string, count: number) => void,
tick: () => void
}
const emitter = createNanoEvents()
// Correct calls:
emitter.emit('set', 'prop', 1)
emitter.emit('tick')
// Compilation errors:
emitter.emit('set', 'prop', '1')
emitter.emit('tick', 2)
```
## Mixing to Object
Because Nano Events API has only just 2 methods,
you could just create proxy methods in your class
or encapsulate them entirely.
```js
class Ticker {
constructor () {
this.emitter = createNanoEvents()
this.internal = setInterval(() => {
this.emitter.emit('tick')
}, 100)
}
stop () {
clearInterval(this.internal)
this.emitter.emit('stop')
}
on (event, callback) {
return this.emitter.on(event, callback)
}
}
```
With Typescript:
```ts
import { createNanoEvents, Emitter } from "nanoevents"
interface Events {
start: (startedAt: number) => void
}
class Ticker {
emitter: Emitter
constructor () {
this.emitter = createNanoEvents()
}
on(event: E, callback: Events[E]) {
return this.emitter.on(event, callback)
}
}
```
## Add Listener
Use `on` method to add listener for specific event:
```js
emitter.on('tick', number => {
console.log(number)
})
emitter.emit('tick', 1)
// Prints 1
emitter.emit('tick', 5)
// Prints 5
```
In case of your listener relies on some particular context
(if it uses `this` within itself) you have to bind required
context explicitly before passing function in as a callback.
```js
var app = {
userId: 1,
getListener () {
return () => {
console.log(this.userId)
}
}
}
emitter.on('print', app.getListener())
```
Note: binding with use of the `.bind()` method won’t work as you might expect
and therefore is not recommended.
## Remove Listener
Methods `on` returns `unbind` function. Call it and this listener
will be removed from event.
```js
const unbind = emitter.on('tick', number => {
console.log('on ' + number)
})
emitter.emit('tick', 1)
// Prints "on 1"
unbind()
emitter.emit('tick', 2)
// Prints nothing
```
## Execute Listeners
Method `emit` will execute all listeners. First argument is event name, others
will be passed to listeners.
```js
emitter.on('tick', (a, b) => {
console.log(a, b)
})
emitter.emit('tick', 1, 'one')
// Prints 1, 'one'
```
## Events List
You can get used events list by `events` property.
```js
const unbind = emitter.on('tick', () => { })
emitter.events //=> { tick: [ [Function] ] }
```
## Once
If you need add event listener only for first event dispatch,
you can use this snippet:
```js
class Ticker {
constructor () {
this.emitter = createNanoEvents()
}
…
once (event, callback) {
const unbind = this.emitter.on(event, (...args) => {
unbind()
callback(...args)
})
return unbind
}
}
```
## Remove All Listeners
```js
emitter.on('event1', () => { })
emitter.on('event2', () => { })
emitter.events = { }
```