先來簡單介紹nodeJS
我們知道JavaScript是運(yùn)行在瀏覽器中的,瀏覽器為它提供了一個上下文(context),從而讓JavaScript得以解析執(zhí)行。
nodeJS其實(shí)可以這么理解,它是另外一種上下文,它允許在后端(脫離瀏覽器環(huán)境)解析執(zhí)行JavaScript代碼。
因?yàn)樗褂昧薌oogle的V8虛擬機(jī)(Google的Chrome瀏覽器使用的上下文環(huán)境),所以代碼可以同理德被執(zhí)行。
nodeJS除了可以在瀏覽器端顯示結(jié)果之外,還可以直接在控制臺輸出。
nodeJS的特點(diǎn)
nodeJS主要有非阻塞、基于事件驅(qū)動、單進(jìn)程這幾個特點(diǎn)。NodeJS的作者說,他創(chuàng)造NodeJS的目的是為了實(shí)現(xiàn)高性能Web服務(wù)器,他首先看重的是事件機(jī)制和異步IO模型的優(yōu)越性,而不是JS它更適用于輕量、可伸縮,適于實(shí)時數(shù)據(jù)交互應(yīng)用。nodeJS內(nèi)置了很多對象,比如http,fs等,我們可以用它搭建我們的HTTP服務(wù)器,在服務(wù)器上進(jìn)行開發(fā)。
安裝
對于我自己來說,很少進(jìn)linux去干活,所以目前只有Windows端的安裝方式。Linux的安裝方式自己網(wǎng)上搜一搜吧..我貼一下別人的
先安裝依賴包 sudo apt-get install g++ curl libssl-dev apache2-utils sudo apt-get install git-corethengit clone git://github.com/joyent/node.git cd node ./configure make sudo make install
聽說要注意Python版本的問題,建議2.6+的版本,低版本會出現(xiàn)Node安裝錯誤,
查詢Python版本可在終端中輸入:pyhton -v
Windows下
安裝很簡單,上官網(wǎng),把最新版本的msi文件下載下來,直接安裝~可以修改路徑。

一路下去無阻礙

安裝成功之后最新版本的默認(rèn)已經(jīng)幫你放進(jìn)系統(tǒng)路徑里邊去了,不必管了。
之后可以到開始菜單里邊找到nodeJS打開其命令行進(jìn)入,默認(rèn)是進(jìn)入C盤的,一般還是切換到安裝路徑所在盤,比如我的是E盤


看nodeJS是否安裝成功,查看其版本號 node -v
然后簡單地測試一下,先輸入node命令,然后直接控制臺輸入console.log("hello");
因?yàn)閏onsole.log方法實(shí)際上是有返回值的,這里沒有給他返回,所以第二個就是undefined

再來測試一下,這次我們要看見 Hello World !
在安裝路徑下(比如我是E:/Program Files/nodejs)新建一個main.js 文件,輸入
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World/n'); }).listen(3000, "127.0.0.1"); console.log('Server running at http://127.0.0.1:3000/'); 然后在里邊輸入 node main.js 執(zhí)行(一般node里邊退出就是按一次或兩次 Ctrl+C ) ,這時服務(wù)器就已經(jīng)搭建好了~
瀏覽器中輸入其中的地址:http://localhost:3000
我們的Hello World 出來了~

