Node — 第三天

模塊化

什么是模塊化

模塊化是指解決一個復雜問題時,自頂向下逐層把系統劃分成若干模塊的過程。 對于整個系統來說,模塊是可組合、分解和更換的單元。

生活中的模塊化

請添加圖片描述

請添加圖片描述

編程中的模塊化

編程領域中的模塊化,就是遵守固定的規則,把一個大文件拆成獨立并互相依賴的多個小模塊。

把代碼進行模塊化拆分的好處:

  • 提高了代碼的復用性
  • 提高了代碼的可維護性
  • 可以實現按需加載
  • etc…

模塊化規范

模塊化規范就是對代碼進行模塊化的拆分與組合時,需要遵守的那些規則。

例如:

  • 使用什么樣的語法格式來引用模塊 (require(‘fs’))
  • 在模塊中使用什么樣的語法格式向外暴露成員 (目前沒有學習,馬上學習)

模塊化規范的好處:大家都遵守同樣的模塊化規范寫代碼,降低了溝通的成本,極大方便了各個模塊之間的相互調用, 利人利己。

我們自己寫模塊,也要遵守模塊化的標準

Node.js 中模塊的分類

Node.js 中根據模塊來源的不同,將模塊分為了 3 大類,分別是:

  • 內置模塊(內置模塊是由 Node.js 官方提供的,例如 fs、path、http 等)
  • 自定義模塊(用戶創建的每個 .js 文件,都是自定義模塊)
  • 第三方模塊(由第三方開發出來的模塊,并非官方提供的內置模塊,也不是用戶創建的自定義模塊,使用前需要先下載)

加載模塊

// 加載核心模塊
const fs = require('fs');// 加載第三方模塊
const express = require('express');// 加載自定義模塊
const custom = require('./custom');

使用 require() 加載模塊后,會緩存起來,下次再調用 require()加載相同模塊的時候,直接使用緩存,而不是從新加載,從而大大提高了性能。

注意事項

  • 無論是什么模塊,我們都要使用 require() 去加載,然后才能使用。
  • 加載自定義的模塊,需要加 ./ ,而且可以省略后綴 .js

自定義模塊的實現(重點)

Node.js中的模塊作用域

在 Node.js 中,用戶創建的每個 .js 文件都是自定義模塊。 在自定義模塊中定義的變量、方法等成員,只能在當前模塊內被訪問,這種模塊級別的訪問限制,叫做模塊作用域

模塊作用域的好處是避免了全局變量污染。

導出導入模塊

為了能正常使用加載的模塊中的成員,CommonJS給出了標準,即

  • 一個模塊需要使用 module.exports 導出需要共享的內容。
  • 使用模塊的JS文件需要使用 require() 導入模塊。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kw5KoQbL-1588152888071)(Node-02.assets/image-20200402001657713.png)]

模塊導出的是什么,另一個使用模塊的JS文件得到的就是什么。

了解CommonJS規范

為了實現模塊化。

模塊化規范的種類:

  • AMD
  • CMD
  • CommonJS — Node.js 遵循CommonJS
  • ES6

Node.js 遵循了 CommonJS 模塊化規范,CommonJS 規定了模塊的特性和各模塊之間如何相互依賴。

CommonJS 規定:

  1. 每個模塊內部,module 變量代表當前模塊。
  2. module 變量是一個對象,它的 exports 屬性(即 module.exports)是對外的接口。
  3. 加載某個模塊,其實是加載該模塊的 module.exports 屬性。require() 方法用于加載模塊。

require() 加載模塊的機制

加載自定義模塊和其他模塊的機制有相同之處,也有不同之處,所以這里分開來看。

