删除不需要的jQuery函数

11

你好,

像jQuery这样的库是完全加载的,其中包含了许多我们在脚本中可能不会使用的函数。我想知道是否有一种方法可以读取我的脚本,找出我正在使用的所有jQuery函数及其依赖项,然后从jQuery库中删除其余的函数。这适用于几乎任何库,不是一个特定于jQuery的问题。

请告诉我您对如何实现此目标的想法。我知道如果将来添加了一个新的功能到我的代码中,而该功能在jQuery中不存在,这可能会成为一个麻烦。但我愿意承担这个风险。


老天爷,我可以问一下为什么吗? - jAndy
1
可以的。我们的软件可以在数千个站点上运行,并且jQuery代码已经与我们的代码一起添加。但是随着我们前进,我们想要删除不必要的部分(因为我们几乎没有使用任何核心jQuery函数,只用了几个)。我们一直在使用CDN加载jQuery,但我们的客户不喜欢它。他们希望自行托管所有内容。不要问我为什么,因为我不知道。 - Alec Smart
如果你能想出一个合理的缓存策略,那么你可以本地提供整个jQuery文件,但是缓存它,这样你就不必担心下载/额外的HTTP请求的成本。Web作者和站长的缓存教程是一个很好的资源。 - Walter Rumsby
6个回答

3

你会如何使用它?是将JQuery的所有JS代码和其他JS代码一起复制并删除未使用的函数吗? - Revious

3

即使我不知道原因,你也可以这样做:

前往http://github.com/jquery/jquery/blob/master/Makefile

这就是jQuery库的makefile。jQuery被分为几个模块,它们被组合在一起。这些“基本文件”按照依赖关系排序,因此您可以剥离您不使用的模块...

我不能100%确定它是否有效,因为我从未尝试过,但你可以试试。


即使它们在开发阶段被分成几个文件,也并不意味着它们能够独立运行,这只是jQuery团队组织工作的方式。例如,数据团队将在data.js上工作,然后他们会有一群测试人员来测试新的方法/功能。所以,这只是一个设计过程,没有更多的东西 - 不过是个好的参考 :) - RobertPitt
1
@RobertPitt:我不知道,它看起来像是一个依赖树。这个顺序很有意义。所以我真的相信你可以只删除“Dimensions”这个属性。 - jAndy
可能可以将尺寸等其他实体(如css)与elem.offsetWidth等一起使用,但是如果删除类似css的子包,那么会导致巨大的麻烦,因为它在整个库中都被使用!更不用说新增的库了,它们也会受到影响 :( - RobertPitt

1

如果你的JavaScript不是非常动态的,那么你可以尝试使用Closure Compiler

所有的JavaScript代码放在同一个地方(包括jQuery、插件、其他库等等),然后使用高级编译选项将其输入给gcc。

这将删除所有未使用的函数,这可能会导致你的代码出现问题。我只建议在有测试用例或者JS足够小以便手动完全测试时使用该方法。

编译器所做的一种简单的优化示例是:

function hello(name) {
    alert('Hello, ' + name);
}

hello();

将会被缩减为:

alert("Hello, undefined");

因为基本上就是这样发生的。


你会如何使用它?是将JQuery的所有JS代码和其他JS代码一起复制并删除未使用的函数吗? - Revious

1

jQuery没有像Prototype和MooTools那样提供打包下载,自己构建可能会很困难,因为您需要手动解决所有依赖关系——并且为每个新的jQuery版本重复这个过程。

此外,完整库的已压缩大小目前为24kb,我告诉您大小并不重要。该库仅加载一次——如果从CDN加载它,则会集中缓存,使其即使在慢速调制解调器连接下也可行。


0

这将是一个不好的主意。

首先,您可能希望删除例如InArray之类的内容,因为您可以使用基本的JavaScript替代方法,但其他方法可能依赖于InArray。

基本上,jQueries方法彼此使用以完成任务,这是他们保持包大小的方式之一。

如果您真的想这样做,我会这样做:

$M = MyjQuery = function(element,context)
{
    this.fn = {}
    this.extend = function(base,new)
    {
        //Extend them here
    }
}

从头开始!

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接