然后先來解釋一下這小段代碼。
var http = require('http');上面說到了,http是nodeJS里邊內(nèi)置的對象模塊,我們使用require這種方式把它引進(jìn)來(對象模塊一般就是這么引入的,我們也可以自己建立自己的模塊,然后將它們引入,之后再提到)。
然后http現(xiàn)在這個對象模塊有一個方法是,http.createServer(),這個方法創(chuàng)建一個服務(wù)之后再監(jiān)聽一個地址:http.createServer().listen(port,ip)
從而搭建了一個服務(wù)器。
createServer()里邊有一個匿名函數(shù),主要就是用來處理相關(guān)信息了。req是請求request,res是回復(fù)response。req一般用于請求階段的解析處理等,比如常見的get中的地址欄url字符的處理。res一般用于收到請求后相應(yīng)的操作,比如寫響應(yīng)頭響應(yīng)體渲染頁面等等。
在這里,res.writeHead(200, {'Content-Type': 'text/plain'});就相當(dāng)于寫了個響應(yīng)頭,res.end('Hello World/n');相當(dāng)于寫了個響應(yīng)體。
nodeJS提供了很多內(nèi)置對象方法,比如http,fs,EventEmitter,url等等
這些東西的使用建議參考官方文檔
或者taobao建立的平臺CNodejs,去里邊逛逛吧
還有這個7天學(xué)會nodeJS
基本的HTTP服務(wù)器搭建就是這樣了,下面介紹node強(qiáng)大的工具npm(node packages manager,包管理工具)。
它主要用于管理我們的包,下載安裝包或者卸載包等等。
舊版本的node需要自個去下載安裝,不過新版本的已經(jīng)集成了。所以直接在這里輸入npm -v 查看它的版本吧~

npm安裝方式一般說來有兩種,全局或者本地
好那我們就先來體驗(yàn)下,裝個express框架吧。
(express.js是nodejs的一個MVC開發(fā)框架,并且支持jade,ejs等多種模板)
我們可以使用兩種方式安裝:
全局安裝:npm install --g express .(我發(fā)現(xiàn)--g或者-g皆可)這種方式會把包安裝到全局路徑里邊,一般是C盤的npm/node_modules/下邊
哇哦....

不要在意那些錯誤..
接下來用我想express -V(大寫的)查看它的版本吧

有些朋友可能會遇到錯誤,這里貼個某網(wǎng)友的的~

解決方式如其所說:新版本將命令工具分家了,所以先另外再安裝它npm install -g express-generator

我說過了,不要在意上面那些細(xì)節(jié)..O_O
好了,現(xiàn)在我們來試試express ?
還是那個main.js 我們把它改成這樣:
var express = require("express");//var app = express.createServer(); // 在新版本已經(jīng)不兼容了,所以直接用下面那個var app = express(); // 或者直接 var app= require("express")();var port = 3000;var ip = "127.0.0.1";app.listen(port,ip);// ip 這個參數(shù)可不寫,默認(rèn)本地app.get('/',function(req,res){ res.send("Hello World/n");});console.log("start express server/n");如上所示,新版本可能會報錯沒那個方法
express封裝了http,所以可以直接使用它定義的方法了
然后瀏覽器輸入http://localhost:3000/ 又是

然后再來簡單介紹上面的代碼。其余都不必說了,說一下app.get() 其實(shí)這就是一個路由處理。
好那我們來試試路由的處理~
var express = require("express");//var app = express.createServer(); // 在新版本已經(jīng)不兼容了,所以直接用下面那個var app = express(); // 或者直接 var app= require("express")();var port = 3000;var ip = "127.0.0.1";app.listen(port,ip);// ip 這個參數(shù)可不寫,默認(rèn)本地app.get('/',function(req,res){ res.send("Hello World/n");});app.get('/one',function(req,res){ // 或者“/one/ res.send("one/n");});app.get('/user',function(req,res){ //或者 "/user/" res.send("user/n");});app.get('/user/:id',function(req,res){ //或者 "/user/" res.send("user: "+req.params.id);});console.log("start express server/n");如上所示,get的第一個參數(shù)就是路徑地址,第二個參數(shù)就是回調(diào)函數(shù)。
你使用不同的地址路徑,就可以進(jìn)行不同的操作了。
比如瀏覽器地址的不同可路由:




上頭那個user/11中的11就被當(dāng)做user的參數(shù)id值。我們可以通過req.params這個全局方法來獲取相應(yīng)的參數(shù)值 req.params.id
對于express,其實(shí)有一種更普遍的方法,那就是直接用它來創(chuàng)建一個項目:
比如,我要創(chuàng)建項目express_test 就輸入
express -e express_test

