19

有没有人有经验/洞察力:解耦jquery / sizzle?

这是出于普遍的兴趣,但这是引发我的问题的场景:

..我已经在项目中有 jquery。想试试http://ecsstender.org/,它需要 Sizzle 选择器引擎。我真的不想包含 Sizzle 的第二个副本 - 它已经是 jquery 的一部分..

似乎是个好主意。虽然我猜这可能会损害性能,但我希望看到与 jQuery 生产版本的基准比较..

有谁知道这是否已经完成?(github fork?)或者是否有充分的理由反对这种方法?.

4

2 回答 2

31

没有必要将 Sizzle 包含在 jQuery 构建中。它可以被删除...所有引用Sizzle.的 jQuery 代码,您可以自己抓取/编译 jQuery(包括预先包含 Sizzle)并将其暴露给任何其他库(实际上并未将其包含在编译版本中,只是作为闭包编译器)。


这是将其保留为嵌入的选项,但将 Sizzle 公开以供外部使用:

如果您知道将使用 jQuery(依赖),只需在 jQuery 之后添加:

​window.Sizzle = jQuery.find;

这会将 Sizzle 重新公开为您可以使用的属性。


这是从嵌入中删除 Sizzle 的手动版本:

在 jQuery(版本 1.4.3 链接)中,您会看到:

/*!
 * Sizzle CSS Selector Engine - v1.0
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){
//...
//lots of code!
//...

// EXPOSE
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;

})();

将该部分替换为:

(function(){    
// EXPOSE
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;    
})();

然后你需要做的就是在jQuery之前包含Sizzle ,它会正常工作。

这是一个显示它工作的小提琴,包括直接来自 github 的 Sizzle,而不是嵌入在 jQuery 中。

于 2010-10-17T10:24:31.280 回答
2

如果你想将 eCSStender CSS3 选择器模块与 jQuery 中捆绑的 Sizzle 一起使用,你可以这样做:

eCSStender.addMethod('findBySelector',function(selector){
  var els = [];
  jQuery(selector).each(function(){
    els.push(this);
  });
  return els;
});

可能有一种更简单的方法可以直接获取实际元素集合(而不是使用数组的假集合),但现在还为时过早,我的大脑还没有完全工作。

于 2010-10-19T12:10:32.643 回答