最近在接触seajs,记录学习过程当中遇到的困难。javascript
3-10:前端
在引进jQuery的时候,发现$为null。先把代码贴上java
//配置base: "./js/",
seajs.config({
//主模块
define(function(require, exports, module) { var $ = require('jquery'); console.log($); //null });
个人全部JS都在项目目录下的js文件夹中,这样看是没问题的,结果怎么也找不到问题所在,上网查了查,问题出在jquery文件上。由于用的是seajs框架因此文件格式得遵循CMD的规范,因此咱们普通用的插件是没被模块化的,因此得先模块化。如何模块化呢,有两种方法。jquery
第一种框架
把下列代码放在jQuery源代码的最后面,这里的后面是指jQuery文件自执行函数最后面,不是执行函数外面。模块化
//2.3.0版本的写法
if ( typeof define === "function" ) { define(function () { return jQuery; } ); }
//2.2.0的写法
if ( typeof module === "object" && module && typeof module.exports === "object" ) { module.exports = jQuery; } else { if ( typeof define === "function" ) { define(function () { return jQuery; } ); } }
;$.noConflict(); //这是2.2.0版本在自执行函数外面加的
上面两种写法均可以。函数
第二种 学习
define(function(){ //jquery code源代码 return $.noConflict(true); });
把jQuery所有的源代码放进模块里。ui
上面的两种解决方法是针对那些直接把之前jQuery文件拖过来用的状况。但是我是下载的官方文档,把里面已经模块化过的jQuery文件拿来用的,可仍是不行。仔细看了看,终于找到缘由了。下面是官方模块后的jQuery文件的一部分代码spa
if ( typeof define === "function" ) { define("jquery/jquery/1.10.1/jquery", [], function () { return jQuery; } ); }
你们发现问题没有,官方把模块的ID命名了,而我上面的配置是alias:{"jquery":"jquery.js"},这里我配置的路径和模块的ID对不上,这里就涉及到了SeaJs里面一个路径和ID匹配的原则,这也是我出现问题的所在。
seajs的设计思想是,路径即ID。通常在调用define()方法时,若是只传递一个factory function,那么这个模块就是个匿名模块;或者传递define(module_id, dependency, factory),这个模块就是个具名模块。
若是一个文件就是一个模块,那么匿名模块就能够了。可是在生产环境中,每每会把多个模块放到一个文件里,可是路径只有一个,如何知道要加载哪一个模块呢?这时候就须要给其中一个模块赋予module_id,和path保持一致,seajs就知道应该加载这个ID和path匹配的模块了。若是具名模块的id和require的path参数不匹配,就会返回null。
返回个人代码里,我配置的路劲是jquery.js,而当前jQuery的模块ID是"jquery/jquery/1.10.1/jquery-debug",因此根据咱们上面所讲的seajs路径和ID匹配的原则, 模块返回的就是null了,这种状况很好解决,也有两种方法。
第一种:修改配置路径以下:
seajs.config({ base: "./js/", alias:{ "jquery":"jquery/jquery/1.10.1/jquery.js"//此时jquery.js放置的必须位置和设置的一致
} });
第二种:去掉模块ID和依赖项只剩factory,把模块变成匿名模块,这样它的ID就默认为文件名了。
if ( typeof define === "function" ) { define( function () { return jQuery; } ); }
经过这两种方法来让路径和ID保持一致。
本人为前端菜鸟,上述言论有误之处,但愿你们能在下方评论指出,若是其余方法或疑惑也能够提出来,你们一块儿成长~~