ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 Node.js 中使用 ES Modules 引入 uuid:从安装到全 API 实战指南

在 Node.js 中使用 ES Modules 引入 uuid:从安装到全 API 实战指南 开发工具CLI【免费下载链接】uuidGenerate RFC-compliant UUIDs in JavaScript项目地址https://gitcode.com/gh_mirrors/uu/uuid点击查看免费下载本文基于仓库 examples/node-esmodules 目录下的官方示例完整讲解如何在 Node.js 原生 ES Modules 环境中安装并引入uuid包当前版本 14.0.1遵循 RFC 9562 / RFC 4122覆盖命名导入、命名空间导入、v1/v3/v4/v5/v6/v7 生成、v1↔v6 互转、parse/stringify/validate/version工具函数以及NIL/MAX常量等全部公开 API。读完本文你将能够直接复制运行一个覆盖 uuid 全 API 的 Node.js ESM 示例并理解其底层实现与导出机制。示例环境概览examples/node-esmodules是一个独立的 Node.js 示例包其目录结构如下examples/node-esmodules/ ├── README.md # 示例说明npm install / npm test ├── example.mjs # 全 API 演示主文件ESM 源码 ├── package.json # 示例包配置与脚本 └── package.mjs # 动态导入 package.json 的独立验证脚本示例的运行方式只有两条命令这也是本文实战部分的起点npm install npm testnpm test会通过npm-run-all依次执行test:example运行node example.mjs与test:package在 Node.js v20 下额外运行node package.mjs验证通过动态import读取uuid/package.json的能力。安装与依赖说明示例的 package.json 中uuid 依赖通过本地打包产物引入而非直接指向 npm registry{ name: uuid-example-node-esmodules, version: 0.0.0, private: true, scripts: { test:package: ( node --version | grep -vq v20 ) || ( node package.mjs ), test:example: node example.mjs, pretest: rm -fr node_modules npm install --no-package-lock, test: npm-run-all test:* }, dependencies: { uuid: file:../../.build/uuid.tgz } }值得注意的几个细节依赖指向本地构建产物file:../../.build/uuid.tgz即仓库根目录npm run build后生成的 tarball。也就是说运行此示例前需先在仓库根目录完成构建根 package.json 的pretest、prepack、prepublishOnly等脚本均会触发npm run build。每次测试前干净重装pretest脚本会删除node_modules并以--no-package-lock重新安装保证示例始终基于最新的本地构建包运行。Node.js 版本条件test:package脚本通过node --version | grep -vq v20判断仅在 Node.js v20 环境才执行package.mjs用于验证 import 属性assert/with子句的兼容行为。两种导入方式命名导入与命名空间导入example.mjs 演示了 ESM 下两种等价引入方式。命名导入named import将uuid的所有公开 API 以别名形式一次性引入import { MAX as MAX_UUID, NIL as NIL_UUID, parse as uuidParse, stringify as uuidStringify, validate as uuidValidate, version as uuidVersion, v1 as uuidv1, v1ToV6 as uuidv1ToV6, v3 as uuidv3, v4 as uuidv4, v5 as uuidv5, v6 as uuidv6, v6ToV1 as uuidv6ToV1, v7 as uuidv7, } from uuid;这些导出与 src/index.ts 中的入口定义一一对应MAX、NIL、parse、stringify、validate、version、v1、v1ToV6、v3、v4、v5、v6、v6ToV1、v7另加类型导出UUIDTypes等见 src/types.ts。命名空间导入namespace import以import * as uuid from uuid的方式引入后通过uuid.v1()、uuid.parse()等属性访问效果完全一致。示例后半段专门对比展示了这两种写法console.log(uuid.v1(), uuid.v1()); console.log(uuid.v4(), uuid.v4()); console.log(uuid.v7(), uuid.v7()); console.log(uuid.NIL, uuid.NIL); console.log(uuid.MAX, uuid.MAX);为什么 ESM 下推荐显式命名导入根 package.json 的exports字段声明了条件导出exports: { .: { node: { types: ./dist/index.d.ts, default: ./dist-node/index.js }, default: ./dist/index.js }, ./package.json: ./package.json }Node.js 环境会命中node条件加载dist-node/index.js其他环境浏览器、打包器等回退到默认的dist/index.js。type: module配合sideEffects: false使得打包器可以对命名导入做 Tree Shaking——只打包实际用到的函数如仅v4这也是命名导入在现代工程中更受推荐的原因之一。各版本 UUID 的生成与命名空间用法示例覆盖了所有生成型 API可直接复制运行观察输出console.log(uuidv1(), uuidv1()); // 时间戳 节点标识版本 1 console.log(uuidv4(), uuidv4()); // 全随机版本 4 console.log(uuidv7(), uuidv7()); // 时间戳 随机序列版本 7 // v3 基于 MD5 哈希需命名空间 console.log(uuidv3() DNS, uuidv3(hello.example.com, uuidv3.DNS)); console.log(uuidv3() URL, uuidv3(http://example.com/hello, uuidv3.URL)); // v5 基于 SHA-1 哈希同样需命名空间 console.log(uuidv5() DNS, uuidv5(hello.example.com, uuidv5.DNS)); console.log(uuidv5() URL, uuidv5(http://example.com/hello, uuidv5.URL)); console.log(uuidv6(), uuidv6()); // 时间排序增强版版本 6命名空间namespace的正确用法v3/v5 是命名空间哈希型 UUID需要同时传入value与namespace。包内预置了两个标准命名空间常量定义于 src/v35.tsDNS6ba7b810-9dad-11d1-80b4-00c04fd430c8URL6ba7b811-9dad-11d1-80b4-00c04fd430c8自定义命名空间必须是属于你应用的 UUID 字符串且必须为 16 字节namespace校验失败会抛出TypeError(Namespace must be array-like (16 iterable integer values, 0-255))// 可事先用 uuid 命令行工具生成一个专属命名空间 const MY_NAMESPACE 55238d15-c926-4598-b49d-cf4e913ba13c; console.log(uuidv3() MY_NAMESPACE, uuidv3(Hello, World!, MY_NAMESPACE)); console.log(uuidv5() MY_NAMESPACE, uuidv5(Hello, World!, MY_NAMESPACE));底层实现中src/v35.tsv3/v5 会将 namespace 字节与 value 字节拼接后做 MD5 或 SHA-1 哈希随后写入版本位bytes[6] (bytes[6] 0x0f) | version与变体位bytes[8] (bytes[8] 0x3f) | 0x80最终格式化为标准字符串。v7 的时序单调性保障v7 是 RFC 9562 新增的时间排序 UUID其内部状态机src/v7.ts在无参数调用时时间前进则重新随机序列号同一毫秒内则递增 32 位序列号溢出时将时间戳 1ms 以维持单调性RFC 9562 §6.2 允许该做法。传入optionsmsecs/seq/random/rng时则完全脱离内部状态生成结果可预期。v1 与 v6 的互相转换示例演示了 RFC 9562 中 v1 → v6 的字段重排能力const V1_ID f1207660-21d2-11ef-8c4f-419efbd44d48; const V6_ID 1ef21d2f-1207-6660-8c4f-419efbd44d48; console.log(uuidv1ToV6(), uuidv1ToV6(V1_ID)); // 输出 1ef21d2f-1207-6660-8c4f-419efbd44d48 console.log(uuidv6ToV1(), uuidv6ToV1(V6_ID)); // 输出 f1207660-21d2-11ef-8c4f-419efbd44d48v1ToV6的实现src/v1ToV6.ts通过位运算将 v1 的 60 位时间戳分布在字节 0-7重排为 v6 的大端序时间布局并把版本位改写为0x60v6ToV1则是完全逆向的过程。两者均保持输入输出类型一致传入字符串返回字符串传入Uint8Array返回新的Uint8Array。这一能力对需要从旧 v1 数据平滑迁移到 v6 排序语义、又不想破坏既有标识的场景非常实用。工具函数与常量示例覆盖了全部工具型 API 与特殊常量console.log(NIL_UUID, NIL_UUID); // 00000000-0000-0000-0000-000000000000 console.log(MAX_UUID, MAX_UUID); // ffffffff-ffff-ffff-ffff-ffffffffffff console.log(uuidParse(), uuidParse(MY_NAMESPACE)); // 解析为 16 字节 Uint8Array console.log(uuidStringify(), uuidStringify(uuidParse(MY_NAMESPACE))); // 还原字符串 console.log(uuidValidate(), uuidValidate(MY_NAMESPACE)); // 合法性校验返回布尔值 console.log(uuidVersion(), uuidVersion(MY_NAMESPACE)); // 返回版本号如 3/4/5/6/7各工具函数对应的源码入口NIL全零 UUID定义于 src/nil.tsMAX全fUUID定义于 src/max.tsparse将 36 字符 UUID 字符串解析为 16 字节数组src/parse.tsstringify将 16 字节数组格式化为标准字符串内部经validate做一致性校验非法输入会抛出TypeError(Stringified UUID is invalid)src/stringify.tsvalidate正则校验 UUID 字符串格式src/validate.tsversion解析并返回 UUID 的版本号src/version.ts。parse与stringify构成完整的双向转换闭环是处理二进制存储、数据库主键与接口字符串之间转换的常用组合。动态导入 package.json面向 React Native 等工具链示例的另一个亮点是动态导入uuid/package.json// Import attribute syntax is still awaiting finalization. // 为兼容 assert 与 with 两种语法这里使用动态 import const pkg await import(uuid/package.json, { assert: { type: json }, with: { type: json }, }); console.log(pkg.name, pkg.default.name); // uuid注释明确指出import 属性JSON 模块的assert/with子句语法尚未完全定稿见 TC39 import-attributes 提案因此示例同时传入两种子句以兼容不同 Node.js 版本。with是新语法assert是旧语法双写可保证在过渡期都能工作。这依赖根 package.json 中./package.json: ./package.json的导出映射——包内所有文件均可直接通过子路径导入。package.mjsNode.js v20 下执行则展示了顶层import pkg from uuid/package.json assert { type: json }的静态写法。动态import适合 React Native、Cordova 等需要运行时内省包元信息如pkg.name、版本号的工具链场景。运行与验证完成上述文件落地后或直接在仓库的examples/node-esmodules目录中npm install # 安装本地构建产物 uuid.tgz npm test # 依次运行 example.mjs 与Node 20 下package.mjs预期输出会依次打印 v1/v4/v7 随机 UUID、v3/v5 的 DNS/URL/自定义命名空间哈希结果、v6 UUID、v1↔v6 转换结果、NIL/MAX常量、parse/stringify/validate/version的工具调用结果以及命名空间导入等价调用的全部输出最后打印pkg.nameuuid。小结examples/node-esmodules示例以极简的npm installnpm test两步走通了 Node.js ESM 环境下 uuid 的全部公开 API 面两种导入方式、v1/v3/v4/v5/v6/v7 生成、命名空间语义、v1↔v6 双向转换、工具函数与常量、以及面向工具链的 JSON 动态导入。配合根 package.json 的exports条件导出与sideEffects: false这套用法同样适用于 Vite、Rollup、Webpack 等现代构建链路需要浏览器端方案时可进一步参考仓库中的 browser-esmodules 与 node-jest 等示例。赞分享开发工具CLI【免费下载链接】uuidGenerate RFC-compliant UUIDs in JavaScript项目地址https://gitcode.com/gh_mirrors/uu/uuid点击查看免费下载相关推荐在 Node.js 中使用 Webpack 打包 uuid完整实战指南在 Node.js 中使用 Webpack 打包 uuid完整实战指南 本指南以仓库中 examples/node webpack https://link.开发工具CLIMJML 安装与使用完全指南从 npm 安装、CLI 编译、Node.js API 到 mj-include 安全实践MJML 安装与使用完全指南从 npm 安装、CLI 编译、Node.js API 到 mj include 安全实践 MJML 是专门面向响应式邮件开发的标前端CLINuxt 原生 ES Modules 实战指南从 Node.js 模块解析到 CJS 兼容排错与库迁移Nuxt 原生 ES Modules 实战指南从 Node.js 模块解析到 CJS 兼容排错与库迁移 本文围绕 Nuxt 官方文档 ES Modules 概前端后端Web框架SSR上一篇抖音下载工具douyin-downloader保姆级指南批量保存视频与直播回放下一篇3步离线下载整个网站WebSite-Downloader 把租来的网页永久搬回家创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表