Javascript CommonJS-如何将jquery和jquery插件组合到$namespace中

Javascript CommonJS-如何将jquery和jquery插件组合到$namespace中,javascript,node.js,jquery-plugins,commonjs,Javascript,Node.js,Jquery Plugins,Commonjs,我试图做的是调整我的jQuery插件,使之与Node.js上的jQuery一起工作 据我所知,CommonJS最基本的形式要求在闭包中封装一个库,并且闭包应该作为“exports”参数的一个参数提供。这样,代码被整齐地包含在它自己的名称空间中(通过一个命名变量),并且不会污染全局名称空间 jQuery本身应该属于“$”名称空间 Ala: var $ = require(jquery); (function( $ ) { // plugin code goes here })(jquery)

我试图做的是调整我的jQuery插件,使之与Node.js上的jQuery一起工作

据我所知,CommonJS最基本的形式要求在闭包中封装一个库,并且闭包应该作为“exports”参数的一个参数提供。这样,代码被整齐地包含在它自己的名称空间中(通过一个命名变量),并且不会污染全局名称空间

jQuery本身应该属于“$”名称空间

Ala:

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?
但是我的插件也应该放在“$”名称空间下

插件代码:

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?
Ex:

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”)的子名称空间,所有内容都可以从“$”名称空间调用

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

注意:匿名函数包装器遵循


注意:此修复程序将应用于插件。

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

var $ = require("jquery");
require("jquery-csv")($);
这也意味着你可以这样做:

module.exports = exports = function (jquery) {
    //You modify the jquery object here.
};
对$object的修改应该按照jQuery插件的建议进行。我相信你已经意识到了你所说的


我相信有人会想出一个更聪明的方法:)但这应该暂时奏效。您也可以只返回一个修改过的jquery对象,然后将其分配给最初包含模块的作用域上的$object。

答案比我想象的要简单…

var $ = jQuery = require('jquery');
require('./jquery.csv.js');
调用“require”而不将其分配给变量/命名空间的行为与脚本导入相同(即它可以操作存在于全局命名空间中的对象)

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

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

您应该在插件中要求jQuery:

var $ = require("jquery");
这也是中的技术,是CommonJS和AMD的标准


另请参见

我刚刚完成了节点env的设置,解决方案甚至比这更简单。您不需要向插件添加导出调用,因为它改变了现有的名称空间。在没有赋值的情况下调用require,其作用与使用标记导入相同。@mamsaac请您提供一点关于如何包装插件的更新,第二个$really necessary注意
var a=b=c=d:它将
b
c
泄漏到全局数据库中!该死的怪癖。因此,多个var赋值语句可以防止污染全局名称空间?@Joey Twiddle我认为上述答案是有效的,因为您需要jQuery成为全局对象,就像通过脚本标记(例如window.jQuery)调用时在浏览器中一样。@Evaplace是的,他们会这样做。对不起,迟了回复@麦克泰勒17好的理论。如果意图真的是污染全球环境,那么明确表达这一意图是惯用的做法:
global.jQuery=$
window.jQuery=$以避免以后的开发人员(比如我们)不得不猜测原始开发人员的意图。如果jquery没有实际使用呢?我试图涵盖这两个用例,因此无论jquery是否实际存在,它都将绑定到$。