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