例子工程在此下載javascript
Windows 下 Node.js 入門java
NodeJS的歷史就不說了,別人說過了。最最關鍵Google JavaScript V8 開發成功,運行效率很高,開放二次開發接口(C++庫,功能相似常見的Lua,Python等腳本的的開放庫)。原本V8主要給Chrome瀏覽器服務的,經不住運行效率太優秀了,因此就有人動起了開發Native端的JavaScript運行環境的主意。NodeJS是這個思路的產物。node
這是官網git
https://nodejs.org/ 英文github
https://nodejs.org/zh-cn/ 中文(除了API其它都中文了)npm
這個是一個有質量上乘的中文API NodeJS API文檔的網址。json
NodeJS中文網 http://nodejs.cn/gulp
這是一箇中文書籍《深刻淺出nodejs》的他人寫的讀書筆記。windows
nodejs深刻學(1)概述 https://www.jianshu.com/p/37d16a63fbb9visual-studio-code
在Windows上的安裝,參考中文官網連接吧。
安裝後,在Windows的CMD窗口經過 node -v, npm -v 檢查安裝正確性。
能夠書寫一個index.js, 內部只需下面一行代碼,經過 node index.js 運行試試。
console.log("Hello Node JS, " + new Date());
和編寫客戶端瀏覽器JavaScript相比,爲NodeJs編寫應用主要的新知識點是它組織模塊代碼的思路。模塊思路必定要懂,要作到能手寫多模塊簡單應用。
上面的讀書筆記需完整看完再加一點練習應該可以開竅。開不了竅說明JavaScript基礎還不行,請基礎踏實了再前行。
這裏給出一個使用JavaScript語言手寫NodeJS上運行的經過多模塊來組織代碼的簡單例子應用。
參考最上方附件吧。代碼就不貼了。不會運行例子說明學習程度不夠,你明的。
安裝後,Node.js 給環境變量 PATH 增長了兩個值。這個路徑尤爲是後面npm那個路徑,得常常去看看。
C:\Users\%USERNAME%\AppData\Roaming\npm
這是一個nvm掃盲貼
https://www.jianshu.com/p/d0e0935b150a
咱們經常須要同時支持多個Node.js版本,例如你在node v8上開發了一個項目,在node v10開發了另一個項目。這是同時維護兩個版本就費心費力了。
nvm能夠處理這個問題。下面是windows10上nvm的安裝網址
https://github.com/coreybutler/nvm-windows/releases 下載 nvm-setup.zip
安裝後的路徑在這裏
C:\Users\winsai\AppData\Roaming\nvm
下載的node版本也在這裏
》》先卸載Windows 10 已有的Node.js 安裝
》》解壓nvm-setup.zip 安裝
》》進入cmd,nvm v 看nvm版本
》》nvm list available 看能夠安裝的版本,找LTS(Long Term Support 提供長期技術支持)那一列的版本號
| CURRENT | LTS | OLD STABLE | OLD UNSTABLE | |--------------|--------------|--------------|--------------| | 11.4.0 | 10.14.2 | 0.12.18 | 0.11.16 | | 11.3.0 | 10.14.1 | 0.12.17 | 0.11.15 | | 11.2.0 | 10.14.0 | 0.12.16 | 0.11.14 | | 11.1.0 | 10.13.0 | 0.12.15 | 0.11.13 | | 11.0.0 | 8.14.0 | 0.12.14 | 0.11.12 | | 10.12.0 | 8.13.0 | 0.12.13 | 0.11.11 | | 10.11.0 | 8.12.0 | 0.12.12 | 0.11.10 | | 10.10.0 | 8.11.4 | 0.12.11 | 0.11.9 |
》》nvm install 10.14.2
》》nvm install 8.9.0
》》nvm list 看看安裝了幾個nodejs版本,哪一個是當前版本
》》nvm use 10.14.2 切換版本
》》node -v && npm -v 看看當前node版本
》》nvm use 8.9.0 切換版本
》》node -v && npm -v 看看當前node版本
其餘系統的nvm安裝網址參考這個文檔
https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
node --inspect 支持調試器 https://nodejs.org/zh-cn/docs/guides/debugging-getting-started
.vscode/launch.json
,選擇 "Node.js" 進行初始化構建。
模塊知識,參考讀書筆記中主要在這裏:
https://www.jianshu.com/p/20f73da34044
基於CommonJS模塊規範,每個模塊文件都包含require、exports、module三個變量,同時,node API中還提供了__filename、__dirname這兩個變量。這些,都是在編譯過程當中,由node進行的包裝,並自動添加的,咱們看一下編譯後的樣子:
(function (exports, require, module, __filename, __dirname) { var math = require('math'); exports.area = function (radius) { return Math.PI * radius * radius; }; });
package.json是node npm工程描述。經過npm init 能夠建立。
npx命令
https://www.jianshu.com/p/cee806439865
npm命令https://www.npmjs.cn/ https://www.npmjs.com/npm命令
package.json 是管理本地項目依賴性的描述文件
A package.json
file:
項目根目錄下,輸入npm init -y 能夠快速初始化一個 package.json。其中name和version屬性是必須須要的。
經過下列命令能夠修改npm init 默認值
> npm set init.author.email "wombat@npmjs.com" > npm set init.author.name "ag_dubs" > npm set init.license "MIT"
require
加載,那麼你應該選擇本地安裝,這種方式也是 npm install
命令的默認行爲。npm install <package_name>
npm連海外網絡不佳,能夠經過cnpm代替
經過命令看如今的網址。默認網址是 https://registry.npmjs.org/
npm config get registry
方法1 執行命令,之後npm都是經過taobao npm鏡像安裝
npm config set registry https://registry.npm.taobao.org
若是感受錯了,修改回來能夠經過
npm config set registry https://registry.npmjs.org/
方法2 執行下面命令,之後cnpm命令能夠經過taobao npm鏡像安裝,原來的npm仍是訪問海外地址。(注意--registry是本次npm安裝<這裏是安裝cnpm>使用哪一個鏡像的意思)
npm install -g cnpm --registry=https://registry.npm.taobao.org
package.json 能夠增長 dependencies devDependencies 兩個屬性指明運行時依賴包和開發室依賴包。
其中,包的版本就須要版本號規範semver
https://semver.org/lang/zh-CN/
http://www.javashuo.com/article/p-btfxutzf-ky.html
常見的這樣用
兼容模塊新發布的補丁版本:~16.2.0、16.2.x、16.2 兼容模塊新發布的小版本、補丁版本:^16.2.0、16.x、16 兼容模塊新發布的大版本、小版本、補丁版本:*、x
升級補丁版本號:npm version patch 升級小版本號:npm version minor 升級大版本號:npm version major
major.minor.patch
major 大版本,版本之間不兼容
minor 小版本,增長了功能,但保持大版本兼容,例如能用1.6.x,那麼就能用1.7.x
patch 補丁版本,功能不增長,修復了bug。例如1.6.0和1.6.1
參數 --save 運行依賴 例如 npm installl gulp --save
"dependencies": {
"gulp": "^4.0.0"
}
參數 --save-dev 開發依賴 npm installl gulp --save-dev
分享工程時,不須要把node_module上傳(例如不用傳到svn, git中)
只須要在新環境 npm install 就經過package.json的描述把依賴包下載下來。
node的內部實現是一個單線程,無限循環,沒有事件就退出(有點像遊戲引擎無限循環的寫法)
定時器有三種 setTimeout setImmediate process.nextTick,其中setTimeout 事件才客戶端服務端代碼通用
例如
var process = require("process");
console.log("first log 44");
setTimeout(function(arg){
console.log("setTimeout 11, " + arg + ", " + new Date());
}, 0, "my args1");
setImmediate(function(arg){
console.log("setImmediate 22, " + arg + ", " + new Date());
}, "my args2");
process.nextTick(function(arg){
console.log("process.nextTick 33, " + arg + ", " + new Date());
}, "my args3");
JavaScript的繼承是經過原型鏈prototype繼承的。ES6有內建 class 和 extends 可是那須要客戶端有IE9或以上。本博客奔着TypeScript 去的,就不理會啥ES6了。
const util = require('util');
const EventEmitter = require('events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
};
Node.js 的死循環,推出的標誌就是是否還有執行中的代碼,以及是否還有事件隊列裏的事件須要處理。都沒有就退出了。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('觸發事件');
});
myEmitter.emit('event');