我第一次在项目中使用 requirejs。我在一个已经有很多 Javascript 的环境中工作,我正在寻找干净的方法来引入我自己的代码。
我遇到的问题是我似乎找不到一个可以加载的 jQuery 模块,它不会破坏现有的 jQuery。
令我惊讶的是,甚至 require-jquery.js 也引入了 jQuery 的全局版本。有没有办法在不引入任何全局变量的情况下将 jQuery 作为模块加载?
jQuery 1.7 支持 AMD 加载。但是,诀窍是避免模块命名冲突,因为 jQuery 将自己的模块名称硬编码为“jquery”。如果您将另一个模块定义为“jquery”(例如,在您的 requirejs 配置中的“路径”属性中),它将导致所述冲突。
要在您的 requirejs 应用程序范围内加载 jQuery,请定义一个模块,例如“jquery-loader”,当您想要加载 jQuery 时,请通过“jquery-loader”进行:
define(['path/to/jquery.min'], function () {
return jQuery.noConflict(true);
});
requirejs 将“缓存”你对 jQuery 的引用,这样 noConflict 只会在第一次加载 jquery-loader 时运行。
一页上有多个版本的 jQuery 是不好的。停止黑客攻击并升级 jQuery 或使用旧版本。
至于保持$
安全尝试
(function($) {
// requirejs inclusion block for loading
}(jQuery.noConflict(true));
如果你传递true
给.noConflict
它,它将替换旧jQuery
变量,而不是全局销毁它。
这意味着您可以安静地传递它。说你有
<script src="jquery-1.2">
<script src="jquery-1.5">
然后使用上面的代码将 1.2 $
&放回全局空间,并在闭包jQuery
中将 1.5 jQuery 作为本地$
我再次建议AGAINTS使用多个版本,因为它是一个正确的混乱和维护噩梦。
如果您使用 1.5,您还可以使用它.sub
来允许您在jQuery
本地扩展而不会破坏全局jQuery
加载 jQuery 脚本,然后使用var myJ = jQuery.noConflict();
或您想要的任何快捷方式变量