【问题标题】:CommonJS - How can I combine jquery and a jquery-plugin into the $ namespaceCommonJS - 如何将 jquery 和 jquery-plugin 组合到 $ 命名空间中
【发布时间】:2012-10-03 21:05:41
【问题描述】:

我要做的是调整我的 jQuery 插件以在 Node.js 上与 jQuery 一起使用。

据我了解,CommonJS 最基本的形式需要将库包装在闭包中,并且该闭包应作为“导出”参数的参数提供。这样,代码整齐地包含在自己的命名空间中(通过命名变量),并且不会污染全局命名空间。

jQuery 本身应该属于 '$' 命名空间。

阿拉:

var $ = require(jquery);

但我的插件也应该适合 '$' 命名空间。

插件代码:

(function( $ ) {
  // plugin code goes here
})(jquery);

exports.jquery = jquery // will this work?

例如:

var $ = require(jquery);
$ = require(jquery-csv.js); // will this work?

要在浏览器中工作,所有内容都设置为可从“$”命名空间调用,即使我的模块设置为“$”的子命名空间(即“$.csv”)。

是否有一种标准方法可以对单个命名空间执行多个要求?如果没有,是否有可行的替代方案(例如对插件代码进行浅拷贝)?

注意:匿名函数包装遵循standard jquery guidelines

注意:此修复将应用于 jquery-csv 插件。

【问题讨论】:

    标签: javascript node.js jquery-plugins commonjs


    【解决方案1】:

    你应该需要 jQuery inside 你的插件:

    var $ = require("jquery");
    

    这也是 UMD (Universal Module Definition) 中的技术,CommonJS 和 AMD 的标准。

    另见example for a jQuery plugin with UMD

    【讨论】:

    • 如果 jquery 没有实际使用呢?我试图涵盖这两个用例,因此无论 jquery 是否实际存在,它都会绑定到 $。
    【解决方案2】:

    我能想到的最简单的方法是执行以下操作:

    var $ = require("jquery");
    require("jquery-csv")($);
    

    这也意味着你可以这样做:

    module.exports = exports = function (jquery) {
        //You modify the jquery object here.
    };
    

    $ 对象的修改应按照 jQuery 插件的建议进行。我相信你已经知道他们所说的了。

    我相信有人会想出一个更聪明的方法:) 但这现在应该可以了。您也可以只返回一个修改后的 jquery 对象,然后将其分配给您最初包含该模块的范围内的 $ 对象。

    【讨论】:

    • 我刚刚完成了节点环境的设置,解决方案比这更简单。您不需要向插件添加导出调用,因为它正在改变现有的命名空间。通过在没有赋值的情况下调用 require,它的作用与使用
    • @mamsaac 你能否提供一些关于你如何包装插件的更新,第二个 $ 真的有必要吗
    【解决方案3】:

    原来答案比我想象的要简单...

    var $ = jQuery = require('jquery');
    require('./jquery.csv.js');
    

    调用“require”而不将其分配给变量/命名空间与脚本导入的作用相同(即它可以操作存在于全局命名空间中的对象)。

    第一行负责正确初始化 jquery。完成后,jquery-csv 可以像在浏览器中一样修改现有的 '$' 命名空间。

    第二个赋值 'jQuery' 是必要的,因为 jquery-csv 在此处获取对 'jquery' 实例的引用。这可能会缩短为仅分配给“$”,但“jQuery”是插件指南指定用于引用库的值。

    【讨论】:

    • 当心var a = b = c = d;:它会将bc 泄露到全球!
    • 该死的 JS 怪癖。那么多个 var 赋值语句会防止污染全局命名空间吗?
    • @joeytwiddle 我认为上述答案有效,因为您需要 jQuery 作为全局对象,就像通过脚本标签(例如 window.jQuery)调用时在浏览器中一样。
    • @EvanPlaice 是的,他们会的。抱歉回复晚了!
    • @MCTaylor17 好理论。如果意图真的是污染全局,那么明确表明该意图是惯用的:global.jQuery = $;window.jQuery = $; 以避免后来的开发人员(如我们自己)不得不推测原始开发者的意图。
    猜你喜欢
    • 2012-05-02
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2010-12-04
    • 2011-07-12
    • 2012-01-14
    相关资源
    最近更新 更多