什麼是模塊化?javascript
模塊化就是把系統分離成獨立功能個方法,須要什麼功能,就加載什麼功能;html
優勢:java
解決傳統編碼過程當中的命名衝突和文件依賴的問題;編程
提升代碼的可維護性,可複用性以及提升生產效率。數組
common.js主要用於服務器端;瀏覽器
common.js加載模塊是同步的,也就是說,加載完成以後執行後面的操做;服務器
commonJs使用基於文件的模塊,因此一每一個文件只能定義一個模塊;異步
Node.js主要用於服務端編程,模塊都是存儲在本地的硬盤中加載比較快,因此Node.js採用的是common.js的規範;模塊化
common.js規範分爲三個部分:函數
module(模塊標識):module變量在每一個模塊的內部,就表明當前模塊
require(模塊引用):require()用來加載外部模塊,讀取並執行js文件,返回該模塊的exports對象;
exports(模塊輸出):exports是對外的接口,用於導出當前模塊的變量和方法;
// aModule.js const $ = require("jQuery"); // 用於其餘的模塊 let count = 1; const numClick = function(){ alert(++count) } module.exports = { // 使用module.exports 定義模塊公共接口 countClick:function(){ $(document).on("click",numClick ) } } //使用咱們寫的module const aModule = require("aModule"); //引入模塊 aModule.countClick(); //使用定義的公共接口
咱們須要注意的是:雖然咱們的在aModule.js中定義的 "全局變量" $ , count, numClick;在咱們的標準js文件中會生成全局變量,可是在Commonjs中它的做用域只存在於當前的模塊;
AMD就是異步模塊定義。它採用異步的方法加載模塊,經過define方法去定義模塊,require方法去加載模塊 ;
AMD模塊定義
若是這個模塊還依賴於其餘模塊,那麼define函數的第一個參數,必須是一個數組,指明該模塊的依賴;
define(["tool"],function(){
// 模塊邏輯
}}))
// AMD模塊的加載 require(['modules'],callback);
// 第一個參數 ['modules'] ,是一個數組,裏面的成員就是要加載的模塊;
// 第二個參數 callback ,則是加載成功以後的回調函數。
require異步加載模塊,瀏覽器在加載過程當中不會失去響應;指定的回調函數,只有在前面的模塊加載成功後,纔會去執行,解決了依賴性的問題。
// a.js 定義a 模塊 依賴於b模塊 define(["b"],function(){ console.log(b) var hello = function(){ console.log("hello") } return { hello:hello } }) // b.js 定義b模塊 define(function(){ var name = "max"; return { name : name } })
demo.html <script> require.config({ // 配置路徑別名 path : { 'a':'./a', 'b':'./b' } }) require(['a','b'],function(a,b){ // 引入a,b模塊 console.log(a); // {hello:function(){}} console.log(b); // {name:'max'} }) </script>
CMD 即通用模塊定義,CMD規範是國內發展過來的;Sea.js和 require.js解決的問題是同樣的,只不過在模塊的定義方法和加載方法不一樣。
CMD推崇就近依賴,延遲執行。文件時提早加載好的,只有在require的時候纔去執行文件;
在CMD規範中,一個模塊就是一個文件。
require 是能夠把其餘模塊導進來的一個參數;
exports 能夠把模塊內的一些屬性和方法導出;
module是一個對象,上面儲存了與當前模塊相關聯的一下屬性和方法;
define(function(require,exports,module){ // 模塊代碼 })
a.js define(function(require,exports,module){ export.name = "max" })
b.js
define(function(require,exports,module){ var a = require('./a'); export.hello = function(){ console.log("hello") } })
demo.html <script> seajs.config({ alias:{ a:'./a', b:'./b' } }) seajs.use(['a','b'],function(a,b){ console.log(a); console.log(b); }) </script>
export const name = 'hyh'; export function compare(){}; export class Car()
const name = 'hyh'; function compare(){}; class Car() export { name, compare }
export default class Car()
export default class Car(); export const name = "hyh"
const name = "hyh"
export { name as myname }
import car from 'aModule.js'
import { name, compare } from 'aModule.js'
import * as aModule from 'aModule.js'
import {name as myname} from 'aModule.js'
import car,{name,compare} from 'aModule.js'