Node應用由模塊組成,採用CommonJS模塊規範。根據這個規範,每一個文件就是一個模塊,有本身的做用域。在這些文件裏面定義的變量、函數、類,都是私有的,對外不可見,所以規避掉了做用域污染。javascript
根據CommonJS規定,每一個模塊內部,module變量表明當前模塊,這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口。加載某個模塊,其實就是加載該模塊的exports屬性。java
舉例:經過module.exports輸出變量 age 和 sayHelloTo 函數。node
./MyModule.js var age = 7; var sayHelloTo= function (name) { return "hello " + name; }; module.exports.age = age; module.exports.sayHelloTo=sayHelloTo;
var temp = require('./MyModule.js'); //這裏也可使用 import myModule from './MyModule.js' console.log(temp.age); // 7 console.log(temp.sayHelloTo("Steve")); // hello Steve
額外說明:對於自定義的模塊,須要使用相對路徑,不然會提示找不到模塊/組件(默認狀況下,非相對路徑的引用,會從node_modules文件夾中查找)express
爲了方便,node爲每一個模塊提供了一個exports變量,指向module.exports。這等同於在每一個模塊頭部,有這麼一行代碼:promise
var exports = module.exports;
所以,咱們能夠直接在exports對象上添加方法(等同於在 module.exports 添加同樣)函數
./MyModule.js var age = 7; var sayHelloTo= function (name) { return "hello " + name; }; exports.age = age; //等效於: module.exports.age = age; exports.sayHelloTo=sayHelloTo; //等效於: module.exports.sayHelloTo=sayHelloTo;
P.S.不能直接將exports指向一個值,這會切斷 exports 與 module.exports 的聯繫(可是能夠用module.exports來指向一個值)ui
./MyModule.js var age = 7; var sayHelloTo= function (name) { return "hello " + name; }; exports = age; //不要這麼幹。這麼作會切斷exports與module.exports的聯繫
用 export 導出的模塊,須要用 import 來進行導入,而不能用 require。 P.S.:export 命令規定的是對外的接口,必須與模塊內部的變量創建一一對應的關係spa
const utils = { showSth : function(){ console.log("showSth"); }, saySth : function(){ console.log("saySth"); } } //導出的3種方式 export var m = utils; // 方式1,這種方式在引用的時候須要這樣: import {m} from './utils.js'; export {utils}; // 方式2,用大括號來導出變量,若是導出的變量有多個,則{變量1,變量2,變量3...,變量N}。這種方式在引用的時候須要這樣: import {utils} from './utils.js'; export {utils as myUtils}; // 方式3,這種方式在引用的時候須要這樣: import {myUtils} from './utils.js'; 在引用的地方,也能夠直接指定別名,如:import {myUtils as utils} from './utils.js';
export語法: export { name1, name2, …, nameN }; export { variable1 as name1, variable2 as name2, …, nameN }; export let name1, name2, …, nameN; // also var, const export let name1 = …, name2 = …, …, nameN; // also var, const export function FunctionName(){...} export class ClassName {...} export default expression; export default function (…) { … } // also class, function* export default function name1(…) { … } // also class, function* export { name1 as default, … }; export * from …; export { name1, name2, …, nameN } from …; export { import1 as name1, import2 as name2, …, nameN } from …; export { default } from …;
import語法: import defaultExport from "module-name"; import * as name from "module-name"; import { export } from "module-name"; import { export as alias } from "module-name"; import { export1 , export2 } from "module-name"; import { export1 , export2 as alias2 , [...] } from "module-name"; import defaultExport, { export [ , [...] ] } from "module-name"; import defaultExport, * as name from "module-name"; import "module-name"; var promise = import(module-name);
const utils = { showSth : function(){ console.log("showSth"); }, saySth : function(){ console.log("saySth"); } } const name = "my name is Artech"; export {name}; //命名導出 export {utils}; 對於命名方式導出的,在導入的時候必須使用相應對象的相同名稱 引用的時候:import {utils,name as myName} from './utils.js';
如經過 export default 導出 export default utils; 則在使用的時候不用加花括號,且導入時的名字能夠自定義,如: import myUtils from './utils.js'; 對於默認方式導出的,則導入的時候,名稱能夠隨便取 默認導出:不能使用 let,var 或 const 做爲默認導出
將一個js文件中定義的方法,模塊,對象等,所有導出,通常結合別名使用,如:code
myModule.js export const fun1 = ()=>{} export const objInfo = {...};
使用:對象
demo.js:引用myModule.JS import * as myAlias from './myModule'; //fun1()和objInfo都是定義在myModule中的方法和對象 myAlias.fun1(); myAlias.objInfo;