DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

npm pkg delete 删除不存在的数组属性,却删掉第一项

keywords.missing 不表示删除值为 missing 的项。npm 的数组删除路径可能把非数字键转成索引 0,应先确认结构与索引并审查 package.json 差异。

执行 npm pkg delete keywords.missing,命令成功退出,package.json 的第一条 keyword 却消失了。这里的 missing 既不是数组下标,也不是按值匹配条件;这条删除路径可能把它错误地当成索引 0。

npm 12.2.0、11.19.0 中有这组表现。12.2.1 的正式 Queryable 实现仍在父值是数组时直接调用 splice(_key, 1),没有在该处拒绝非数字键,所以不能只升级到 12.2.1 就假定误删风险消失。

看父值是数组还是对象

例如:

{
  "keywords": ["alpha", "beta"],
  "scripts": { "build": "vite build" }
}

对对象删除不存在的 scripts.missing,不会删除其他脚本;数组走的是另一种处理。splice 接收到 missing 这样的非数字字符串时,会转换为非数字值并按起点 0 处理,于是删掉 alpha。keywords.beta 也不表示“找值为 beta 的元素”。

先查看执行前后差异和实际数组内容,检查 contributors 等其他数组是否也被同类脚本操作。退出码 0 只能说明命令执行完毕,不能证明它删的是目标字段。

确认目标后使用数字索引,或编辑确切数组

若确实要删第二项,而且当前文件仍为上面的数组,可使用明确的数组路径:

npm pkg delete 'keywords[1]'

先备份或保留版本控制差异,执行前再次确认下标。数组是从 0 开始,前面的删除会改变后续位置,因此不能把多个旧下标无审查地连着执行。引号保留路径,避免 shell 把方括号解释成其他模式。

自动化需要按值删除时,应先读取数组、按业务条件确定要保留的项,再只更新这个字段。明确重复值应删一项还是全部、值不存在时保持不变,不能拿点路径冒充数组搜索。简单人工调整可以在编辑器中修改该数组,随后检查 JSON 结构和整份差异。

不要用补回一个猜测的第一项来掩盖已经发生的误删。需要恢复时,从执行前文件或已审定提交中找回准确内容,保留其他同时发生的有效编辑;不能直接覆盖整份 package.json。

验收应覆盖没有匹配项的情况

核对只删了目标项、相邻项和其他字段完整,package.json 仍能被项目工具读取。对自动化流程,还应覆盖目标不存在、数组为空及存在重复值,确认不会顺手删掉无关项。

这里处理的是 package 元数据编辑,通常不需要重建依赖树或删除锁文件。若删除动作来自脚手架或发布脚本,应修正它生成的路径,并在受控副本审查结果;仅恢复一次文件,下一次脚本运行仍会重复误删。