Nodejs模块、自定义模块、CommonJs的概念和使用
場(chǎng)景
CommonJs
JavaScript 是一個(gè)強(qiáng)大面向?qū)ο笳Z言,它有很多快速高效的解釋器。然而, JavaScript
標(biāo)準(zhǔn)定義的API 是為了構(gòu)建基于瀏覽器的應(yīng)用程序。并沒有制定一個(gè)用于更廣泛的應(yīng)用程序
的標(biāo)準(zhǔn)庫。CommonJS 規(guī)范的提出,主要是為了彌補(bǔ)當(dāng)前JavaScript 沒有標(biāo)準(zhǔn)庫的缺陷。它的
終極目標(biāo)就是:提供一個(gè)類似Python,Ruby 和Java 語言的標(biāo)準(zhǔn)庫,而不只是讓JavaScript 停
留在小腳本程序的階段。用CommonJS API 編寫出的應(yīng)用,不僅可以利用JavaScript 開發(fā)客
戶端應(yīng)用,而且還可以編寫以下應(yīng)用。
服務(wù)器端JavaScript 應(yīng)用程序。(nodejs)
命令行工具。
桌面圖形界面應(yīng)用程序。
簡(jiǎn)單概括一句話:
CommonJS 就是模塊化的標(biāo)準(zhǔn),nodejs 就是CommonJS(模塊化)的實(shí)現(xiàn)。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
Nodejs中的模塊化
Node 應(yīng)用由模塊組成,采用CommonJS 模塊規(guī)范。
在Node中,模塊分為兩類:
??? 一類是Node 提供的模塊,稱為核心模塊;另一類是用戶編寫的模塊,稱為文件模塊。
核心模塊部分在Node 源代碼的編譯過程中,編譯進(jìn)了二進(jìn)制執(zhí)行文件。在Node 進(jìn)
程啟動(dòng)時(shí),部分核心模塊就被直接加載進(jìn)內(nèi)存中,所以這部分核心模塊引入時(shí),文件定位和
編譯執(zhí)行這兩個(gè)步驟可以省略掉,并且在路徑分析中優(yōu)先判斷,所以它的加載速度是最快的。
如:HTTP 模塊、URL 模塊、Fs 模塊都是nodejs 內(nèi)置的核心模塊,可以直接引入使用。
??? 文件模塊則是在運(yùn)行時(shí)動(dòng)態(tài)加載,需要完整的路徑分析、文件定位、編譯執(zhí)行過程、
速度相比核心模塊稍微慢一些,但是用的非常多。這些模塊需要我們自己定義。接下來我
們看一下nodejs 中的自定義模塊。
CommonJS(Nodejs)中自定義模塊的規(guī)定
1.我們可以把公共的功能抽離成為一個(gè)單獨(dú)的js 文件作為一個(gè)模塊,默認(rèn)情況下面這
個(gè)模塊里面的方法或者屬性,外面是沒法訪問的。如果要讓外部可以訪問模塊里面的方法或
者屬性,就必須在模塊里面通過exports 或者module.exports 暴露屬性或者方法。
2. 在需要使用這些模塊的文件中,通過require 的方式引入這個(gè)模塊。這個(gè)時(shí)候就可
以使用模塊里面暴露的屬性和方法。
自定義模塊簡(jiǎn)單示例
在項(xiàng)目目錄下新建文件夾module用來存放自定義的公共模塊。
在module下新建tools.js
function formatName(api){return "公眾號(hào):"+api; }exports.formatName=formatName;自定義模塊中新建一個(gè)函數(shù),并通過exports暴露。
然后在項(xiàng)目目錄下新建test1.js
?
在test1.js中,通過
const tools = require('./module/tools.js');引入模塊
然后通過
var name = tools.formatName('霸道的程序猿');調(diào)用模塊的方法
最后輸出
console.log(name);test1.js完整示例代碼
const tools = require('./module/tools.js'); var name = tools.formatName('霸道的程序猿'); console.log(name);然后打開終端運(yùn)行
node test1.js?
自定義模塊含有多個(gè)方法
如果自定義模塊中含有多個(gè)方法,即將自定義模塊定義為對(duì)象,其下有多個(gè)方法。
var tools = {sayName:function(){return "公眾號(hào):";},sayValue:function(){return "霸道的程序猿";} }exports.sayName = tools.sayName; exports.sayValue = tools.sayValue;然后新建test2.js
var tools = require('./module/tools'); console.log(tools.sayName()); console.log(tools.sayValue());運(yùn)行test2.js
node test2.js?
自定義模塊的約定路徑
在項(xiàng)目下新建node_modules目錄,在此目錄下新建一個(gè)自定義模塊的文件夾,比如新建axios,并在axios下新建index.js
?
模擬從服務(wù)器獲取數(shù)據(jù)和提交數(shù)據(jù)。
然后在項(xiàng)目目錄下新建test3.js
const axios=require('axios');axios.get();axios.post();文件位置如下
?
可以看到此時(shí)引入自定義模塊的路徑為
const axios=require('axios');先運(yùn)行下test3.js
node test3.js?
這里引入自定義模塊沒有使用全路徑直接使用
const axios=require('axios');就可以引用的原因是node會(huì)默認(rèn)尋找node_modules目錄下對(duì)應(yīng)模塊名字目錄下的index.js這個(gè)模塊
這里必須是index.js
如果名字不是index.js,比如這里改名為badao.js就會(huì)報(bào)錯(cuò)
?
可是如果說非要使用badao.js自定義的名字不使用index.js的話怎么辦。
比如我們?cè)趎ode_modules下新建badao文件夾,其下面的模塊起名為badao.js而不是index.js
?
?
然后找到badao.js所在的文件夾下打開命令行輸入
npm init?
此時(shí)會(huì)在badao.js同級(jí)目錄下生成package.json
{"name": "badao","version": "1.0.0","description": "","main": "badao.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC" }此文件就會(huì)表明此模塊的入口函數(shù)為badao.js
那么再引入badao模塊時(shí)就會(huì)先找package.json
然后根據(jù)其入口函數(shù)去查找模塊。
然后在項(xiàng)目下新建test4.js
const badao = require('badao'); badao.get(); badao.post();運(yùn)行test4.js
node test4.js?
?
總結(jié)
以上是生活随笔為你收集整理的Nodejs模块、自定义模块、CommonJs的概念和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElementUI中使用el-time-
- 下一篇: SqlServer 根据一个表数据更新另