@dotenvx/primitives

中文文档
4.4.0发布于 2026/11/07BSD-3-ClauseCommonJS零依赖近 30 天下载 4846.5万

由创造者创造的安全道具 dotenv

中文使用文档
文档目录36 节
  1. 安装
  2. API 密码
  3. check(policy, env)
  4. decrypt
  5. derive
  6. encrypt
  7. encrypted
  8. evaluate
  9. expand
  10. injectsummary
  11. keypair
  12. keyring
  13. keyringSync
  14. match
  15. parse
  16. parseSync
  17. parsearrays
  18. parsearraysSync
  19. parsedotenvxfile(source, file = '.env')
  20. policy(source, file = '.env')
  21. storagepolicy(source, file = '.env')
  22. storagecheck(policy, scanned)
  23. profile(source, options = {})
  24. publickeys
  25. redact(text, secrets)
  26. remove
  27. scan
  28. sealed(src, storagePolicy?)
  29. upsert
  30. 兼容性
  31. 出版
  32. 第三方通知
  33. 关系
  34. @ecies/密码
  35. @noble/曲线和 @noble/hashes
  36. @ noble/ 密码

@ dotenvx/ 原始内容

官方节点j的实施情况 dotenvx 原始语。 。 。 .

它提供dotenv解析,扩展,命令评价,sep256k1 ECIES 加密和解密、密钥环、扫描、匹配、密封检测和 dotenv 源代码更新.

安装

npm install @dotenvx/primitives

创建一个 .env 文件 :

HELLO=World

加密它 :

$ dotenvx encrypt

阅读和解析 index.cjs,然后打印每个密钥和值:

// index.cjs
const fs = require('node:fs')
const { parseSync } = require('@dotenvx/primitives')

const path = '.env'
const src = fs.readFileSync(path, 'utf8')
const parsed = parseSync(src)

for (const [key, value] of Object.entries(parsed.parsed)) {
  console.log(`${key}=${value}`)
}

那就运行它.

$ node index.cjs
HELLO=World

API 密码

一个Dotenvxfile来源为不同阶段生成两种政策:

生成校验每把钥匙的规则提供给检查器的值
policycheckenv 财务报告和审定财务报表 stdout最终解决的环境字符串
storagepolicystoragecheckstorage 仅限解密前原已存储的字符串

这两个政策发电机都具有记忆力。 呼叫者提供源文本和 值;这些原始人不读取文件,也不装入 shell 环境.

节点.js目的
check对照最终环境值检查已编译的 Dotenvxfile 策略
decrypt解密加密的 dotenvx 值
derive从私人密钥中获取压缩的公钥
encrypt加密公钥的值
encrypted探测到 encrypted: 前缀
evaluate评价 $(command) 替换
expand扩展环境可变表达式
keypair生成或还原 sip256k1 键盘
keyring绘制公用至私用密钥地图
keyringSync同步构建密钥环
match创建按键模式匹配器
parse解析、扩展、解密和分类 dotenv 字符串
parseSync解析多腾v 字符串同步
parsearrays保存重复任务时分析 dotenv 值
parsearraysSync解析 dotenv 阵列同步
parsedotenvxfile从 Dotenvx 文件源返回空字符串值的已声明密钥
parsedotenvxfileSync以空字符串值同步返回已声明的密钥
policy将 Dotenvx 文件文本或缓冲输入已解决的政策对象
profile从 Dotenvx 文件配置和呼叫器输入中选择一个以逗号分隔的文件列表
publickeys提取 dotenv 公钥元数据
redact以已编辑的标记来替换秘密字符串
remove按密钥删除 dotenv 任务
scan扫描 dotenv 任务、 复制和评论
sealed检查值是加密、空白还是秘密引用
storagecheck根据存储策略验证原始存储字符串
storagepolicy从 Dotenvxfile 源代码编译一个文件的存储规则
upsert插入或替换 dotenv 任务

check(policy, env)

验证最后的环境对象 env 返回时 { checked, errors }返回的数值 遵循他们命名的校正规则,回到 keys["*"].stdout.redacted 未申报的密钥; 输入不变。 也使用已应用的未申报密钥 通配符环境验证规则和诊断严格性。 失踪 未申报的密钥不产生诊断. 错误包括: 键,代码,规则,消息,和严格的旗帜.

