如何通过RequireJS将全局变量定义为AMD模块以复用环境中的jQuery和Foundation框架?
复用全局框架的RequireJS配置方案
当然可以实现复用环境内置全局框架的需求!你的思路方向是对的,但原配置里的paths写法有误,RequireJS不会识别"window.$"这种格式的路径。下面是正确的实现方式和关键细节:
正确的配置写法
我们可以通过paths里的特殊值empty:告诉RequireJS不需要加载对应模块的文件(因为框架已经在全局环境中存在),再配合shim导出对应的全局变量:
requirejs.config({ paths: { // 用"empty:"标记不需要加载文件的模块 "jquery": "empty:", "foundation": "empty:", "foundation.module": "empty:" }, shim: { "jquery": { // 导出全局环境中的$变量 exports: "$" }, "foundation": { // 指定依赖jquery,确保加载顺序 deps: ["jquery"], // 导出全局环境中的Foundation变量 exports: "Foundation" }, "foundation.module": { deps: ["foundation"], // 导出Foundation的子模块 exports: "Foundation.Module" } } });
关键细节说明
empty:的作用:这个特殊值告诉RequireJS,当请求对应的模块时,不要尝试去加载任何JS文件,直接使用已存在的全局变量。shim.exports的作用:指定模块对应的全局变量名,RequireJS会在模块被依赖时返回这个全局变量,让你的应用脚本可以像使用普通AMD模块一样调用它。- 加载顺序的保证:通过
shim.deps配置依赖关系,确保Foundation在jQuery之后初始化,Foundation.Module在Foundation之后可用,和全局框架的加载顺序一致。
额外注意事项
- 必须确保环境内置的框架脚本(jQuery、Foundation等)在RequireJS配置和你的应用代码之前加载完成,否则RequireJS会找不到对应的全局变量而抛出错误。
- 如果使用的是较新版本的jQuery(1.7+),它本身已经支持AMD规范,会自动在全局环境中注册
"jquery"模块。这种情况下你甚至可以省略shim配置,只保留paths里的"jquery": "empty:"即可。
内容的提问来源于stack exchange,提问作者Philipp Wrann
相关产品推荐
相关产品推荐

