zoukankan      html  css  js  c++  java
  • Require JS

    一、require.js的价值

    用于解决两个问题:(1)实现js文件的异步加载,避免网页失去响应;(2)管理模块之间的依赖性,便于代码的编写和维护。

    二、require.js的加载

    <script src="js/require.js" defer async="true" ></script>

    async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
    加载require.js以后,就要加载自己的代码。假定代码文件是main.js,也放在js目录下面。只需要写成下面这样:

    <script src="js/require.js" data-main="js/main"></script>

    data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main

    三、主模块

    main.js称为"主模块",是整个网页的入口代码,就像C语言的main()函数。

    主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。

    // main.js
    require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
        // some code here
    });

    require()函数接受两个参数

    第一个参数:是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;

    第二个参数:是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。

    require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

    四、模块加载

    使用require.config()方法,可以对模块的加载行为进行自定义。
    require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。 

    require.config({
        paths: {
          "jquery": "jquery.min",
          "underscore": "underscore.min",
          "backbone": "backbone.min"
        }
      });

    上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。

    如果这些模块在其他目录,比如js/lib目录,则有两种写法。
    一种是逐一指定路径

    require.config({
        paths: {
          "jquery": "lib/jquery.min",
          "underscore": "lib/underscore.min",
          "backbone": "lib/backbone.min"
        }
      });

    另一种则是直接改变基目录(baseUrl)

    require.config({
        baseUrl: "js/lib",
        paths: {
          "jquery": "jquery.min",
          "underscore": "underscore.min",
          "backbone": "backbone.min"
        }
      });

    如果某个模块在另一台主机上,也可以直接指定它的网址,比如:

    require.config({
        paths: {
          "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
        }
      });

    require.js要求,每个模块是一个单独的js文件。这样的话,如果加载多个模块,就会发出多次HTTP请求,会影响网页的加载速度。因此,require.js提供了一个优化工具,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。

    五、AMD模块规范

    require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。具体来说,就是模块必须采用特定的define()函数来定义

    假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

    // math.js
      define(function (){
        var add = function (x,y){
          return x+y;
        };
        return {
          add: add
        };
      });

    加载方法如下:

    // main.js
      require(['math'], function (math){
        alert(math.add(1,1));
      });

    如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

    六、加载非规范的模块

    理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。

    这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。

    举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。

      require.config({
        shim: {
          'underscore':{
            exports: '_'
          },       'backbone': {         deps: ['underscore', 'jquery'],         exports: 'Backbone'       }     }   });

    require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。

    具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。

    比如,jQuery的插件可以这样定义:

      shim: {
        'jquery.scroll': {
          deps: ['jquery'],
          exports: 'jQuery.fn.scroll'
        }
      }

    七、require.js插件

    require.js还提供一系列插件,实现一些特定的功能。
    domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

      require(['domready!'], function (doc){
        // called once the DOM is ready
      });

    text和image插件,则是允许require.js加载文本和图片文件。

      define([
        'text!review.txt',
        'image!cat.jpg'
        ],
    
        function(review,cat){
          console.log(review);
          document.body.appendChild(cat);
        }
      );

    类似的插件还有json和mdown,用于加载json文件和markdown文件

  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/simpro/p/4933485.html
Copyright © 2011-2022 走看看