• 初识requirejs


    一、为什么要使用require.js?

    1、在大型项目中,往往一个页面需要加载很多个js文件,而页面加载的时候,浏览器会停止网页渲染,因此加载文件越多,导致网页失去响应的时间就会越长;

    2、其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。

    所以,在开发大型Javascript应用程序的时候,就必须引入模块化机制。关于前端模块化的前世今生,可以参考此博客:https://www.cnblogs.com/scq000/p/10647128.html

    二、require.js能干什么?

    1、RequireJS是遵循AMD规范的模块化工具, 在导入模块的时候,会先加载对应的依赖模块,然后再执行接下来的代码,同时AMD模块可以并行加载所有依赖模块,防止js加载阻塞页面渲染,从而很好地提高页面加载性能:

    2、管理模块之间的依赖性,便于代码的编写和维护。

    RequireJS的基本思想是,通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。

    三、require.js的加载:

    <script src="js/require.js"></script>

    引用js的过程,为了避免网页失去响应,我们可以将代码卸载网页底部进行加载,也可以采用异步加载,设定async属性。IE不支持这个属性,只支持defer,所以把defer也写上。

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

    加载require.js以后,下一步就要加载我们自己的代码了。假定我们的代码文件时main.js,且与requireJS放置在相同的路径js文件夹下,可以写成下面这样:

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

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

    四、主模块的写法

    (一)主模块中依赖的加载

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

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

    比如,假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写:

    require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    
    // some code here
    
    });

    require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。

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

    // 如果不依赖其他模块,可以直接在主模块中写js代码
    
    // alert("加载成功!");
    
    // 真正常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。
    
    require.config({
    
        // 假如要加载的模块与主模块不在一个文件夹,可以改变基目录baseUrl为要加载的模块目录
        // baseURL:"",
    
        paths:{
            "jquery":"jquery-3.2.1.js",
        }
    
    })

    (二)模块的定义与加载

    1、define()函数

    require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。

    其中,模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。

    关于define函数的详解,可以参考此博客:https://www.cnblogs.com/minghui007/p/7127762.html

    假定现在有一个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()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

    //math.js
    define(['jquery'], function($) { 'use strict'; var add = function (x,y){ return x+y; }; return{ add: add }; });

     

  • 相关阅读:
    js第四天
    js第三天
    js第二天
    面试题集锦;有关作用域和this的指向
    JS高级:事件冒泡和事件捕获;
    关于函数的解析;
    BOM浏览器对象模型;
    关于js动画简单理解;
    关于document的节点;用Dom2创建节点;
    js操作Css样式
  • 原文地址:https://www.cnblogs.com/chengl062/p/11542408.html
Copyright © 2020-2023  润新知