eslint: Atomics: readonly 和 SharedArrayBuffer: readonly 的含义是什么

问题描述

在eslint的配置文件中我看到很多人这样做:

"globals": {
  "Atomics": "readonly","SharedArrayBuffer": "readonly"
}

这是什么意思以及 eslint 如何使用它?

我了解全局变量是什么,但我想了解 eslint 如何使用这两个变量。

解决方法

.eslintrc.json 中的全局对象属性

ESLint 在 globals 配置文件中实现的 .eslintrc.json Object-Property 是一个允许您定义全局变量的对象。需要这个属性的原因是因为 ESLint 无法判断全局是否正在被 config 定义,让您声明全局变量,因此 ESLint 知道它们不是未定义的。许多 JavaScript 环境实现的全局变量,比如浏览器,或者 Node.js,已经被 ESLint 识别了,不需要定义,但是 ESLint 有时会选择识别某些由各种 API 实现的全局变量,运行时环境、浏览器、框架、工具、Lang 特性等......,出于各种任意原因,ESLint 将故意不识别前面列表实现的一些全局变量。两个这样的全局变量是 Atomics 和 SharedArrayBuffer,它们由 V8 JavaScript 引擎实现(稍后会详细介绍)。

ESLint 配置文件中 Globals 属性的一个很好的例子是 __filename__dirname 的节点 CJS(通用 JavaScript 模块)实现> 全局变量。在由 Node.js 开发人员编写的原始 Common JS 模块中,__dirname__filename 是存在于 Node RTE 中的全局变量,因此,ESLint 默认将它们识别为定义的变量,当在一个然而,CJS 模块; ESLint 无法在 ESM(ES 模块或 ES6 模块)中识别它们,因为它们不存在于更通用的现代模块类型中,因为 ESM 可在浏览器和节点之间移植,而浏览器无法识别 {{1 }} & __filename 因为它们是由节点定义的,而不是由 Spider-MonkeyV8等 JS 引擎定义的>.

因为我太习惯使用它们,而且我真的不喜欢 ESM 替代方案(importMeta 对象的 fileURL),所以我编写了一个可以在下面看到的模块(它是用 typescript 编写的)。问题是 ESLint 无法将全局变量识别为 ESM 模块中的“事物”,因此我必须使用 __Globals Property__dirnameeslintrc.json` 配置文件定义它们,因此 ESLint 确实将它们标记为红色波浪线。

in the

Atomics & SharedArrayBuffer


export function globalPathnames(importMeta: ImportMeta): void { const { __filename,__dirname } = getPathnames(importMeta); global.__filename = __filename; global.__dirname = __dirname; } atomics 是需要特殊实现的 JavaScript 功能,因为之前可以针对它们进行计时攻击。我可能认为这就是 ESLint 无法识别全局变量的原因,但它们是由 chrome 实现的全局变量,而且 ESLint 经常定义可在 JavaScript 中访问的 V8 全局变量,但不要引用我的话。在发现存在幽灵定时攻击后,在浏览器中使用 SharedArrayBuffer 的概念在很长一段时间内实施起来很危险。今天有一些特殊的协议允许我们使用这些功能。事实上,我可以谈论这个话题很长时间,但为了简洁起见,我不会。 SharedArrayBuffer 也是一个全局变量,由于定时攻击可能被认为是危险的。当像原子这样极其精确的时钟用于非恶意目的时,它们可以帮助开发人员准确测试其 JavaScript 程序/应用程序的性能。

这应该足以帮助理解这一点。如果您不使用 atomicsatomics,那么通过定义它们,您将不会从它们那里得到任何东西,如果不是因为保持 ESLint 配置文件清洁之外的任何其他原因,它可能会最好将它们删除,就像我说的那样,如果您没有在代码中的任何地方访问它们。