node基礎

node.js

node.js是基于v8引擎的JavaScript運行環境

終端快捷鍵

使用↑鍵可以快速定位到上一次執行的命令
使用tab鍵能夠快速補全路徑
使用esc鍵可以快速清空當前已輸入命令
輸入cls可以清空當前窗口

fs( file system )文件系統模塊

fs模塊,nodejs用來操作文件的模塊

fs.readFile() 讀取指定文件中的內容

fs.readFile(path[,options],callback)
  • 參數path:必選參數,字符串的文件路徑
  • 參數option:可選參數,表示以什么編碼格式來讀取文件
  • 參數callback:必選參數,文件讀取后執行的回調函數
    示例,以utf8編碼格式讀取txt
const fs = require('fs')
fs.readFile('./files/1.txt','utf8',function(err,dataStr){
    if(err) return err
    console.log(dataStr)
})

如果讀取成功err為null,如果讀取失敗,err的值為錯誤對象,dataStr的值為undefined

fs.writeFile() 寫入文件或創建文件

fs.writeFile(fileName,data[,options],callback)
  • 參數path:要寫入內容或要創建的文件路徑
  • 參數data:表示要寫入的內容
  • 參數option:表示以什么格式寫入文件內容,默認值是utf8
  • 參數callback:文件寫入內容之后執行的回調函數

注意點:

  1. 重復使用writeFile會覆蓋文件內容
  2. writeFile方法只能創建文件,不能創建文件夾

fs模塊路徑動態拼接問題:

在node執行路徑命令時候,./ 和 ../ 是根據node執行時所在的位置開始執行的,很容易會導致從執行位置開始找文件。
解決此方法可以使用絕對路徑

__dirname 基于當前文件所處的目錄

在node執行路徑命令時候,./ 和 ../ 是根據node執行時所在的位置開始執行的,使用 __dirname 就可以基于當前nodejs文件的路徑開始找, __dirname就是當前文件的絕對路徑。
多數情況下,使用 __dirname 之后依靠的就是絕對路徑,如果使用+號拼接基本不會再跟 ./ 和 ../,如果使用path.join就可以用 ./和../

path 模塊

path模塊,nodejs用來處理路徑的模塊。

const path = require('path')

path.join() 路徑拼接

path.join([...paths])

參數 ...paths :代表任意多個路徑片段

返回值為string類型,例子:

const path = require('path')
const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr)    //會輸出a\b\d\e

path.basename() 獲取路徑最后一部分

path.basename(path[,ext])

參數path:表示一個路徑的字符串
參數ext:表示文件拓展名,傳入拓展名之后返回值就不帶拓展名
返回值:表示路徑中的最后一部分

const path = require('path')
let fpath = '/a/b/c/index.html'
let fullName = path.basename(fpath)
console.log(fullName) //返回index.html

let  notExt = path.basename(fpath,'html')
console.log(notExt)     //返回index

path.extname() 獲取路徑中的文件拓展名

path.extname(path)

參數path:表示一個路徑的字符串
返回值:<string>文件的拓展名部分(帶.)

http 模塊

http 模塊是nodejs官方提供的、用來創建web服務器的模塊。通過http模塊提供的 http.createServer() 方法,就可以創建服務器應用

創建基本服務器

創建基本服務器四個步驟:

  1. 引入http模塊
const http = require('http')
  1. 調用http模塊里的createServer方法
const server = http.createServer()
  1. 為服務器實例綁定request事件
server.on('request',(req,res)=>{
    回調函數執行內容
})
  1. 調用服務器實例的listen方法,參數1為端口號,純Number類型,參數2為回調函數
server.listen(80,()=>{
    啟動成功后執行的回調函數
})

req 請求對象

server.on('request',(req,res)=>{
    回調函數執行內容
})

服務器綁定事件中,回調函數的req對象擁有著許多包含 發出請求的客戶端 的屬性,例如

req.url     請求所需要的的url是什么(只包含后面的路徑)
req.method 請求對象所使用的方法

res 響應對象

服務器綁定事件中,回調函數的req對象擁有著許多 服務器相關 的屬性與方法,例如

res.end() 向客戶端發送指定的內容,并結束這次請求的處理過程

res 響應頭設置

響應頭可以設置字符編碼解決中文亂碼問題

res.setHeader('Content-Type','text/html;charset=utf-8')

模塊化

模塊化加載

使用 require() 方法即可,加載內置模塊和第三方模塊直接寫名字,加載自定義模塊需要寫上路徑

module對象

每個模塊都有一個module對象,里面有著很多屬性,例如path、filename、exports

module.exports 向外共享模塊作用域

  • 在自定義模塊中,可以使用module.exports 對象,將模塊內的成員共享出去,供需導入的文件使用。
  • 另一個文件用require() 方法導入自定義模塊時,得到的就是module.exports 所指向的對象。
  • 在自定義模塊中,默認的 module.exports = {} ,也就是一個空對象。
  • module.exports 是一個對象,可以使用點.的形式將東西掛載到這個對象上