check(policy('redacted true\nenv "TOKEN"'), { TOKEN: 'abc123' })
// { checked: { TOKEN: '[REDACTED]' }, errors: [] }

decrypt

解密一个 encrypted: 使用六进制编码的私钥值。 纯值 不变地返回.

const { decrypt, encrypt, keypair } = require('@dotenvx/primitives')

const { privateKey, publicKey } = keypair()
const encryptedValue = encrypt(publicKey, 'World')
const plaintext = decrypt(privateKey, encryptedValue)
console.log(plaintext)
// World

错误会显示稳定的 dotenvx 代码 :

const { decrypt } = require('@dotenvx/primitives')

try {
  decrypt('', 'encrypted:abc123')
} catch (error) {
  console.log(error.code)
  // MISSING_PRIVATE_KEY
}

过 { prefix: false } 作为解密基数64的第三个参数 不包括 encrypted: 前缀.

derive

为私钥衍生压缩的 secp256k1 公钥.

const { derive, keypair } = require('@dotenvx/primitives')

const { privateKey, publicKey } = keypair()
console.log(derive(privateKey) === publicKey)
// true

encrypt

使用 dotenvx 兼容的 ECIES 加密 UTF-8 值并返回一个 encrypted:- 预设值.

const { encrypt, keypair } = require('@dotenvx/primitives')

const { publicKey } = keypair()
const encryptedValue = encrypt(publicKey, 'World')
console.log(encryptedValue.startsWith('encrypted:'))
// true

加密是随机的,所以两次加密相同的值 不同的密码.

encrypted

检查一个数值是否从大小写敏感开始 encrypted: 前缀. 前缀也可作为 encrypted.PREFIX。 。 。 .

const { encrypted } = require('@dotenvx/primitives')

console.log(encrypted.PREFIX)
// encrypted:
console.log(encrypted('encrypted:abc123'))
// true
console.log(encrypted('World'))
// false

evaluate

评估 shell 命令替换并删除后面的新行 命令输出。 下面的例子使用 POSIX shell 命令.

const { evaluate } = require('@dotenvx/primitives')

const value = evaluate('HELLO=$(printf World)', {})
console.log(value)
// HELLO=World

使用 {} 默认 :

选项默认目的
processEnvprocess.env提供给命令的环境值
runningParsed{}先前解析的值; 覆盖 processEnv 对于命令

错误命令丢出代码错误 COMMAND_SUBSTITUTION_FAILED。 。 。 .

expand

扩展 $NAME, (中文(简体) ), ${NAME},默认值表达式,和替代值 表达.

const { expand } = require('@dotenvx/primitives')

const value = expand('postgres://${USER}:$PASS@localhost', {
  processEnv: { USER: 'scott', PASS: 'secret' }
})
console.log(value)
// postgres://scott:secret@localhost

支持的运算符 :

  • ${NAME:-fallback} 在缺少或空时使用倒数.
  • ${NAME-fallback} 缺少时使用倒计时.
  • ${NAME:+alternate} 使用当前和非空的相交点.
  • ${NAME+alternate} 使用在场时的替代.

使用 {} 默认 :

选项默认目的
processEnvprocess.env现有环境价值
runningParsed{}逐渐解析的数值
overloadfalse给 runningParsed 优先于 processEnv
literals{}不应再扩展表达式的字面价值

injectsummary

injectsummary(count, files = []) 共享注入格式 不记录、检查环境值或添加ANSI颜色. 呼叫者决定何时何地打印,并应用自己的静默设置.

const { injectsummary } = require('@dotenvx/primitives')
injectsummary(2, ['.env']) // ⟐ injected env (2) from .env

文件也可能是公共元数据对象 filepath, (中文(简体) ), publicKeys,以及 keySources (公用钥匙 ) 这包括简短的代码和 独有的监护标签,例如:

injectsummary(3, [{
  filepath: '.env',
  publicKeys: ['031f20abc'],
  keySources: { '031f20abc': 'armor' }
}]) // ⟐ injected env (3) from .env (031 F20) via Armor ⛨

