目錄
1. CommonJS
exports與module.exports的區別
4. 總結
首頁 web前端 js教程 從0到1學習node(一)之模組規範

從0到1學習node(一)之模組規範

Jan 24, 2017 pm 03:30 PM
node 模組

在講解CommonJS, AMD, CMD這些概念之前,我們先兩個了解下js的模組化。模組化,顧名思義,就是將專案依照功能或其他邏輯分解處理,每個部分只處理一個功能,進行功能的解耦處理,方便以後的開發與維護。那麼模塊化必須具有以下的能力,才能進行模塊的拆分和組裝:

  1. 定義封裝的模塊;

  2. 定義新模塊對其他模塊的依賴;

  3. 可對其他模塊的引入支持;

那麼就需要一套規範準則來定義這些能力,於是就出現了CommonJS, AMD, CMD等。

1. CommonJS

CommonJS原先叫做ServerJS,是js在服務端的規範,node使用的就是這種規範。根據CommonJS規範,一個單獨的檔案就是一個模組,require用來載入一個模組,exports用來向外部暴露該模組裡的方法或屬性。

例如:

// hello.jsfunction say(username){    console.log( 'hello, '+username );
}

exports.say = say;
登入後複製

=============

// main.jsvar person = require('./hello');

person.say('wenzi'); // hello, wenziperson.say('师少兵'); // hello, 师少兵person.say('NUC'); // hello, NUC
登入後複製

同時,require語句可以寫在文件中的任何位置,只要使用先前引用之前即可,不一定要寫在文件的最前面。不過,為了程式碼更容易閱讀,能直觀地看到目前引用了哪些模組,最好是放在文件的最前面。

exports與module.exports的區別

可能有人見過直接使用exports的,有的是使用module.exports的,這裡稍微的講解下這兩者的區別。

先舉個簡單的例子:

var a = {name:'wenzi'};var b = a;console.log(a); // {name: "wenzi"}console.log(b); // {name: "wenzi"}
登入後複製

a和b輸出的結果是一樣的。現在我改變下b中name的值:

b.name = 'shaobing';console.log(a); // {name: "shaobing"}console.log(b); // {name: "shaobing"}
登入後複製

a和b的輸出結果都改變了。我再重新聲明b:

var b = {name:'师少兵'};console.log(a); // {name: "shaobing"}console.log(b); // {name: "师少兵"}
登入後複製

這三個例子輸出了三種結果:

  1. 聲明a對象,並把a賦值給b,然後a和b輸出了相同的結果;

  2. 改變了b中的name,那麼a中的name也跟著改變;
  3. 重新聲明了b對象,那麼a中的name也沒有跟著b一起改變
解釋

解釋

  1. 解釋

    :對象,b 是對a 的引用,即a 和b 指向同一塊內存,所以1中的輸出是一樣的。當 b 作修改時,即 a 和 b 指向同一塊記憶體位址的內容發生了改變,a 也會體現出來,所以第2個範例輸出也是一樣。當 b 被覆蓋時,b 指向了一塊新的內存,a 還是指向原來的內存,所以最後輸出會不一樣。

  2. 那麼此時就可以引出
  3. exports

    module.exports
  4. 了:
  5. module.exports 初始值為一個空對象{export

module.exports 初始值為一個空對象{export

require() 回傳的是module.exports 而不是exports

如果module.exports發生了新指向,則exports無效;若module.exports沒有發生變化,則直接exports即可。
2. AMD與RequireJS

說到AMD,不得不說到
RequireJS
,AMD從CommonJS社區獨立出來,單獨成為了AMD社區,AMD的流行,很大程度上也是依託了RequireJS作者的推廣。

AMD規範中,預設推薦的模組格式是:

// hello.js// 将需要引入的模块全部写入到数组中,然后传递参数进行调用define(['a', 'b'], function(a, ,b){    // do something    return{
        hello : function(username){            console.log( 'hello, '+username );
        }
    }
})
登入後複製

==========

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// main.jsdefine([&amp;#39;./hello&amp;#39;], function(h){ h.hello(&amp;#39;wenzi&amp;#39;); })</pre><div class="contentsignin">登入後複製</div></div>也就是說,在AMD中,模組必須使用define

定義,依賴透過函數參數傳進來,這樣的一個好處就是所有的依賴都能一目了然。
3. CMD與seajs🎜🎜CMD規範是國內著名的玉伯大神提出來的,將就的就是🎜就近依賴🎜,什麼時候用到,就在那個地方進行🎜require🎜。 SeaJS就是使用的CMD規格:🎜🎜
// hello.jsdefine(function(require, exports, module){    var a = require(&#39;a&#39;);    // do a    var b = require( &#39;b&#39; );    // do b    module.exports.hello = hello; // 对外输出hello})
登入後複製
🎜

從這裡也能看到AMD和CMD的區別:

