從0到1學習node(一)之模組規範
在講解CommonJS, AMD, CMD這些概念之前,我們先兩個了解下js的模組化。模組化,顧名思義,就是將專案依照功能或其他邏輯分解處理,每個部分只處理一個功能,進行功能的解耦處理,方便以後的開發與維護。那麼模塊化必須具有以下的能力,才能進行模塊的拆分和組裝:
定義封裝的模塊;
定義新模塊對其他模塊的依賴;
可對其他模塊的引入支持;
那麼就需要一套規範準則來定義這些能力,於是就出現了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: "师少兵"}
這三個例子輸出了三種結果:
聲明a對象,並把a賦值給b,然後a和b輸出了相同的結果;
改變了b中的name,那麼a中的name也跟著改變;- 重新聲明了b對象,那麼a中的name也沒有跟著b一起改變
:
解釋
:
- 解釋
:對象,b 是對a 的引用,即a 和b 指向同一塊內存,所以1中的輸出是一樣的。當 b 作修改時,即 a 和 b 指向同一塊記憶體位址的內容發生了改變,a 也會體現出來,所以第2個範例輸出也是一樣。當 b 被覆蓋時,b 指向了一塊新的內存,a 還是指向原來的內存,所以最後輸出會不一樣。
那麼此時就可以引出 - exports
和
module.exports 了: - module.exports 初始值為一個空對象{export
require() 回傳的是module.exports 而不是exports
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([&#39;./hello&#39;], function(h){
h.hello(&#39;wenzi&#39;);
})</pre><div class="contentsignin">登入後複製</div></div>
也就是說,在AMD中,模組必須使用
define
// hello.jsdefine(function(require, exports, module){ var a = require('a'); // do a var b = require( 'b' ); // do b module.exports.hello = hello; // 对外输出hello})
從這裡也能看到AMD和CMD的區別:
AMD通常需要一次性引入全部的依賴,然後透過參數傳遞;而CMD則需要時才引入
不過,AMD也支持CMD這樣的引入格式,但內部還是依照AMD的邏輯執行。
4. 總結
這篇文章裡介紹了下CommonJS, AMD, CMD規範的相關區別與聯繫,這裡再簡要的總結下:
CommonJS: 每個文件就是一個模組,沒有define定義,node使用此規範;
AMD: 使用define定義一個模組,講究提前依賴;
CMD: 使用define定義模組,將就要開始正式進行node的學習了。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題
![WLAN擴充模組已停止[修復]](https://img.php.cn/upload/article/000/465/014/170832352052603.gif?x-oss-process=image/resize,m_fill,h_207,w_330)
如果您的Windows電腦上的WLAN擴充模組出現問題,可能會導致您與網際網路中斷連線。這種情況常常讓人感到困擾,但幸運的是,本文提供了一些簡單的建議,可以幫助您解決這個問題,讓您的無線連線重新正常運作。修復WLAN擴充模組已停止如果您的Windows電腦上的WLAN可擴充性模組已停止運作,請依照下列建議進行修復:執行網路和Internet故障排除程式停用並重新啟用無線網路連線重新啟動WLAN自動設定服務修改電源選項修改高級電源設定重新安裝網路適配器驅動程式運行一些網路命令現在,讓我們來詳細看

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

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

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

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

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

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

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