覆盖 require.js 中的 setTimeout

2024-03-17

我们在项目中使用 require.js,我们需要重写设置超时时间在第 705 行,这是我们需要的代码以某种方式忽略/省略这个 setTimeout 根本(我的意思是运行它),问题是,如果我在更改版本时显式地在开源代码中更改它,代码将丢失,我应该如何仅针对 require.js 文件从外部重写此 setTimout只要我使用这个库就保留它,是否可以在elegantJS 全局的方式?

https://github.com/jrburke/requirejs/blob/master/require.js https://github.com/jrburke/requirejs/blob/master/require.js

这是705号线

        //If still waiting on loads, and the waiting load is something
        //other than a plugin resource, or there are still outstanding
        //scripts, then just try back later.
        if ((!expired || usingPathFallback) && stillLoading) {
            //Something is still waiting to load. Wait for it, but only
            //if a timeout is not already in effect.
            if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
                checkLoadedTimeoutId = setTimeout(function () {
                    checkLoadedTimeoutId = 0;
                    checkLoaded();
                }, 50);
            }
        }

仅供参考,我们这样做的原因是Chrome:后台选项卡中暂停了超时/间隔? https://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs


您已经说过您的目标是解决 Chrome 执行的限制setTimeout对于后台的选项卡。我认为这样做不是一个好主意,但如果你必须这样做,那么你绝对应该修补 RequireJS 而不是搞乱setTimeout全球。你说:

如果我在更改版本时显式地在开源代码中更改它,则代码将丢失

仅当您不使用合理的方法来执行更改时才会出现这种情况。明智地去做是可能的。例如,您可以使用 Gulp 来获取require.js文件安装在node_modules(在安装 RequireJS 之后npm)并生成一个修补文件build。然后您在应用程序中使用这个修补文件。这里是gulpfile.js:

var gulp = require("gulp");

// Bluebird is a good implementation of promises.
var Promise = require("bluebird");

// fs-extra produces a `fs` module with additional functions like
// `ensureDirAsync` which is used below.
var fs = require("fs-extra");

// Make it so that for each the function in fs that is asynchronous
// and takes a callback (e.g. `fs.readFile`), a new function that
// returns promise is created (e.g. `fs.readFileAsync`).
Promise.promisifyAll(fs);

var to_replace =
"if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {\n\
                    checkLoadedTimeoutId = setTimeout(function () {\n\
                        checkLoadedTimeoutId = 0;\n\
                        checkLoaded();\n\
                    }, 50);";

var replace_with =
"if (isBrowser || isWebWorker) {\n\
                    checkLoaded();";


gulp.task("default", function () {
    // Use `fs.ensureDirAsync` to make sure the build directory
    // exists.
    return fs.ensureDirAsync("build").then(function () {
        return fs.readFileAsync("node_modules/requirejs/require.js")
            .then(function (data) {
                data = data.toString();

                // We use the split/join idiom to a) check that we get
                // the string to be replaced exactly once and b)
                // replace it. First split...
                var chunks = data.split(to_replace);

                // Here we check that the results of splitting the
                // chunk is what we expect.
                if (chunks.length < 2) {
                    throw new Error("did not find the pattern");
                }
                else if (chunks.length > 2) {
                    throw new Error("found the pattern more than once");
                }

                // We found exactly one instance of the text to
                // replace, go ahead. So join...
                return fs.writeFileAsync("build/require.js",
                                         chunks.join(replace_with));
            });
    });
});

