覆盖 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 的相关文章

随机推荐

  • 如何在 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 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应