Windows 10 下 Node.js 入門

例子工程在此下載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:\Program Files\nodejs\

C:\Users\%USERNAME%\AppData\Roaming\npm 

 nvm —— Node.js 多版本管理工具

這是一個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

Visual Studio Code 1.10+

  • 在 Debug 面板中,點擊設置按鈕打開 .vscode/launch.json,選擇 "Node.js" 進行初始化構建。

 

 

Node.js如何對 js 模塊(commonjs下一個文件一個模塊)編譯

模塊知識,參考讀書筆記中主要在這裏:

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命令

npm命令入門

package.json 是管理本地項目依賴性的描述文件

package.json file:

  • 列出依賴 lists the packages that your project depends on.
  • 指定依賴包的版本 allows you to specify the versions of a package that your project can use using semantic versioning rules.語義化版本
  • 使得你的編譯能夠重現,別人拿到工程也輕鬆能實現編譯 makes your build reproducible, and therefore much easier to share with other developers.

項目根目錄下,輸入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"
  • 若是你本身的模塊依賴於某個包,並經過 Node.js 的 require 加載,那麼你應該選擇本地安裝,這種方式也是 npm install 命令的默認行爲。
  • 若是你想將包做爲一個命令行工具,(好比 grunt CLI),那麼你應該選擇全局安裝

npm install <package_name>

淘寶npm鏡像

npm連海外網絡不佳,能夠經過cnpm代替

https://npm.taobao.org/

經過命令看如今的網址。默認網址是   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.016.2.x、16.2
兼容模塊新發布的小版本、補丁版本:^16.2.016.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

 npm安裝時保存到package.json中

參數 --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.js 的定時器

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");

Node.js 的JavaScript 對象類型繼承

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 的事件

 Node.js 的死循環,推出的標誌就是是否還有執行中的代碼,以及是否還有事件隊列裏的事件須要處理。都沒有就退出了。

ES6風格

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
    console.log('觸發事件');
});
myEmitter.emit('event');

util風格

const EventEmitter = require('events');
const util = require("util");

function MyEmitter()
{
    EventEmitter.call(this);
}

util.inherits(MyEmitter, EventEmitter);

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
    console.log('觸發事件11');
});
myEmitter.emit('event');
相關文章
相關標籤/搜索