加載自定義模塊

  1. 首次加載成功,會緩存模塊
  2. 下次從緩存中加載,速度更快
  3. 加載模塊必須加 ./ ,如果是其他路徑,對應變化,否則會把它當做核心模塊或者第三方模塊
  4. 加載模塊的時候,如果是 require('./abc')
    1. 優先加載相同名字的文件,加載一個叫做 abc 的文件
    2. 自動補 .js 后綴,然后加載 abc.js 文件
    3. 自動補 .json 后綴,然后加載 abc.json 文件
    4. 自動補 .node 后綴,然后加載 abc.node 文件
    5. 以上文件都沒有,則報錯 Cannot find module './abc'

加載核心模塊和第三方模塊

  1. 首次加載成功,會緩存模塊
  2. 下次從緩存中加載,速度更快
  3. 加載模塊一定不能./ ,否則會把它當做自定義模塊
  4. 加載模塊的時候,如果是 require('haha')
    1. 優先加載核心模塊
    2. 去查找并加載第三方模塊,查找第三方模塊的路徑可以通過 module.paths 查看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248002.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FireDAC 中文字段過濾問題

當使用 FireDAC Filter 過濾數據的時候,通常這樣寫: FDMemTable.Filtered : False; FDMemTable1.Filter : 姓名 string(edtFilter.Text).QuotedString; FDMemTable.Filtered : True; 將會報錯:[FireDAC][Stan][Eval]-107. Invalid characte…

UIScrollViewDelegate-代理API詳解

在iOS編程中,經常用到UIScrollView控件。自然也會用到UIScrollViewDelegate協議。 今天就抽空,研究了一下UIScrollViewDelegate中所有的委托方法。 僅做Mark!如有,錯誤之處,歡迎留言指正,交流!貼…

License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)

https://blog.csdn.net/user11223344abc/article/details/83997907轉載于:https://www.cnblogs.com/dtdxrk/p/10812469.html

Express — 使用步驟

Express Express 介紹安裝搭建服務器的步驟express提供的新方法GET接口 獲取GET中的請求參數 POST接口 獲取POST請求提交的數據 中間件原理中間件語法中間件初體驗(設置響應頭)中間件開放靜態資源中間件接收POST請求體中間件返回404頁面 express 介紹 E…

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整體功能,想解決什么問題 基于 Langchain 與 ChatGLM 等LLM模型,搭建一套針對中文場景與開源模型,界面友好、可離線運行的知識庫問答解決方案。 當前解決…

iOS 鍵盤風格詳解UIKeyboardType

一、鍵盤風格 UIKit框架支持8種風格鍵盤。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默認鍵盤:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默認鍵盤 UIKeyboardTypeNu…

MySQL Hardware--FIO壓測

FIO參數 filename/export/1.txt 支持文件系統或者裸設備,-filename/dev/sda2或-filename/dev/sdb direct1 測試過程繞過機器自帶的buffer,使測試結果更真實 rwrandwread 測試隨機讀的I/O rwrandwrite 測試隨機…

Node — 第四天(Promise與路由)

Promise - ES6新對象 Promise能夠處理異步程序。 回調地獄 JS中或node中,都大量的使用了回調函數進行異步操作,而異步操作什么時候返回結果是不可控的,如果我們希望幾個異步請求按照順序來執行,那么就需要將這些異步操作嵌套起來…

xcode8 升級后注釋快捷鍵不能使用的解決方法

一種說法: 這個是因為蘋果解決xcode ghost。把插件屏蔽了。解決方法 命令運行: sudo /usr/libexec/xpccachectl 然后必須重啟電腦后生效 還有一種說法:不用指令直接重啟就可以了。

winform datagridview控件使用

最近做項目時&#xff0c;顯示查詢結果總需要綁定到datagridview控件上顯示&#xff0c;總結了給datagridview綁定數據的方式&#xff0c;以及導出datagridview數據到excel表格&#xff0c;如有錯誤請多指教 1.直接綁定數據源&#xff0c;可以綁定的數據格式有List<T>,Da…

Node — 第五天

