• JS----模块化


    ES6:export /import /export default
    AMD:require / export / define
    CMD:require / require.async / exports / module.exports / define
    common.js: require / exports / module.exports

    1.Node.js webpack都是common.js模块化规范的实现
    2.AMD是require.js模块化推广的规范(预执行)
    AMD规范只定义了一个函数“define” define(id, dependencies,factory)
    3.CMD是sea.js模块化推广的规范(懒执行)
    define(factory) define(function(require,exports,module))
    4.ES6
    import/ export/export default
    common.js与ES6的区别
    前者是动态的同步导入,后者是异步导入;
    前者是导出时值拷贝,后者是实时绑定;

    sea.js
    快速简要知识点:
    
    1,seajs.config({...});   //用来对 Sea.js 进行配置。
    2,seajs.use(['a','b'],function(a,b){...});   //用来在页面中加载一个或多个模块。
    3,define(function(require, exports, module){...});   //用来定义模块。Sea.js 推崇一个模块一个文件,遵循统一的写法:
    4,require(function(require){var a = require("xModule"); ... });   //require 用来获取指定模块的接口。
    5,require.async,  //用来在模块内部异步加载一个或多个模块。 例如:
    define(function(require){
        require.async(['aModule','bModule'],function(a,b){  // 异步加载多个模块,在加载完成时,执行回调
        a.func();
        b.func();
        })    
    });
    6,exports, //用来在模块内部对外提供接口。 例如:
    define(function(require, exports){
        exports.varName01 = 'varValue';  // 对外提供 varName01 属性    
        exports.funName01 = function(p1,p2){  // 对外提供 funName01 方法
        ....
        }       
    });
    7,module.exports, 与 exports 类似,用来在模块内部对外提供接口。例如:
    define(function(require, exports, module) {  
      module.exports = {  // 对外提供接口
        name: 'a',
        doSomething: function() {...};
      };
    });
    参考学习:https://blog.csdn.net/shenzhennba/article/details/51661544
    

    参考学习:https://www.jianshu.com/p/3832c00a44a7
    1.模块化开发怎么做

    1.立即执行函数,不暴露私有成员
    2.通过函数作用域解决了命名冲突、污染全局作用域的问题

      var module1 = (function(){
            var _count = 0;
            var m1 = function(){
              //...
            };
            var m2 = function(){
              //...
            };
            return {
              m1 : m1,
              m2 : m2
            };
        })();
    

    2.模块化可以给我们带来以下好处

    解决命名冲突
    提供复用性
    提高代码可维护性

    Es6的模块化·
    在有 Babel 的情况下,我们可以直接使用 ES6的模块化
    // file a.js
    export function a() {}
    export function b() {}
    // file b.js
    export default function() {}

    import {a, b} from './a.js'
    import XXX from './b.js'
    

    CommonJS
    CommonJs 是 Node 独有的规范,浏览器中使用就需要用到 Browserify解析了。

    // a.js
    module.exports = {
        a: 1
    }
    // or
    exports.a = 1
    
    // b.js
    var module = require('./a.js')
    module.a // -> log 1
    
    在上述代码中,module.exports 和 exports 很容易混淆,让我们来看看大致内部实现
    
    var module = require('./a.js')
    module.a
    // 这里其实就是包装了一层立即执行函数,这样就不会污染全局变量了,
    // 重要的是 module 这里,module 是 Node 独有的一个变量
    module.exports = {
        a: 1
    }
    // 基本实现
    var module = {
      exports: {} // exports 就是个空对象
    }
    // 这个是为什么 exports 和 module.exports 用法相似的原因
    var exports = module.exports
    var load = function (module) {
        // 导出的东西
        var a = 1
        module.exports = a
        return module.exports
    };
    

    再来说说 module.exports 和exports,用法其实是相似的,但是不能对 exports 直接赋值,不会有任何效果。

    3.对于 CommonJS 和 ES6 中的模块化的两者区别是:
    前者支持动态导入,也就是 require(${path}/xx.js),后者目前不支持,但是已有提案,前者是同步导入,因为用于服务端,文件都在本地,同步导入即使卡住主线程影响也不大。
    而后者是异步导入,因为用于浏览器,需要下载文件,如果也采用同步导入会对渲染有很大影响
    前者在导出时都是值拷贝,就算导出的值变了,导入的值也不会改变,所以如果想更新值,必须重新导入一次。
    但是后者采用实时绑定的方式,导入导出的值都指向同一个内存地址,所以导入值会跟随导出值变化
    后者会编译成 require/exports 来执行的

    commonJS 动态导入,同步导入,导出时都是值拷贝,导出值变,导入值不变。
    ES6 异步导入 实时绑定    导入值会随导出值变化  会编译成require/exports执行
    

    AMD 和 CMD
    鉴于目前这两种实现方式已经很少见到,所以不再对具体特性细聊,只需要了解这两者是如何使用的。

    // AMD
    define(['./a', './b'], function(a, b) {
      // 加载模块完毕可以使用
      a.do()
      b.do()
    })
    // CMD
    define(function(require, exports, module) {
      // 加载模块
      // 可以把 require 写在函数体的任意地方实现延迟加载
      var a = require('./a')
      a.doSomething()
    })
    

    AMD,CMD,CommonJs,ES6 Module:解决原始无模块化的痛点

    1.AMD:requirejs 在推广过程中对模块定义的规范化产出,提前执行,推崇依赖前置
    2.CMD:seajs 在推广过程中对模块定义的规范化产出,延迟执行,推崇依赖就近 3.CommonJs:模块输出的是一个值的copy,运行时加载,加载的是一个对象(module.exports 属性),该对象只有在脚本运行完才会生成
    4.ES6 Module:模块输出的是一个值的引用,编译时输出接口,ES6模块不是对象,它对外接口只是一种静态定义,在代码静态解析阶段就会生成。

    es6: import / export/ export default
    commonjs: require / module.exports / exports
    amd: require / defined
    

    谈谈你对AMD、CMD的理解
    CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
    AMD规范则是非同步加载模块,允许指定回调函数
    AMD推荐的风格通过返回一个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的

    es6模块 CommonJS、AMD、CMD
    CommonJS 的规范中,每个 JavaScript 文件就是一个独立的模块上下文(module context),在这个上下文中默认创建的属性都是私有的。也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。
    CommonJS是同步加载模块,在浏览器中会出现堵塞情况,所以不适用
    AMD 异步,需要定义回调define方式
    es6 一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量 es6还可以导出类、方法,自动适用严格模式

    参考学习:https://blog.csdn.net/fen747042796/article/details/70840089
    http://www.cnblogs.com/lvdabao/p/js-modules-develop.html
    https://www.cnblogs.com/zhongjiang/p/6554514.html

    在这里插入图片描述

    CommonJS是服务器端模块的规范,AMD CMD是浏览器端模块化的规范, ES6提供通用的模块化规范。

    简要区别:

    CommonJS: require / module.exports / exports

    动态导入,同步导入,只有加载完成,才能执行后面的操作,导出时都是值拷贝,
    导出值变,导入值不变。
    

    =============================================

       RequireJS:AMD: require / export/define 
        SeaJS:CMD: require, require.async, exports, module.exports define, 
        AMD:提前执行(异步加载:依赖先执行)+延迟执行
        CMD:延迟执行(运行到需加载,根据顺序执行)
        Sea.JS对模块的态度是懒执行, 而RequireJS对模块的态度是预执行
    

    ===========================================

    es6: import / export/ export default
    export和export default的区别就是:前者导出的东西需要在导入的时候加{},而后者则不需要
    ES6 异步导入,实时绑定 ,导入值会随导出值变化  会编译成require/exports执行
    
  • 相关阅读:
    CC_UNUSED_PARAM 宏含义的解释
    JAVA 字符串编码总结
    cocos-html5 Json 灵活 遍历方式 不同方式的缺陷,优点总结
    selenium--获取HTML源码断言和URL地址
    django -- 路由
    selenium--表格和复选框的定位
    selenium--加载浏览器配置
    django -- 视图
    django -- 母版继承
    selenium--浏览器窗口截图
  • 原文地址:https://www.cnblogs.com/princeness/p/11664938.html
Copyright © 2020-2023  润新知