AMD通常需要一次性引入全部的依賴,然後透過參數傳遞;而CMD則需要時才引入

不過,AMD也支持CMD這樣的引入格式,但內部還是依照AMD的邏輯執行。

4. 總結

這篇文章裡介紹了下CommonJS, AMD, CMD規範的相關區別與聯繫,這裡再簡要的總結下:

  1. CommonJS: 每個文件就是一個模組,沒有define定義,node使用此規範;

  2. AMD: 使用define定義一個模組,講究提前依賴

  3. CMD: 使用define定義模組,將就要開始正式進行node的學習了。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

WLAN擴充模組已停止[修復] WLAN擴充模組已停止[修復] Feb 19, 2024 pm 02:18 PM

如果您的Windows電腦上的WLAN擴充模組出現問題,可能會導致您與網際網路中斷連線。這種情況常常讓人感到困擾,但幸運的是,本文提供了一些簡單的建議,可以幫助您解決這個問題,讓您的無線連線重新正常運作。修復WLAN擴充模組已停止如果您的Windows電腦上的WLAN可擴充性模組已停止運作,請依照下列建議進行修復:執行網路和Internet故障排除程式停用並重新啟用無線網路連線重新啟動WLAN自動設定服務修改電源選項修改高級電源設定重新安裝網路適配器驅動程式運行一些網路命令現在,讓我們來詳細看

WLAN可擴充性模組無法啟動 WLAN可擴充性模組無法啟動 Feb 19, 2024 pm 05:09 PM

本文詳細介紹了解決事件ID10000的方法,該事件表明無線區域網路擴充模組無法啟動。在Windows11/10PC的事件日誌中可能會顯示此錯誤。 WLAN可擴充性模組是Windows的一個元件,允許獨立硬體供應商(IHV)和獨立軟體供應商(ISV)為使用者提供客製化的無線網路特性和功能。它透過增加Windows預設功能來擴充本機Windows網路元件的功能。在作業系統載入網路元件時,WLAN可擴充性模組會作為初始化的一部分啟動。如果無線區域網路擴充模組遇到問題無法啟動,您可能會在事件檢視器的日誌中看到錯誤消

node專案中如何使用express來處理檔案的上傳 node專案中如何使用express來處理檔案的上傳 Mar 28, 2023 pm 07:28 PM

怎麼處理文件上傳?以下這篇文章為大家介紹一下node專案中如何使用express來處理文件的上傳,希望對大家有幫助!

Python常用標準函式庫及第三方函式庫2-sys模組 Python常用標準函式庫及第三方函式庫2-sys模組 Apr 10, 2023 pm 02:56 PM

一、sys模組簡介前面介紹的os模組主要面向作業系統,而本篇的sys模組則主要針對的是Python解釋器。 sys模組是Python自帶的模組,它是與Python解釋器互動的一個介面。 sys 模組提供了許多函數和變數來處理 Python 執行環境的不同部分。二、sys模組常用方法透過dir()方法可以查看sys模組中帶有哪些方法:import sys print(dir(sys))1.sys.argv-取得命令列參數sys.argv作用是實作從程式外部向程式傳遞參數,它能夠取得命令列參數列

深入淺析Node的進程管理工具'pm2” 深入淺析Node的進程管理工具'pm2” Apr 03, 2023 pm 06:02 PM

這篇文章跟大家分享Node的進程管理工具“pm2”,聊聊為什麼需要pm2、安裝和使用pm2的方法,希望對大家有幫助!

Python程式設計:詳解命名元組(namedtuple)的使用要點 Python程式設計:詳解命名元組(namedtuple)的使用要點 Apr 11, 2023 pm 09:22 PM

前言本文繼續來介紹Python集合模組,這次主要簡明扼要的介紹其內的命名元組,即namedtuple的使用。閒話少敘,我們開始-記得按讚、追蹤和轉發哦~ ^_^創建命名元組Python集合中的命名元組類namedTuples為元組中的每個位置賦予意義,並增強代碼的可讀性和描述性。它們可以在任何使用常規元組的地方使用,並且增加了透過名稱而不是位置索引方式存取欄位的能力。其來自Python內建模組collections。其使用的常規語法方式為:import collections XxNamedT

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

Python 的 import 是怎麼運作的? Python 的 import 是怎麼運作的? May 15, 2023 pm 08:13 PM

你好,我是somenzz,可以叫我徵哥。 Python的import是非常直覺的,但即使這樣,有時你會發現,明明套件就在那裡,我們仍會遇到ModuleNotFoundError,明明相對路徑非常正確,就是報錯ImportError:attemptedrelativeimportwithnoknownparentpackage導入同一個目錄的模組和不同的目錄的模組是完全不同的,本文透過分析使用import經常遇到的一些問題,來幫助你輕鬆搞定import,據此,你可以輕鬆創建屬

See all articles