# ssri 中文文档

规范地址：https://npmcn.com/package/ssri/

版本：14\.0\.0
npm 元数据更新时间：2026-09-09T20:11:28.433Z
中文译文更新时间：2026-11-05T16:42:12.223Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/ssri
原文对照：https://npmcn.com/package/ssri/?lang=original
项目主页：https://github.com/npm/ssri#readme
源码仓库：https://github.com/npm/ssri

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：38.5 kB，4 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- Node.js 要求：^22\.22\.2 \|\| ^24\.15\.0 \|\| \>=26\.0\.0
- 运行依赖：1 个
- 首次发布：2017-03-23T04:56:05.227Z
- 最新版本发布：2026-05-08T18:33:10.421Z
- 近 30 天下载量：157756519（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：44（近 12 个月 2 个）

## 中文简介

标准子资源完整性库 - 根据SRI光谱剖析,序列化,生成,并验证完整性元数据.

## 安装

```sh
npm install ssri
```

也可以使用：`pnpm add ssri`、`yarn add ssri`、`bun add ssri`

## README

# 丝丽 [![npm version](https://img.shields.io/npm/v/ssri.svg)](https://npm.im/ssri) [![license](https://img.shields.io/npm/l/ssri.svg)](https://npm.im/ssri) [![Travis](https://img.shields.io/travis/npm/ssri.svg)](https://travis-ci.org/npm/ssri) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/npm/ssri?svg=true)](https://ci.appveyor.com/project/npm/ssri) [![Coverage Status](https://coveralls.io/repos/github/npm/ssri/badge.svg?branch=latest)](https://coveralls.io/github/npm/ssri?branch=latest)

