首頁 > web前端 > js教程 > 手把手教你使用JS給通用模組寫法(程式碼詳解)

手把手教你使用JS給通用模組寫法(程式碼詳解)

奋力向前
發布: 2021-08-26 14:05:23
轉載
2154 人瀏覽過

之前的文章《淺析JavaScript中時間戳運算的方法(附程式碼)》中,給大家了解了js中時間戳運算的方法。下面這篇文章給大家怎麼使用JS給通用模組寫法,我們一起看看怎麼做。

手把手教你使用JS給通用模組寫法(程式碼詳解)

模組化這個問題並非一開始就存在,WWW剛問世的時候,htmlJavaScriptCSSJSCSS都是後來在網景被引進瀏覽器的)都是極為簡單的存在,不需要模組化。

模組化的需求是規模的產物,當web page進化到web application,瀏覽器端處理的邏輯越來越複雜,展現的樣式和動畫越來多,對於工程的要求也越來越高。於是模組化的需求也就產生了。模組化的意義:

  • 元件的複用,降低開發成本與維護成本

  • 元件單獨開發,方便分工合作

  • 模組化遵循標準,方便自動化依賴管理,程式碼最佳化,部署

#JavaScript長久以來被認為是簡單的腳本語言,實際上情況早就發生來變化,在最新版的 ECMA-262(ES6)文件中強調JavaScript是通用程式語言而不是腳本語言。腳本語言,例如shell並不是用來完成複雜功能的,只是用來做一些自動化控制,是不需要模組化的。而用來建構複雜系統通用程式語言(例如Java)一般都有模組的實作。

ES6以前,JS語言沒有模組化,如何讓JS不只執行在瀏覽器,能更有效的管理程式碼, 於是應運而生CommonJS這種規範,定義了三個全域變數:

require,exports,module
登入後複製
  • require用於引入一個模組

  • exports對外暴露模組的接口,可以是任何類型

  • module是這個模組本身的物件

require引入時取得的是這個模組對外暴露的介面(exports

Node.js使用了CommonJS規格:

var foo = require("foo");
var out = foo.sayName();
module.exports = out;
登入後複製

在瀏覽器端,不像Node.js內部支援CommonJS,如何進行模組化,於是出現了CMDAMD兩種方式,其主要代表是seajsrequirejs,他們都定義了一個全域函數define來建立一個模組:

//CMD
define(function (require, exports, module) {
  var foo = require("foo");
  var out = foo.sayName();
  module.exports = out;
});

//AMD
define(["foo"], function (foo) {
  var out = foo.sayName();
  return out;
});
登入後複製

可以看出CMD完整的保留了CommonJS的風格, 而AMD用了更簡潔的依賴注入和函數回傳的方式實作模組化。 兩者除風格不同外最大區別在於加載依賴模組的方式,CMD是懶加載,在require時才會加載依賴, 而AMD是預先加載,在定義模組時就提前加載好所有依賴。

 我們要實作一個模組,讓它既能在seajs(CMD)環境中引入,又能在requirejs(AMD)環境中引入,當然也能在Node.js(CommonJS)中使用,另外還可以在沒有模組化的環境中用script標籤全域引入。

先搞一個模組

var factory = function () {
  var moduleName = {};
  return moduleName;
};
登入後複製

當然return輸出的可以是任何值,對象,類,其他都可以

先滿足 Node.jsES6,我們可以透過全域變數moduleexports來判斷

var factory = function () {
  var moduleName = {};
  return moduleName;
};
if (typeof module !== "undefined" && typeof exports === "object") {
  module.exports = factory;
}
登入後複製

CMD#在 ##和AMD中,我們需要提供一個工廠函數傳入define來定義模組,當沒有上述全域變量,且有define全域變數時,我們認為是AMDCMD,可以直接將factory傳入define

var factory = function () {
  var moduleName = {};
  return moduleName;
};
if (typeof module !== "undefined" && typeof exports === "object") {
  module.exports = factory;
} else if (typeof define === "function" && (define.cmd || define.amd)) {
  define(factory);
}
登入後複製

注意:CMD 其實也支援return 返回模組接口,所以兩者可以通用。

然後還要滿足

script標籤全域引入,我們可以將模組放在window上,為了模組內部在瀏覽器和Node .js中都能使用全域對象,我們可以做此判斷:

var global = typeof window !== "undefined" ? window : global;
登入後複製

我們用一個立刻執行的閉包函數將所有程式碼包含,來避免污染全域空間,並將

global物件傳入閉包函數,最後變成這樣:

(function (global) {
  var factory = function () {
    var moduleName = {};
    return moduleName;
  };
  if (typeof module !== "undefined" && typeof exports === "object") {
    module.exports = factory;
  } else if (typeof define === "function" && (define.cmd || define.amd)) {
    define(factory);
  } else {
    global.factory = factory;
  }
})(typeof window !== "undefined" ? window : global);
登入後複製

注意:閉包前加上分號是為了給前一個模組填坑,分號多了沒問題,少了則語句可能會改變。

然後,就能愉快的呼叫了

//Node.js
var myModule = require('moduleName')

//Seajs
define(function(require,exports,module){
  var myModule = require('moduleName')
})

// Browser global
<script src=&#39;moduleName.js&#39;></script>
登入後複製
【完】


#推薦學習:

JavaScript高階教學

以上是手把手教你使用JS給通用模組寫法(程式碼詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
js
來源:chuchur.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板