模块规范(module)
Ruby 的 require
、Python 的 import
、 CSS 有 @import
。
CommonJS规范
Node 应用由模块组成,采用 CommonJS 模块规范。
每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
如果想在多个文件分享变量,必须定义为global对象的属性。
global.warning = true;
CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
require 模块
node 遵循 CommonJS 规范,requirejs 遵循 AMD ,seajs 遵循 CMD ,虽各有不同,但风格统一。
// -------- node -----------
module.exports = {
a : function() {},
b : 'xxx'
};
// ----------- AMD or CMD ----------------
define(function(require, exports, module){
module.exports = {
a : function() {},
b : 'xxx'
};
});
//引入
// ------------ node ---------
var m = require('./a');
m.a();
// ------------ AMD or CMD -------------
define(function(require, exports, module){
var m = require('./a');
m.a();
});
ES6 模块
在 export 之后,还可以被修改
//导出 a.js
export default function() {}
export function a () {}
var b = 'xxx';
export {b}; // 这是ES6的写法,实际上就是{b:b}
//引入
import $ from 'jquery';
import * as _ from '_';
import {a,b,c} from './a';
import {default as alias, a as a_a, b, c} from './a';
暴露模块使用 module.exports 和 exports.
加载模块使用 require().
AMD规范(Asynchronous Module Definition)
浏览器端的模块,不能采用”同步加载”(synchronous),只能采用”异步加载”(asynchronous)
AMD 采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
define(id?, dependencies?, factory)
ES6 的模块自动采用严格模式
,不管你有没有在模块头部加上"use strict"
-
export 命令