injectsummary.sources(files) 返回时 { files, suffix } 用于其他命令 摘要,因此加密和解密使用相同的标签和短码. 只通过公共元数据,从不通过私钥或环境值.

keypair

生成新密钥派或从已有的私钥中恢复密钥.

const { keypair } = require('@dotenvx/primitives')

const generated = keypair()
const restored = keypair(generated.privateKey)
console.log(generated.publicKey === restored.publicKey)
// true

返回对象包含 privateKey 财务报告和审定财务报表 publicKey 螺旋绳.

keyring

构建一个按键为公钥且其值为匹配的对象 私钥.

const { keyring, keypair } = require('@dotenvx/primitives')

const { privateKey, publicKey } = keypair()
const ring = await keyring({
  processEnv: { DOTENV_PRIVATE_KEY: privateKey }
})
console.log(ring[publicKey] === privateKey)
// true

默认, keyring() 读取 .env.keys 从当前工作目录中 键 process.env。缺少或无法读取的密钥文件无声 被忽略 。 设定 fk 以覆盖路径,或 [] 以禁用文件读取.

选项默认目的
processEnvprocess.env环境包含 DOTENV_PRIVATE_KEY* 财务报告和审定财务报表 DOTENV_PUBLIC_KEY* 条目
ring{}现有公用至私用钥匙物体,已安装
fk'.env.keys'密钥文件路径或一系列路径
provider无函数在私钥缺失时使用公钥调用; 返回密钥环对象或对密钥的承诺

密钥文件中的私钥任务可以重复或逗号分隔. 无效的私钥被忽略 。 没有匹配的私钥的公钥 在环中保留空值.

keyringSync

与相同的选项同步构建密钥环。 提供 provider 必须同步返回对象.

const { keyringSync, keypair } = require('@dotenvx/primitives')

const { privateKey, publicKey } = keypair()
const ring = keyringSync({ processEnv: { DOTENV_PRIVATE_KEY: privateKey } })
console.log(ring[publicKey] === privateKey)
// true

也可用 keyring.sync(options)。 。 。 .

match

创建支持 glob 模式的匹配者, 包括 * 财务报告和审定财务报表 ?附加时 忽略图案。 用途 picomatch 模式和选项.

const { match } = require('@dotenvx/primitives')

const isAllowed = match(['DOTENV_*'], { ignore: ['DOTENV_PRIVATE_*'] })
console.log(isAllowed('DOTENV_PUBLIC_KEY'))
// true
console.log(isAllowed('DOTENV_PRIVATE_KEY'))
// false

parse

应用扩展、 超载优先级、 有选择 解密,并注射与已存在的分类.

const { parse } = require('@dotenvx/primitives')

const result = await parse('A=file\nB=$A\nHELLO=World', { processEnv: {} })
console.log(result.parsed.B)
// file

for (const [key, value] of Object.entries(result.parsed)) {
  console.log(`${key}=${value}`)
}

parse() 自动调用 keyring()读取 .env.keys 从当前 默认工作目录。 缺少或无法读取的密钥文件无声 被忽略 。 覆盖 fk 以使用其他路径,或提供 [] 以禁用文件读取. 呼叫者仍然提供 Dotenv 源字符串; parse() 不读 .env 或将返回的值写入 process.env。 。 。 .

选项默认目的
processEnvprocess.env优先、扩展和关键发现的现有环境价值
overloadfalse让源值凌驾于已存在的环境值
ik所有密钥要解密的密钥模式或一系列模式
ek无除外情形从解密中排除的关键模式或类型
fk'.env.keys'密钥文件路径或一系列路径
provider无解析缺失的私钥; 与 keyring()

排斥模式胜过包容模式。 这些模式控制 解密; 排除的密钥仍保留在解析输出中 .

结果包括:

外地目录
parsed所有解析的密钥/ 值对
injected分类为注射的值,包括已解密的已存在的密码文本
existed从所提供的环境中保存的价值
errors解析/解析出错对象 code 财务报告和审定财务报表 message

