node教程,如何使用nanoid库生成随机数id?
发布于 作者:苏南大叔 来源:程序如此灵动~在随机id
生成领域,uuid
是当仁不让的老大,具有统治地位。但是,由于uuid
日渐庞大(node
版本的uuid
同时提供5种算法生成,能不庞大么),后来又出现了一个nanoid
,其特点就是小,体积小。如果你没有啥特殊要求,又以最小代价生成个随机id
的话,也许nanoid
是个不错的选择。体积足够小,函数足够简单。
苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试环境:node@16.14.2
,nanoid@4.0.0
。nanoid
默认生成21位随机数(uuid
默认36位),这个位数可控,随机数的范围其实也可控。
nanoid
代码主页
nanoid
的github
地址是:
这里还有个官方的中文文档:
这个代码没有任何依赖项目,非常的小,函数非常简单,这就是其对标uuid
的最大底气。相关文章:
但是,目前的最新版nanoid
只支持import
,不支持require
。所以,具有一些局限性。(老版本是同时支持import
和require
的)
官方推荐使用方式import
【es6】
官方例子是个import
,所以是在.mjs
文件里面写的:
import { nanoid } from 'nanoid';
console.log(nanoid())
普通的commonjs
文件(.cjs
)里面的话,可以使用动态加载:
(async()=>{
const { nanoid } = await import('nanoid');
console.log(nanoid())
})();
参考文章:
import
还是require
?
先回顾一下基本原则:https://newsn.net/say/node-require-import.html
1、是否支持import
和require
的关键是模块里面是怎么导出的。如果使用module.exports={}
(commonjs
标准),就可以同时支持import
和require
。如果使用的是export
(es 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=
【重点就是这句话】)。文件对比:
如果修改成支持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.
然而,react
里面说了,key
应该由循环体自己生成。不建议使用useid()
。
useId is not for generating keys in a list. Keys should be generated from your data.
有没有觉得两者都在相互甩锅?相关文章:
结束语
更多node
经验文章,请点击苏南大叔的博客文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。