1、介紹css
Node.js是一個讓JavaScript運行在服務器端的開發平臺,它讓JavaScript的觸角伸到了服務器端。html
但Node彷佛有點不一樣:node
● Node.js不是一種獨立的語言,與PHP、JSP、Python、Perl、Ruby的「既是語言,也是平臺」不一樣,Node.js的使用JavaScript進行編程,運行在JavaScript引擎上(V8)。程序員
● 與PHP、JSP等相比,Node.js跳過了Apache、Nginx、IIS等HTTP服務器,它本身不用建設在任何服務器軟件之上。Node.js的許多設計理念與經典架構(LAMP)有着很大的不一樣,能夠提供強大的伸縮能力。apache
Node.js自身哲學,是花最小的硬件成本,追求更高的併發,更高的處理性能。npm
2、安裝nodejs編程
Node的官網地址:https://nodejs.orgjson
Node的中文網站:http://nodejs.cn/api/api
提示:①若是你的電腦是32位的,你就下載32,通常是64的通常就是下載MSI版本的64位的就能夠。數組
②無腦下一步 node -v 查看的是node的版本號
環境變量的設置
①window+R->輸入CMD
②找打計算機此電腦點擊-屬性
③點擊高級系統設置
④選擇環境變量的設置按鈕
3、node的基本使用
一、提示:將JS文件直接拖拽到瀏覽器,你會發現執行不了,由於JS須要宿主環境,我們已經知道的宿主環境是靜態頁面。
for(var i = 0;i<10;i++){
if(i%2==0){
console.log(i);
}
}
二、宿主環境-node平臺
第一步:打開命令終端 window+R,
輸入CMD命令進入;
第二步:輸入cd(change directory) +空格 +文件夾的路徑(進入到某一個文件夾)
第三步:先運行那個JS文件你就node誰
node +js文件名
提示:按住shift+右鍵選擇(在此處打開命令窗口),想執行誰就node誰 node +tab(補齊js文件)
注意:①js文件當中有window、document對象嗎?
如今我們的JS文件沒有window對象,也沒有document,也沒有getElementByid這些東西都沒有了,所以如今的JS宿主環境是node,不是任何的瀏覽器,由於瀏覽器纔有window、document?
②如今的JS文件你能夠作哪些操做?
基本的JS語法均可使用,變量、循環語句、條件語句,函數;也就說JS語法的核心部分均可以使用;
若是你的JS文件發生變化,你須要再次保存,再次node才能執行;
4、搭建服務器
1初識node服務器
//須要引入內置的HTTP模塊 var http = require("http"); //返回的http對象有一個createServer方法,這個方法能夠建立服務器,傳遞是一個callBack //有兩個形參 req(請求) res(response) var server= http.createServer(function (req,res) { //輸出一些東西 //從新設置一下字符集 res.setHeader("Content-type","text/html;charset=utf8"); res.write("你好,我是node.js,歡迎訪問個人服務器"); res.write("<br/>"); res.write("<h1>我是h1標籤</h1>"); res.write("你好,我是node.js,歡迎訪問個人服務器"); res.write("你好,我是node.js,歡迎訪問個人服務器"); res.write("你好,我是node.js,歡迎訪問個人服務器"); res.write("你好,我是node.js,歡迎訪問個人服務器"); res.end("Hello Word"); }); //監聽端口號 0-6萬多,可是我們的apache已經佔用80 server.listen(3000);
注意: ①node一個特性:事件的驅動,當你訪問服務器的時候,服務才執行本身的回調函數;
②用Node生生的建立了一個服務器;哪怕用戶沒有node環境也能夠訪問個人服務器。
③若是你的服務器開啓,那麼你的終端窗口不能關閉;
④res.write、res.end這兩個方法當中不能出現數字,只能是字符串;
⑤當你改變js文件的時候,你會發現我們CMD窗口,光標一直掛起,ctr+c打破鼠標掛起的狀態;
⑥res.setHeader("Content-type","text/html;charset=utf8");這是一下響應頭;
⑦write方法能夠有多個,可是必需要有一個end的法方法,不然會一直加載;
二、外置頁面
//內置的http模塊 var http = require("http"); //須要一個fs內置模塊(file)server) var fs = require("fs"); http.createServer(function (req,res) { //系統內置的fs模塊有一個readFile一個方法 fs.readFile("./public/1.wangjunka.html",function (err,data) { res.end(data); }) }).listen(3000);
提示:①之後若是操做的是文件的操做,都是使用的內置fs,readFile(path,callBack)
3.路由(router)的學習
概述:路由就是我們的URL的設計,你會發現node當中的路由是咱們這些程序員能夠本身定義的。
//內置的http模塊 var http = require("http"); //須要一個fs內置模塊(file)server) var fs = require("fs"); http.createServer(function (req,res) { res.setHeader("Content-type","text/html;charset=utf8"); if(req.url==="/wangjunkai"){ //系統內置的fs模塊有一個readFile一個方法 fs.readFile("./public/1.wangjunka.html",function (err,data) { //輸出文件流 res.end(data); }) }else if(req.url==="/zhangjie"){ //系統內置的fs模塊有一個readFile一個方法 fs.readFile("./public/2.zhangjie.html",function (err,data) { //輸出文件流 res.end(data); }) }else{ res.end("對不起,你的URL有錯誤"); } }).listen(3000);
提示:①req這個請求的對象,自生有一個url屬性,能夠獲取到客戶端傳遞過來的URL的數據;
②就能夠和URL配合寫路由清單;
//內置的http模塊 var http = require("http"); //須要一個fs內置模塊(file)server) var fs = require("fs"); http.createServer(function (req,res) { //這個路由訪問的是王俊凱的頁面 if(req.url==="/wangjunkai"){ res.setHeader("Content-type","text/html;charset=utf8"); //系統內置的fs模塊有一個readFile一個方法 fs.readFile("./public/1.wangjunka.html",function (err,data) { //輸出文件流 res.end(data); }) //這個路由訪問的是張傑的頁面 }else if(req.url==="/zhangjie"){ res.setHeader("Content-type","text/html;charset=utf8"); //系統內置的fs模塊有一個readFile一個方法 fs.readFile("./public/2.zhangjie.html",function (err,data) { //輸出文件流 res.end(data); }) //這個是王俊凱的頁面的樣式表的路由 }else if (req.url==="/public/wangjunkai.css") { res.setHeader("Content-type","text/css"); fs.readFile("./public/wangjunkai.css",function (err,data) { //輸出文件流 res.end(data); }) //這個是張傑圖片的路由 }else if (req.url==="/shuaige/1.jpg") { res.setHeader("Content-type","text/img"); fs.readFile("./public/1.jpg",function (err,data) { //輸出文件流 res.end(data); }) }else{ res.end("URL地址錯誤"); } }).listen(3000);
知乎的路由設置
var http = require("http"); var server = http.createServer(function (req,res) { //獲取地址欄地址 var url = req.url; var array =url.match(/^\/user\/(.+)\/(.+)$/); //若是數組爲空;表明的是沒有匹配到不執行下面語句 if(!array){ return; } //這兩個變量是捕獲到的數據 var $1 = array[1]; var $2 = array[2]; var json1 = { "zhangjie":"張傑", "kebi":"科比", "dilireba":"迪麗熱巴", "zhaoliying":'趙麗穎' } var json2 = { 'asks':"回答", "pins":"想法" } //設置一下響應頭 res.setHeader("Content-type","text/html;charset=utf8"); //輸出 res.end("我是"+json1[$1]+"個人"+json2[$2]); }); server.listen(3000);
5、模塊
1.node 當中你須要哪個js文件,你就require()
//這個是app.js var a = require("./a.js"); //這個是a.js console.log("我是0.1.js文件啊");
提示:你會發現,在a.js文件中申明的變量b在app.js當中不可使用;由於node所有的js文件它們的做用域天生是隔離的;由於沒有window對象;
2.exports 對外暴露
//app.js文件 var a = require("./a.js"); console.log(b); //a.js文件 var b = 100;
//對於暴露基本的數據:好比變量、函數就能夠用exports方法 a.js exports.b = 100; exports.sum = function ($1,$2) { return $1+$2; }
提示:①app.js文件要使用a.js文件var a = require("./a.js");變量名稱和文件名稱要統一;
②對於一個js文件暴露數據exports進行。通常暴露的是基本數據類型(數字、字符串)變量、函數
3.module.exports對外暴露類
//app.js var People = require("./People.js"); var xiaoming = new People("小明",18,"男"); xiaoming.say(); //People.js function People (name,age,sex) { this.name = name; this.age = age; this.sex = sex; } //原型對象的方法 People.prototype.say = function (argument) { console.log("我是"+this.name); } module.exports = People;
提示:①若是某一個JS文件對外暴露的是一個類,它須要用的是module.exports = People這種方式暴露類;
好處 不用向這種方式去執行(new People.People("小明",18,"男");,而是和咱們前面學些的執行構造函數的方式是同樣的;
②引用文件的變量的名必須和引用的js文件名一直;
四、引用文件夾
//app.js var jihe = require("./jihe"); console.log(jihe.yuan.mianji(1)); console.log(jihe.juxing.zhouchang(2,3)); 提示:若是你引進的是某一個文件夾,系統會自動的進入文件夾當中的index.js文件當中; //index.js var juxing = require("./juxing.js"); var yuan = require("./yuan.js"); //暴露矩形對象和圓對象 exports.yuan = yuan; exports.juxing = juxing; //juxing.js exports.zhouchang = function (a,b) { return 2*(a+b); } exports.mianji = function (a,b) { return a*b; } //yuan.js exports.zhouchang = function (r) { return 2*3.14*r; } exports.mianji = function (r) { return 3.14 * r *r; }
五、神奇的node_modules文件夾
var jihe = require("jihe"); console.log(jihe.yuan.mianji(1)); console.log(jihe.juxing.zhouchang(2,3));
提示:若是你將某一個文件夾放在了node_modules文件當中,那麼你使用這個文件夾當中功能,你就能夠省略相對路徑;
什麼是一個模塊?
一個JS文件就是一個模塊,一個文件夾它也是一個模塊;
你能夠認爲是一個輪子,這個輪子你想使用的時候,就能夠require();
6、npm社區(node 代碼輪子社區)
Npm社區地址:https://www.npmjs.com/
第一步:引入它人的模塊 npm install nzh
第二步:照着人家的API直接使用
var nzhcn = require("nzh/cn"); var solarLunar = require("solarLunar"); var xlsx = require("node-xlsx"); var fs = require("fs"); //這個是NZH使用 console.log(nzhcn.encodeS(123456)); console.log(nzhcn.encodeS("1.23456789e+21")); //農曆所以的轉換 var solar2lunarData = solarLunar.solar2lunar(2015, 10, 8); console.log(solar2lunarData.gzYear+solar2lunarData.gzMonth+solar2lunarData.gzDay); //excel導出 var data = [[1, 2, 3], [true, false, null, 'sheetjs'], ['foo', 'bar', new Date('2014-02-19T14:30Z'), '0.3'], ['baz', null, 'qux']]; var buffer = xlsx.build([{name: "mySheetName", data: data}]); fs.writeFile("./貝勒爺. xlsx",buffer);
提示:①使用模塊的時候,你須要npm install nzh solarlunar node-xlsx
②須要誰就require()誰
③node_modules文件夾在你下載模塊的時候,自動就有了