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经验文章,请点击苏南大叔的博客文章: