@endo/immutable-arraybuffer

中文文档
2.0.0发布于 2026/08/14Apache-2.0TypeScriptES Module零依赖近 30 天下载 134.9万

难以抗拒的阵列

中文使用文档
文档目录9 节
  1. 背景情况
  2. 一、导 言 不可移动的阵列缓冲器 提议
  3. 岛
  4. 洞穴
  5. 对平台的支持 transferToImmutable
  6. 发动机
  7. 运行时间和浏览器
  8. 特征测试指导
  9. 故意违反

@endo/immutable-arraybuffer

这个 @endo/immutable-arraybuffer 软件包为提议的新 JavaScript 特性提供shim : 不可移动的阵列缓冲器。 。 。 . 一个shim根据需要修改了现有的JavaScript primordials,以最密切地模仿所建议的特性. 导入 @endo/immutable-arraybuffer/shim.js 将导致这些变化.

下面,我们用"缓冲"一词非正式地提到一个实例: ArrayBuffer,无论是否不可改变.

背景情况

先前的提案 位置可调整可成长 ArrayBuffer编号 财务报告和审定财务报表 ArrayBuffer.prototype. 转让和朋友 现在JavaScript的正式部分也到了第四阶段. 总共, ArrayBuffer.prototype 现在有以下方法:

  • transfer(newByteLength?: number) :ArrayBuffer - 将原缓冲器的内容移动到一个新的缓冲器上,去掉原缓冲器,并返回新的缓冲器. 新的缓冲器将像原来的一样可以重塑.
  • transferToFixedLength(newByteLength?: number) :ArrayBuffer - 喜欢 transfer 但是,新的缓冲器是无法调整的.
  • resize(newByteLength: number) :void -- 如果可能, 改变缓冲器的大小, 或者另投 .
  • slice(start?: number, end?: number) :ArrayBuffer - 返回一个新的缓冲器,其初始内容是原缓冲器所在区域的复制件. 原缓冲器为无修改.

和以下仅读存取器属性

  • detached: boolean - 缓冲器是否分离出, 还是其内容仍然可以从缓冲器对象中获取 ?
  • resizable: boolean - 这个缓冲器可以调整大小,还是固定长度?
  • byteLength: number 这个缓冲器的当前内容有多大?
  • maxByteLength: number - 这个缓冲器能有多大?

上述操作都无法创建一不可变的缓冲器,即不可变分的缓冲器,其内装物不能被改变,改变大小,或脱去.

两者a DataView 对象和 a TypedArray 对象是进入缓冲后置存储的视图. 对a TypedArray 对象,后置存储的内容作为索引数据属性显示 TypeArray 反映此后置存储当前内容的对象. 目前,由于无法阻止后置商店的内容被更改, TypedArrays不能被冻结.

一些JavaScript的实现,如Moddable XS,将JavaScript带入嵌入式系统,如设备控制器,其中ROM比RAM更丰富更便宜. 这些系统需要将大量固定数据放入ROM,目前使用JavaScript正式标准以外的语义进行.

这个 OCAPN (英语) 网络协议将字符串和字节阵列视为通过复制传输的批量数据的不同形式. 在 JavaScript 的结束点中, 使用 OCAPN 等 @endo/pass-style + 键 @endo/marshal, JavaScript 字符串代表 OCapN 字符串. 在JavaScript语言中字符串的不可改变性反映了其在协议中的副拷贝性质. 同样,为了将一个OCAPN字节阵列很好地反映在JavaScript语言中,我们需要一个不可改变的散装二进制数据的容器. 目前没有. 冰冻的 Uint8Array 提供我们所需要的低级机器.

一、导 言 不可移动的阵列缓冲器 提议

这个 不可移动的阵列缓冲器 提议引入额外的方法和只读存取器属性 ArrayBuffer.prototype 这自然地符合上面所解释的. 正如缓冲器可以被重塑或不被拆卸,也可以不拆卸一样,这个提议使缓冲器能够被永久地或不能被拆卸. 碞钩 transferToFixedSize 将原缓冲器的内容移动到新创建的非调节缓冲器中,此建议提供了一个转移操作,将原原缓冲器的内容移动到新创建的不可移动缓冲器中去. 总共,本提案只增加了 ArrayBuffer.prototype 一种方法

  • transferToImmutable() :ArrayBuffer - 将原缓冲器的内容移入一个新的不可移动缓冲器,去除原缓冲器,并还原出新的缓冲器.

和一个只读访问器

  • immutable: boolean - 这个缓冲是不可改变的,还是可以改变其内容?