好了,項目創(chuàng)建成功,看一下它的結(jié)構(gòu)吧~

項目創(chuàng)建成功之后,生成四個文件夾,主文件app.js與配置信息文件packetage.json
bin是項目的啟動文件,配置以什么方式啟動項目,默認(rèn) npm start
public是項目的靜態(tài)文件,放置js css img等文件
routes是項目的路由信息文件,控制地址路由
views是視圖文件,放置模板文件ejs或jade等(其實(shí)就相當(dāng)于html形式文件啦~)
express這樣的MVC框架模式,是一個Web項目的基本構(gòu)成。
更細(xì)的部分先不考慮,我們先來簡單地啟動吧~

看到?jīng)]有,第一步出錯了,因?yàn)樗恢朗鞘裁错椖?,所以要先進(jìn)入你想要啟動的項目。cd express_test
然后又出錯了是怎么回事?
看到了吧,它找不到所需模塊,所以一般我們創(chuàng)建新項目的時候也要先給他安裝相應(yīng)的模塊。
我們直接使用npm install 就行了,它會自動檢測package.json文件下載安裝相應(yīng)的模塊

好吧,那就啟動吧~

ok,啟動成功,瀏覽器輸入地址查看一下~
默認(rèn)端口是3000,可以到bin里邊的www文件查看,或者自己修改吧~


哇哦~成功了!簡單的express項目就是這樣子了..
express模塊就先簡單地介紹到這來。更多的express后面會繼續(xù)講一講~
最后隨手談一下上面提到的require相關(guān)的知識
編寫稍大一點(diǎn)的程序時一般都會將代碼模塊化。在NodeJS中,一般將代碼合理拆分到不同的JS文件中,每一個文件就是一個模塊,而文件路徑就是模塊名。
在編寫每個模塊時,都有require、exports、module三個預(yù)先定義好的變量可供使用。
require函數(shù)用于在當(dāng)前模塊中加載和使用別的模塊,傳入一個模塊名,返回一個模塊導(dǎo)出對象。
模塊名可使用相對路徑(以./開頭),或者是絕對路徑(以/或C:之類的盤符開頭),模塊名中的.js擴(kuò)展名可以省略。
舉個例子:
var express = require("express");var func1 = require("./func1");// 是與當(dāng)前main.js同路徑下的func1.js模塊var func2 = require("../nodejs/func2");// func2.js則位于與main.js父文件同路徑下的exports對象是當(dāng)前模塊的導(dǎo)出對象,用于導(dǎo)出模塊公有方法和屬性。
別的模塊通過require函數(shù)使用當(dāng)前模塊時得到的就是當(dāng)前模塊的exports對象。
比如上面提到的func1.js
我們可以這樣寫代碼然后導(dǎo)出來:
exports.func1 = function(){ console.log("This is func1");};/*或者這樣function func1(){ console.log("This is func1");}exports.func1 = func1;*/module對象可以訪問到當(dāng)前模塊的一些相關(guān)信息,但最多的用途是替換當(dāng)前模塊的導(dǎo)出對象。
例如模塊導(dǎo)出對象默認(rèn)是一個普通對象,如果想改成一個函數(shù)的話,可以使用以下方式。
module.exports = function () { console.log('Hello World!'); };
這樣一來,模塊默認(rèn)導(dǎo)出對象被替換為一個函數(shù)。我們在main.js里邊就可以直接 var app = require("./func1")(); 操作了
還可以導(dǎo)出一個對象的形式:
//在func1.js里邊這樣module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; }; //然后在main.js里邊這樣var Func1 = require('./func1.js'); var r = new Func1('xiaoming', 12); r.about(); // xiaoming is 12 years old-----------好了 以上就是nodeJS的起步,有沒有發(fā)現(xiàn),好神奇..--------------
新聞熱點(diǎn)
疑難解答