7 Node
7.1 Linux環境搭建
- wget https://npm.taobao.org/mirrors/node/v6.10.3/node-v6.10.3-linux-x64.tar.xz
- xz -d node-v6.10.3-linux-x64.tar.xz / tar -xzvf node-v6.10.3-linux-x64.tar.gz(解壓)
- tar -xvf node-v6.10.3-linux-x64.tar(解壓)
- ln -s /node-v6.10.3-linux-x64/bin/node /usr/local/bin/node (建立一個軟連接)
- ln -s /node-v6.10.3-linux-x64/bin/npm /usr/local/bin/npm(ln=link)
LTS:long time suppose(長期支持的版本,一般三年內是有效的)
比較坑的一種方法:
- sudo apt-get install nodejs
- sudo apt-get install npm
7.2 創建httpserver
node特點:
- 基於Chrome V8引擎
- 單線程
- 使用JavaScript開發後端代碼
- 非阻塞的IO
演示Common規範: 1,通過module.exports來創建;2,通過exports.對象來創建
// 第一種創建方式:module.exports
module.exports = {
userName:"Jack",
sayHello(){
return "hello"
}
}
// 第二種創建方式:exports.對象
exports.userName = "Tom";
exports.sayHello = function () {
return "World"
}
// 引入調用
let user = require('./User');
console.log(`userName:${user.userName}`);
console.log(`I'm ${user.userName},I say ${user.sayHello()}`)
創建一個Http Server:
let http = require("http");
let url = require('url');
let util = require('util');
let server = http.createServer((req,res)=>{
res.statusCode = 200;
res.setHeader("Content-Type","text/plain;charset=utf-8");
console.log(`url:${req.url}`); // 字符串
console.log(`parse:${url.parse(req.url)}`); // [object Object]
console.log(`inspect:${util.inspect(url.parse(req.url))}`) // 將對象以字符串輸出
res.end(util.inspect(url.parse(req.url)));
});
server.listen(3000,'127.0.0.1',()=>{
console.log("服務器已經運行,請打開瀏覽器,輸入:http://127.0.0.1.3000/ 來訪問")
})
創建一個Web容器,可以訪問到HTML內容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>測試一下能否訪問到!</h2>
</body>
</html>
let http = require("http");
let url = require('url');
let util = require('util');
let fs = require('fs');
let server = http.createServer((req,res)=>{
// res.statusCode = 200;
// res.setHeader("Content-Type","text/plain;charset=utf-8");
var pathname = url.parse(req.url).pathname;
console.log("file:"+pathname.substring(1));
fs.readFile(pathname.substring(1),function (err,data) {
if(err){
res.writeHead(404,{
'Content-Type':'text/html'
})
}else {
res.writeHead(200,{
'Content-Type':'text/html'
})
res.write(data.toString());
}
// end需要在文件讀取內結束。
res.end();
})
});
server.listen(3000,'127.0.0.1',()=>{
console.log("服務器已經運行,請打開瀏覽器,輸入:http://127.0.0.1.3000/ 來訪問")
})
Http模塊客戶端演示:
let http = require('http');
let util = require('util');
http.get('http://www.imooc.com/u/card',function (res) {
let data = '';
res.on('data',function (chunk) {
data += chunk;
});
res.on('end',function (){
let jsonpToJson = data.split('(')[1].split(')')[0];
let result = JSON.parse(jsonpToJson);
console.log('resultAll:'+util.inspect(result));
console.log('resultMsg:'+result.msg);
})
})
在這裏,我來說一下ES6的let和var、const的區別:
JS中作用域有:全局作用域、函數作用域。沒有塊作用域的概念。ECMAScript 6(簡稱ES6)中新增了塊級作用域。
塊作用域由 { } 包括,if語句和for語句裏面的{ }也屬於塊作用域。
- var定義的變量,沒有塊的概念,可以跨塊訪問, 不能跨函數訪問。
- let定義的變量,只能在塊作用域裏訪問,不能跨塊訪問,也不能跨函數訪問。
- const用來定義常量,使用時必須初始化(即必須賦值),只能在塊作用域裏訪問,而且不能修改。
7.3 通過node加載靜態資源
7.4 搭建基於express框架的運行環境
- 安裝express generator生成器
- 查看express版本:express --version(express -v是視圖的意思,這裏和其他軟件的情況不一樣)npm install express --save;
- 安裝完express generator生成器才能查看版本號:npm install -g express-generator。
- 通過生成器自動創建項目
創建一個express框架項目:express server 創建出一個文件包含:bin、public、routes、view、app.js、package.json
- 配置分析
- bin:可執行文件,www對一些事物封裝,有用的只有一句話,就是創建了一個server;
- public:靜態資源;
- routes:路由;
- views:視圖(.jade語言);
- app.js:入口;
- package.json:配置,可以與外面的合併。
// 如何將jade改成html
var ejs = require('ejs');
app.engine('.html',ejs.__express);
app.set('view engine', 'html');