use-singleton

Create singleton better, and more easily

Usage no npm install needed!

<script type="module">
  import useSingleton from 'https://cdn.skypack.dev/use-singleton';
</script>

README

use-singleton

Npm Bundlephobia Coverage License License

中文简体

Create singleton better, and more easily.

  • Typescript
  • Optional immediately create
  • Optional recreate
  • Allow async create
  • Without dependence
  • Not OOP
  • Only ~1kb before gzipped

Install

NPM

npm install use-singleton --save

Browser

<script src="https://cdn.jsdelivr.net/npm/use-singleton/dist/index.min.js"></script>
<script>
  var useSingleton = UseSingleton.default;
</script>

API

import useSingleton from "use-singleton";

const getSingleton = useSingleton(createInstance, options);
  • createInstance {function},should return instance.
  • options {Object} default: {}
    • withKey {boolean} default: false
    • immediate {boolean} default: false

Usage

Create singleton

const getNumber = useSingleton(() => {
  console.log("created");
  return 1;
});

getNumber();
// log -> 'created'
// -> 1

getNumber();
// -> 1

Create singleton immediately

const getNumber = useSingleton(
  () => {
    console.log("created");
    return 1;
  },
  {
    immediate: true,
  }
);
// log -> 'init'

getNumber();
// -> 1

getNumber();
// -> 1

Create singleton with key, and recreate by different key

const getTime = useSingleton(
  (key) => {
    console.log(key);
    return new Date();
  },
  {
    withKey: true,
  }
);

const instance0 = getTime();
// log -> undefined
// -> date
const instance1 = getTime();
// -> same as instance0

const instance2 = getTime(1);
// log -> 1
// -> new date
const instance3 = getTime(1);
// -> same as instance2
const instance4 = getTime();
// -> same as instance2

Create singleton by async function

const getUserInfo = useSingleton(
  async (key: userId) => {
    console.log(userId);
    userInfo = await api.get(`https://foo.bar/api/user?id=${userId}`);
    return userInfo;
  },
  {
    withKey: true,
  }
);

await Promise.all[(getUserInfo(1), getUserInfo(1), getUserInfo(2))];
// log -> 1
// log -> 2

// -> [userInfo_1, userInfo_1, userInfo_2]