其他分享
首页 > 其他分享> > 切图崽的自我修养-SeaJs重要概念剖析

切图崽的自我修养-SeaJs重要概念剖析

作者:互联网

前言

高能预警,前方山路十八弯

在上一篇文章里简单的讨论了一下模块化Js, 先来回顾一下目前模块化的两大规范:

其中CMD规范的产出是国内目前十分火爆的SeaJs, 这篇文章主要是解释几个使用SeaJs会碰到的重要概念


匿名模块

SeaJs定义匿名模块一般采用如下的方式:

define(function(require,exports,module){xx})


具名模块

SeaJs定义除了定义匿名模块,还可以定义具名模块

//define(BlockID,[Deps],function(require,exports,module){})
 define(‘A’,[],function(require,exports,module){xx})

其中可以

为什么需要具名模块?

诚然,我们可以把所有模块都以匿名的形式书写。但这样有个很大的缺点,就是模块化会导致Js文件特别多,这样无形中会加大了http请求的数
我们在知道,在文件比较小的时候, 文件的大小并不显著影响http的下载速度, 但是如果把这个文件拆成两个文件下载,增加的一次http开销确是很大的
所以,很多情况下我们需要把零碎的Js模块进行合并成一个文件。但是这么多模块合并在一个文件里,全是匿名的话,系统如何区别哪个是哪个模块呢? 因此,我们需要对这些模块给不同的ID进行标识。 于是这些带了ID的模块,就叫做具名模块


路径即ID

上面解释了什么是具名模块,为什么需要用具名模块,我们现在就来给具名模块命名

SeaJs遵循的是路径即ID命名规则,意思就是具名模块的ID名是路径的一部分. 而沿着最终拼接出来的路径,肯定可以找得到这个具名模块

听起来很绕,但这个规则非常非常非常重要.作者也是在理解SeaJs路径的过程中踩坑无数,这里就来重点讲一下
首先来看SeaJs的路径的书写种类,总的来说,可以分为3种.

  1. 相对路径(以相对路径符开头,比如../js/), 路径以本页面为起点

  2. 直接路径(以直接目录开头,比如js/), 路径以baseUrl为起点

  3. 根路径(以根路径开头, 比如/app/js/) 路径以项目根目录为起点

这里拿入口文件index.html举例:


<!--例1-->
<script>
    seajs.config({
    base: "../js/",      
    alias:{"JQ":"lib/jquery"}        
    })
    
    seajs.use("src/index.js")  
</script>
    

如果换一种形式写:

<!--例2-->
<script>
    seajs.config({
    base: "../js/",      
    alias:{"JQ":"../js/lib/jquery"}        
    })
    
    seajs.use("../js/src/index.js")  
</script>

现在拿例1来说:

<!--例1-->
<script>
    seajs.config({
    base: "../js/",      
    alias:{"JQ":"lib/jquery"}        
    })
    
    seajs.use("src/index.js")  
</script>

既然alias中具名模块叫lib/jquery, 那么你的jquery通过define定义的模块ID一定是lib/jquery

define(‘lib/jquery’,[],function(require,exports,module){xx})

又由于alias中具名模块(lib/jquery)的采用了直接路径的方式, 根据路径即ID的原则,你应该可以顺着 (baseUrl) + (lib/jquery) 找到该具名模块的位置,如果找不到,肯定会报错

现在拿例2来说:

<!--例2-->
<script>
    seajs.config({
    base: "../js/",      
    alias:{"JQ":"../js/lib/jquery"}        
    })
    
    seajs.use("../js/src/index.js")  
</script>

既然alias中具名模块叫../js/lib/jquery, 那么你的jquery通过define定义的模块ID一定是../js/lib/jquery

define(‘../js/lib/jquery’,[],function(require,exports,module){xx})

又由于alias中具名模块(../js/lib/jquery)的采用了相对路径的方式, 根据路径即ID的原则,你应该可以顺着 index.html当前位置 + (../js/lib/jquery) 找到该具名模块的位置,如果找不到,肯定会报错


实际使用

但实际的使用上,我们基本不会去写具名模块, 而是全部写匿名模块
然后通过自动化构建工具(比如grunt,gulp,fis3)的插件去自动解决匿名模块具名化的问题,比如grunt就提供了相关插件:


结语

SeaJs大法好,Grunt大法好 但在使用这些工具的之时,并不是简单抄一两个demo就完事. 很多情况下你要根据自己工程的特性来调整目录结构,而模块所在的路径,和模块的ID, 和最后JS合并压缩的过程息息相关. 所以必须理解它们的规则,运用起来才能更加得心应手

标签:jquery,index,..,切图,路径,js,剖析,模块,SeaJs
来源: https://www.cnblogs.com/baimeishaoxia/p/12628615.html