Node.js 概述
- Node.js是一個(gè)基于Chrome V8 JavaScript引擎構(gòu)建的JavaScript運(yùn)行時(shí)。Node.js使用事件驅(qū)動(dòng)的非阻塞I / O模型,使其輕便且高效
- 在 Java,PHP,或者 ASP.NET 等服務(wù)器端語(yǔ)言中,為每個(gè)客戶端連接創(chuàng)建一個(gè)新的線程,而 Node.js 是為每個(gè)客戶端觸發(fā)一個(gè) 在Node.js內(nèi)部進(jìn)行處理的事件.因此,使用 Node.js 可以同時(shí)處理多達(dá)幾萬(wàn)個(gè)用戶客戶端連接.
- Node.js 適合開(kāi)發(fā)的應(yīng)用程序:當(dāng)應(yīng)用程序需要處理大量并發(fā)的輸入/輸出,而在向客戶端發(fā)出響應(yīng)之前,應(yīng)用程序內(nèi)部不需要進(jìn)行非常復(fù)雜的處理的時(shí)候,應(yīng)該考慮使用Node.js 進(jìn)行開(kāi)發(fā)該應(yīng)用程序.栗子:聊天服務(wù)器;綜合服務(wù)類網(wǎng)站或者電子商務(wù)網(wǎng)站的服務(wù)器.
Node的核心特性 : 單線程 非阻塞I/O 事件驅(qū)動(dòng)
安裝
簡(jiǎn)便辦法 (Windows 和 macOS 用戶初上手時(shí)建議使用此方法)
https://nodejs.org/en/download/
或者用系統(tǒng)的包管理器 (老手或 Linux 上用此方法可能更佳)
https://nodejs.org/en/download/package-manager/
NPM 入門(mén)
NPM ?(Node Package Manager) 是 Node.js 的包管理器,會(huì)隨著 Node.js 一起安裝
[slide]
為什么要使用包管理器
- 因?yàn)槭謩?dòng)安裝很累很麻煩
- 手動(dòng)維護(hù)版本更麻煩
- 有了包管理器,可以(一定程度上)減少這些麻煩
cnmp
- cnmp : 使用淘寶的鏡像源
npm config set registry https://registry.npm.taobao.org
但是要注意這樣會(huì)無(wú)法把你寫(xiě)的包發(fā)布出去 (也就是說(shuō)發(fā)布的時(shí)候要先拿掉這個(gè)設(shè)置)
或者使用 cnpm
使用 NPM
全局安裝
npm install <package_name> -g
?安裝到全局目錄下的 node_modules 目錄里
使用機(jī)會(huì)不是很多,基本只適用于安裝一些命令行工具
局部安裝 Part 1
npm install <package_name>
此方法會(huì)在當(dāng)前目錄生成 node_modules 目錄,并把文件放進(jìn)去
- 由于只在當(dāng)前目錄安裝,不會(huì)干擾到全局目錄 (也就是說(shuō)電腦上其它項(xiàng)目不會(huì)受影響),理論上應(yīng)該是很好的方式
- 但是實(shí)際生活中為了處理依賴關(guān)系,往往會(huì)使用 package.json,局部安裝的時(shí)候也往往不會(huì)只這么直接?安裝了事
- 注意: 提交代碼到 git 服務(wù)器的時(shí)候 不要 帶上 node_modules 目錄。這個(gè)目錄可能會(huì)很大!
創(chuàng)建 package.json
創(chuàng)建 package.json 最簡(jiǎn)單的辦法就是在項(xiàng)目目錄執(zhí)行
npm init
執(zhí)行后會(huì)詢問(wèn)很多選項(xiàng)問(wèn)題,可以?一路回車,完成后就會(huì)在當(dāng)前目錄生成 package.json
局部安裝 Part 2
有了 package.json 就可以開(kāi)始?在局部安裝的同時(shí)指定依賴關(guān)系
npm install <package_name> --save
安裝并添加 生產(chǎn)環(huán)境 的依賴,會(huì)添加到 package.json 的 dependencies 里
npm install <package_name> --save-dev
安裝并添加 開(kāi)發(fā)環(huán)境 的依賴,會(huì)添加到 package.json 的 devDependencies 里
npm install
根據(jù) package.json 的依賴關(guān)系自動(dòng)安裝所有需要安裝的包 (比如從 github 上 clone 了別人的項(xiàng)目的時(shí)候)
--save-dev 與 --save區(qū)別
- 1.--save-dev 是你開(kāi)發(fā)時(shí)候依賴的東西(例如:babel,壓縮等開(kāi)發(fā)時(shí)需要),--save 是你發(fā)布之后還依賴的東西(例如:jQuery等)。
- 2.正常使用npm install時(shí),會(huì)下載dependencies和devDependencies中的模塊,當(dāng)使用npm install --production或者注明NODE_ENV變量值為production時(shí),只會(huì)下載dependencies中的模塊。
運(yùn)行
來(lái)小試一下,編輯并保存一個(gè)名為 app.js 的文件,內(nèi)容為
console.log('hello world')
然后執(zhí)行
node app.js
即可看到運(yùn)行結(jié)果
導(dǎo)入和導(dǎo)出
導(dǎo)入
可以用 require 導(dǎo)入其它模塊
let fs = require('fs')
或者導(dǎo)入本地文件
let a = require('./a.js')
導(dǎo)入規(guī)則如下:
Node.js 有一些核心模塊,加載時(shí)的優(yōu)先級(jí)別最高
有
/或者./作為開(kāi)頭,則會(huì)被認(rèn)為是本地文件。導(dǎo)入本地文件時(shí)如果不指定后綴,會(huì)按照 .js、.json、.node 的順序依次嘗試如果核心模塊里沒(méi)找到,也沒(méi)有以
/或者./作為開(kāi)頭,則會(huì)嘗試從node_modules目錄里加載。如果還沒(méi)有找到,則會(huì)嘗試在父一級(jí)進(jìn)行查找,直至找到或者抵達(dá)根目錄
目錄也可以作為模塊導(dǎo)入,具體在這里不展開(kāi)講解
導(dǎo)出
假設(shè)有如下兩個(gè)文件
foo.js
let circle = require('./circle.js')
console.log( 'The area of a circle of radius 4 is '
+ circle.area(4))
circle.js
let PI = Math.PI
exports.area = function (r) {
return PI * r * r
}
exports.circumference = function (r) {
return 2 * PI * r
}
circle.js 模塊輸出了 area() 和 circumference() 函數(shù)。
如果你想讓模塊導(dǎo)出成一個(gè)函數(shù)(比如構(gòu)造函數(shù)),或者你想導(dǎo)出一個(gè)完整對(duì)象, 那就使用 module.exports,而不是 exports。
例如
bar.js
let square = require('./square.js')
let mySquare = square(2)
console.log('The area of my square is ' + mySquare.area())
square.js
module.exports = function(width) {
return {
area: function() {
return width * width
}
}
}
square.js 模塊導(dǎo)出了構(gòu)造函數(shù)