- js前期是没有模块化的概念,会造成变量冲突
- 解决方法(立即执行函数)
;var space = (function(w) {
let name = 'caoyang'
// 方式一
return {
name,
}
// 方式二
w.name = name
})(window);
通过一系列的方式,前端并没有找到合适的方式去解决上面的问题,但是这个 nodejs 诞生。
nodejs 借鉴别的的语言的模块化的规范,形成一个自己的模块化规范, 叫做同步加载规范(commonjs规范):好比加载一个模块的时候,只有模块加载完毕后,后面的代码才执行。(commonjs 规范:如果是在服务器端是没有任何问题,服务器代码和模块都是在一个磁盘文件)
前端发现 commonjs 规范,很好,想拿来直接用。 问题:前端和后端进行交互是通过网络请求(延时)如果前端加载某个模块需要很长的时间,用户体验不好。
前端把 commonjs 规范进行革新,中国淘宝(玉伯,射雕)对其做了优化,形成一个新的规范 CMD 规范(基于这个规范,写一个库 sea.js)
国外大牛基于 commonjs 规范,做一个 AMD规范(异步加载规范 require.js 库)
上面的这些规范都不是 官方的规范(ECMA),都是民间组织自己弄出来。 官方借鉴这些规范,形成一个自己的规范 es6 module(es6 模块化)
commonjs
- 在 Node 中,默认在代码最后有一句
return module.exports
- exports是module.exports的 一个引用
- 给 exports 赋值会断开和 module.exports 之间的引用, 同理,给 module.exports 重新赋值也会断开
示例代码:
math.js
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
increment.js
var add = require('math').add;
exports.increment = function(val) {
return add(val, 1);
};
program.js
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
es6 module
a.js
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
b.js
import { square, sqrt } from 'a.js';
console.log(square(11)); // 121
默认导出
myFunc.js
export default function () { ... };
main1.js
import myFunc from 'myFunc';
myFunc();