[`ssri`](https://github.com/npm/ssri),标准次资源 完整性,是用于解析,操纵,串行化的节点Js工具, 生成并验证 [次级资源 诚信](https://w3c.github.io/webappsec/specs/subresourceintegrity/) 胡说八道.

## 安装

`$ npm install --save ssri`

## 目录

-   [示例](https://npmcn.com/package/ssri/#readme-example)
-   [特征](https://npmcn.com/package/ssri/#readme-features)
-   [捐款](https://npmcn.com/package/ssri/#readme-contributing)
-   [API 密码](https://npmcn.com/package/ssri/#readme-api)
    -   解析序列( S)
        -   [`parse`](https://npmcn.com/package/ssri/#readme-parse)
        -   [`stringify`](https://npmcn.com/package/ssri/#readme-stringify)
        -   [`Integrity#concat`](https://npmcn.com/package/ssri/#readme-integrity-concat)
        -   [`Integrity#merge`](https://npmcn.com/package/ssri/#readme-integrity-merge)
        -   [`Integrity#toString`](https://npmcn.com/package/ssri/#readme-integrity-to-string)
        -   [`Integrity#toJSON`](https://npmcn.com/package/ssri/#readme-integrity-to-json)
        -   [`Integrity#match`](https://npmcn.com/package/ssri/#readme-integrity-match)
        -   [`Integrity#pickAlgorithm`](https://npmcn.com/package/ssri/#readme-integrity-pick-algorithm)
        -   [`Integrity#hexDigest`](https://npmcn.com/package/ssri/#readme-integrity-hex-digest)
    -   诚信生成
        -   [`fromHex`](https://npmcn.com/package/ssri/#readme-from-hex)
        -   [`fromData`](https://npmcn.com/package/ssri/#readme-from-data)
        -   [`fromStream`](https://npmcn.com/package/ssri/#readme-from-stream)
        -   [`create`](https://npmcn.com/package/ssri/#readme-create)
    -   诚信核查
        -   [`checkData`](https://npmcn.com/package/ssri/#readme-check-data)
        -   [`checkStream`](https://npmcn.com/package/ssri/#readme-check-stream)
        -   [`integrityStream`](https://npmcn.com/package/ssri/#readme-integrity-stream)

### 示例

```javascript
const ssri = require('ssri')

const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

// Parsing and serializing
const parsed = ssri.parse(integrity)
ssri.stringify(parsed) // === integrity (works on non-Integrity objects)
parsed.toString() // === integrity

// Async stream functions
ssri.checkStream(fs.createReadStream('./my-file'), integrity).then(...)
ssri.fromStream(fs.createReadStream('./my-file')).then(sri => {
  sri.toString() === integrity
})
fs.createReadStream('./my-file').pipe(ssri.createCheckerStream(sri))

// Sync data functions
ssri.fromData(fs.readFileSync('./my-file')) // === parsed
ssri.checkData(fs.readFileSync('./my-file'), integrity) // => 'sha512'
```

### 特征

-   解析和字符串 SRI 字符串 .
-   从原始数据或流中生成SRI字符串.
-   严格标准合规.
-   `?foo` 元数据选项支持.
-   同一算法的多个条目.
-   基于对象的完整散列操纵.
-   足迹小:没有依附关系,执行简洁.
-   全面测试覆盖.
-   定制算法取取取器.

### 捐款

斯里团队热情欢迎捐款和项目参与!! 如果你想出力,你们可以做很多事! 这个 [贡献者 指南](https://npmcn.com/package/ssri/CONTRIBUTING.md) 拥有所有你需要的信息 从所有从 报告错误以贡献整个新特性。 请不要犹豫 如果你愿意,跳进去,甚至问我们问题 如果事情不明.

### API 密码

#### `> ssri.parse(sri, [opts]) -> Integrity`

参数 `sri` 变成 `Integrity` 数据结构. `sri` 也可以是一个正直 字符串, 一个 `Hash`\- 喜欢 `digest` 财务报告和审定财务报表 `algorithm` 字段和一个可选 `options` 字段,或一个 `Integrity`\- 喜欢的东西。 由此产生的对象将是 `Integrity` 具有此形状的示例:

```javascript
{
  'sha1': [{algorithm: 'sha1', digest: 'deadbeef', options: []}],
  'sha512': [
    {algorithm: 'sha512', digest: 'c0ffee', options: []},
    {algorithm: 'sha512', digest: 'bad1dea', options: ['foo']}
  ],
}
```

若为 `opts.single` 是事实,一个 `Hash` 对象将返回。 这是,一个 看起来像单对象 `{algorithm, digest, options}`,相对于 具有多个这样的较大对象.

若为 `opts.strict` 是真实的,产生的对象将被过滤到这样 它严格遵循子资源完整性规格,丢弃任何条目 带有任何无效组件。 这也意味着一套有限的算法 将被使用 -- 光谱限制它们到 `sha256`, (中文(简体) ), `sha384`,以及 `sha512`。 。 。 .

如果完整性字符串用于 浏览器,或者在需要严格遵守光谱的其他情况下.

##### 示例

```javascript
ssri.parse('sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo') // -> Integrity object
```

#### `> ssri.stringify(sri, [opts]) -> String`

此函数与 [`Integrity#toString()`](https://npmcn.com/package/ssri/#readme-integrity-to-string), (中文(简体) ), 除非它可以用来 _任意_ 对象 [`parse`](https://npmcn.com/package/ssri/#readme-parse) 能处理 - that 一个字符串,一个 `Hash`\- 喜欢,或者一个 `Integrity`\- 喜欢.

这个 `opts.sep` 选项定义在加入多个条目时使用的字符串 一起来 要符合规格,这个 _必须_ 白相间 默认是 单间空间( e)`' '`) (中文(简体) ).

若为 `opts.strict` ,完整性字符串将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
// Useful for cleaning up input SRI strings:
ssri.stringify('\n\rsha512-foo\n\t\tsha384-bar')
// -> 'sha512-foo sha384-bar'

// Hash-like: only a single entry.
ssri.stringify({
  algorithm: 'sha512',
  digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',
  options: ['foo']
})
// ->
// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

// Integrity-like: full multi-entry syntax. Similar to output of `ssri.parse`
ssri.stringify({
  'sha512': [
    {
      algorithm: 'sha512',
      digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',
      options: ['foo']
    }
  ]
})
// ->
// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'
```

#### `> Integrity#concat(otherIntegrity, [opts]) -> Integrity`

缩写 a `Integrity` 与另一个完整性类似或完整性的对象 绳子.

这在功能上相当于调和两者的字符串格式 廉洁的论据,以及调用 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-ssri-parse) 在新字符串上.

若为 `opts.strict` 是真的,新来的 `Integrity` 将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
// This will combine the integrity checks for two different versions of
// your index.js file so you can use a single integrity string and serve
// either of these to clients, from a single `<script>` tag.
const desktopIntegrity = ssri.fromData(fs.readFileSync('./index.desktop.js'))
const mobileIntegrity = ssri.fromData(fs.readFileSync('./index.mobile.js'))

// Note that browsers (and ssri) will succeed as long as ONE of the entries
// for the *prioritized* algorithm succeeds. That is, in order for this fallback
// to work, both desktop and mobile *must* use the same `algorithm` values.
desktopIntegrity.concat(mobileIntegrity)
```

#### `> Integrity#merge(otherIntegrity, [opts])`

安全合并另一个完整性 类似或完整性字符串 `Integrity` 对象.

如果其他完整性值有与当前相通的任何算法 对象,然后散列文摘必须匹配,否则就会出错.

任何新的散列都会被添加到当前对象的设定中.

当一个完整性值可能升级为更强时,这样做是有用的 算法,您希望防止不慎抑制完整性错误 覆盖预期的完整性值 .

##### 示例

```javascript
const data = fs.readFileSync('data.txt')

// integrity.txt contains 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4='
// because we were young, and didn't realize sha1 would not last
const expectedIntegrity = ssri.parse(fs.readFileSync('integrity.txt', 'utf8'))
const match = ssri.checkData(data, expectedIntegrity, {
  algorithms: ['sha512', 'sha1']
})
if (!match) {
  throw new Error('data corrupted or something!')
}

// get a stronger algo!
if (match && match.algorithm !== 'sha512') {
  const updatedIntegrity = ssri.fromData(data, { algorithms: ['sha512'] })
  expectedIntegrity.merge(updatedIntegrity)
  fs.writeFileSync('integrity.txt', expectedIntegrity.toString())
  // file now contains
  // 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4= sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg=='
}
```

#### `> Integrity#toString([opts]) -> String`

返回一个字符串表示式 `Integrity` 对象。 所有散列条目 将在字符串中由 `opts.sep`,默认为 `' '`。 。 。 .

如果你想把一个不是来自 `ssri` 函数, 使用情况 [`ssri.stringify()`](https://npmcn.com/package/ssri/#readme-stringify)。 。 。 .

若为 `opts.strict` ,完整性字符串将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

ssri.parse(integrity).toString() === integrity
```

#### `> Integrity#toJSON() -> String`

返回一个字符串表示式 `Integrity` 对象。 所有散列条目 将在字符串中由 `' '`。 。 。 .

这是一个方便的方法,你可以通过一个 `Integrity` 对象直接对 `JSON.stringify`。 。 。 . 需要更多的信息检查出来 [至 JSON () mdn 上的行为](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior)。 。 。 .

##### 示例

```javascript
const integrity = '"sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo"'

JSON.stringify(ssri.parse(integrity)) === integrity
```

#### `> Integrity#match(sri, [opts]) -> Hash | false`

如果 `Integrity` 匹配通过的参数为 `sri`,它可以是任何东西 [`parse`](https://npmcn.com/package/ssri/#readme-parse) 将接受. `opts` 将会是 传递到 `parse` 财务报告和审定财务报表 [`pickAlgorithm()`](https://npmcn.com/package/ssri/#readme-integrity-pick-algorithm)。 。 。 .

##### 示例

```javascript
const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='

ssri.parse(integrity).match(integrity)
// Hash {
//   digest: '9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='
//   algorithm: 'sha512'
// }

ssri.parse(integrity).match('sha1-deadbeef')
// false
```

#### `> Integrity#pickAlgorithm([opts]) -> String`

从完整性对象中可用的算法返回“最佳”算法.

若为 `opts.pickAlgorithm` 将会通过两个算法作为 参数。 ssri 将优先排序两个算法中的任意一个 ưμ㼯A 注意该函数可能被称为多次,并且 **必须** 返回所提供的两个算法中的一个。 默认,Ssri会做 用于选择给定算法中最强/最可靠的算法。 这个 可能有意将已知有弱点的算法降低优先顺序.

##### 示例

```javascript
ssri.parse('sha1-WEakDigEST sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1').pickAlgorithm() // sha512
```

#### `> Integrity#hexDigest() -> String`

`Integrity` 假设是单发 `Integrity` 例如,或 `Hash` 举个例子 归还其 `digest`,转换为十六进制 基础64数据.

##### 示例

```javascript
ssri.parse('sha1-deadbeef').hexDigest() // '75e69d6de79f'
```

#### `> ssri.fromHex(hexDigest, algorithm, [opts]) -> Integrity`

创建一个 `Integrity` 单项对象,基于六进制格式 散货 这是帮助将已有的shasums转换为 诚信格式,大致相当于诸如:

```javascript
algorithm + '-' + Buffer.from(hexDigest, 'hex').toString('base64')
```

`opts.options` 可选择通过:必须是一系列选项 将添加到所有生成的完整散列的字符串 `fromData`。这是SRI的宽松特征,目前没有 指定语义除是 `?`\- 分开了 冒险使用,和 如果您的完整性字符串是用于浏览器的话, 可能会避免 .

若为 `opts.strict` ,完整性对象将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

若为 `opts.single` 是真的,一个 `Hash` 对象将返回.

##### 示例

```javascript
ssri.fromHex('75e69d6de79f', 'sha1').toString() // 'sha1-deadbeef'
```

#### `> ssri.fromData(data, [opts]) -> Integrity`

创建一个 `Integrity` 从字符串或 `Buffer` 数据,计算 所有请求的散列,并在对象中添加任何指定的选项.

`opts.algorithms` 决定要生成散列的算法 。 全体 结果将列入一个单一的 `Integrity` 对象。 默认值 `opts.algorithms` 实值 `['sha512']`。所有算法字符串必须列出散列 内 `crypto.getHashes()` 为主机Node.js平台.

`opts.options` 可选择通过:必须是一系列选项 将添加到所有生成的完整散列的字符串 `fromData`。这是SRI的宽松特征,目前没有 指定语义除是 `?`\- 分开了 冒险使用,和 如果您的完整性字符串是用于浏览器的话, 可能会避免 .

若为 `opts.strict` ,完整性对象将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
const integrityObj = ssri.fromData('foobarbaz', {
  algorithms: ['sha256', 'sha384', 'sha512']
})
integrity.toString('\n')
// ->
// sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0=
// sha384-irnCxQ0CfQhYGlVAUdwTPC9bF3+YWLxlaDGM4xbYminxpbXEq+D+2GCEBTxcjES9
// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==
```

#### `> ssri.fromStream(stream, [opts]) -> Promise<Integrity>`

返回通过读取数据计算出的完整性对象的许诺 给定 `stream`。 。 。 .

它接受两者 `opts.algorithms` 财务报告和审定财务报表 `opts.options`,现作为文件编号 部分内容 [`ssri.fromData`](https://npmcn.com/package/ssri/#readme-from-data)。 。 。 .

此外, `opts.Promise` 可以输入输入“承诺”库 选择。 默认情况下,sri会使用Node的内置承诺.

若为 `opts.strict` ,完整性对象将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
ssri.fromStream(fs.createReadStream('index.js'), {
  algorithms: ['sha1', 'sha512']
}).then(integrity => {
  return ssri.checkStream(fs.createReadStream('index.js'), integrity)
}) // succeeds
```

#### `> ssri.create([opts]) -> <Hash>`

返回 Hash 对象 `update(<Buffer or string>[,enc])` 财务报告和审定财务报表 `digest()` 方法。 。 .

Hash 对象提供了与 [密码类 Hash](https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html#crypto_class_hash)。 。 。 . `digest()` 接受任何参数并返回通过读取数据计算出来的完整性对象 请求更新.

它接受两者 `opts.algorithms` 财务报告和审定财务报表 `opts.options`,现作为文件编号 部分内容 [`ssri.fromData`](https://npmcn.com/package/ssri/#readme-from-data)。 。 。 .

若为 `opts.strict` ,完整性对象将使用严格的 解析规则。 见 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse)。 。 。 .

##### 示例

```javascript
const integrity = ssri.create().update('foobarbaz').digest()
integrity.toString()
// ->
// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==
```

#### `> ssri.checkData(data, sri, [opts]) -> Hash|false`

验证 `data` 廉洁行为 `sri` 参数. `data` 可以是 `String` 或一个 `Buffer`,以及 `sri` 可以是任何子资源完整性 代表 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse) 可以处理.

如果核查成功, `checkData` 将返回算法的名称 用于核查(真实值)。 否则它会回来的 `false`。 。 。 .

若为 `opts.pickAlgorithm` 提供时,它将被使用 [`Integrity#pickAlgorithm`](https://npmcn.com/package/ssri/#readme-integrity-pick-algorithm) 当决定哪一个 可用的文摘可以匹配.

若为 `opts.error` 是真的 核查失败了, `checkData` 将投出 a 一个 `EBADSIZE` 或一个 `EINTEGRITY` 错误, 而不是只返回虚假 .

##### 示例

```javascript
const data = fs.readFileSync('index.js')
ssri.checkData(data, ssri.fromData(data)) // -> 'sha512'
ssri.checkData(data, 'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0')
ssri.checkData(data, 'sha1-BaDDigEST') // -> false
ssri.checkData(data, 'sha1-BaDDigEST', {error: true}) // -> Error! EINTEGRITY
```

#### `> ssri.checkStream(stream, sri, [opts]) -> Promise<Hash>`

核实 `stream` 反对: `sri` 参数. `stream` 将会是 整个过程消耗殆尽. `sri` 可以是任何子资源完整性 代表 [`ssri.parse`](https://npmcn.com/package/ssri/#readme-parse) 可以处理.

`checkStream` {\\fn华文楷体\\fs16\\1cHE0E0E0}将回到一个承诺... {\\fn华文楷体\\fs16\\1cHE0E0E0}其中之一 `Hash` 如果核查失败 或发生错误 `stream`承诺会被拒绝的.

如果由于校验失败而拒绝承诺, 返回的错误会 有过 `err.code` 作为 `EINTEGRITY`。 。 。 .

若为 `opts.size` 将被给出,它将与流大小相匹配。 错误 与 `err.code` `EBADSIZE` 如果预期的大小被否决,则将被还原 实际大小无法匹配.

若为 `opts.pickAlgorithm` 提供时,它将被使用 [`Integrity#pickAlgorithm`](https://npmcn.com/package/ssri/#readme-integrity-pick-algorithm) 当决定哪一个 可用的文摘可以匹配.

##### 示例

```javascript
const integrity = ssri.fromData(fs.readFileSync('index.js'))

ssri.checkStream(
  fs.createReadStream('index.js'),
  integrity
)
// ->
// Promise<{
//   algorithm: 'sha512',
//   digest: 'sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1'
// }>

ssri.checkStream(
  fs.createReadStream('index.js'),
  'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0'
) // -> Promise<Hash>

ssri.checkStream(
  fs.createReadStream('index.js'),
  'sha1-BaDDigEST'
) // -> Promise<Error<{code: 'EINTEGRITY'}>>
```

#### `> integrityStream([opts]) -> IntegrityStream`

回返a `Transform` 用于生成的数据流 并选择检查管道数据的数据完整性。 当溪流完成时 成功发射 `size` 财务报告和审定财务报表 `integrity` 活动总数 处理和计算过的字节数 `Integrity` 基于流的示例 数据.

若为 `opts.algorithms` 中,当 生成最终 `Integrity` 举个例子 默认是 `['sha512']`。 。 。 .

若为 `opts.single` 被传入,一个 `Hash` 将返回实例.

若为 `opts.integrity` 它应该是一个 `integrity` 理解值 以 [`parse`](https://npmcn.com/package/ssri/#readme-parse) 以数据为对照。 若为 验证成功,完整性流将发出 `verified` 活动 值是一个单一的 `Hash` 对象是成功验证的对象。 若为 校验失败, 流将用一个 `EINTEGRITY` 错误代码 .

若为 `opts.size` 将被给出,它将与流大小相匹配。 错误 与 `err.code` `EBADSIZE` 如果预期大小 实际大小无法匹配.

若为 `opts.pickAlgorithm` 将会通过两个算法作为 参数。 ssri 将优先排序两个算法中的任意一个 ưμ㼯A 注意该函数可能被称为多次,并且 **必须** 返回所提供的两个算法中的一个。 默认,Ssri会做 用于选择给定算法中最强/最可靠的算法。 这个 可能有意将已知有弱点的算法降低优先顺序.

##### 示例

```javascript
const integrity = ssri.fromData(fs.readFileSync('index.js'))
fs.createReadStream('index.js')
.pipe(ssri.integrityStream({integrity}))
```

## 常见问题

### ssri 是什么？

标准子资源完整性库 - 根据SRI光谱剖析,序列化,生成,并验证完整性元数据\.

### 如何安装 ssri？

在项目目录运行 npm install ssri，或使用 pnpm add / yarn add / bun add。

### ssri 支持 TypeScript 吗？

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

### ssri 支持 ESM 还是 CommonJS？

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

### ssri 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js ^22\.22\.2 \|\| ^24\.15\.0 \|\| \>=26\.0\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### ssri 可以商用吗？

ssri 使用 ISC 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### ssri 的下载量有多少？

根据 npm 官方下载统计，ssri 在 2026/10/05 – 2026/11/03 这 30 天内被下载 157,756,519 次，日均约 5,258,551 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### ssri 还在维护吗？

最新版本 14\.0\.0 发布于 2026/05/09（5 个月前）；至今共发布 44 个版本，其中过去 12 个月发布了 2 个；首次发布于 2017/03/23。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

