node及node周邊

走在前端的大道上javascript

本文記錄本身 nodejs 學習過程當中的一些知識點html

最後更新時間 2018年1月18日前端

1.node 版本控制工具 nvm

NVM——Node Version Manager(Node版本管理器),用它能夠方便的在機器上安裝並維護多個Node的版本。那麼爲何須要多個版本呢?場景有不少,比方說:你可能同時進行兩個項目,而不一樣項目所使用的node版本是不同的;又或者你要用更新的版本是作一些實驗。java

有須要的同窗能夠查看我以前總結的文章 Windows下安裝 node 的版本控制工具 nvmnode


2.npm 包鏡像地址切換工具 nrm

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
  • cnpm
  • nodejitsu
  • taobao
  • rednpm

3.npm 包版本更新工具npm-check-updates

npm-check-updates能夠將package.jsonbower.json中的依賴項升級到最新版

clipboard.png

安裝

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-check-updates

4.npm 更新

$ npm i -g npm

5.node進程管理器

在初上手Node.js開發的時候,咱們要啓動一個服務,使用的是 node 命令:

node myapp

然而,node告訴咱們,服務端的js代碼只有在node第一次引用,纔會從新加載;若是node已經加載了某個文件,即便咱們對它進行了修改, node也不會從新加載這個文件。

那麼,在開發過程當中,要如何才能像PHP同樣,修改某個文件後,直接刷新網頁就能看到效果呢?

方法有不少,好比使用 Supervisor、pm二、forever 等來管理。

開發環境下進程管理器 Supervisor

1.安裝

在開發過程當中,每次修改代碼保存後,咱們都須要手動重啓程序,才能查看改動的效果。使用 supervisor 能夠解決這個繁瑣的問題,全局安裝 supervisor。這裏注意一點的就是,supervisor必須安裝到全局,若是你不安裝到全局,錯誤命令會提示你安裝到全局。

npm install -g supervisor

2.基本使用

最經常使用、最快捷的方式,就是直接進入你的網站根目錄,執行:

supervisor myapp

這裏要說明的一點是,不論你的網站服務啓動文件在什麼位置,你必須在根目錄啓動它。

舉個例子

Express4.0中,啓動文件位於 ./bin/www 中,則咱們啓動時,必須在 ./ 中執行:

supervisor bin/www

clipboard.png

而不能進入 bin 目錄執行: supervisor www。這樣雖然有可能也能啓動,但這麼作至關於把 bin 目錄看成了服務的根目錄了,一旦有涉及到文件目錄的操做,必定會出錯的。

另外,執行完這個命令後,咱們的網站服務就已經啓動了;不過,須要注意的是,這種方式啓動的服務,是默認監控全部文件、文件夾的變化的;一旦有變化,服務就會重啓

這樣就出現了一些問題:咱們會將一些日誌文件存入某些文件夾,或者用戶會上傳附件到服務器;而這樣的操做都致使了服務器文件的變化,必然會引發node服務器的重啓。試想一下,若是每一次上傳都重啓一次,那用戶操做一旦頻繁起來,服務器啥都不用幹,天天重啓就好了

因此說,supervisor的這種工做方式,僅僅適用於調試階段;甚至於有一些調試環境都不適合(好比調試服務器在遠程,網絡狀態不是很好的狀況下)。

3.使用方法
咱們在命令行中直接執行下邊命令,會獲得它的詳細使用方法

supervisor

若是想不監控某一些文件夾,可使用 -i 參數。如:咱們要忽略根目錄下的 private 文件夾,能夠這樣啓動:

supervisor -i ./private myapp

若是要忽略多個文件夾,則用英文的逗號,分隔:

supervisor -i ./private,./otherdir myapp

生產環境下進程管理器 pm2

當咱們的項目要部署到線上服務器時,不能單純的靠 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


6.node 基礎入門

本章節主要是學習 Node.js 概述 - 阮一峯 這本書的筆記,裏邊會結合本身掌握狀況簡化描述,也會在後續的學習中添加其餘書中未提到的知識點。

安裝略

6.1.1 執行js腳本,如當前目錄demo.js。

$ node demo
# 或者
$ node demo.js

使用-e參數,能夠執行代碼字符串。

$ node -e 'console.log("Hello World")'
Hello World

6.1.2 REPL環境

在命令行鍵入node命令,後面沒有文件名,就進入一個Node.js的REPL環境(Read–eval–print loop,」讀取-求值-輸出」循環),能夠直接運行各類JavaScript命令。

$ node
> 1+1
2
>

REPL是Node.js與用戶互動的shell,各類基本的shell功能均可以在裏面使用,好比使用上下方向鍵遍歷曾經使用過的命令。

特殊變量下劃線(_)表示上一個命令的返回結果。

> 1 + 1
2
> _ + 1
3

6.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);
  }
}

6.1.4 全局對象和全局變量

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

安裝 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
相關文章
相關標籤/搜索