所有三个对象中的值都是字符串. 重复的密钥保留最后的 加工价值。 检查 errors 用于未解密的加密值。 例外 关键提供者可以拒绝承诺.

parseSync

Parses dotenv source与相同的选项和结果形状同步. 提供 provider 必须是同步的.

const { parseSync } = require('@dotenvx/primitives')

const result = parseSync('HELLO=World', { processEnv: {} })
console.log(result.parsed.HELLO)
// World

也可用 parse.sync(source, options)。 。 。 .

parsearrays

使用 parsearrays(source, options) 以数组保存重复的任务. 它接受的选项与 parse()。所有三个对象(parsed, (中文(简体) ), injected,以及 existed)包含数组,甚至对于一个单一任务的密钥也是如此. parse() 保留最后一个值.

const { parsearrays } = require('@dotenvx/primitives')

const result = await parsearrays('HELLO=World\nHELLO=Node', { processEnv: {} })
console.log(result.parsed.HELLO)
// ['World', 'Node']

两种功能都自动建立密钥环并共享扩展,解密, 和优先行为。 排斥模式胜过包容模式.

迁移:替换 parse(source, { array: true }) 与 parsearrays(source)。 。 。 . 删除 array 从选项; 它不再改变输出类型.

parsearraysSync

解析数组与相同选项和结果形状同步 parsearrays()提供 provider 必须是同步的.

const { parsearraysSync } = require('@dotenvx/primitives')

const result = parsearraysSync('HELLO=World\nHELLO=Node', { processEnv: {} })
console.log(result.parsed.HELLO)
// ['World', 'Node']

也可用 parsearrays.sync(source, options)。 。 。 .

parsedotenvxfile(source, file = '.env')

同时可用 parsedotenvxfile.sync(source, file) 或者说 parsedotenvxfileSync(source, file)。 。 。 .

返回选定文件的空字符串值的已声明密钥.

await parsedotenvxfile('env "PORT"\nenv "TOKEN"')
// { PORT: '', TOKEN: '' }

policy(source, file = '.env')

编译 Dotenvx 文件文本或缓冲 { keys: { ... } }。每个键都有 env 审定规则和 stdout 编辑规则。 存储设置被省略 . 对于逗号分隔的文件名,第一个文件会赢得明确的规则. 汇编 在内存中工作;呼叫者读取文件并加载环境值.

const rules = policy('env "TOKEN", required: true, redacted: true')
// rules.keys.TOKEN:
// { env: { type: 'string', required: true, strict: false },
//   stdout: { redacted: true } }

保留 keys["*"] 条目包含未申报密钥的默认值.

同一来源可以产生两种政策:

const source = 'storage "encrypted"\nenv "TOKEN", required: true, redacted: true'
const envRules = policy(source, '.env.production')
const storageRules = storagepolicy(source, '.env.production')

check(envRules, { TOKEN: 'resolved-secret' })
// { checked: { TOKEN: '[REDACTED]' }, errors: [] }
storagecheck(storageRules, { TOKEN: ['encrypted:example'] })
// { checked: { TOKEN: ['encrypted:example'] }, errors: [] }

storagepolicy(source, file = '.env')

为一个文件名编译同一个源 。 每个密钥只包含 storage 规则 : type (单位:千美元)any, (中文(简体) ), encrypted,或 plaintext, (中文(简体) ), required,以及 strict默认类型到 any。按规定严格遵循 决 议 policy: 每键覆盖, 所选文件设置, 根设置, 然后是虚假的. 此政策没有固定/重排设置 .

const rules = storagepolicy('storage "encrypted"\nenv "PORT", storage: "plaintext"', '.env.production')
storagecheck(rules, { PORT: ['3000'], TOKEN: ['encrypted:example'] })

将原始存储字符串传递到 storagecheck,在解密之前。 加密检查 承认 encrypted: 前缀;它们不认证密码文本.

storagecheck(policy, scanned)

检查原始存储字符串与 storagepolicy 规则和返回 checked 财务报告和审定财务报表 errors。不应用 Stdout 编辑。 使用 check 与 policy 用于解决的环境验证和编辑.

profile(source, options = {})

