2

我正在开发一个内部使用 jQuery 的 JavaScript 库。但是,到了部署它的时候,我宁愿简化一些事情(wrt 部署),而不用担心环境中是否已经包含(或没有)jQuery <head>

我应该提到我的库是作为 Coffescript 中的一个类实现的,并且生成的 .js 文件具有用于隔离作用域的默认函数包装器。

我可以想到几个解决这个问题的方法:

  1. 询问网站管理员他们是否已经存在 jQuery。如果是,只需包含库本身。如果没有,则包含 jQuery + 库,可能在单个文件中并连接起来。部署更难,但问题可能已经解决。

  2. 创建一个连接 jQuery 和我的 lib 代码的文件,并且总是让网站管理员只包含这个文件。为防止冲突,请var myJ = jQuery.noConflict()在 jQuery 代码之后执行。

  3. 像上面的(2)那样做,但是调用var myJ = jQuery.noConflict()封装好的 Coffeescript 类里面。

总之,这项挑战的目标是:

  1. 绝对避免在部署的网站上出现任何损坏,无论他们可能使用什么
  2. 使部署尽可能简单
  3. 尽可能避免不必要的 jQuery 转移

我的担忧是:

  • 如果站点已经有 jQuery,但需要旧/新版本怎么办?
  • 如果我的noConflict()电话打断了他们的某些东西怎么办?

解决这种情况的最佳方法是什么?我错过了什么吗?

4

2 回答 2

2

CoffeeScript 有一个 -b 选项可以在没有顶级函数包装器的情况下进行编译。使用此方法,您可以改用您自己的顶级函数包装器。

IE

(($) ->
    # ...
    # your code
    # ...
)(jQuery.noConflict())

然后,作为构建过程的一部分,将 jQuery 连接到编译输出的前面。适当的 Linux/Mac shell 命令是:

(cat jQuery.js; coffee -pb yourSource.coffee) > yourCompiledFileWithjQuery.js

CoffeeScript的p选项将编译后的输出打印到标准输出,以便您可以将其与 合并cat jQuery.js并将该输出重定向到yourCompiledFileWithjQuery.js

This would ensure that, immediately before your code is executed, jQuery would be included. jQuery keeps a reference to the old owner of $, so if some library or another version of jQuery is already using it it will be returned to them with the jQuery.noConflict() call.

jQuery.noConflict() also returns a reference to that jQuery, so that is how it would be passed to the $ of your code.

I hope that's clear.

Extra:

As of CoffeeScript 1.3, released a few days ago, you could use this instead for your top-level function wrapper, which is somewhat clearer:

do ($ = jQuery.noConflict()) ->
    # ...
    # your code
    # ...
于 2012-04-12T22:17:58.810 回答
1

如果您的结束脚本作为闭包,您可以简单地将 jQuery 作为参数传递并检查它是否未定义。

(function($) {

  if (!$) {
    // load jQuery
  } else {
    // check jQuery version if needed or just use jQuery
    if ($.fn.jquery !== '1.7.2') {
        // load 1.7.2
    };
  };

})(window.jQuery || false);

必须使用 window.jQuery,因为 jQuery 只有在未声明 jQuery 时才会产生错误

于 2012-04-12T12:45:08.243 回答