你需要跑过npm install gulp fs-extra bluebird requirejs在运行之前。无论如何,您可以使用 Gulp,您可以使用 Grunt,或者您可以使用您想要执行构建的任何其他系统。要点是:

  1. 您有一个可重复且自动化的方法来修补 RequireJS。如果您安装新版本的 RequireJSnpm,当您重建软件时,只要 RequireJS 代码的更改不会妨碍应用补丁,补丁就会自动应用。请参阅下一点,了解如果更改阻止应用补丁会发生什么情况。

  2. 该方法比重写更稳健setTimeout在运行时。假设 James Burke 决定在较新版本的 RequireJS 中重命名checkLoaded to checkDone并重命名关联的变量(以便checkLoadedTimeoutId变成checkDoneTimeoutId)。当您再次运行上面的 gulpfile 时,它​​会引发异常,因为它找不到要替换的文本。您必须更新要替换的文本和替换内容,以便补丁可以与新版本的 RequireJS 配合使用。这样做的好处是您可以提前收到警告,告知情况已发生变化,您需要查看补丁。在游戏后期你不会有惊喜,也许在您已经向客户交付了新版本的软件之后。

    重写的方法setTimeout在运行时只会默默地无法完成他们的工作。他们将寻找一个包含以下内容的函数checkLoadedTimeoutId,在新版本中将不再存在。所以他们只会让 RequireJS 按照默认的方式运行。失败将是一种微妙的失败。 (我已经使用建议的自定义版本运行了 RequireJSsetTimeout一个项目在未优化时加载超过 50 个模块。我发现 RequireJS 使用 stock 之间没有明显的区别setTimeout和 RequireJS 使用自定义setTimeout.)

  3. 此方法不会减慢每次使用的速度setTimeout. setTimeout被 RequireJS 以外的其他代码使用。不管你如何削减它,在自定义替换中添加代码setTimeout开始在传递给它的每个函数中查找字符串将使all的用途setTimeout slower.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 require.js 中的 setTimeout 的相关文章

  • html5 下载属性在 FF 中不起作用

    您好 我有一个带有下载属性的锚标记 单击该标记时将从 href 中定义的 url 下载图像 这在 Chrome 中工作正常 但在 Firefox 中它需要浏览器中的图像 有什么办法可以让我们在 FF 中实现这一点吗 a href https
  • 响应中的“Access-Control-Allow-Credentials”标头为“”,必须为“true”

    我在后端使用 Node Express 在客户端使用 Angular4 这给了我以下错误 XMLHttpRequest 无法加载http localhost 4876 登录 检查 http localhost 4876 login chec
  • javascript 使用 unicode 进行排序

    有很多按某些属性 即 标题 对某些 JSON 数组进行排序的示例 我们正在使用这样的比较函数 function sortComparer a b if a title b title return 0 return a1 gt b1 1 1
  • 如何在 TypeScript 中使用时刻持续时间格式?

    我在 TypeScript Ionic2 Angular2 项目中使用 moment js 继从这个帖子 https stackoverflow com questions 43042337 how to format decimal ho
  • VueJS 在内联模板组件中重新编译 HTML

    我已经包装了 bootstrapTable https github com wenzhixin bootstrap table https github com wenzhixin bootstrap table 到指令中 如下所示 Vu
  • 选择数据集时触发更改 [Amcharts 多数据集图表]

    是否可以在他们提供的 amcharts 多数据集图表的选择元素上触发 更改 amChartsDataSetSelector find select val 2 trigger change 这是我尝试过的代码 它的作用基本上是将选择选项更改
  • 使用 Struts 2.2.x 的简单 JSON 示例?

    我在获取 JSON 结果时遇到问题支柱2 2 1 1 http struts apache org 2 2 1 1 index html 有没有人有一个简单的工作示例 可以使用以下命令将 JSON 结果返回到 JSP支柱2 2 1 1并准备
  • Reactjs中的递归函数

    我正在使用递归函数制作动态菜单 并且我已经制作了菜单并且它以正确的顺序显示 没有任何问题 我从以下位置收到菜单数据服务 js文件 您可以在下面的代码沙箱示例中看到整个工作应用程序 https codesandbox io s reactst
  • 进度条摆动效果

    摆动垂直进度条 我学会了如何构建一个整洁的 动态大小的垂直进度条 其中带有横栏这个问题 https stackoverflow com questions 22337851 css vertical progress bar noredir
  • Vite Vue 3 库构建并不隐式包含 dist/style.css

    我构建了一个库项目 Vue 3 Vite 我想通过以下方式将其包含在主机项目中package json 但我遇到了一个问题 我可以导入组件并使用这些导入的组件运行一个简单的程序 但它们的样式消失了 请让我知道我的配置有什么问题 当我必须手动
  • 滚动到 HTML 网站中的顶部 JavaScript

    我正在尝试在我的网站中实现滚动到顶部功能 www arrow tvseries com 网站上可以看到 按钮 但它无法正常工作 因为单击时它不会滚动到页面顶部 更重要的是 我希望 滚动到顶部按钮 在向下滚动 例如一半页面 时可见 这是 Ja
  • 在 MVC 5 中,如何在单个 Ajax POST 请求中发送 ViewModel 和文件?

    我有一个 ASP NET MVC 5 应用程序 我正在尝试发送带有模型数据的 POST 请求 并且还包括用户选择的文件 这是我的 ViewModel 为了清晰起见进行了简化 public class Model public string
  • 如何在 AngularJS 中插入命令或阻止 $http 的 JSONP 自动解析?

    似乎我发现的关于 http 或 angularjs 的几乎每个问题或解释通常都假设您可以修改请求的响应 我不能这样做 而且我得到的响应格式错误 根据 AngularJS 解析器 它的格式错误一致 因此我可以在解析纯文本之前修改它来解决问题
  • 如何从 API 获取雅虎天气背景?

    我有一个天气小部件 我需要动态背景 雅虎有天气 API 但我无法找到与天气类型相关的背景图像 https weather yahoo com https weather yahoo com 这可能吗 var url http query y
  • Snap.svg 如何获取我们拖动的元素

    我正在使用 Snap svg 库并进行一些拖放操作 我的问题是如何获取我拖动的元素的 id 我正在尝试实现拖放 并且只有选定的区域才是有效的放置目标 我不知道如何检查拖拽下方的元素是什么 这是来自文档 Element drag onmove
  • 在进程注册后显示 div,woocommerce

    在网站注册过程后 我想显示一个隐藏的div div 位于同一页面中 但注册后 页面将加载并显示相同的页面 这是表单处理程序 php public static function process registration nonce valu
  • Javascript 已禁用,简短的问题

    只是一些关于 javascript 和网站的简短问题 1 通过启用 javascript 是否意味着在浏览器设置中安装并启用了 sun java 或者每个浏览器都始终启用 JavaScript 吗 2 如果禁用 javascript 我的网
  • Javascript/jQuery/等中测量经过时间/一段时间后触发事件的方法

    我正在尝试使用 HTML5 Javascript 制作一个简单的游戏 我想对活动施加时间限制 例如 当玩家进入一个屋顶正在向他们逼近的房间时 我想给他们一些时间来做出决定 然后自动发生其他事件 但是 如果他们做出决定 我根本不希望触发定时功
  • 无法使用“in”运算符在中搜索“_id”

    我正在尝试使用 mongoose 和express 来获取现有的用户文档 但我只得到这个 webroot api domain com production node modules mongoose lib document js 162
  • 删除 JavaScript 中的不间断空格

    我无法从字符串中删除空格 首先我要转换div to text 删除标签 有效 然后我尝试删除 nbsp 字符串的一部分 但它不起作用 知道我做错了什么 newStr myDiv text newStr newStr replace nbsp

