Node.js中的CommonJS模塊化規(guī)范詳解
nodeJS的介紹
NodeJS不但自己可以完成服務(wù)器軟件的功能,也不再需要php,asp,jsp等傳統(tǒng)的服務(wù)器語(yǔ)言
nodeJS可以解析JS代碼,而沒(méi)有瀏覽器安全級(jí)別的限制,因?yàn)椋倪\(yùn)行可以脫離瀏覽器的環(huán)境,而是在服務(wù)端運(yùn)行;提供了很多系統(tǒng)級(jí)別的API,如:
文件的讀寫
進(jìn)程的管理
網(wǎng)絡(luò)通信
NodeJS的包管理器npm,成為世界上最大的開放源代碼的生態(tài)系統(tǒng)。
CommonJS
上文提到了 Node 采用的模塊化規(guī)范是 CommonJS
,它主要規(guī)定了如何定義模塊,如果導(dǎo)出模塊和如何導(dǎo)入模塊:
- 定義模塊:一個(gè)文件就是一個(gè)模塊
- 導(dǎo)出模塊:通過(guò)
module.exports
導(dǎo)出模塊 - 導(dǎo)入模塊:通過(guò)
require
方法導(dǎo)入模塊
為了方便使用模塊化,于是提供了幾個(gè)全局的方法或?qū)ο螅謩e是:
- require:是一個(gè)方法,用來(lái)導(dǎo)入模塊
- module:是一個(gè)對(duì)象,表示當(dāng)前的模塊定義
- exports:是 module.exports 對(duì)象的別名,存放了模塊要導(dǎo)出的內(nèi)容
- __dirname:獲取當(dāng)前文件的絕對(duì)路徑
- __filename:獲取當(dāng)前文件絕對(duì)路徑和文件名稱
下面來(lái)看下這幾個(gè)對(duì)象和方法的使用。
模塊的導(dǎo)入和導(dǎo)出
首先準(zhǔn)備一個(gè)目錄:
a.js
模塊導(dǎo)出內(nèi)容:
const name = 'kw' // 導(dǎo)出內(nèi)容有幾種不同的方式: // 方式1:模塊只導(dǎo)出變量 name module.exports = name // 方式2:模塊導(dǎo)出的是一個(gè)對(duì)象,包含一個(gè) name 屬性 module.exports.name = name // 等同于 exports.name = name
模塊要導(dǎo)出的內(nèi)容是存放在 module.exports
中的,默認(rèn)是一個(gè)空對(duì)象。
exports
是module.exports
的別名,在導(dǎo)出內(nèi)容時(shí),切不可這樣做:
const name = 'kw' exports = name
這里就是值類型與引用類型的區(qū)別的問(wèn)題。將 exports
指向一個(gè)全新的值,就和原來(lái)的 module.exports
斷了聯(lián)系,此時(shí)模塊將導(dǎo)出默認(rèn)的空對(duì)象。
在 idnex.js
中,導(dǎo)入 a
模塊:
const a = require('./a') // 方式1的結(jié)果: console.log(a) // 'kw' // 方式2的結(jié)果: console.log(a) // {name: 'kw'}
模塊不止 .js
上面的示例中,我們所創(chuàng)建的模塊都是一個(gè)個(gè)的 .js
文件,這屬于文件類型的模塊。
文件不止一種類型,文件模塊也就不止一種。在 node 中的文件模塊有三種:
- 后綴名為
.js
的文件 - 后綴名
.json
的json
文件 - 后綴名為
.node
的經(jīng)過(guò)編譯的二進(jìn)制模塊文件
對(duì)不同文件后綴的模塊有不同的加載策略。對(duì)于 json
文件會(huì)調(diào)用 fs
模塊讀取后再用 JSON.parse
方法轉(zhuǎn)成 json
對(duì)象;對(duì)于 .node
文件,不經(jīng)任何處理,直接調(diào)用。
我們知道 Webpack 是一個(gè)模塊打包工具,它默認(rèn)支持 CommonJS 規(guī)范。使用 Webpack 時(shí),也會(huì)認(rèn)為一個(gè)文件就是一個(gè)模塊。但比 CommonJS 規(guī)范更加豐富的是,不僅 .js
、.json
是模塊,任意一個(gè)文件都是模塊,比如 .png
,.vue
,.ts
,但是這種模塊 Webpack 是“不認(rèn)識(shí)”的,還需要安裝對(duì)應(yīng)的 loader 去解析。
require 導(dǎo)入模塊的查找機(jī)制
按照來(lái)源劃分,在 Node 中一共有三類模塊,分別是:
- 內(nèi)置模塊:也叫核心模塊,由 Node 本身實(shí)現(xiàn)和提供的,比如
fs
、http
、path
模塊 - 自定義模塊:一般項(xiàng)目中自己寫的每一個(gè)
.js
文件都是 - 第三方模塊:通過(guò)包管理工具 npm/yarn/pnpm 安裝到 node_modules 目錄下的模塊
require
方法在導(dǎo)入模塊時(shí),會(huì)有一個(gè)查找的機(jī)制。
導(dǎo)入內(nèi)置模塊
參數(shù)是一個(gè)模塊名。如果發(fā)現(xiàn)是內(nèi)置模塊,則導(dǎo)入并結(jié)束查找。
const http = require('http')
導(dǎo)入自定義模塊
參數(shù)是一個(gè)文件路徑,以 ./
、../
或者 /
開頭。
// 此時(shí)會(huì)當(dāng)作內(nèi)置模塊查找,自然是找不到的,會(huì)報(bào)錯(cuò) const a = require('a.js') // 必須以 ./、 ../、 / 開頭 // 找到同級(jí)目錄下的 a.js 并導(dǎo)入 const a = require('./a.js')
如果模塊沒(méi)有帶后綴:
const a = require('./a')
會(huì)依次去找有沒(méi)有 a.js
、 a.json
、a.node
,找到則導(dǎo)入模塊;沒(méi)有的話,會(huì)將 a
當(dāng)作一個(gè)目錄名,去找 a
目錄下的 index.js
、 index.json
、 index.node
,找到則導(dǎo)入模塊。如果還沒(méi)有找到,則報(bào)錯(cuò)找不到模塊。
導(dǎo)入第三方模塊
參數(shù)是一個(gè)模塊名,并且不是核心模塊名。
通過(guò)包管理工具安裝一個(gè)模塊:
npm install dayjs
// src/index.js // 發(fā)現(xiàn) dayjs 不是內(nèi)置模塊,首先會(huì)從當(dāng)前模塊所在目錄的 node_modules 目錄下查找,找到后就結(jié)束查找。找不到則向上一級(jí)目錄查找,一直到系統(tǒng)的根目錄。 // 查找順序分別是: /** 'c:\Users\taylo\Desktop\commonjs\src\node_modules', 'c:\Users\taylo\Desktop\2022 掘金日新計(jì)劃 8月\commonjs\node_modules', 'c:\Users\taylo\Desktop\2022 掘金日新計(jì)劃 8月\node_modules', 'c:\Users\taylo\Desktop\node_modules', 'c:\Users\taylo\node_modules', 'c:\Users\node_modules', 'c:\node_modules' 在我們的目錄結(jié)構(gòu)中,會(huì)從第二個(gè)路徑中找到,于是導(dǎo)入模塊,結(jié)束查找。 */ const dayjs = require('dayjs') console.log(dayjs(123456789123).format('YYYY-MM-DD hh:mm:ss')) // '1973-11-30 05:33:09'
小結(jié)
本文主要介紹了 CommonJS 規(guī)范在 Node 中的簡(jiǎn)單應(yīng)用,主要就是導(dǎo)入和導(dǎo)出模塊。
關(guān)于 CommonJS 規(guī)范更細(xì)節(jié)的講解,以及實(shí)現(xiàn)原理,會(huì)在后面的更文中談到,敬請(qǐng)期待。
到此這篇關(guān)于Node.js中的CommonJS模塊化規(guī)范的文章就介紹到這了,更多相關(guān)Node.js CommonJS模塊化規(guī)范內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js基礎(chǔ)入門之回調(diào)函數(shù)及異步與同步詳解
Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的回調(diào)函數(shù)及異步與同步,感興趣的可以了解一下2022-03-03Node.js中的文件系統(tǒng)(file system)模塊詳解
Node.js文件系統(tǒng)模塊提供了豐富的方法,用于讀取、寫入、操作文件和目錄,文件系統(tǒng)模塊是Node.js強(qiáng)大而靈活的一部分,為文件操作提供了方便的API,本文給大家介紹Node.js中的文件系統(tǒng)(file system)模塊,感興趣的朋友一起看看吧2023-11-11node.js應(yīng)用后臺(tái)守護(hù)進(jìn)程管理器Forever安裝和使用實(shí)例
這篇文章主要介紹了node.js應(yīng)用后臺(tái)守護(hù)進(jìn)程管理器Forever安裝和使用實(shí)例,forever可以看做是一個(gè)nodejs的守護(hù)進(jìn)程,能夠啟動(dòng),停止,重啟我們的app應(yīng)用,需要的朋友可以參考下2014-06-06Node學(xué)習(xí)筆記:Node.js安裝及環(huán)境配置 史詩(shī)級(jí)詳細(xì)版【含測(cè)試與鏡像說(shuō)明】
這篇文章主要介紹了Node學(xué)習(xí)筆記之Node.js安裝及環(huán)境配置方法,詳細(xì)分析了node.js的基本安裝、配置、環(huán)境變量設(shè)置、以及環(huán)境測(cè)試與鏡像使用說(shuō)明,需要的朋友可以參考下2023-05-05解決Mac安裝thrift因bison報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決Mac安裝thrift因bison報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05nodejs express搭建服務(wù)并熱更新文件過(guò)程詳解
這篇文章主要為大家介紹了nodejs express搭建服務(wù)并熱更新文件過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11node.js實(shí)現(xiàn)帶進(jìn)度條的多文件上傳
這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)攜帶進(jìn)度條的多文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08