1. 程式人生 > >前端模組化(CommonJs,AMD和CMD)

前端模組化(CommonJs,AMD和CMD)

前端模組規範有三種:CommonJs,AMD和CMD。
CommonJs用在伺服器端,AMD和CMD用在瀏覽器環境
AMD 是 RequireJS 在推廣過程中對模組定義的規範化產出。
CMD 是 SeaJS 在推廣過程中對模組定義的規範化產出。
AMD:提前執行(非同步載入:依賴先執行)+延遲執行
CMD:延遲執行(執行到需載入,根據順序執行)

模組

  • 函式寫法
  function f1(){
    //...
  }
  function f2(){
    //...
  }

模組就是實現特定功能的檔案,把幾個函式放在一個檔案裡就構成了一個模組。需要的時候載入這個檔案,呼叫其中的函式即可。
但這樣做會汙染全域性變數,無法保證不與其他模組發生變數名衝突,而且模組成員之間沒什麼關係。

  • 物件寫法
      var module = {
    star : 0,
    f1 : function (){
      //...
    },
    f2 : function (){
      //...
    }
  };
      module.f1();
      module.star = 1;

模組寫成一個物件,模組成員都封裝在物件裡,通過呼叫物件屬性,訪問使用模組成員。但同時也暴露了模組成員,外部可以修改模組內部狀態。

  • 立即執行函式
      var module = (function(){
    var star = 0;
    var f1 = function
()
{       console.log('ok');     };     var f2 = function (){       //...     }; return { f1:f1, f2:f2 };   })(); module.f1(); //ok console.log(module.star) //undefined

外部無法訪問內部私有變數

CommonJs

CommonJS是伺服器端模組的規範,由Node推廣使用。由於服務端程式設計的複雜性,如果沒有模組很難與作業系統及其他應用程式互動。使用方法如下:

math.js
exports.add = function() {
    var sum = 0, i = 0, args = arguments, l = args.length;
    while (i < l) {
      sum += args[i++];
    }
    return sum;
};

increment.js
var add = require('math').add;
exports.increment = function(val) {
    return add(val, 1);
};

index.js
var increment = require('increment').increment;
var a = increment(1); //2

根據CommonJS規範:

  • 一個單獨的檔案就是一個模組。每一個模組都是一個單獨的作用域,也就是說,在該模組內部定義的變數,無法被其他模組讀取,除非定義為global物件的屬性。

  • 輸出模組變數的最好方法是使用module.exports物件。

  • 載入模組使用require方法,該方法讀取一個檔案並執行,返回檔案內部的module.exports物件

仔細看上面的程式碼,您會注意到 require 是同步的。模組系統需要同步讀取模組檔案內容,並編譯執行以得到模組介面。
然而, 這在瀏覽器端問題多多。

瀏覽器端,載入 JavaScript 最佳、最容易的方式是在 document 中插入<script>標籤。但指令碼標籤天生非同步,傳統 CommonJS 模組在瀏覽器環境中無法正常載入。

解決思路之一是,開發一個伺服器端元件,對模組程式碼作靜態分析,將模組與它的依賴列表一起返回給瀏覽器端。 這很好使,但需要伺服器安裝額外的元件,並因此要調整一系列底層架構。

另一種解決思路是,用一套標準模板來封裝模組定義:

define(function(require, exports, module) {

  // The module code goes here

});

這套模板程式碼為模組載入器提供了機會,使其能在模組程式碼執行之前,對模組程式碼進行靜態分析,並動態生成依賴列表。

math.js
define(function(require, exports, module) {
  exports.add = function() {
    var sum = 0, i = 0, args = arguments, l = args.length;
    while (i < l) {
      sum += args[i++];
    }
    return sum;
  };
});

increment.js
define(function(require, exports, module) {
  var add = require('math').add;
  exports.increment = function(val) {
    return add(val, 1);
  };
});

index.js
define(function(require, exports, module) {
  var inc = require('increment').increment;
  inc(1); // 2
});

AMD

AMD是"Asynchronous Module Definition"的縮寫,意思就是"非同步模組定義"。由於不是JavaScript原生支援,使用AMD規範進行頁面開發需要用到對應的庫函式,也就是大名鼎鼎RequireJS,實際上AMD 是 RequireJS 在推廣過程中對模組定義的規範化的產出

它採用非同步方式載入模組,模組的載入不影響它後面語句的執行。所有依賴這個模組的語句,都定義在一個回撥函式中,等到載入完成之後,這個回撥函式才會執行。

RequireJS主要解決兩個問題

  • 多個js檔案可能有依賴關係,被依賴的檔案需要早於依賴它的檔案載入到瀏覽器
  • js載入的時候瀏覽器會停止頁面渲染,載入檔案越多,頁面失去響應時間越長

RequireJs也採用require()語句載入模組,但是不同於CommonJS,它要求兩個引數:

第一個引數[module],是一個數組,裡面的成員就是要載入的模組;第二個引數callback,則是載入成功之後的回撥函式。math.add()與math模組載入不是同步的,瀏覽器不會發生假死。

require([module], callback);

require([increment'], function (increment) {
    increment.add(1);
});
define()函式

RequireJS定義了一個函式 define,它是全域性變數,用來定義模組:
define(id?, dependencies?, factory);
引數說明:

  • id:指定義中模組的名字,可選;如果沒有提供該引數,模組的名字應該預設為模組載入器請求的指定指令碼的名字。如果提供了該引數,模組名必須是“頂級”的和絕對的(不允許相對名字)。

  • 依賴dependencies:是一個當前模組依賴的,已被模組定義的模組標識的陣列字面量。
    依賴引數是可選的,如果忽略此引數,它應該預設為["require", "exports", "module"]。然而,如果工廠方法的長度屬性小於3,載入器會選擇以函式的長度屬性指定的引數個數呼叫工廠方法。

  • 工廠方法factory,模組初始化要執行的函式或物件。如果為函式,它應該只被執行一次。如果是物件,此物件應該為模組的輸出值。

來舉個

相關推薦

前端模組CommonJs,AMDCMD

前端模組規範有三種:CommonJs,AMD和CMD。CommonJs用在伺服器端,AMD和CMD用在瀏覽器環境AMD 是 RequireJS 在推廣過程中對模組定義的規範化產出。CMD 是 SeaJS 在推廣過程中對模組定義的規範化產出。AMD:提前執行(非同步載入:依賴先執行)+延遲執行CMD:延遲執行(

前端模塊CommonJs,AMDCMD

pan path 我們 指定 exports 意思 ... IT 依賴 前端模塊規範有三種:CommonJs,AMD和CMD。 CommonJs用在服務器端,AMD和CMD用在瀏覽器環境 AMD 是 RequireJS 在推廣過程中對模塊定義的規範化產出。 CMD

模組開發,AMDCMDCommonjs規範

angular、vue、react三大框架模組管理遵循的規範 webpack打包成一個檔案,一次都載入完,需要哪個就去執行哪個。不像傳統的頁面,引入很多檔案,要一個個按順序載入。 生成的都是閉包,變數隔離,並能避免汙染作用域。 vue,angularx,r

前端模組nodeJS中的CommonJS規範

序言 模組化,大家用vue,react等東西,都會接觸到像exports,module.exports,export,export default,require,define,import等等欄位,感覺很多人對於這些東西還是分不清,概念非常的模糊,便想著寫這麼一篇文章,一

CommonJs,AMDCMD資料

前端模組規範有三種:CommonJs,AMD和CMD CommonJs用在伺服器端,AMD和CMD用在瀏覽器環境。 AMD 是 RequireJS 在推廣過程中對模組定義的規範化產出。提前執行(非同步載入:依賴先執行)+延遲執行 CMD 是 SeaJS 在推廣過程中對模組定義的規範化產出。

前端模組兩兄弟——requireJSseaJS

寫在前面 之前沒學過nodeJS,底子不好,對AMD和CMD的實現沒法理解,現在nodeJS也算是步入門檻,再回過身好好研究一下這個“模組化載入器”。http://jafeney.com/2016/01/10/2016-01-10-module/ SeaJS與Requ

三:深入理解Nginx的模組 結合原始碼詳解

盜用前面用到的流程圖 第二步實際上是呼叫 ngx_add_inherited_sockets() //檔名: Nginx.c int ngx_cdecl main(int argc,

前端模組(AMDCMDCommonJs)

知識點1:AMD/CMD/CommonJs是JS模組化開發的標準,目前對應的實現是RequireJs/SeaJs/nodeJs. 知識點2:CommonJs主要針對服務端,AMD/CMD主要針對瀏覽器端,所以最容易混淆的是AMD/CMD。(順便提一下,針對伺服器端和針對瀏覽器端有什麼本質的區別呢?伺服器端一

前端模組——徹底搞懂AMDCMD、ESMCommonJS

我們知道,在NodeJS之前,由於沒有過於複雜的開發場景,前端是不存在模組化的,後端才有模組化。NodeJS誕生之後,它使用CommonJS的模組化規範。從此,js模組化開始快速發展。 模組化的開發方式可以提供程式碼複用率,方便進行程式碼的管理。通常來說,一個檔案就是一個模組,有自己的作用域,只向外暴露特定的

前端模塊的一些理解-commonJsAMDCMD

() urn fig comm tor 實現 ports ont 相對 ---恢復內容開始--- 前端模塊化規範有三種:CommonJs\AMD\CMD CommonJs 用於服務器端 AMD 用於瀏覽器環境,是RequireJS在推廣過程中對模塊定義的規範化產出

前端模塊(AMDCMDCommonJs)

瀏覽器 預加載 執行順序 處理 大坑 不一定 同步 區別 seajs 知識點1:AMD/CMD/CommonJs是JS模塊化開發的標準,目前對應的實現是RequireJs/SeaJs/nodeJs. 知識點2:CommonJs主要針對服務端,AMD/CMD主要針對瀏覽器端,

前端模組AMDCMD的區別總結

AMD和CMD都是瀏覽器端的js模組規範,2者的區別總結如下: 1、AMD推崇依賴前置,CMD推崇就近依賴 //AMD: m

前端模組開發規範之AMD可不是處理器哦!

首先強調下,我們這裡提到的AMD可不是計算機的處理器哦! 繼CommonJS之後,雙出現了一種非同步載入模組的方法。就是AMD,全稱為:Asynchronous module definition。 它的使用方法依然很簡單。 定義一個模組: define('user', ['

再談 JS中的模組規範CommonJSAMDCMD來自玉伯的seajs分析

                隨著網際網路的飛速發展,前端開發越來越複雜。本文將從實際專案中遇到的問題出發,講述模組化能解決哪些問題,以及如何使用 Sea.js 進行前端的模組化開發。惱人的命名衝突我們從一個簡單的習慣出發。我做專案時,常常會將一些通用的、底層的功能抽象出來,獨立成一個個函式,比如funct

前端模組AMDCMD原理(附原始碼)

1. 前言 可能現在初入前端的同學們,都直接就上手webpack了,而在幾年前,沒有現在這些豐富的工具,還是jquery打天下的時候,不借助node或程式卻讓不同js檔案之間互相引用、模組化開發,確實是一件痛苦的事情。。。 接下來會介紹兩個有名的工具AMD(require.js)和CMD(sea.js),

JS模組規範:AMD/CMD/CommonJS

一、模組化規範的由來 隨著網頁的複雜化,javascript程式碼也相應變得龐大起來,程式碼之間的分工合作就尤為重要了,這時候有了模組,我們就可以只關注自己業務的核心邏輯,其他想要實現的功能直接載入他人的模組便足夠了。考慮到模組的統一,便有了模組規範化。接下來

前端面試題----前端模組元件的區別聯絡

前端元件化開發和模組化開發的區別 之前一直以為模組化開發和元件化開發是一個意思,有次看到了類似這樣的題,發現自己還是太年輕,現在整理一點出來。 首先,元件化和模組化的意義都在於實現了分治,目前我們開發的專案複雜度不斷的上升,早已不是我們一個人能完成的工作,團

前端模組AMDCMD的區別

最近在研究cmd和amd,在網上看到一篇不錯的文章,整理下看看。 在JavaScript發展初期就是為了實現簡單的頁面互動邏輯,寥寥數語即可;如今CPU、瀏覽器效能得到了極大的提升,很多頁面邏輯遷移到了客戶端(表單驗證等),隨著web2.0時代的到來,Ajax

前端模塊 CommonJS AMD ES6 CMD

date 分享圖片 image require 別名 fill app this com 不使用模模塊化的情況 util.js(基礎函數庫) getFormatDate 函數 a-util.js(業務基礎函數庫) aGetFormatDate 函數 使用getFor

前端模組IIFE,commonjsAMD,UMD,ES6 Module規範超詳細講解

[TOC] ## 為什麼前端需要模組化 在沒有模組化的時候,多個指令碼引入頁面,會造成諸多問題,比如: - 多人協同開發的時候,系統中可能會引入很多js指令碼,這些js會定義諸多全域性變數,這時候很容易出現變數名覆蓋的問題 ```html