requirejs - 多次调用 require 的性能

2024-01-07

我想知道在具有多个模块的项目中使用 RequireJS 的正确方法是什么,关于具有较少依赖项的多个 require 调用与具有所有依赖项的单个 require 的性能。

让我们以一个应用程序为例,我需要加载一些模块:gmaps, jquery, module1, module2, module3。某些模块的使用是相当独立的。因此,问题是建议使用以下哪种替代方案(假设此代码是加载到页面中的主模块):

require(['gmaps'], function(gmaps){
   gmaps.use();
});

require(['jquery','module1'], function(jquery, module1){
   module1.use();
});

require(['jquery','module2'], function(jquery, module2){
   module2.use();
});

require(['jquery','module3'], function(jquery, module3){
   module3.use();
});

vs

require(['jquery','module1','module1','module1','gmaps'], function(jquery, module1,module2,module3,gmaps){
   module1.use();
   module2.use();
   module3.use();
   gmaps.use();
});

换句话说,性能损失是多少require这是最佳实践。


这里问题的答案是“视情况而定”。我是作为一个在大型应用程序中使用过 RequireJS 的人来发言的not仔细阅读RequireJS的代码。 (只是指出,了解 RequireJS 内部结构的人可能会做出与我不同的解释。)require可以分为3种成本场景:

  1. 如果模块从未被加载过,require从服务器加载文件,执行该文件,执行模块的工厂函数并返回对该模块的引用。 (从网络加载文件的成本通常使其他成本相形见绌。)

  2. 如果模块已被加载但从未被需要,require执行模块的工厂函数并返回对该模块的引用。 (这通常会发生在优化应用。)

  3. 如果模块已经被加载并且需要,require返回对模块的引用。

成本场景 1 > 成本场景 2 > 成本场景 3。

首先,我们考虑每个文件有一个模块的情况。该应用程序未优化。我有一个名为module1这是千载难逢的需要。它在主应用程序中的用法可以建模如下:

define(["module1", <bunch of other required modules>],
    function (module1, <bunch of other modules variables>) {

    [...]

    if (rare_condition_happening_once_in_a_blue_moon)
        module1.use();

    [...]
});

Here I always即使我不使用该模块,也要支付成本场景 1 的价格。最好这样做:

define([<bunch of required modules>],
    function (<bunch of module variables>) {

    [...]

    if (rare_condition_happening_once_in_a_blue_moon)
        require(["module1"], function (module1) {
            module1.use();
        });

    [...]
});

这样,我就需要付出加载模块的代价only千载难逢。

现在,如果我需要使用怎么办module反复?这可以建模为:

define(["module1", <bunch of other required modules>],
    function (module1, <bunch of other modules variables>) {

    [...]

    for(iterate a gazillion times)
        module1.use();

    [...]
});

在这种情况下,成本方案 1 只支付一次,仅此而已。如果我使用require像这样:

define([<bunch of required modules>],
    function (<bunch of module variables>) {

    [...]

    for(iterate a gazillion times)
        require(["module1"], function (module1) {
            module1.use();
        });

    [...]
});

我支付了一次成本方案 1anda(亿万次 - 1)成本场景编号 3. 在一天结束时,是否module1应包含在要求中define调用或单独调用require调用取决于您的应用程序的具体情况。

如果应用程序已通过使用进行优化,则分析会发生变化r.js或自制优化。如果应用程序经过优化,所有模块都在一个文件中,则每次您在上述情况下支付成本方案 1 时,您都需要支付成本方案 2。

为了完整起见,我将补充一点,如果您提前不知道您可能想要加载的模块,请使用require是必要的。

