toastr.js报TypeError: $ is not a function及AMD包装器需求
解决Toastr报错“$ is not a function”的AMD包装器方案
我完全懂你的困扰——明明已经加载了jQuery,Toastr却还是找不到$,还因为内部的require('jquery')去寻找不存在的dist/jquery.js搞出了新问题。下面给你一套靠谱的解决方案:
先理清问题根源
你提到Toastr里的require('jquery')会请求dist/jquery.js,同事创建空文件后虽然解决了其他错误,但Toastr拿到的是空模块,自然无法正常调用jQuery的方法。本质是Toastr的模块依赖路径和你项目里实际的jQuery路径不匹配,导致它拿不到正确的jQuery实例。
方案1:创建AMD包装器返回现有jQuery
这是最直接的解决方式,给Toastr要找的dist/jquery.js写一个包装器,让它返回你项目里已加载的jQuery:
- 先删除之前同事创建的空
dist/jquery.js文件,避免干扰 - 在
project/jspm_packages/npm/toastr@2.1.2/dist/目录下(如果dist文件夹不存在就手动新建)创建真正的jquery.js,内容如下:
// AMD格式的包装器,返回已加载的jQuery实例 define(function() { // 优先取全局的jQuery,也可以根据你项目的实际情况调整 return window.jQuery || window.$; });
如果你的jQuery是通过模块加载器加载的(而非全局暴露),可以改成:
define(['jquery'], function($) { return $; });
方案2:用模块加载器映射(更推荐)
直接修改Toastr的依赖映射,避免手动创建文件,也不用改Toastr源码:
在你的项目jspm.config.js(或对应的模块配置文件)里添加映射规则,把Toastr依赖的jquery指向你项目里实际的jQuery文件路径:
System.config({ map: { // 把toastr要找的"jquery"映射到你实际的jQuery模块路径 "toastr/jquery": "npm:jquery@x.x.x/dist/jquery.js" } });
替换x.x.x为你项目里jQuery的实际版本号,这样Toastr内部的require('jquery')就会直接加载正确的jQuery模块,不用再去dist目录找不存在的文件了。
额外提醒
尽量不要直接修改Toastr的源码(你之前修改了470行的逻辑),这样后续升级Toastr版本时会面临代码合并的麻烦,用上面的依赖映射或包装器方案,既能解决问题,又能保持第三方库的源码干净。
内容的提问来源于stack exchange,提问作者螠enela慰s
相关产品推荐
相关产品推荐

