我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在随机id生成领域,uuid是当仁不让的老大,具有统治地位。但是,由于uuid日渐庞大(node版本的uuid同时提供5种算法生成,能不庞大么),后来又出现了一个nanoid,其特点就是小,体积小。如果你没有啥特殊要求,又以最小代价生成个随机id的话,也许nanoid是个不错的选择。体积足够小,函数足够简单。

苏南大叔:node教程,如何使用nanoid库生成随机数id? - nanoid
node教程,如何使用nanoid库生成随机数id?(图5-1)

苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:node@16.14.2nanoid@4.0.0nanoid默认生成21位随机数(uuid默认36位),这个位数可控,随机数的范围其实也可控。

nanoid代码主页

nanoidgithub地址是:

这里还有个官方的中文文档:

苏南大叔:node教程,如何使用nanoid库生成随机数id? - nanojs-github
node教程,如何使用nanoid库生成随机数id?(图5-2)

这个代码没有任何依赖项目,非常的小,函数非常简单,这就是其对标uuid的最大底气。相关文章:

但是,目前的最新版nanoid只支持import,不支持require。所以,具有一些局限性。(老版本是同时支持importrequire的)

官方推荐使用方式import【es6】

官方例子是个import,所以是在.mjs文件里面写的:

import { nanoid } from 'nanoid';
console.log(nanoid())

普通的commonjs文件(.cjs)里面的话,可以使用动态加载:

(async()=>{
    const { nanoid } = await import('nanoid');
    console.log(nanoid())
})();

参考文章:

苏南大叔:node教程,如何使用nanoid库生成随机数id? - mjs-cjs
node教程,如何使用nanoid库生成随机数id?(图5-3)

import还是require

先回顾一下基本原则:https://newsn.net/say/node-require-import.html

1、是否支持importrequire的关键是模块里面是怎么导出的。如果使用module.exports={}commonjs标准),就可以同时支持importrequire。如果使用的是exportes module模块),那么就仅仅支持import

2、同时,.mjs意味着必然是es module.cjs意味着必须是commonjs。而.js则跟随者package.json里面type设定而更改。(意思是可能是commonjs,也可能是es module)。

老版本可以使用require【commonjs】

如果是nanoid的老版本的话(例如3.0版本)或者是魔改的nanoid,还是可以使用require的。

const { nanoid } = require('nanoid');
console.log(nanoid())

nanoid()可以传个数字长度做参数。

nanoid(5);      //CaEvi

魔改新版本支持require【commonjs】

这个nanoid代码的最新版本,目前舍弃了require的方式,(可以看源码里面的模块导出方式,使用的是export,而不是module.export=【重点就是这句话】)。文件对比:

苏南大叔:node教程,如何使用nanoid库生成随机数id? - exports支持代码
node教程,如何使用nanoid库生成随机数id?(图5-4)

如果修改成支持require的模块引用的话,可以修改node_modules/nanoid/目录下面的文件:
1、package.json,删除type:module字样。【重要】
2、index.js,删除所有的export字样,然后修改顶部导入,和底部的导出语句。

let { randomFillSync } = require('crypto')
let { urlAlphabet } = require('./url-alphabet')
//...
module.exports = { nanoid, customAlphabet, customRandom, urlAlphabet, random }

3、url-alphabet/index.js:

const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
module.exports = { urlAlphabet }

react循环key

nanoid官方说了,不建议使用nanoid用作map循环里面的key,建议使用react里面的useid()

In case you just need random IDs to link elements like labels and input fields together, useId is recommended. That hook was added in React 18.

苏南大叔:node教程,如何使用nanoid库生成随机数id? - not-key-nanoid
node教程,如何使用nanoid库生成随机数id?(图5-5)

然而,react里面说了,key应该由循环体自己生成。不建议使用useid()

useId is not for generating keys in a list. Keys should be generated from your data.

有没有觉得两者都在相互甩锅?相关文章:

结束语

更多node经验文章,请点击苏南大叔的博客文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   node