nodejs——nodejs簡單介紹 & 模塊 & 全局對象global

一、命令行窗口

1、 打開命令行窗口(小黑屏)、CMD窗口、終端、shell

方法一:開始菜單 -> 運(yùn)行 -> cmd -> 回車
方法二:直接url欄中輸入cmd

2、常用指令

dir 顯示目錄里面的所有文件(包括文件夾和文件)
cd.. 回到上一級目錄
cd\ 回到根目錄
cd 路徑 跳轉(zhuǎn)到指定的目錄
盤符名稱: 切換盤符(比如:d:,回車后就會切換到d盤)
cls 清屏(清空屏幕)
md 目錄名稱 創(chuàng)建目錄
rd 目錄名稱 刪除目錄
del 文件名 刪除指定的文件
del 目錄名 刪除目錄里面的全部文件
copy 命令用于復(fù)制文件
move 命令用于移動文件
文件名.后綴名 打開文件

3、環(huán)境變量(windows系統(tǒng)中變量)

path:環(huán)境變量中保存的是一個(gè)一個(gè)的路徑,路徑之間使用;隔開。里面放的都是路徑,該路徑下的文件,可以直接打開
作用:當(dāng)我們在命令行窗口打開一個(gè)文件,或調(diào)用一個(gè)程序時(shí),系統(tǒng)會首選在當(dāng)前目錄下尋找文件程序,如果找到了則直接打開,如果沒有找到則會依次到環(huán)境變量path的路徑中尋找,直到找到為止,如果沒有找到則報(bào)錯(cuò)。所以我們可以將一些經(jīng)常需要訪問的程序和文件的路徑添加到path中,這樣我們就可以在任意位置來訪問這些文件和程序了。

二、進(jìn)程和線程

1、進(jìn)程

當(dāng)一個(gè)程序開始運(yùn)行時(shí),它就是一個(gè)進(jìn)程,進(jìn)程包括運(yùn)行中的程序和程序所使用到的內(nèi)存和系統(tǒng)資源。
進(jìn)程負(fù)責(zé)為程序的運(yùn)行提供必備的環(huán)境。進(jìn)程就相當(dāng)于工廠中的車間。

2、線程

線程是計(jì)算機(jī)中的最小的計(jì)算單位,線程負(fù)責(zé)執(zhí)行進(jìn)程中的程序。線程就相當(dāng)于工廠中的工人。

(1)多線程

多線程是指程序中包含多個(gè)執(zhí)行流,即在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來執(zhí)行不同的任務(wù),也就是說允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線程來完成各自的任務(wù)。java是多線程的。

(2)單線程

單線程就只有一個(gè)執(zhí)行流。js是單線程的。

三、Nodejs

Nodejs官網(wǎng)
Node.js 就是運(yùn)行在服務(wù)端的 JavaScript。是一個(gè)能夠在服務(wù)器端運(yùn)行JavaScript的開放源代碼、跨平臺JavaScript運(yùn)行環(huán)境。采用Google開發(fā)的V8引擎運(yùn)行js代碼,使用事件驅(qū)動、非阻塞和異步I/O模型等技術(shù)來提高性能,可優(yōu)化應(yīng)用程序的傳輸量和規(guī)模。

1、I/O(Input/Output)

I/O操作指的是對磁盤的讀寫操作。

2、Node定義

Node是一個(gè)基于Chrome V8引擎的JavaScript代碼運(yùn)行環(huán)境。
瀏覽器(軟件)能夠運(yùn)行JavaScript代碼,瀏覽器就是JavaScript代碼的運(yùn)行環(huán)境。
Node(軟件)能夠運(yùn)行JavaScript代碼,Node就是JavaScript代碼的運(yùn)行環(huán)境。
版本:
LTS = Long Term Support 長期支持版 穩(wěn)定版
Current 擁有最新特性 實(shí)驗(yàn)版

3、Node優(yōu)勢

(1)可以使用JavaScript語法開發(fā)后端應(yīng)用
(2)生態(tài)系統(tǒng)活躍,有大量開源庫可以使用
(3)前端開發(fā)工具大多基于Node開發(fā)

4、Node.js 的組成

JavaScript 由三部分組成,ECMAScript,DOM,BOM。
Node.js是由ECMAScript及Node 環(huán)境提供的一些附加API組成的,包括文件、網(wǎng)絡(luò)、路徑等等一些更加強(qiáng)大的 API。(ECMAScript + Node模塊API)

四、模塊化

