不要乱来

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

之前关于模块化开发用的一直是webpack,因为是在线预编译的,所以支持CMD和AMD写法,也支持ES6语法。

但是现在换了新公司,用的requirejs,之前没用过,现在记录一些关于requirejs的使用。

从基础的说起,关于模块化概念的引入,由于传统的标签加载会导致两个问题:

1.过多的js文件加载导致游览器渲染阻塞,大部分的时间都被拿去处理加载文件的事务了,网页在一段时间中失去了响应。

2.由于js文件之间存在着相互依赖的关系,依赖性最大的文件一定是最后加载的,随着js文件的增多,代码变得很难维护,这种感觉抽象的来说,就跟城乡结合部里错综复杂的网线一样缠绕在一起。

requirejs就是为了解决以上痛点而诞生的:

1.通过异步加载来避免网页阻塞失去响应的现象。

2.管理依赖,便于后期维护。

 

关于requirejs的使用:

1.正常的标签引入头部,可以写成这样  <script src="js/require.js" async="true"></script>  也是异步载入。

2.require(['moduleA','moduleB','moduleC'],function (moduleA,moduleB,moduleC) {})

当主模块依赖其他模块的时候,需要使用AMD规范来定义一个require函数,写法如上。

分析下,第一个参数,是一个数组形式的参数,数组里每一个元素,对应一个模块,既主模块是依赖于这三个模块的。第二个参数是一个回调函数,当指定模块被加载成功后,它将被调用,被加载的模块被当做参数传入,供函数内使用这些模块。require在加载这三个模块的时候是异步的,所以并不会影响游览器的继续响应,同时只有在加载完毕后才会回调函数,解决了依赖问题。

3.AMD模块的写法

允许requirejs加载的模块是必须采用AMD规范来书写的。书写格式,如果一个模块希望被加载成为requirejs模块,需要用define()来定义函数。

3.1当一个模块不依赖于其他模块的时候:

//math.js

define(function(){

 var add = function (x,y){

      return x+y;

    };

    return {

      add: add
    };

  

})       

我们需要拿到的函数或者变量当做一个对象返回出来,把需要的都封装到字面量变量当中。

3.2 当一个模块依赖于其他模块define(['A','B'],function(A,B){}())

3.3 加载一个被注入进来的模块 require(['math.js'],function(){})

 

4.加载非规范模块

理论上,能够引用的加载模块都必须是按照AMD规范,通过define()函数定义的模块,但是也存在着一批不符合规范的流行库。当然可以也是可以加载这些模块的,只是需要进行require.config()处理,来定义一些特征。写法:

require.config({

  shim:{

   'underscore':{

     exports:'_'

     },

    'backbone':{

     deps:[''underscore'',''jquery''],

     exports:'BackB'

}

}

})

解释:首先我们将这些非AMD模块的东西引入到shim属性中,然后每个模块定义一个exports,表明这个模块被调用时的名称。deps为依赖。

 

5.requirejs插件

define(['image!cat.jpg'],function(){})这样就被引入了。类似的插件还有text,json,mdown。

 

小结:以上内容都参考阮一峰的模块化编程。大体思路感觉es6差不多,但是es6可以自定义未声明模块的名称,require的话只能是文件名。还是觉得es6的更简单方便一些。如果再有什么使用心得再来更新了。

 

 

 

 

 

 

 

 

 








posted on 2017-04-27 23:18  不要乱来  阅读(679)  评论(0编辑  收藏  举报