走在前端的大道上javascript
本文記錄本身 nodejs 學習過程當中的一些知識點html
最後更新時間 2018年1月18日前端
NVM——Node Version Manager(Node版本管理器),用它能夠方便的在機器上安裝並維護多個Node的版本。那麼爲何須要多個版本呢?場景有不少,比方說:你可能同時進行兩個項目,而不一樣項目所使用的node版本是不同的;又或者你要用更新的版本是作一些實驗。java
有須要的同窗能夠查看我以前總結的文章 Windows下安裝 node 的版本控制工具 nvmnode
nrm就是npm registry manager 也就是npm的鏡像源管理工具,有時候國外資源太慢,那麼咱們能夠用這個來切換鏡像源。react
$ npm install -g nrm
用 nrm ls
能夠查看咱們能夠切換的地址webpack
$ nrm ls * npm ----- https://registry.npmjs.org/ cnpm ---- http://r.cnpmjs.org/ taobao - https://registry.npm.taobao.org/ nj ------ https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn skimdb - https://skimdb.npmjs.com/registry
提示:其中的*表明當前使用的地址web
切換shell
$ nrm use cnpm //switch registry to cnpm Registry has been set to: http://r.cnpmjs.org/
使用express
Usage: nrm [options] [command] Commands: ls List all the registries use <registry> Change registry to registry add <registry> <url> [home] Add one custom registry del <registry> Delete one custom registry home <registry> [browser] Open the homepage of registry with optional browser test [registry] Show the response time for one or all registries help Print this help Options: -h, --help output usage information -V, --version output the version number
Registries
npm-check-updates
能夠將package.json
或bower.json
中的依賴項升級到最新版
安裝
npm install -g npm-check-updates
使用
在當前目錄中顯示項目的全部新的依賴關係:
$ ncu
express 4.12.x → 4.13.x
multer ^0.1.8 → ^1.0.1
react-bootstrap ^0.22.6 → ^0.24.0
react-a11y ^0.1.1 → ^0.2.6
webpack ~1.9.10 → ~1.10.5
升級項目的包文件:
$ ncu -u express 4.12.x → 4.13.x
$ npm i -g npm
在初上手Node.js開發的時候,咱們要啓動一個服務,使用的是 node 命令:
node myapp
然而,node告訴咱們,服務端的js代碼只有在node第一次引用,纔會從新加載;若是node已經加載了某個文件,即便咱們對它進行了修改, node也不會從新加載這個文件。
那麼,在開發過程當中,要如何才能像PHP同樣,修改某個文件後,直接刷新網頁就能看到效果呢?
方法有不少,好比使用 Supervisor、pm二、forever 等來管理。
在開發過程當中,每次修改代碼保存後,咱們都須要手動重啓程序,才能查看改動的效果。使用 supervisor 能夠解決這個繁瑣的問題,全局安裝 supervisor。這裏注意一點的就是,supervisor必須安裝到全局,若是你不安裝到全局,錯誤命令會提示你安裝到全局。
npm install -g supervisor
最經常使用、最快捷的方式,就是直接進入你的網站根目錄,執行:
supervisor myapp
這裏要說明的一點是,不論你的網站服務啓動文件在什麼位置,你必須在根目錄啓動它。
舉個例子
Express4.0中,啓動文件位於 ./bin/www 中,則咱們啓動時,必須在 ./ 中執行:
supervisor bin/www
而不能進入 bin 目錄執行: supervisor www。這樣雖然有可能也能啓動,但這麼作至關於把 bin 目錄看成了服務的根目錄了,一旦有涉及到文件目錄的操做,必定會出錯的。
另外,執行完這個命令後,咱們的網站服務就已經啓動了;不過,須要注意的是,這種方式啓動的服務,是默認監控全部文件、文件夾的變化的;一旦有變化,服務就會重啓
這樣就出現了一些問題:咱們會將一些日誌文件存入某些文件夾,或者用戶會上傳附件到服務器;而這樣的操做都致使了服務器文件的變化,必然會引發node服務器的重啓。試想一下,若是每一次上傳都重啓一次,那用戶操做一旦頻繁起來,服務器啥都不用幹,天天重啓就好了
因此說,supervisor
的這種工做方式,僅僅適用於調試階段;甚至於有一些調試環境都不適合(好比調試服務器在遠程,網絡狀態不是很好的狀況下)。
3.使用方法
咱們在命令行中直接執行下邊命令,會獲得它的詳細使用方法
supervisor
若是想不監控某一些文件夾,可使用 -i 參數。如:咱們要忽略根目錄下的 private 文件夾,能夠這樣啓動:
supervisor -i ./private myapp
若是要忽略多個文件夾,則用英文的逗號,分隔:
supervisor -i ./private,./otherdir myapp
當咱們的項目要部署到線上服務器時,不能單純的靠 node index 或者 supervisor index 來啓動了,由於咱們斷掉 SSH 鏈接後服務就終止了,這時咱們就須要像 pm2 或者 forever 這樣的進程管理器了。pm2 是 Node.js 下的生產環境進程管理工具,就是咱們常說的進程守護工具,能夠用來在生產環境中進行自動重啓、日誌記錄、錯誤預警等等。pm2官方文檔
以 pm2 爲例,全局安裝 pm2:
首先須要安裝pm2:
npm install -g pm2
運行:
pm2 start www.js
或者 修改 package.json中的start命令,而後運行 npm start 經過 pm2 啓動程序
"scripts": { "start": "pm2 start ./bin/www" }
經常使用命令總結以下:
安裝pm2 | npm install -g pm2 |
啓動應用 | pm2 start app.js |
列出全部應用 | pm2 list |
查看資源消耗 | pm2 monit |
查看某一個應用狀態 | pm2 describe [app id] |
查看全部日誌 | pm2 logs |
重啓應用 | pm2 restart [app id] |
中止應用 | pm2 stop [app id] |
開啓api訪問 | pm2 web |
本節參考文章:
1.pm2
2.詳細版 | 用Supervisor守護你的Node.js進程
3.supervisor與pm2
本章節主要是學習 Node.js 概述 - 阮一峯 這本書的筆記,裏邊會結合本身掌握狀況簡化描述,也會在後續的學習中添加其餘書中未提到的知識點。
安裝略
$ node demo # 或者 $ node demo.js
使用-e參數,能夠執行代碼字符串。
$ node -e 'console.log("Hello World")' Hello World
在命令行鍵入node命令,後面沒有文件名,就進入一個Node.js的REPL環境(Read–eval–print loop,」讀取-求值-輸出」循環),能夠直接運行各類JavaScript命令。
$ node > 1+1 2 >
REPL是Node.js與用戶互動的shell,各類基本的shell功能均可以在裏面使用,好比使用上下方向鍵遍歷曾經使用過的命令。
特殊變量下劃線(_)表示上一個命令的返回結果。
> 1 + 1 2 > _ + 1 3
Node採用V8引擎處理JavaScript腳本,最大特色就是單線程運行,一次只能運行一個任務。這致使Node大量採用異步操做(asynchronous opertion),即任務不是立刻執行,而是插在任務隊列的尾部,等到前面的任務運行完後再執行。
因爲這種特性,某一個任務的後續操做,每每採用回調函數(callback)的形式進行定義。
var isTrue = function(value, callback) { if (value === true) { callback(null, "Value was true."); } else { callback(new Error("Value is not true!")); } }
上面代碼就把進一步的處理,交給回調函數callback。
Node約定,若是某個函數須要回調函數做爲參數,則回調函數是最後一個參數。另外,回調函數自己的第一個參數,約定爲上一步傳入的錯誤對象。
var callback = function (error, value) { if (error) { return console.log(error); } console.log(value); }
上面代碼中,callback的第一個參數是Error對象,第二個參數纔是真正的數據參數。這是由於回調函數主要用於異步操做,當回調函數運行時,前期的操做早結束了,錯誤的執行棧早就不存在了,傳統的錯誤捕捉機制try…catch對於異步操做行不通,因此只能把錯誤交給回調函數處理。
try { db.User.get(userId, function(err, user) { if(err) { throw err } // ... }) } catch(e) { console.log(‘Oh no!’); }
上面代碼中,db.User.get方法是一個異步操做,等到拋出錯誤時,可能它所在的try…catch代碼塊早就運行結束了,這會致使錯誤沒法被捕捉。因此,Node統一規定,一旦異步操做發生錯誤,就把錯誤對象傳遞到回調函數。
若是沒有發生錯誤,回調函數的第一個參數就傳入null。這種寫法有一個很大的好處,就是說只要判斷回調函數的第一個參數,就知道有沒有出錯,若是不是null,就確定出錯了。另外,這樣還能夠層層傳遞錯誤。
if(err) { // 除了放過No Permission錯誤意外,其餘錯誤傳給下一個回調函數 if(!err.noPermission) { return next(err); } }
Node提供如下幾個全局對象,它們是全部模塊均可以調用的。
global:表示Node所在的全局環境,相似於瀏覽器的window對象。須要注意的是,若是在瀏覽器中聲明一個全局變量,其實是聲明瞭一個全局對象的屬性,好比var x = 1等同於設置window.x = 1,可是Node不是這樣,至少在模塊中不是這樣(REPL環境的行爲與瀏覽器一致)。在模塊文件中,聲明var x = 1,該變量不是global對象的屬性,global.x等於undefined。這是由於模塊的全局變量都是該模塊私有的,其餘模塊沒法取到。process:該對象表示Node所處的當前進程,容許開發者與該進程互動。
console:指向Node內置的console模塊,提供命令行環境中的標準輸入、標準輸出功能。
Node還提供一些全局函數
setTimeout():用於在指定毫秒以後,運行回調函數。實際的調用間隔,還取決於系統因素。間隔的毫秒數在1毫秒到2,147,483,647毫秒(約24.8天)之間。若是超過這個範圍,會被自動改成1毫秒。該方法返回一個整數,表明這個新建定時器的編號。
clearTimeout():用於終止一個setTimeout方法新建的定時器。
setInterval():用於每隔必定毫秒調用回調函數。因爲系統因素,可能沒法保證每次調用之間正好間隔指定的毫秒數,但只會多於這個間隔,而不會少於它。指定的毫秒數必須是1到2,147,483,647(大約24.8天)之間的整數,若是超過這個範圍,會被自動改成1毫秒。該方法返回一個整數,表明這個新建定時器的編號。
clearInterval():終止一個用setInterval方法新建的定時器。
require():用於加載模塊。
Buffer():用於操做二進制數據。
Node提供兩個全局變量,都以兩個下劃線開頭。
__filename:指向當前運行的腳本文件名。 __dirname:指向當前運行的腳本所在的目錄。
除此以外,還有一些對象其實是模塊內部的局部變量,指向的對象根據模塊不一樣而不一樣,可是全部模塊都適用,能夠看做是僞全局變量,主要爲module, module.exports, exports等。
安裝 node-sass 的時候老是會各類不成功
正確姿式
在項目目錄 執行
macOS 系統直接運行下面的命令便可:
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
windows下的同窗能夠拆分紅兩個命令
set SASS_BINARY_SITE=https://npm.taobao.org/mirror... npm install node-sass