1、模塊化

軟件中的模塊化開發(fā):一個(gè)功能就是一個(gè)模塊,多個(gè)模塊可以組成完整應(yīng)用,抽離一個(gè)模塊不會影響其他功能的運(yùn)行。將一個(gè)完整的程序分成一個(gè)一個(gè)小的程序,降低耦合度,方便代碼的復(fù)用。
Node.js規(guī)定一個(gè)JavaScript文件就是一個(gè)模塊,每一個(gè)js文件中的js代碼都是獨(dú)立運(yùn)行在一個(gè)函數(shù)中。模塊內(nèi)部定義的變量和函數(shù)默認(rèn)情況下在外部無法得到。模塊內(nèi)部可以使用exports對象進(jìn)行成員導(dǎo)出,使用require方法導(dǎo)入其他模塊。

2、模塊參數(shù)

每個(gè)獨(dú)立的模塊是一個(gè)私有的作用域,每一個(gè)獨(dú)立模塊其實(shí)就是獨(dú)立方法。并且在函數(shù)執(zhí)行時(shí),同時(shí)傳遞進(jìn)了5個(gè)參數(shù):exports, require, module, __filename, __dirname。

(1)exports對象

exports:該對象用來將變量或函數(shù)暴露到外部。
nodejs中,導(dǎo)出當(dāng)前模塊的成員,可以用exports,也可以用module.exports。exports 實(shí)際指向 module.exports,最終導(dǎo)出的是module.exports對象。

① 用exports對象導(dǎo)出

exports導(dǎo)出成員時(shí),不能重新給exports賦值一個(gè)新對象,只能一個(gè)一個(gè)導(dǎo)出。

let money = 10000
let city = '南京'
exports.money = money
exports.city = city

注意:不能采用下面的方式導(dǎo)出成員

exports = {
    money:money,
    city:city
} 

② 使用module.exports

module.exports導(dǎo)出成員時(shí),既可以一個(gè)一個(gè)導(dǎo)出,也可以通過賦值一個(gè)對象的方式導(dǎo)出。

module.exports.fun1 = fun1
module.exports = {
    money:money,
    city:city,
    fun1:fun1
} 

(2)require函數(shù)

require函數(shù),用來導(dǎo)入其他模塊里面的成員。require方法的參數(shù)是:模塊的標(biāo)識。require()引入模塊以后,該函數(shù)會返回一個(gè)對象,這個(gè)對象代表的是引入的模塊。
在nodejs中,通過require方法,導(dǎo)入其他模塊。一般情況下,我們會通過解構(gòu)賦值的方式,直接從導(dǎo)入的對象中獲取需要的成員。

① 導(dǎo)入系統(tǒng)模塊

通過系統(tǒng)模塊的名稱導(dǎo)入。

let path = require('path')

② 導(dǎo)入第三方模塊

通過模塊的名稱導(dǎo)入(這個(gè)名稱是package.json文件中name屬性對應(yīng)的名稱)。

let path = require('path')

③ 導(dǎo)入自定義模塊

通過模塊的路徑導(dǎo)入,路徑可以是相對路徑,也可以是絕對路徑。

let bing = require('./bing')

(3)module對象

是當(dāng)前模塊本身,它里面的exports對象屬性,也是用于導(dǎo)出當(dāng)前模塊里面的成員。

(4)__filename變量

返回當(dāng)前模塊文件的絕對路徑。

console.log(__filename);   // E:\kw\kwstudy\nodeJS\L01\index03.js

(5)__dirname變量

返回當(dāng)前模塊文件所在目錄的絕對路徑。

console.log(__dirname);    // E:\kw\kwstudy\nodeJS\L01

3、系統(tǒng)模塊

Node運(yùn)行環(huán)境提供的API. 因?yàn)檫@些API都是以模塊化的方式進(jìn)行開發(fā)的, 所以我們又稱Node運(yùn)行環(huán)境提供的API為系統(tǒng)模塊。

(1)系統(tǒng)模塊path

① 定義

系統(tǒng)模塊path,用于操作路徑相關(guān)。

let path = require('path')

② join() 路徑拼接

path.join('路徑','路徑',...) 該方法會根據(jù)當(dāng)前nodejs所在的系統(tǒng)環(huán)境,返回正確格式的拼接路徑。
不同的操作系統(tǒng),路徑的拼接符是不一樣的。windows系統(tǒng)中,路徑的拼接符是 / 或 \ ;linux系統(tǒng)中,路徑的拼接符是 / ;我們用nodeJS開發(fā)的程序,將來部署到什么操作系統(tǒng)的服務(wù)器上是不確定的。所以,使用join()方法,返回拼接路徑。

