SeaJs学习笔记$为null

最近在接触seajs,记录学习过程当中遇到的困难。javascript

3-10:前端

在引进jQuery的时候,发现$为null。先把代码贴上java

//配置
seajs.config({
    base: "./js/",
    alias:{
      "jquery":"jquery.js"
    }
 });
 seajs.use("./js/main");

//主模块
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保持一致。

本人为前端菜鸟,上述言论有误之处,但愿你们能在下方评论指出,若是其余方法或疑惑也能够提出来,你们一块儿成长~~  

相关文章
相关标签/搜索