美文网首页
Web38.AMD&CMD&RequireJS

Web38.AMD&CMD&RequireJS

作者: FiredEarthMusic | 来源:发表于2017-11-05 10:49 被阅读6次

    模块化

    最主要的目的:
    1:解决命名冲突
    2:依赖管理

    其他价值
    提高代码可读性
    代码解耦,提高复用性

    参考:https://github.com/seajs/seajs/issues/547
    http://javascript.ruanyifeng.com/nodejs/module.html
    http://requirejs.org/

    目前通用的js规范有 CommonJS 和 AMD

    <script src="./require.js" data-main="main"></script>
    //data-main必须和require.js写在同一行
    
    //CommonJS例子(Node端运行)
    
    //a.js
    var people = {
        name: 'ruoyu',
        sayName: function(){
            console.log(this.name);
        }
    }
    module.exports = people;
    
    //b.js
    var p = require('./a');
    p.sayName();
    
    //浏览器端的问题
    
    仔细看上面的代码,会发现require是同步的。模块系统需要同步读取模块文件内容,并编译执行以得到模块接口。
    浏览器端,加载JavaScript最佳、最容易的方式是在document中插入script 标签。但脚本标签天生异步,传统CommonJS模块在浏览器环境中无法正常加载。
    
    解决思路之一是,开发一个服务器端组件,对模块代码作静态分析,将模块与它的依赖列表一起返回给浏览器端。 这很好使,但需要服务器安装额外的组件,并因此要调整一系列底层架构。
    
    另一种解决思路是,用一套标准模板来封装模块定义,但是对于模块应该怎么定义和怎么加载,又产生的分歧:
    

    题目1: 为什么要使用模块化?

    1.解决命名冲突
    2.依赖管理
    3.提高代码可读性
    4.代码解耦,提高代码复用性

    题目2: CMD、AMD、CommonJS 规范分别指什么?有哪些应用

    AMD 异步模块定义  在浏览器端模块化开发的规范
    AMD是RequireJS在推广过程中对模块定义的规范化的产出
    
    requireJS主要解决两个问题:
    1.多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
    2.js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长
    
    //比如定义一个index.js
    
    //AMD
    require( ['carousel', 'tab', 'lazy'], function(Carousel, Tab, lazy) {
        new Carousel();
        Tab.init();
        Lazy.init();
    })
    
    //CommonJS
    var carousel = require();
    new carousel('.ct');
    var tab = require('./tab')
    tab.init();
    var lazy = require('./lazy')
    lazy.init('', function(){
    
    })
    //具体加载时机由支持该语法的框架决定
    
    CMD 通用模块定义  seajs
    
    
    //CommonJS规范   Node采用CommonJS模块规范
    
    //每个文件就是一个模块,有自己的作用域,在一个
    //文件里面定义的变量 函数 类 都是私有的,对其他文件不可见
    //CommonJS模块的特点如下:
    //所有代码都运行在模块作用域,不会污染全局作用域。
    //模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
    //模块加载的顺序,按照其在代码中出现的顺序。
    
    //example.js
    var x = 5;
    var addX = function (value) {
        return value + x;
    };
    //变量 x和函数addX,是当前文件example.js私有的,其他文件
    //不可见
    //如果想在多个文件分享变量,必须定义为global对象的属性
    global.warning = true;
    
    
    //CommonJS规定,每个模块内部,module变量代表当前模块。
    //这个变量是一个对象,它的exports属性(即module.exports)
    //是对外的接口。加载某个模块,其实是加载该模块的
    //module.exports属性
    var x = 5;
    var addX = function (value) {
        return value + x;
    };
    module.exports.x = x;
    module.exports.addX = addX;
    
    //通过module.exports输出变量x和函数addX
    
    
    //require方法用于加载模块
    
    var example = require('./example.js')
    console.log(example.x) //5
    console.log(example.addX(1)) //6
    

    题目3: 使用 requirejs 完善入门任务15,包括如下功能:

    7777.png

    https://firedearthmusic.github.io/requirejs-demo/src/index.html

    相关文章

      网友评论

          本文标题:Web38.AMD&CMD&RequireJS

          本文链接:https://www.haomeiwen.com/subject/yutapxtx.html