不可改变的缓冲不能被剥离或调整大小. 内容 maxByteLength 与其 byteLength。 。 。 . A 类 DataView 或者说 TypedArray 使用不可变的缓冲器作为其后置库可以被冷冻和不可变. ArrayBuffers, (中文(简体) ), DataViews,和 TypedArrays被冷冻并不可变的可以被放入ROM而不超出JavaScript的官方语义.

岛

导入 @endo/immutable-arraybuffer/shim.js 安装拟议方法(transferToImmutable, (中文(简体) ), sliceToImmutable)和访问者(immutable打开 ArrayBuffer.prototype,以及替换真核 slice, (中文(简体) ), resize, (中文(简体) ), transfer,以及 transferToFixedLength 方法对接收器是否为可模拟的不可移动缓冲器有所区别. 对于真正的 " 阵列 " ,替代者将代表掌握的真正方法,而且行为与以前相同. 对于模拟的不可移动缓冲,方法要么返回适当的不可移动行为(用于 slice)或扔出合适的"不能变异" TypeError (为变相人.

Shim的安装策略是检测到当时的斯基普:如果 'sliceToImmutable' in ArrayBuffer.prototype 当 shim 装入( 本地执行, 或先前装入的 shim ) 时, shim 已经是真的, 而 前置安装则获胜 . 不可移动的有线电车提案已经达到第3阶段;在这一阈值上,早期安装被认为是具有权威性的.

洞穴

这个 不可移动的阵列缓冲器 shim通过下列方式未能实现提案

  • Shim依赖于基础平台 structuredClone 或者说 ArrayBuffer.prototype.transfer。 。 。 . 见 对平台的支持 transferToImmutable 以下为每引擎版本阈值,以及关于何时需要进行特征测试的指导意见. 没有两个, shim仍然shims ArrayBuffer.prototype.sliceToImmutable 但不包含 ArrayBuffer.prototype.transferToImmutable。 。 。 .
  • Shim的不可改变缓冲器不是真的 ArrayBuffer 异地物品. 如果是的话,shim不会保护他们不被书写. 尽管他们完全执行了提议 ArrayBuffer API , 它们不能兼容插件: 它们不能用作辅助存储器 DataViews 或 (简体中文) TypedArray编号. 也许后续的Shims可能会修改 DataView 财务报告和审定财务报表 TypedArray 也模仿它, 但这是困难的,超出了这个shim的野心.
  • 和真不一样 ArrayBuffer 或者说 SharedArrayBuffer 异地物体,shim所模仿的不可移动缓冲器不能被克隆或转移于JS线条之间.
  • 这是平地 Java 脚本 嘘,不是自己一个 硬化 Java 脚本 多填/嘘. 因此,它创造的物体和功能不会被这个shim本身所硬化. 相反,Ses-shim预计会导入它,然后将由此产生的物体当作是额外的原始物,以便在 lockdown硬化阶段.

对平台的支持 transferToImmutable

希姆的效仿 ArrayBuffer.prototype.transferToImmutable 要求基础平台提供 ArrayBuffer.prototype.transfer (在出现时首选)或全球 structuredClone (用作后退以将缓冲器的内容移动到一个新的后卫商店). sliceToImmutable 编辑 immutable 访问者在每个平台工作 transferToImmutable 带有这种依赖.

下表记录了第一种发动机版本,该版本至少可以运载其中一种原始人. 标记单元格 无论是 意思是平台有两者 structuredClone 财务报告和审定财务报表 ArrayBuffer.prototype.transfer; 标记单元格 仅结构化 指shim使用结构化-clone倒置路径. "解密"的意思是 既不是原始的存在 ArrayBuffer.prototype.transferToImmutable 因此,在投弹后即缺席.

发动机

发动机第一个版本与 structuredClone第一个版本与 ArrayBuffer.prototype.transfer今天的航运状况
V8 (铬)9.8 (与Chrome 98, 2022年2月)11.4(与Chrome 114, 2023年5月)无论是
蜘蛛猴 (火狐)与Firefox 94(第2021号)一起装运与Firefox 122号船(2024年1月)无论是
JavaScript Core (WebKit) (英语)与Safari公司运输的15.4(2022年3月)与Safari公司(2024年3月)无论是
赫尔墨斯未执行未执行不足

这个 structuredClone global是一个通过引擎主机环境暴露出脚本的Web/HTML平台功能;上面的日期是首次曝光它的主机架构. ArrayBuffer.prototype.transfer 是引擎本身实施的TC39语言特性(ES2024).

运行时间和浏览器

运行时间/ 浏览器第一个版本与 structuredClone第一个版本与 ArrayBuffer.prototype.transfer今天的航运状况
节点.js17.0.0(第2021号意见)21.0.0(第2023号意见)无论是 21号及以后; 仅结构化 17至20号节点; 不足 16号节点及更早
德诺1.14 (第2021段)1.33 (2023年5月)无论是 第1.33号及以后
颜色/边缘98(2022年2月)114 (2023年5月) (中文(简体) )无论是 关于Chrome 114号及以后; 仅结构化 第98至113条
火花94 (第2021号)122 (2024年1月) (中文(简体) )无论是 火狐122号及以后; 仅结构化 94至121号
萨法里15.4(2022年3月)17.4(2024年3月)无论是 在《古兰经》第十七章第4节和后一节; 仅结构化 第15.4至17.3段
原生反应( Hermes)未执行未执行不足

22号节点(撰写之时为活性LTS)和24号节点(当前)都有 ArrayBuffer.prototype.transfer 并使用首选路径. 18号节点和20号节点到达了结构化-clone倒回路径;根据节点放出时间表,两者都已经过去或接近寿命.

特征测试指导

只有代码可以运行在一个 不足 平台需要特性测试 ArrayBuffer.prototype.transferToImmutable数字 :

import '@endo/immutable-arraybuffer/shim.js';

if (typeof ArrayBuffer.prototype.transferToImmutable === 'function') {
  // use transferToImmutable
} else {
  // fall back to sliceToImmutable (always present once the shim loads)
}

其部署目标均不缺失的代码(任何现代浏览器,Node.js 17及后,Deno 1.14及后)都可以依赖 transferToImmutable 于 import '@endo/immutable-arraybuffer/shim.js' 并跳过特性测试. 在Hermes和Node-17前服务器环境上反应原生是仍然需要测试的实际案例.

故意违反

此软件包 [Symbol.toStringTag] 改为 'ImmutableArrayBuffer' 每一个模拟不可移动缓冲器(作为实例的自有财产,而不是共享财产) ArrayBuffer.prototype) (中文(简体) ). 理由:节点 调和 (ava用于诊断输出) Object.prototype.toString.call(value) 来决定它能否做到 Buffer.from(value) 在物体上. Buffer.from 只做真实的 ArrayBuffer 异地物体; 向它传递一个模拟的不可移动缓冲器 TypeError 调和不处理优雅. 自有财产 [Symbol.toStringTag] = 'ImmutableArrayBuffer' 插槽保持对齐,不将值通过 Buffer.from 并让它掉入不可还原的价值路径.

滴入式原型重新设计移除了先前版本挂起此槽的中间原型;该槽现在通过每档安装 defineProperty 内 makeImmutableArrayBufferInternal。 。 。 . 真正的阵列缓冲器继续继承 'ArrayBuffer' 从原型: Object.prototype.toString.call(new ArrayBuffer(0)) 读作 '[object ArrayBuffer]'。 。 。 . 只有模拟的不可移动缓冲带 'ImmutableArrayBuffer' 位置 : Object.prototype.toString.call(new ArrayBuffer(0).sliceToImmutable()) 读作 '[object ImmutableArrayBuffer]'。 。 。 . 需要将模拟的不可变缓冲器与真正的缓冲器区分开来的人,在方案上应更倾向于 immutable 打开访问器 ArrayBuffer.prototype (由shim所安装),即"克能克"品牌检查.

版本与发布记录

@endo/immutable-arraybuffer 共发布 5 个版本,首次发布于 2025/05/08;过去 12 个月发布了 1 个版本。

版本发布日期距今
2.0.0latest2026/08/142 个月前
1.1.22025/07/121.3 年前
1.1.12025/06/181.4 年前
1.1.02025/06/031.4 年前
1.0.02025/05/081.5 年前

关于 @endo/immutable-arraybuffer 的常见问题

@endo/immutable-arraybuffer 是什么?

难以抗拒的阵列

如何安装 @endo/immutable-arraybuffer?

在项目目录运行 npm install @endo/immutable-arraybuffer,或使用 pnpm add / yarn add / bun add。

@endo/immutable-arraybuffer 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@endo/immutable-arraybuffer 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@endo/immutable-arraybuffer 可以商用吗?

@endo/immutable-arraybuffer 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@endo/immutable-arraybuffer 的下载量有多少?

根据 npm 官方下载统计,@endo/immutable-arraybuffer 在 2026/10/14 – 2026/11/12 这 30 天内被下载 1,349,471 次,日均约 44,982 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@endo/immutable-arraybuffer 还在维护吗?

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