modeule.exports.username = 'zs'
module.exports.sayHello = ()=>{
    console.log('hello')
}

exports 對象

由于 module.exports 單詞寫起來比較復雜,為了簡化,node 提供了 exports 對象。
默認情況下exports 和 module.exports 指向同一個對象。
最終結果以 module.exports 為準

module.exports = {
    gender: 'man',
    age: 22
}
exports.username = 'zs'

最終另一個文件導入得到的是 module.exports 的東西.
為了防止混亂,盡量不要在一個模塊中同時使用exports 和 module.exports

ComonJS模塊化規范

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

npm

npm 包共享平臺,官網 [npmjs.com]。
Node Package Manager ,npm包管理工具,nodejs安裝的時候會一起安裝到電腦上

npm項目初始化

npm init -y

執行此命令,會生成一個package.json配置文件。
注意:命令只能在英文且沒有空格的目錄下成功運行

npm 國內鏡像

查詢當前下載包的地址和切換下載包的地址

npm config get registry 
npm config set registry=https://registry.npmmirror.com/    

或者使用nrm工具,安裝-查詢所有可用鏡像源-切換為淘寶鏡像源

nrm i nrm -g
nrm ls
nrm use taobao

npm 安裝包命令

npm install 包的完整名稱

簡寫形式

npm i 包的完整名稱

安裝指定版本的包,在包名后面接@然后寫上版本號

npm i moment@2.22.2

安裝包,并只在開發環境用到(記錄到開發依賴上)

npm install 包名 --save-dev
//或簡寫形式,包名與杠D順序可調換
npm i 包名 -D

安裝全局包,運行環境下使用的包

npm install 包名 -g
npm i 包名 -g

引用包

const 包的名稱 = require('包的名稱')

通常,引用包的時候用的變量接收的那個變量名,通常和包同名

卸載包

npm uninstall 具體包的名字

npm uninstall moment

npm 自動創建的文件

初次安裝包后,目錄下會多出一個 node_modules 文件夾和 package-lock.json 文件,其中

  • node_modules 文件夾用來存放所有已安裝到項目中的包,require() 導入第三方包時,就是從這個目錄查找。通常需要把這個文件夾添加到.gitignore忽略文件里去
  • package-lock.json 配置文件用來記錄 node_modules 目錄下每一個包的下載信息,例如包的名字、版本號、下載地址等
    項目init初始化后會生成一個package.json 配置文件,用來記錄與項目有關的一些配置信息。
    例如:項目的名稱、版本號、描述等。項目中都用到了那些包。哪些包只在開發期間會用到。哪些包在開發和部署時都需要用到。

package.json

dependencies 依賴節點

packagejson文件的此屬性會記錄該項目依賴哪些第三方npm包和版本號。

devDependencies 開發依賴節點

此屬性會記錄哪些包只在項目開發階段會用到,在項目上線后不會用到的。

當我們拿到一個剔除了node_modules文件夾的項目時候,通常使用 npm install 命令(或npm i)安裝所有denpendencies和devDependencies節點里記錄的所有包

創建npm包

一個合格的npm包必須滿足這幾個條件

  1. 包必須以單獨的目錄而存在
  2. 包的頂級目錄下必須包含 package.json
  3. package.json 中必須包含name,version,main。分別代表包的名字、版本號、包的入口

發布npm包的相關指令

登錄到npm和發布包

npm login
npm publish

刪除72小時內已發布的包

npm unpublish 包名 --force

模塊加載機制

  • 模塊在第一次加載后會被緩存。這也意味著多次調用 require() 不會導致模塊的代碼被執行多次
  • 內置模塊、自定義模塊、第三方模塊。都會優先從緩存中加載。
  • 內置模塊加載優先度最高。
  • 如果加載模塊時沒有 ./ 或 ../ 這樣的路徑標識符,會當作內置模塊或第三方模塊進行加載,一直往上級目錄的node_modules 文件夾查找
  • 加載時候如果沒有文件后綴名會按 .js .json .node 后綴順序加載
  • 加載當目錄(文件夾)作為模塊的時候,會先從package.json 尋找main屬性作為入口。如果沒有,則加載目錄下的index.js
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容

  • node環境安裝 1.什么是Node.js?Node.js 是一個基于"Chrome V8 引擎" 的JavaSc...
    Gmn_微雙閱讀 217評論 0 1
  • 一、什么是node Node.js is a JavaScript runtime.It is built on ...
    Linyqs閱讀 184評論 0 0
  • Node基礎 為什么學習Node? IO優勢對于文件讀寫,Node采用的是非阻塞IO傳統IO在讀寫文件的時候CPU...
    Victor_818閱讀 136評論 0 0
  • 一、模塊化開發 之前我們做過一個練習,使用node運行一個js文件。但是在實際項目開發中,不可能將全部代碼都寫在一...
    lmonkey_01閱讀 83評論 0 0
  • Node回調函數 node是非堵塞,比如我們執行一個讀取文件的操作,然后打印一句話,不需要等待文件讀取完成,這樣就...
    ccc往事隨風閱讀 256評論 0 1