- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有兴趣听取有关如何在可能会出现高流量的大型 Web 应用程序项目中有效地组织 JavaScript(和 jQuery)的意见。
我关心的事情是:
假设所有编写的 JavaScript 都保存在一个巨大的 application.js
文件中,该文件又与所有外部库连接成一个服务器必须提供的 js 文件。这在服务器上应该是最有效的,因为它只需要提供一次服务,然后浏览器将为每个后续页面加载缓存它。
其中包含许多与选择器 Hook 的自定义 jQuery 函数,如下所示:
$('#my_unique_selector').bellsAndWhistlesPlugin();
上面的选择器只出现在几个页面上,使用将所有内容都打包在一起的方法意味着浏览器加载的每个页面都必须解析插件代码(不会被使用),并且然后解释 bellsAndWhiSTLesPlugin()
方法,即使选择器没有找到匹配项。
所以我想我的问题是,这种方法在什么时候变得低效?是否有关于拆分 JavaScript 并仅提供每个页面所需的位的争论?还是我什么都不担心 - 浏览器完全有能力处理大量冗余代码?
最佳答案
绝对不应该做的事情是将所有 JavaScript 连接到一个文件中。如果您对代码库进行了更改,则会重新创建该文件……并重新分发给每个访问者。 HTTP 开销相当微不足道,因此除非您要加载成百上千个唯一文件,否则加载 20 个不同的文件与加载 1 个大文件不会显示出太大差异,除非用户连接速度特别慢(他们将等待大文件文件,因此他们不会从 HTTP 开销中注意到额外的一两秒)。
ToonMariner 关于使用托管代码(特别是 Google Code 存储库)的建议是一个很好的建议 - 它使您不必托管文件,它允许遇到该文件的用户利用缓存(提高明显的加载速度您的网站),如果您进行更改,它不会包含在您的串联文件中。即使您选择在一个大文件中维护整个应用程序,您也应该考虑使用它,因为您可以避免打包 jQuery,这样可以节省 50+kb。
此外,您对解释 bellsAndWhiSTLesPlugin() 的担忧是正确的 - bellsAndWhiSTLesPlugin 函数中的 this
只是一个空列表(尽管我希望插件执行 $(this).each 调用遍历元素并尽早返回,因为没有元素……否则,您可能需要重新访问您的插件!)。您可以通过从完整的 application.js 文件中删除特定于页面的代码并将其放入页面本身的内联 <script> 元素中来消除此问题,无论如何它都属于该元素,或者重写插件以使其在有没有匹配的元素。
只需确保为从/js 目录加载的资源启用缓存,您就不会在重新加载库时遇到问题 - 只有那些已更改的库。您可以使用 Expires header 或 Last-modified header ;除非用户重新加载或缓存已过期,否则 Expires 不一定会强制更新,并且 Last-modified 会为每个文件调用 HTTP 开销,这对于大量文件来说是有问题的。您必须评估您的应用程序的权衡。
如果您真的对最大效率非常感兴趣,您可以使用 GWT 重写您的应用程序.这在技术上保证了最大的跨浏览器可移植性、最大的代码效率、消除了对 jQuery 库的依赖、执行速度更快,并产生更小的文件大小。一切都在一个文件中,我可能会补充说,但是为了获得静态编译器以实现最高效率的 JavaScript 的权衡是值得的......如果你愿意在 GWT 中重写整个东西。
您必须问自己的问题是:谁是我的普通用户?他/她有什么样的联系?我的应用程序需要在移动设备上运行吗?如果您的普通用户拥有快速连接,请不要担心 - 无论您选择哪种方式,他们都会足够快地加载您的页面。如果您需要在移动设备上工作,或者您的目标受众的连接速度较慢,请考虑缓存您很少更改的大型库并在可用的情况下使用外部存储库(例如 jQuery),然后将应用程序的其余部分打包到一个大文件中.移动设备和慢速互联网的 HTTP 开销足以保证这样做。
关于javascript - 有效组织和服务 JavaScript 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303894/
我是 Django 新手并开始了一个项目,我想以正确的方式去做。 我想知道您认为组织项目的最佳实践是什么。 以下是我的一些问题: 如何将静态资源与 Python 代码分开,以免浪费时间通过 Djang
通过这个组织,是否可以引用“id”属性? function house(id) { this.id = id } house.prototype.buy = function() { }
我的任务是“识别并修复任何错误”。这张取自 Java 教科书的图片显示了 Swing 结构的组织。这对我来说很好,我没有发现任何问题。 谁能解释一下? JPanel 应该放在 JComponent 之
重要的事情 是否可以确定 WHERE 条件的最佳顺序以使其更快?例如,我有一个包含 6 个条件的查询。一些简单,另一些带有子查询或函数。我的想法是对查询进行概要分析,以确定条件语句 true 的常见程
我有 Java/AS3/Javascript 背景,我的所有类都组织成包,以帮助表示它们的功能。 在开始一个 C++ 项目时,我试图以几乎相同的方式模仿这个文件系统结构,但我一直遇到包含问题。 目前我
我正在使用 CKAN 作为开放数据门户。我已经完成了 CKAN 实例的设置并添加了数据集、组和组织。 主页上有一个特色组和一个特色组织框。如何在主页上显示我想要的组和组织。 如何在主页上更改这些特色组
我已经创建了我的第一个 iPhone 应用程序,它可以在表格 View 中显示类似类型的音轨。用户可以使用类似 ipod 的控件来播放音轨,这些控件可以流式传输 mp3。 我的所有代码都在两个主要类中
我将我的代码组织成 20-60 行模块,通常采用模块模式。我想要一个结构良好的面向对象的 JavaScript 库。 这是最好的方法吗?代码已经过测试并且有效。 我喜欢它,因为程序员可以从库中提取模块
我正在使用 riot.js 和 jquery 构建一个应用程序。一切都按预期工作,但是随着代码的增长,我也担心在代码中随机/意外的地方触发和处理事件 (.trigger/.on) 对保持我的代码有条理
这是另一个 GIT 新手。 我想在我们的项目中使用 GIT。 团队不熟悉 GIT。 这些项目基本上由一些通用项目(*)和一些应用项目组成。应用程序正在使用公地,公地也可以使用其他公地。通过“使用”我的
例如,考虑一个组织有一个包含两个分支的存储库的情况,master 和 1.0.0.1。 是否可以让团队对 master 具有只读访问权限,而对分支 (1.0.0.1) 具有读写访问权限? 最佳答案 自
我一直致力于寻找组织 CSS 代码的最佳方式,尤其是在大型网站上。我对编写风格不太感兴趣,而对人们如何构建和管理他们的代码更感兴趣。 我一直在遵循这个结构,我觉得它在可维护性方面工作得很好,但我想听取
我们正在扩展到一个大型微服务构建,并通过 postman 完成更多测试(现场验证、错误测试等)。好奇...您的团队如何组织大量 API 的集合? (按 API、按测试类型、按发布等)从一个团队传递到另
我最近遇到了这个编码面试问题,但似乎找不到答案。这是问题。 给定一个整数数组,编写一个函数,返回组织数组所需的最小交换,使得相邻元素的绝对差都小于或等于 K。交换可以是任意两个数组元素,不一定是相邻的
我有 100 多页。所有页面都使用不同的模板。 目前,我有一长串 .state('page.html').state('page2.html') 等。10-15 页后,我认为这变得不可读/难以管理。
我看下grails-app/i18n有一吨messages*.properties捆绑。我想将我的应用程序国际化,但每页有 1 个“捆绑集”。我所说的包集是指包含相同文本但用于不同语言的一组包/属性文
我正在编写一个非常非常长的 CUDA 内核,它对人类的可读性来说非常糟糕。有什么方法可以用内核外部的功能组织 CUDA 内核吗?示例: __global__ void CUDA_Kernel(int*
我的公司要求我将Outlook用于我的电子邮件。 Outlook几乎不执行我想做的任何事情,这让我感到非常沮丧。 (我并不是要在这里发动一场火焰大战,它必须完全执行数千名CEO想要做的事情,但我不是C
我一直在尝试一些不同的方法来组织我的 javascript 应用程序中的代码,我想知道哪种方法最合适。 第一个例子: var Application = { init: function()
Angular 样式指南包含有关在应用程序中使用类和接口(interface)的最佳实践的信息。但它没有任何关于如何组织我的接口(interface)和模型类的信息。 有一个问题:关于文件和类的组织有
我是一名优秀的程序员,十分优秀!