随机推荐

  • 如何在 Unix 系统上编辑二进制文件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在 Windows 计算机上 有许多第三方编辑器可用于编辑二进制文件 如何在 Unix 系统上编辑二进
  • 在反应中停止日期更新的最佳方法是什么?

    我正在映射对象数组并在卡片中显示它们的值 每个对象都有一个标题 评论和 datePosted 字段 datePosted 字段通过我制作的函数将其显示在卡片上为 2 小时前发布 或 2 分钟前发布 尽管每次状态发生变化 这都会更新 这在几天
  • 如何在 WooCommerce 中启用自定义产品类型的价格和库存

    我在 WooCommerce 应用程序中创建了自定义产品类型 function register variable bulk product type class WC Product Variable bulk extends WC Pr
  • jQuery 图像网格系统

    我有一个关于图像网格系统的问题 我创建了这个DEMO http codepen io shadowman86 pen YPpedQ来自 codepen io 在此演示中您可以看到 div class photo row div class
  • 创建位图时使用与密度无关的像素作为宽度和高度

    Bitmap createBitmap int width int height Bitmap Config config 方法只是说给它一个高度和一个宽度 没有指示这些是实际像素还是 dp 像素 我的问题 1 这些值是 dp 像素吗 2
  • 具有小数精度的格式数字字段?

    当然 我遗漏了一些非常明显的东西 我有一个精度为 2 的小数字段 但 Formtastic 仅以一位小数显示它 除非实际值有 2 位 我缺少什么 Model create table items force gt true do t t s
  • 你能让 std::shared_ptr 管理用 new T[] 分配的数组吗?

    你能做一个std shared ptr http en cppreference com w cpp memory shared ptr指向一个数组 例如 std shared ptr
  • npm:术语“npm”不被识别为 cmdlet、函数、脚本文件或可操作程序的名称

    当我检查节点 v时 一切正常并打印出来 但 npm 显示此错误 我怎样才能解决这个问题 请帮我 我搜索了很多时间并找到了解决方案 一旦安装nodejs gt 请重新启动笔记本电脑 然后设置路径 系统属性 gt 环境设置 gt C Progr
  • Git LFS 文件未推送到远程存储库

    我正在尝试使用 git LFS 将 xlsx 文件推送到远程存储库 我尝试了两种方法 使用 Sourcetree 点击菜单和使用终端服务器 两者都会产生相同的错误消息 我在 Bitbucket 中设置了一个远程存储库并设置了允许 LFS 选
  • WPF C# 类、文本框和参考,Easy(?)“当前上下文中不存在”

    我正在拔头发 我创建了一个类 employee cs 我最初在 Window1 xaml cs 上的 公共部分类 Window1 Window 中开发了这个类 当将其移动到单独的类时 我无法再引用文本框 组合框等 我该怎么办 给出的错误是
  • Python 交互式 Shell - 带有 print 的 SyntaxError [重复]

    这个问题在这里已经有答案了 我是Python新手 我在 Windows 2003 虚拟机上安装了 Python 推出Python Shell 输入以下代码 print Hello World 它立即向我吐出以下内容 语法错误 语法无效 以下
  • 哈希表 v 自平衡搜索树

    我很想知道使用自平衡树技术来存储项目比使用哈希表更重要的推理是什么 我发现哈希表无法维护插入顺序 但我始终可以在顶部使用链表来存储插入顺序序列 我发现对于少量的值 哈希函数会增加成本 但我总是可以将哈希函数与密钥一起保存以加快查找速度 我知
  • 检测何时将文本输入到文本区域并相应地更改它

    我有一个textarea用户可以在其中输入或粘贴其他人的电子邮件地址 并在按 提交 按钮后向他们发送邀请 每封电子邮件必须用逗号分隔 并且在提交表单之前有效 验证由jQuery 验证插件 http jqueryvalidation org
  • “在‘​​vue’中找不到导出‘默认’(作为‘Vue’导入)

    我是 VueJs 的初学者 这是我的第一个应用程序 import BootstrapVue from bootstrap vue import createApp from vue import App from App vue const
  • “函数”对象没有属性“tk”是什么意思?

    我目前正在开发一个程序 可以让您注册一个帐户 然后通过将详细信息写入 txt 文档并再次读取它们来再次登录 一切都工作正常 直到我添加以下内容 def login fh open usernamepassword txt r lines f
  • 在 Swift 中过滤具有多个条件和类型的对象数组

    我正在尝试在我的应用程序中进行一些复杂的过滤 但我不知道下一步该做什么 我的数据由一个字典数组组成 其中每个字典中的值可以是String Int or String let person1 String Any first name Joh
  • Onload 使输入大小适合文本长度

    我试图让 jQuery 测试 onLoad 输入框中文本的长度 并更改输入框的大小以适应 这是迄今为止我的代码尝试 emailSubject attr size this val length 我收到以下错误 this val 不是函数 我
  • Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境

    在使用 hi IN 进行数字验证时 我面临以下问题 其中 Zend Locale Format isFloat 对于非单个数字和任何语言环境都可以正常工作 但不适用于单位数字和区域设置 hi IN 源代码 测试用例 foreach arra
  • 有没有办法识别 c/c++ 库的版本?

    例如 如何获取 usr lib libz a的版本 如果可以获取其他有用的信息 例如编译器 架构等 那就太好了 我想知道这一点的原因是 当我编译程序并与特定版本的 libz 链接时 gcc 总是说它忽略了我在命令行中提供的 libz gcc
  • 覆盖 require.js 中的 setTimeout

    我们在项目中使用 require js 我们需要重写设置超时时间在第 705 行 这是我们需要的代码以某种方式忽略 省略这个 setTimeout 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应