Shim 与 Sham:它们之间有何区别?

在前端开发中,我们经常听到“Shim”和“Sham”这两个术语。这两个术语都是解决跨浏览器问题的方案。但是,它们之间有什么区别呢?本文将详细介绍这两种方案,并提供示例代码。

Shim

“Shim”可以理解为“垫片”或“补丁”,用于解决旧版本浏览器不支持新技术或 API 的问题。通常情况下,“Shim”是一个 JavaScript 库或插件,通过模拟新技术或 API 的行为来实现兼容性。例如,如果某个浏览器不支持 HTML5 的 canvas 元素,那么可以使用一个 Canvas Shim 库来模拟 canvas 的行为。

以下是一个简单的 Canvas Shim 示例代码:

-- ---------------------------------------------- -
  --- ------ - ---------------------------------
  ---------- - --------------------------------------------------------------------------------------
  ----------------------------------
-

上述代码首先检查当前浏览器是否支持 canvas 元素,如果不支持,则动态加载一个 polyfill 库来提供 canvas 功能。

Sham

与 “Shim” 不同,“Sham”更多地涉及到测试和模拟。它是一种虚拟的实现,用于在开发和测试期间模拟接口或行为。例如,在单元测试中,可能需要模拟一个网络请求来测试代码的正确性,这时就可以使用一个 XMLHttpRequest Sham 来模拟网络请求。

以下是一个简单的 XMLHttpRequest Sham 示例代码:

-- -------- -------------- ----
-- --------------------- --- ------- -
  --------------------- - ---------- -
    --------------- - --
    ----------- - ----
    ----------------- - ------------ ------- ----------
    --------- - ----------
    --------- - ----------
  --
-

上述代码使用 Jest 测试框架中的全局变量 global 来创建一个 XMLHttpRequest Shim,以模拟网络请求。在测试代码中调用真正的 XMLHttpRequest 对象时,可以替换成这个 Shim 对象来模拟网络请求的结果。

总结

“Shim”与“Sham”都是解决跨浏览器问题的方案,只是从不同角度出发。前者提供了一种针对旧版本浏览器的兼容性解决方案,后者则提供了一种模拟和测试接口的方法。在实际开发中,我们可以根据具体情况选择合适的方案来解决问题。

值得注意的是,虽然 Shim 和 Sham 可以解决许多兼容性问题,但它们并不是银弹。在使用它们时,我们仍然需要谨慎地检查我们的代码,并测试它们在各种浏览器和设备上的兼容性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/25708


