我想做的是调整我的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"是插件指南为引用库指定的值。