美文网首页
为什么需要用globalthis代替window

为什么需要用globalthis代替window

作者: 薯条你哪里跑 | 来源:发表于2023-07-02 14:38 被阅读0次

原文:https:⭐️//ilikekillnerds.com/2023/02/why-you-should-be-using-globalthis-instead-of-window-in-your-javascript-code/

我讨厌成为那些总是发博客说 “不要用X” 或者 “为什么你应该使用Y来代替” 的人,但最近在我修改很久之前写的代码时发现写一篇关于“为什么应该用globalthis作为代替”的博客是很有必要的。并不是说现在在用的window 是错误的(因为在浏览器环境globalthis和window是等价的),然而通过使用globalthis可以给自己节省很多麻烦,尤其是在单元测试中!

科普下,globalthis是由 ECMAScript 2020 引入全新的全局变量。无论是在浏览器、node服务或在web worker等其他环境中globalthis 提供了访问全局变量的方法。使用globalthis替代 windowglobal的最大好处是可以保障你的代码更具一致性和前瞻性;

以下是一些globalthis在不同环境中的例子:

在浏览器环境中

globalThiswindow 对象等价,举个栗子:

console.log(globalThis === window); // true
console.log(globalThis.location.href); // same as window.location.href

通过使用globalThis进行替换后可保证在任何浏览器中都可正常工作。

在nodejs环境中

globalThis和全局对象等价,举个栗子:

console.log(globalThis === global); // true
console.log(globalThis.setTimeout === global.setTimeout); // true

通过使用globalThis替换可保证在任何node环境中都可正常工作。

在web worker环境中

globalThis与当前worker实例等价,举个栗子:

console.log(globalThis === self); // true
console.log(globalThis.postMessage === self.postMessage); // true

通过使用globalThis替换self可以保证在任何web workder环境中都可正常工作。

在单元测试中

使用globalThis的最大好处就是可以使你的单元测试变得更容易,尤其是你需要模拟想window或global之类的全局对象。
比如我们有个函数,其依赖于window对象

function showMessage(message) {
  window.alert(message);
}

为了测试这个函数,你可能需要模拟window对象。然而模拟window对象是个棘手的问题,尤其是你希望在不同的环境中对其进行测试;如果你使用 Jest框架,默认的测试环境是有global对象但没有window对象的nodejs环境。
通过使用globalThis替换window,可以使我们的test模拟window对象变得容易得多:

function showMessage(message) {
    globalThis.alert(message);
}

现在当你给这个showMessage函数写单元测试的时候,可以使用globalThis将window进行替换。

it('shows message', () => {
    const originalAlert = globalThis.alert;
    globalThis.alert = jest.fn();
    showMessage('Hello, world!');
    expect(globalThis.alert).toHaveBeenCalledWith('Hello, world!');
    globalThis.alert = originalAlert;
});

替换后单元测试可以轻易地在不同环境下跑通;

作为结论,当在浏览器、nodejs及webworker环境中使用globalThis可使代码更具一致性、前瞻性并且更容易测试。

相关文章

  • TS TypeScript window 添加自定义属性

    在TS环境里给window添加自定义属性会报错: 类型“Window & typeof globalThis”上...

  • 拿到javascript顶层对象

    现在有一个提案,在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis...

  • Docker入门(一)基础使用

    为什么要用docker 我之所以用docker,是因为window电脑的局限性,本人是做php开发,需要用到swo...

  • ECMAScript比较友好的新特性

    ES11(ES 2020) 动态import Promise.allSettled() globalThis 可选...

  • swift window

    swift window 弹窗可触控弹框外面的内容 popUpView用自定义 的view代替

  • Android Window和WindowManager

    一、Window简介 有时候我们需要在桌面上显示一个类似悬浮窗的东西,这种效果就需要用 Window 来实现,Wi...

  • 未整理

    {' '} - 这里: {' '} 是空格的意思。 标签中不能直接显示空格,需要用 {' '} 来代替空格

  • window.fetch

    Fetch 是浏览器提供的原生 AJAX 接口。使用 window.fetch 函数可以代替以前的 $.ajax、...

  • 带你彻底理解 Window 和 WindowManager

    有时候我们需要在桌面上显示一个类似悬浮窗的东西,这种效果就需要用 Window 来实现,Window 是一个抽象类...

  • 可以代替window搜索的神器-Everything

    关注微信公众号"HAS的新基地"获得更多干货! 各位晚上好! 众所周知:默认的Windows搜索工具一直被指责为缓...

网友评论

      本文标题:为什么需要用globalthis代替window

      本文链接:https://www.haomeiwen.com/subject/lvlfudtx.html