1. MySQL數據庫 phpstudy 數據庫服務器及圖形化軟件 軟件鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw 提取碼&#xff1a;xl3k 數據庫對于我們前端同學來說&#xff0c;就是一個了解。 對于不會變化的數據&#xff08;省、市、縣&#xff09;&…

iOS10 權限訪問崩潰

手機升級了 iOS10 Beta&#xff0c;然后用正在開發的項目 裝了個ipa包&#xff0c;發現點擊有關 權限訪問 直接Crash了&#xff0c;并在控制臺輸出了一些信息&#xff1a; This app has crashed because it attempted to access privacy-sensitive data without a usage descr…

Node — 第六天(前后端分離)及(身份驗證)

綜合應用服務端知識點搭建項目 下載安裝所需的第三方模塊 npm init -y npm i express cors mysql # express 用于搭建服務器 # cors 用于解決跨域 # mysql 用于操作數據庫# 后面用到什么&#xff0c;再下載創建app.js 之前&#xff0c;我們開啟一個服務器&#xff0c;js文件…

繼承上機作業

1、實現如下類之間的繼承關系&#xff0c;并編寫Music類來測試這些類 2、編寫一個Java應用程序&#xff0c;該程序包括3個類&#xff1a;Monkey類、People類和主類E。要求&#xff1a; (1) Monkey類中有個構造方法&#xff1a;Monkey (String s)&#xff0c;并且有個public voi…

ApplePay集成教程

Apple Pay運行環境&#xff1a;iPhone6以上設備&#xff0c;操作系統最低iOS9.0以上&#xff0c;部分信息設置需要iOS9.2以上。目前還不支持企業證書添加。 環境搭建好后可以在模擬器上面運行&#xff0c;xcode7.2.1iPhone6SP9.2系統下&#xff0c;系統會綁定幾種虛擬的銀行卡…

Node — 第七天 (大事件項目接口實現一)

關于JS錯誤處理 node中和mysql中的錯誤處理 node和MySQL提供的方法&#xff0c;已經對錯誤信息進行了封裝&#xff0c;只需要使用 err.message 即可獲取到錯誤信息。 比如&#xff1a; const fs require(fs); // 讀取一個不存在的文件 fs.readFile(abcd.txt, (err, data) …

1.Consul 簡介和環境搭建

1.什么是 Consul Consul 是 service mesh(服務網格)的一個解決方案&#xff0c;它提供了諸如服務發現&#xff0c;配置和隔離等功能的一整套控制平面(control plane)。開發人員可以根據需要單獨使用這些功能點&#xff0c;也可以將他們整合成為一個完整的service mesh。Consul …

Node — 第八天 (大事件項目接口實現二)

如何處理MySQL的錯誤 MySQL的錯誤信息&#xff0c;可以通過err來獲取。這是沒有問題的。 但是&#xff0c;我們加入了Promise&#xff0c;Promise中的錯誤&#xff0c;在外部是獲取不到的&#xff0c;只能使用Promise相關方法來獲取錯誤信息。 解決方法一 使用 JS原生的 tr…

在local模式下的spark程序打包到集群上運行

一、前期準備 前期的環境準備&#xff0c;在Linux系統下要有Hadoop系統&#xff0c;spark偽分布式或者分布式&#xff0c;具體的教程可以查閱我的這兩篇博客&#xff1a; Hadoop2.0偽分布式平臺環境搭建 Spark2.4.0偽分布式環境搭建 然后在spark偽分布式的環境下必須出現如下八…

Effective Objective-C 2.0 初讀小結

1.對于OC中的對象聲明例如NSObject *obj1 [NSObject new];, obj1這個指針變量是分配在棧上的, 他指向的是這一個分配在堆上面的實例對象, 如果進行下面的賦值操作NSObject *obj2 obj1;,那么并沒有新生成一個實例對象, 只是在棧上分配了一個新的指針變量obj2, 而obj2和obj1指向…