将 Dotenvx 文件配置文件解析为逗号分隔文件名 。 接受 f, (中文(简体) ), profile, (中文(简体) ), processEnv,以及 environmentKeys 选项. processEnv 默认为 process.env· ; 通过 {} 忽略进程环境。 明确文件胜过配置名称; 使用开发配置文件或 .env。 。 。 .

profile('profile "production", files: [".env.production"]', { profile: 'production' })
// '.env.production'

publickeys

提取每个 DOTENV_PUBLIC_KEY* 任务时 保存密钥顺序.

const { publickeys } = require('@dotenvx/primitives')

const keys = publickeys('DOTENV_PUBLIC_KEY=public-a\nDOTENV_PUBLIC_KEY_PRODUCTION=public-b')
console.log(keys)
// ['public-a', 'public-b']

redact(text, secrets)

将字面上的秘密字符串替换为 [REDACTED],包括重叠匹配.

redact('token=abc123', ['abc123']) // 'token=[REDACTED]'

remove

删除给定密钥的每一项任务。 它保存周围的线路, 注释,其他密钥的多行值,以及 CRLF 线尾. 如果钥匙 缺少,源代码不变.

const { remove } = require('@dotenvx/primitives')

const updated = remove('HELLO=one\nFOO=bar\nHELLO=two\n', 'HELLO')
console.log(updated === 'FOO=bar\n')
// true

scan

扫描 dotenv 任务而不应用扩展或解密. 复制 值及其注释按源顺序保存.

const { scan } = require('@dotenvx/primitives')

const result = scan('HELLO=first\nHELLO=second # optional')
console.log(result.scanned.HELLO)
// ['first', 'second']
console.log(result.comments.HELLO)
// [undefined, 'optional']
选项默认目的
ik所有密钥要包括的密钥模式或一系列模式
ek无除外情形要排除的关键模式或类型
expandDoubleQuotedNewlinestrue解码逃出的新行、车厢返回和双引号的标签
convertWindowsNewlinestrue将 CRLF 和 CR 线的终点规范为 LF

可选变换接收 { name, value, quote, comment } 每个 任务。 它的返回值被存储在相应的数组中 :

const { scan } = require('@dotenvx/primitives')

const result = scan('HELLO=World', ({ value }) => value.toUpperCase())
console.log(result.scanned.HELLO)
// ['WORLD']

如果有选项, 将变换作为第三个参数 : scan(source, options, transform)。 。 。 .

sealed(src, storagePolicy?)

回返 true 当每个非元数据值都是加密的,只有空或白空, 或者从 op:// (1个口活字)或 bw:// (Bitwarden 密码管理器). DOTENV_PUBLIC_KEY* 财务报告和审定财务报表 *_PLAIN 值被允许为正文. 空源被视为被封. 检查每个重复的任务 . 可选解决 storagepolicy() 允许纯文本密钥。 明确 encrypted 规则高于 _PLAIN 后缀; any 使用后缀会议。 现有 即使政策允许简单文字,密码文本仍然被接受. 秘密引用以其对大小写敏感的前缀识别;它们不是 解决或鉴定了供应商。 其他URL、可变参考文献和 命令替换不例外.

const { sealed } = require('@dotenvx/primitives')

console.log(sealed('HELLO=encrypted:abc123'))
// true
console.log(sealed('HELLO=World'))
// false

upsert

插入缺失的任务或替换现有密钥的所有出错. 它保留了现有的引号样式,导出前缀,多行值,以及 CRLF行终.

const { upsert } = require('@dotenvx/primitives')

const updated = upsert('HELLO=one\nHELLO=two', 'HELLO', ['uno', 'dos'])
console.log(updated)
// HELLO=uno
// HELLO=dos

字符串替换适用于每次发生。 对于偶发性变化, 提供一个阵列,每个现有任务有一个替换。 为了新的 键,提供字符串;插入的任务为双引出.

兼容性

采用私人节点Js兼容性测试,对实施情况进行测试. 这个 粗略执行 提供相应的原始 含有 Rust-inative 类型和命名,包括 policy, (中文(简体) ), storagepolicy, (中文(简体) ), profile, (中文(简体) ), check,以及 redact 带有相同的 Dotenvx 文件默认和优先规则.

