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



我想做的是调整我的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?

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

有没有一种标准的方法可以在单个命名空间上执行多个需求?如果没有,还有一个可行的替代方案(比如对插件代码进行浅层复制)?

注意:匿名函数包装器遵循标准的jquery准则

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

您应该在插件内部要求jQuery

var $ = require("jquery");

这也是通用模块定义(UMD)中的技术,通用模块定义是CommonJS和AMD的标准。

另请参阅带有UMD 的jQuery插件的示例

我能想到的做这样事情的最简单的方法是做以下事情:

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

这也意味着你可以做这样的事情:

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

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

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

答案比我想象的要简单

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

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

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

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

最新更新