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执行
原文地址:https://www.cnblogs.com/princeness/p/11664938.html