出版

从此目录手动发布 。 保持npm 和 Rust 状态 版本匹配, 如下 发展.md,然后运行 :

npm run standard
npm run build
npm pack --dry-run
npm publish

第三方通知

此包件将下列麻省理工学院许可包件的一部分捆绑起来:

  • eciesjs
  • @ecies/ciphers
  • @noble/curves
  • @noble/hashes
  • @noble/ciphers

关系

MIT 许可证

版权(c) 2019-2026 李伟良

特此免费准许任何人获得副本 ,用于处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:

上述版权通知和这项许可通知应载入所有 软件的复制件或大部分.

软件是提供的"AS IS", 没有任何的恐惧, EXPRESS OR ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 财产、财产、财产、财产、财产或财产 软件.

@ecies/密码

MIT 许可证

版权(c) 2019-2026 李伟良

特此免费准许任何人获得副本 ,用于处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:

上述版权通知和这项许可通知应载入所有 软件的复制件或大部分.

软件是提供的"AS IS", 没有任何的恐惧, EXPRESS OR ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 财产、财产、财产、财产、财产或财产 软件.

@noble/曲线和 @noble/hashes

《麻省理工学院许可证》

版权 (c) 2022 保罗·米勒(英语:https://paulmiller.com (中文(简体) )(中文(简体) )

特此免费准许任何人获得副本 软件和相关文档文件(“软件”),处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:

上述版权通知和本许可通知应列入 软件的所有副本或大部分.

软件是提供的 " AS IS " ,没有任何形式的恐惧、排斥或 ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 或与溶剂或溶剂的使用或 软件.

@ noble/ 密码

《麻省理工学院许可证》

版权 (c) 2022 保罗·米勒(英语:https://paulmiller.com (中文(简体) )(中文(简体) ) 版权 (c) 2016 托马斯·波宁 色情制品@bolet.org

特此免费准许任何人获得副本 软件和相关文档文件(“软件”),处理 在软件中不受限制,包括不受限制的权利 使用、复制、修改、合并、出版、分发、分许可证和/或出售 软件的复制件,并允许该软件所针对的人 满足下列条件:

上述版权通知和本许可通知应列入 软件的所有副本或大部分.

软件是提供的 " AS IS " ,没有任何形式的恐惧、排斥或 ,包括但不限制于雇佣军的保障, 特别目的和非目的的证明。 绝对不会 B. 任何索赔、索赔或其他索赔的索赔人或 责任,在契约、契约或其他行为中,产生于, 或与溶剂或溶剂的使用或 软件.

版本与发布记录

@dotenvx/primitives 共发布 58 个版本,首次发布于 2026/06/20;过去 12 个月发布了 58 个版本。

版本发布日期距今
4.4.0latest2026/11/076 天前
4.3.02026/10/2915 天前
4.2.32026/10/2915 天前
4.2.22026/10/2915 天前
4.2.12026/10/2915 天前
4.2.02026/10/2915 天前

关于 @dotenvx/primitives 的常见问题

@dotenvx/primitives 是什么?

由创造者创造的安全道具 dotenv

如何安装 @dotenvx/primitives?

在项目目录运行 npm install @dotenvx/primitives,或使用 pnpm add / yarn add / bun add。

@dotenvx/primitives 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/dotenvx__primitives 是否存在。

@dotenvx/primitives 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@dotenvx/primitives 可以商用吗?

@dotenvx/primitives 使用 BSD-3-Clause 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。另外不得用原作者名义为衍生产品背书。以上为概括,不构成法律意见,请以许可原文为准。

@dotenvx/primitives 的下载量有多少?

根据 npm 官方下载统计,@dotenvx/primitives 在 2026/10/13 – 2026/11/11 这 30 天内被下载 48,465,424 次,日均约 1,615,514 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dotenvx/primitives 还在维护吗?

最新版本 4.4.0 发布于 2026/11/07(6 天前);至今共发布 58 个版本,其中过去 12 个月发布了 58 个;首次发布于 2026/06/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。