模塊規(guī)范(module)
Ruby 的 require、Python 的 import、 CSS 有 @import。
CommonJS規(guī)范
Node 應(yīng)用由模塊組成,采用 CommonJS 模塊規(guī)范。
每個(gè)文件就是一個(gè)模塊,有自己的作用域。在一個(gè)文件里面定義的變量、函數(shù)、類,都是私有的,對(duì)其他文件不可見(jiàn)。
如果想在多個(gè)文件分享變量,必須定義為global對(duì)象的屬性。
global.warning = true;
CommonJS規(guī)范規(guī)定,每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊。這個(gè)變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口。加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。
require 模塊
node 遵循 CommonJS 規(guī)范,requirejs 遵循 AMD ,seajs 遵循 CMD ,雖各有不同,但風(fēng)格統(tǒng)一。
// -------- 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 之后,還可以被修改
//導(dǎo)出 a.js
export default function() {}
export function a () {}
var b = 'xxx';
export ; // 這是ES6的寫(xiě)法,實(shí)際上就是{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規(guī)范(Asynchronous Module Definition)
瀏覽器端的模塊,不能采用”同步加載”(synchronous),只能采用”異步加載”(asynchronous)
AMD 采用異步方式加載模塊,模塊的加載不影響它后面語(yǔ)句的運(yùn)行。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。
define(id?, dependencies?, factory)
ES6 的模塊自動(dòng)采用嚴(yán)格模式,不管你有沒(méi)有在模塊頭部加上"use strict"
-
export 命令