console.log(path.join('a','b','c','d'))     //  a\b\c\d

③ resolve() 返回絕對路徑

帶參數(shù):path.resolve(相對路徑)方法,返回一個(gè)相對路徑的絕對路徑。

console.log(path.resolve('./file/a.txt'))   //  E:\kw\kwstudy\nodeJS\1028\file\a.txt

不帶參數(shù):path.resolve()方法,返回當(dāng)前模塊所在目錄的絕對路徑。

console.log(path.resolve());    // E:\kw\kwstudy\nodeJS\1028

全局變量__dirname也是返回當(dāng)前模塊所在目錄的絕對路徑

console.log(__dirname);    // E:\kw\kwstudy\nodeJS\1028

④ 返回指定包(math)的絕對路徑

// E:\kw\kwstudy\nodeJS\1028\math
console.log(path.join(path.resolve(),'math'));

(2)系統(tǒng)模塊fs

系統(tǒng)模塊fs,用于操作文件相關(guān)。
f:file 文件 ,s:system 系統(tǒng),文件系統(tǒng)。

let fs = require('fs')

4、第三方模塊

(1)定義

別人寫好的、具有特定功能的、我們能直接使用的模塊即第三方模塊。由于第三方模塊通常都是由多個(gè)文件組成并且被放置在一個(gè)文件夾中,所以又名包。
npmjs.com:第三方模塊的存儲和分發(fā)倉庫。
第三方模塊有兩種存在形式:
① 以js文件的形式存在,提供實(shí)現(xiàn)項(xiàng)目具體功能的API接口。
② 以命令行工具形式存在,輔助項(xiàng)目開發(fā)。

(2)第三方模塊 nodemon

在Node.js中,每次修改文件都要在命令行工具中重新執(zhí)行該文件,非常繁瑣。
nodemon是一個(gè)命令行工具,用以輔助項(xiàng)目開發(fā)??梢宰詣颖O(jiān)測文件的變化,當(dāng)有變化時(shí)重新啟動服務(wù)。(需要使用nodemon時(shí),先關(guān)閉自動保存)

使用步驟:
① 全局安裝nodemon:

npm install nodemon –g  

② 在命令行工具中用nodemon命令替代node命令執(zhí)行文件

nodemon ./index.js

5、Node.js中模塊加載機(jī)制

(1)模塊查找規(guī)則-當(dāng)模塊擁有路徑但沒有文件后綴

require('./find.js');
require('./find');
步驟:
① require方法根據(jù)模塊路徑查找模塊,如果是完整路徑,直接引入模塊。
② 如果模塊后綴省略,先找同名JS文件再找同名JS文件夾。
③ 如果找到了同名文件夾,找文件夾中的index.js。
④ 如果文件夾中沒有index.js就會去當(dāng)前文件夾中的package.json文件中查找main選項(xiàng)中的入口文件。
⑤ 如果找指定的入口文件不存在或者沒有指定入口文件就會報(bào)錯(cuò),模塊沒有被找到。

(2)模塊查找規(guī)則-當(dāng)模塊沒有路徑且沒有后綴

require('find');
步驟:
① Node.js會假設(shè)該模塊是系統(tǒng)模塊
② 如果不是系統(tǒng)模塊,再判斷是不是第三方模塊
③ Node.js會去node_modules文件夾中,首先看是否有該名字的JS文件;再看是否有該名字的文件夾。
④ 如果是文件夾看里面是否有index.js。如果沒有index.js查看該文件夾中的package.json中的main選項(xiàng)確定模塊入口文件。否則找不到報(bào)錯(cuò)。

五、全局對象global

在node環(huán)境中,沒有window對象。有一個(gè)全局對象global,類似于瀏覽器環(huán)境中的window對象。
在全局中創(chuàng)建的變量都會作為global的屬性保存。在全局中創(chuàng)建的函數(shù)都會作為global的方法保存。

Node中全局對象下有以下方法,可以在任何地方使用,global可以省略:
console.log() 在控制臺中輸出
setTimeout() 設(shè)置超時(shí)定時(shí)器
clearTimeout() 清除超時(shí)定時(shí)器
setInterval() 設(shè)置間歇定時(shí)器
clearInterval() 清除間歇定時(shí)器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容