猜你喜欢

  • AngularJS 中的循环依赖和 OOP 的问题

    在 AngularJS 项目中,使用对象导向编程(OOP)时,经常会遇到模块之间的循环依赖问题。这种情况下,模块之间相互依赖,可能会导致死循环、性能问题和代码难以维护等问题。

    7 年前
  • 使用属性指令有条件地控制 AngularJS 应用

    在 AngularJS 中,属性指令是一种非常强大的工具,可以让开发者轻松地扩展 HTML 的功能。通过属性指令,我们可以根据应用的需要来自定义 DOM 元素的行为和样式。

    7 年前
  • 前端技术文章:ReferenceError: module is not defined - Karma/Jasmine配置与Angular/Laravel应用

    在使用Karma/Jasmine对Angular或Laravel应用程序进行单元测试时,您可能会遇到以下错误消息:ReferenceError: module is not defined。

    7 年前
  • Angular 1.5 Component vs. Old Directive - Where is the Link Function?

    在AngularJS中,指令(Directive)是我们构建Web应用程序的基础。在早期版本的Angular中,指令扮演了许多不同的角色,并且有许多可选的属性和方法可以使用,其中最重要的就是链接函数(...

    7 年前
  • AngularJS - Animate ng-view transitions

    AngularJS 是一个强大的前端框架,它提供了许多功能来简化 Web 应用程序的开发。其中之一是 ng-view 指令,该指令允许我们在单个页面应用程序中使用路由来动态加载视图。

    7 年前
  • 在 Angular 中如何将 JSON 对象/数组传递给指令

    Angular 是一个流行的前端框架,它使用指令来扩展 HTML 元素的功能。在使用指令时,经常需要将数据传递给它们。本文将介绍在 Angular 中如何将 JSON 对象或数组传递给指令,并提供示例...

    7 年前
  • 用 Angular2 更新组件中的变量

    Angular2 是一个流行的前端框架,它允许开发人员创建可重用的组件和服务。在组件和服务之间共享数据是很常见的,但是当服务更新变量时,组件如何感知这些变化呢?本文将介绍如何在 Angular2 中使...

    7 年前
  • Angular - UI Router - 编程式添加状态

    简介 Angular 是一款前端框架,而 UI Router 则是一个用于管理路由的库。在 Angular 中,通过 UI Router 可以轻松地实现单页应用的路由控制。

    7 年前
  • 在 AngularJS 的 config() 模块中注入依赖项

    AngularJS 是一个流行的前端 JavaScript 框架,它使用依赖注入(Dependency Injection,简称 DI)来管理组件间的依赖关系。在 AngularJS 中,我们通常使用...

    7 年前
  • 使用 ui-router 提取 AngularJS 中的查询参数

    当我们在开发 AngularJS 应用程序时,经常需要从 URL 查询字符串中提取参数。对于使用 ui-router 的应用程序来说,这个过程非常简单和直观。在本文中,我们将学习如何使用 ui-rou...

    7 年前
  • AngularJS 指令:$scope 改变不反映在 UI 上的解决方法

    AngularJS 是一款流行的前端框架,它允许开发者使用指令(Directives)来封装可重用的组件和功能。在编写指令时,有时会遇到一个问题:当更改 $scope 中的值时,UI 并没有及时更新。

    7 年前
  • Angular 中的选择框布尔值

    在使用 Angular 开发 Web 应用程序时,我们通常会使用表单元素来收集用户输入。其中一个常见的表单元素是选择框,它可以让用户从预定义的选项中选择一个或多个值。

    7 年前
  • 在 AngularJS 控制器中如何获取当前作用域的 DOM 元素?

    在 AngularJS 中,控制器是 MVC 模式的一部分,负责处理视图和模型之间的交互。有时候我们需要在控制器中获取当前作用域下的 DOM 元素,这个过程可能会有些困难。

    7 年前
  • 如何在 AngularJS 中禁用输入内容的修剪?

    在 AngularJS 中,当我们使用 ng-model 指令来绑定输入元素时,它默认会修剪(trim)输入内容。这意味着输入框中的前导和尾随空格都会被删除。但有时候我们希望保留这些空格,该怎么办呢?...

    7 年前
  • 使用 AngularJS 导出xls文件

    在Web应用程序中,将数据导出为Excel文件是一个常见的需求。本文将介绍如何使用AngularJS实现导出XLS文件的功能。 准备工作 首先,需要在项目中引入以下两个js库: angular-xl...

    7 年前
  • AngularJS 中的两个嵌套点击事件

    在 AngularJS 中,我们可以通过使用 ng-click 指令来响应单击事件。但是,在某些情况下,我们需要在同一个元素上定义两个或更多的点击事件,或者在一个元素内部嵌套另一个元素时处理点击事件。

    7 年前
  • AngularJS ng-repeat如何隐藏第一个元素

    在AngularJS中,ng-repeat是一种非常方便的指令,可以将数组中的元素循环渲染到HTML页面中。但有时候我们需要对ng-repeat循环出的元素进行特殊处理,比如隐藏第一个元素。

    7 年前
  • AngularJS ngRepeat 元素删除

    在AngularJS中,ngRepeat指令可以用于在前端页面中通过循环展示数据。但是,在使用ngRepeat时,我们可能需要删除其中的某些元素。本文将介绍如何在ngRepeat中删除元素。

    7 年前
  • AngularJS 中当用户离开页面时显示提示框

    在开发 Web 应用程序时,我们经常需要确保用户不会因为意外的离开而失去对页面所做的更改。通常情况下,我们使用 JavaScript 的 window.onbeforeunload 事件来捕获这种情况...

    7 年前
  • Angular $http 发送 OPTIONS 请求而不是 PUT/POST

    当使用 Angular 的 $http 服务进行 PUT 或 POST 请求时,有时会看到浏览器发送一个 OPTIONS 请求而不是预期的 PUT 或 POST 请求。这可能是由于跨域请求引起的。

    7 年前

相关推荐

    暂无文章