你帶着你的同事聯調的時候
????
前端
從古至今,Javascript都沒有自帶的模塊體系,能作的,也就只是將不一樣做用的代碼寫在不一樣的JS文件中,而後經過<script>
分別引入。這樣作又一個很是致命的問題,那就是咱們要定位一個方法變得很是的困難。jquery
一個靈活的模塊體系,能讓你的代碼之間的依賴關係更加直觀,一個好的模塊式的寫法讓沒個方法都能很快的找到聲明位置所在。前端框架
在NODE中是有這種寫法的,咱們稱爲CMD
語法,就是經過require
關鍵詞,引入所要依賴的文件。框架
固然,隨着前端在WEB開發中佔據的比重愈來愈高,客戶端JS的模塊化也尤其重要。其實已經有比較成熟的前端框架來實現這個功能,好比RequireJs
和Seajs
。ES6的出現,讓JS實現模塊功能變得更�加簡單。模塊化
//requirejs的語法 define(['moudleA'], function(){ function foo(){ doSomething(); } return { foo : foo }; }); //seajs的用法 // 全部模塊都經過 define 來定義 define(function(require, exports, module) { // 經過 require 引入依賴 var $ = require('jquery'); var Spinning = require('./spinning'); // 經過 exports 對外提供接口 exports.doSomething = ... // 或者經過 module.exports 提供整個接口 module.exports = ... });
ES6的模塊功能主要經過兩個關鍵字來實現export
和import
。requirejs
從字面上不難看出,export
是輸出,即用來將模塊內部的方法暴露出來,而import
是輸入,即引入其餘模塊的方法,便於在本模塊中調用其餘模塊的方法。ui
正常來說,咱們能夠將每一個模塊都寫成一個獨立的文件,因爲Javascript
做用域的問題,每一個模塊內部的變量及方法都是私有的,即只能內部訪問,外部沒法訪問。要想使模塊內部的方法能夠從外部訪問,就必須使用export
關鍵字。spa
//moduleA.js var moduleA1 = "a"; var moduleA2 = "aa"; function moduleFunc(){ console.log(moduleA2); } export { moduleA1, moduleA2 as moduleA, moduleFunc as module };
如上面的代碼所示,在模塊中聲明瞭變量和方法,咱們只須要將變量名或者方法名,置於export
的做用下,就能夠被其餘模塊使用。code
as
關鍵詞能夠用來重命名,上面的例子中moduleA
就等於moduleA2
。接口
這裏須要注意的是,export
定義的是對外的接口,接口必須在模塊內部被聲明或實現過,否則就會報錯。
var a = 1; export a;//不報錯 export b;//報錯
使用export
定義了模塊的接口以後,其餘模塊就能夠經過import
命令來引入這個模塊
//moduleB.js import {moduleA1, moduleA} from './moduleA.js'; import {module as moduleFunc} from './moduleA.js'; moduleFunc();
如上面的代碼所示,經過import
關鍵字從moduleA.js
中引入了moduleA1
、moduleA2
、moduleFunc()
三個變量,這樣在這個模塊中就能使用A模塊中的變量了。
須要注意的是,import
關鍵字有提高效果,也就是不管寫在哪一個位置,都和寫在模塊頂部效果同樣。import
加載模塊的過程是在編譯階段執行的,代碼運行以前就已經完成了加載過程。
若是咱們須要引入一個模塊中的全部變量,能夠用下面的方法
//moduleC.js import * as module from './moduleA.js'; module.moduleA;//"a" module.moduleFunc();//"aa"
另外,import
加載的文件是不會重複加載的
//moduleD.js import {moduleA1} from './moduleA.js'; import {moduleA2} from './moduleA.js'; //等同於 import {moduleA1, moduleA2} from './moduleA.js';
moduleA.js
只會加載一次。
export default
是用來聲明模塊的默認接口的。
//hello.js var name = "dahan"; function sayHello(){ console.log("Hello"); } export default sayHello; //person.js import hello from './hello.js'; hello(); //"Hello"
使用export default
聲明的接口,引入的時候不須要使用大括號,也不用指定特定的變量名。