如何解决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-Monkey 或 V8等 JS 引擎定义的>.
因为我太习惯使用它们,而且我真的不喜欢 ESM 替代方案(importMeta 对象的 fileURL),所以我编写了一个可以在下面看到的模块(它是用 typescript 编写的)。问题是 ESLint 无法将全局变量识别为 ESM 模块中的“事物”,因此我必须使用 __Globals Property__dirname
eslintrc.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 程序/应用程序的性能。
这应该足以帮助理解这一点。如果您不使用 atomics
或 atomics
,那么通过定义它们,您将不会从它们那里得到任何东西,如果不是因为保持 ESLint 配置文件清洁之外的任何其他原因,它可能会最好将它们删除,就像我说的那样,如果您没有在代码中的任何地方访问它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。