define([<bunch of other required modules>],
    function (<bunch of other modules variables>) {

    [...]

    require(<requirements unknown ahead of time>, function(m1, m2, ...) {
        m1.foo();
        m2.foo();
        [...]
    });

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

requirejs - 多次调用 require 的性能 的相关文章

  • 浏览器视口大小(以设备像素为单位)

    Goal 我希望 Flash 能够获得有关浏览器视口宽度和高度 以设备像素为单位 的准确信息初始化 调整大小或浏览器缩放事件时 规格 我需要将 flash 嵌入到在 chrome safari firefox 等中运行的 html 页面中
  • 从函数返回函数的目的是什么?

    阅读一些遗留代码 发现 A prototype setSize function var v1 new Vector2 return function size var halfSize v1 copy size multiplyScala
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • JavaScript 继承;调用和原型

    要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 改变 JavaScript 中的顶部填充

    以下是我在 css 中设置顶部填充的方法 body font size font size px margin 0 padding 100px 0 20px 0 width 100 important 如何使用最简单的 javascript
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • Vaadin 12 将对象传递给 JavaScript 函数:无法对类进行编码

    Vaadin 12 Kotlin 项目 In my myPage html我有JavaScript myObject redirectToCheckout sessionId 1111 2222 所以我需要调用javaScript函数red
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 有没有办法使用 ko.observableArray 作为地图?

    有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 如何使用 septice 在明火中创建持久房间?

    我正在使用以下内容iq在 openfire 中创建持久房间的消息 var configiq iq to chatObj getActiveChatRoomName chatObj groupChatService type set c x
  • 使用js将字符串附加到图像src

    我有一个页面 里面有 img src images product whatever image jpg alt 我希望在加载页面时 将字符串 Action thumbnail 附加到 src 的值 使其成为src images produ
  • 为什么stream api不是为异常处理而设计的?

    Fixtures BiConsumer
  • 使用 Python 读取 UTF8 CSV 文件

    我正在尝试使用 Python 读取带有重音字符的 CSV 文件 仅限法语和 或西班牙语字符 基于 csvreader 的 Python 2 5 文档 http docs python org library csv html http do
  • 使用光流进行特征跟踪

    我找到了一个类似的问题 https stackoverflow com questions 9701276 opencv tracking using optical flow 9702540 comment13031247 9702540
  • 将材质图标与样式组件一起使用

    刚刚开始使用样式组件 有没有办法设置第三方图标 例如 Material Design Icon 的样式 这是我到目前为止的代码 但显然它不起作用 相关代码位于内容组件下方 Thanks const MaterialIcon props gt
  • localStorage html5 功能在 Samsung Android 设备上的 WebView 中不起作用

    我有一个用 WebView 包装的 html5 应用程序 为了在页面之间存储和检索用户输入值 我使用本地存储html5 功能 它在我的 Nexus 4 Android 4 4 4 上运行良好 但在 Samsung Galaxy Tab 2
  • 罗马尼亚语区域设置

    经过谷歌搜索一段时间后 我发现 Android 2 3 版本确实支持它 但我没有找到它支持的最低版本 如果 Android 2 2 版本不支持罗马尼亚语那么有什么替代方案 感谢您的关注 这是已解决的类似问题 Android 支持的语言 区域
  • 使用正则表达式检查文本框不允许小数

    我想创建一个 TextChanged 事件来检查输入文本是否符合特定条件 如果不符合则删除最后输入的字符 在本例中 标准是数字 1 位小数和 1 位分数 我正在测试仅用于数字和小数的正则表达式 并遇到了问题 我尝试了几种不同的表达式 我不擅
  • 如何在 Laravel 代码中嵌入视频

    我正在开发一个项目 在该项目中 我将 youtube 视频链接存储在数据库中 然后检索这些链接并使用刀片模板引擎尝试将它们嵌入到页面中 我使用循环将视频放入页面中 由于某种原因 我在浏览器中看不到任何视频 它覆盖了提到的空间 但不渲染任何东
  • QSqlQuery size() 总是返回-1

    QSqlQuery query QString queryText SELECT FROM section query exec queryText qDebug lt lt query size always 1 while query
  • ViewPager Fragments 未在 onCreate 中启动

    我似乎在更新 ViewPager 中使用的片段时遇到问题 无论我尝试使用 onCreate onCreateView 还是 onResume 以下是我在 MainFragment 中设置 ViewPager 的方法 public View
  • 绘制多条徒手折线或曲线图 - 添加撤消功能

    我正在尝试创建一个具有撤消和重做功能的简单绘图应用程序 我假设您可以将要绘制的内容添加到列表中 并调用该列表来绘制所有内容 然后撤消应该只是删除最后添加的项目并再次重新绘制所有内容 问题是 如何将绘制的内容添加到列表中并使用该列表撤消 我正
  • 修改awk中的文本文件

    我有一个文本文件 如以下小示例 chr1 HAVANA transcript 12010 13670 gene id ENSG00000223972 4 transcript id ENST00000450305 2 gene type p
  • 创建一个ant文件来运行其他ant文件

    I saw this https stackoverflow com questions 2108862 ant for other ants相关问题 但我的情况不同 所以再次询问 基本上 我有 12 个 ant 文件 我必须按特定顺序运行
  • 如何捕获 OSX 所有正在运行的进程的列表并将它们保存为 Xcode / Cocoa 中的文件?

    我想要捕获 OSX 所有正在运行的进程的列表 并将它们保存为 Xcode Cocoa 中的文件 我用谷歌搜索了这个 我发现的是 我的工作区正在运行的应用程序 我不知道该怎么做 请帮忙 谢谢你 正如中所解释的QA1123 http devel
  • 关闭动画、模态、Angular-UI

    是否可以关闭 Angular UI 中模态指令的动画 http angular ui github io bootstrap http angular ui github io bootstrap 选项里找不到啊我应该修改源吗 或者当您想要
  • Ada 中类型/包别名的单独声明

    我想声明一些 用户定义的编译器常量 以使我的规范文件尽可能保持 常量 这在 C 中很常见 例如 misc config hh namespace misc typedef std shared ptr a A ptr namespace a
  • 使用window.open()下载文件,如何不去掉URL中的#?

    因此 当单击某个元素时 我使用 JavaScript 下载文件 如下所示 HTML p Click Here p JavaScript function download window open file pdf 在单击该元素之前 URL
  • requirejs - 多次调用 require 的性能

    我想知道在具有多个模块的项目中使用 RequireJS 的正确方法是什么 关于具有较少依赖项的多个 require 调用与具有所有依赖项的单个 require 的性能 让我们以一个应用程序为例 我需要加载一些模块 gmaps jquery