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:文件寫入內容之后執行的回調函數
注意點:
- 重復使用writeFile會覆蓋文件內容
- 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() 方法,就可以創建服務器應用
創建基本服務器
創建基本服務器四個步驟:
- 引入http模塊
const http = require('http')
- 調用http模塊里的createServer方法
const server = http.createServer()
- 為服務器實例綁定request事件
server.on('request',(req,res)=>{
回調函數執行內容
})
- 調用服務器實例的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模塊化規范
- 每個模塊內部,module變量代表當前模塊。
- module變量是一個對象,它的exports/module.exports屬性是對外接口
- 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包必須滿足這幾個條件
- 包必須以單獨的目錄而存在
- 包的頂級目錄下必須包含 package.json
- 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