cmd命令:
? ?./? 當(dāng)前目錄
? ?../ 上一級(jí)
? ?dir? 查看當(dāng)前目錄
? ?ls? 查看當(dāng)前目錄下文件
? ?windows 切換盤符 d:
? ?cls清屏
? ?cd +文件加名
es6:
1.let/const
2.對(duì)象里的方法function可以省略
3.函數(shù)中的默認(rèn)參數(shù)
4.template
5.箭頭函數(shù)
6.展開操作符
7.解構(gòu)賦值
8.Symbol
9.class 模擬類,但本質(zhì)是基于原型的
10.for ...of
11.promise 解決回調(diào)金字塔.回調(diào)地獄
12.生成器函數(shù),可以退出函數(shù)
13.JS模塊化
NodeJS:
1.node.js開發(fā)環(huán)境搭建
2.npm nodejs包管理器
3.CommonJS模塊化標(biāo)準(zhǔn)化,AMD(require)
4.導(dǎo)出模塊/加載模塊
fs模塊(讀寫文件)
var fs = require("fs");//加載模塊
//異步讀取文件
fs.readFile("./readme.txt","utf8", (err, data) => {
if(err) throw err;
console.log(data);
});
//同步讀取文件 Synchrous
var data = fs.readFileSync("./readme.txt","utf8");
console.log(data);
//異步寫入文件
fs.writeFile("./test.txt", "This is test content~~~",(err) => {
if(err)throw err;
console.log("寫入成功");
})
console.log("write");
//同步寫入文件
fs.writeFileSync("./test.txt", "This is test content~~~");
console.log("write");
查看路徑信息stat:fs.stat(path, (err, stat) => {})
fs.stat("./test", (err, stat) => {
if(err) throw err;
console.log(stat);
if(stat.isFile()) {
console.log("該路徑為文件");
}else if (stat.isDirectory()) {
console.log("該路徑為文件夾");
}
})
path模塊
var path = require("path"); //加載模塊
path.dirname(url) 獲取目錄名
path.extname(url)獲取后綴名
path.join([...paths]) 拼接路徑
var url = "https://nodejs.org/dist/latest-v6.x/docs/api/path.html";
var p1 = path.basename(url,".html");
console.log(p1); //path
var p2 = path.dirname(url);
console.log(p2); //https://nodejs.org/dist/latest-v6.x/docs/api
var p3 = path.extname(url);
console.log(p3); //.html
var p4 = path.join(__dirname, "./a", "../b", "c");
console.log(p4); //E:\node\nodejs_2\b\c
querystring模塊 查詢字符串
var qs = require("querystring");
var o = {
color: "red",
border: "1px solid red",
"font-size": "16px"
}
var ret = qs.stringify(o, ";", ":");
console.log(ret);
// "color:red;border: 1px solid red;font-size: 16px"
http模塊
var http = require("http"); //加載模塊
var server = http.createServer((request, response) => {
//創(chuàng)建一個(gè)web服務(wù)器
//request
//response
//設(shè)置響應(yīng)頭
console.log(request.url);
switch(request.url) {
? ? ? ? ? ? ?case "/":
? ? ? ? ? ? ? ? ? ? response.write("首頁");
? ? ? ? ? ? ? ? ? ? ?break;
case "/list":
response.write("列表頁");
break;
case "/detail":
response.write("詳情頁");
break;
}
response.writeHead(200, {
"Content-Type":"text/html; charset=utf8"
})
response.end();
//if(request.url)
})
//http80端口號(hào) ftp23端口號(hào)
server.listen(3000, function() {
console.log("server has started at port 3000");
})
1.http請(qǐng)求頁面,不是該文件目錄下的頁面重定向,其余的根據(jù)目錄查找
var http = require("http"); //CommonJS規(guī)范 加載模塊
var fs = require("fs");
var path = require("path");
var server = http.Server(); //創(chuàng)建服務(wù)器
server.on("request", function(req, res) {
var filepath = path.join(__dirname, "./www", req.url);
if(req.url === "/") {
filepath = path.join(filepath, "index/html");
}
try{
var stat = fs.statSync(filepath);
if(stat.isFile()) {
var content = fs.readFileSync(filepath);
res.setHeader("Content0length", Buffer.bytelength(content))
res.write(content);
}else if(stat.isDirectory() {
//當(dāng)請(qǐng)求的路徑是目錄的時(shí)候
})
}catch(e) {
//重定向301(永久) 302(暫時(shí))
res.writeHead(302, {
"Location" : "/"
})
}
res.end();
})
server.listen(3000, function() {
console.log("server has started");
})
http協(xié)議:
HyperText Transport Protocol)是超文本傳輸協(xié)議的縮寫.
http請(qǐng)求:get/post/put/delete(get在地址欄,傳輸速度快,大小有限制.在頭,只能傳輸一些文本;post加密傳輸,在正文)
可以發(fā)起http請(qǐng)求的方式:瀏覽器/postman/curl/Fiddle/php/node.js
http1.0和http1.1的區(qū)別:1.0是每次請(qǐng)求都建立一個(gè)連接,而1.1是多個(gè)請(qǐng)求一個(gè)連接.
報(bào)文:請(qǐng)求頭(post有content-type:"application-x-www-form-urlencoded", cookie)+正文
xhr.readystate
XMLHttpRequest.UNSENT? 0? ? ? ? 初始化連接
XMLHttpRequest.OPENED? 1? ? ? ? 連接建立
XMLHttpRequest.HEADER_RECEIVED 2? 接收到請(qǐng)求頭
XMLHttpRequest.LOADING? 3? ? ? ? 處理數(shù)據(jù)
XMLHttpRequest.DONE? ? 4? ? ? ? 處理完畢
xhr.status HTTP響應(yīng)狀態(tài)碼
1開頭? 101 切換協(xié)議
2開頭? 成功? 200
3開頭? 重定向? 304 301/302
4開頭? 客戶端錯(cuò)誤? 404 403
5開頭? 服務(wù)器端錯(cuò)誤
2.爬蟲 cheerio
原理: 1.拉取頁面(字符串)http.get/request(node),file_get_content(php)
2.使用模塊,方便快捷篩選.cheerio(node), simple.html.dom.php(php)
3.收集信息
npm install cheerio //安裝cheerio模塊
npm init
// spider.js
var http? ? = require("http");
var cheerio = require("cheerio");
var fs? ? ? = require("fs");
3.express 基于 Node.js 平臺(tái),快速、開放、極簡(jiǎn)的 web 開發(fā)框架。
nmp install express -g
npm install express-generator -g(快速創(chuàng)建express的整體目錄)
express -h
express myapp
cd myapp
npm start
express
1.新建文件夾
cd到該文件目錄下
npm init (enter name:myapp enter....)
npm install express
在myapp里面新建app.js
在app.js里面寫代碼
var express? = require("express"),//加載express模塊
http = require("http"), //加載http模塊
app? = express(), //創(chuàng)建一個(gè)express實(shí)例
server? = http.createServer(app); //app可以作為http創(chuàng)建服務(wù)器的回調(diào)函數(shù)
//靜態(tài)資源掛載,設(shè)置靜態(tài)資源目錄
//中間件 express.static
//掛載中間件 使用use
app.use(express.static("public"));
//定義一個(gè)獲取訪問用戶IP的中間件
//哪個(gè)先掛載,先使用哪個(gè)的代碼
var ips = [];
function getIp(req, res, next) {
console.log(req.ip);
ips.push(req.ip);
next();
}
function responseIP (req, res, next) {
res.send(req.ip);
}
app.use((req, res, next) => {
console.log("hello");
next();
})
app.use(getIp);
app.use(responseIP);
app.get("/", (req, res) => {
res.send("首頁");
})
app.get("/list", (req, res) => {
// console.log(req.ip);獲取ip
res.send("列表頁");
})
app.get("/details", (req, res) => {
res.send("詳情頁");
})
server.listen(3000, function() {
//監(jiān)聽端口號(hào)3000,并提示服務(wù)成功開啟
console.log("Server has started");
})
總結(jié)express:中間件和路由.
3.websocket 構(gòu)建實(shí)時(shí)應(yīng)用(你猜我畫,視頻直播)
全雙工、雙向數(shù)據(jù)、長(zhǎng)連接的協(xié)議,h5新增特性
服務(wù)器端能夠主動(dòng)向?yàn)g覽器端發(fā)送消息
必須瀏覽器要支持,服務(wù)器要支持,數(shù)據(jù)傳輸格式是Frame
過程:第一次是由客戶端發(fā)起,請(qǐng)求的報(bào)文的請(qǐng)求頭會(huì)多一些內(nèi)容,要求服務(wù)器更換協(xié)議.
服務(wù)器端響應(yīng)回報(bào)文,響應(yīng)頭也會(huì)多幾條數(shù)據(jù),之后就能建立長(zhǎng)的連接.
a. 發(fā)起請(qǐng)求,跟一般的http請(qǐng)求不同的地方,
請(qǐng)求頭 包括:
Sec-WebSocket-Key:asgK0L1sVa22xbiq8MU58w==
Sec-WebSocket-Version:13
Upgrade:websocket
讓服務(wù)器更新切換協(xié)議 websocket
b. 服務(wù)器收到請(qǐng)求,upgrade
經(jīng)過一定的步驟算法 產(chǎn)生
Sec-WebSocket-Accept:IQcF4EGKE8sALj3PxJRvYQ1iG2Y
2.? npm init
npm install socketio express --save-dev
socketio 是對(duì)websocket協(xié)議封裝的一個(gè)模塊,讓客戶端和服務(wù)器端的寫法都是一樣的
socket.emit()發(fā)數(shù)據(jù)
socket.on()收數(shù)據(jù)
監(jiān)聽客戶端連接,回調(diào)函數(shù)會(huì)傳遞本次連接的socket
io.on('connection',function(socket));
給所有客戶端廣播消息
io.sockets.emit('String',data);
給指定的客戶端發(fā)送消息
io.sockets.socket(socketid).emit('String', data);
監(jiān)聽客戶端發(fā)送的信息
socket.on('String',function(data));
給該socket的客戶端發(fā)送消息
socket.emit('String', data);
3.WebSocket
new Websocket("ws:localhost/chat")
gulp
npm init
npm install gulp --save-dev
新建 gulpfile.js(默認(rèn)執(zhí)行的文件)
//gulpfile.js
//1.安排任務(wù), 2.自動(dòng)執(zhí)行
var gulp = require("gulp");
var uglify = require("gulp-uglify");
//task1 定義一個(gè)任務(wù)ufligy 壓縮js
gulp.task("uglify" ,function() {
gulp.src("./src/js/*.js")
.pipe(uglify())
.pipe(gulp.dest("./dist/js"))
})
安裝gulp-uglify插件 npm install gulp-uglify --save-dev
新建src文件夾 > js文件夾 >demo.js
新建dist文件夾> js文件夾 >
運(yùn)行 gulp uglify
然后在dist文件夾就能找到已經(jīng)壓縮的demo.js
插件:gulp-less
插件:gulp-minify-css
//文件看守, 監(jiān)聽./src/less/*.less 文件的變化,變化運(yùn)行該less任務(wù)
gulp.task("default", ["uglify", "less"], function() {
gulp.watch("./src/less/*.less", ["less"]);
})
//運(yùn)行 gulp即可即使更改代碼
webpack
全局安裝webpack npm install webpack --save-dev
新建文件夾webpack
1.初始化一個(gè)項(xiàng)目 npm init
name:不能為webpack
2.在該文件夾下面安裝npm install webpack --save-dev
3. webpack 資源模塊化
webpack ./app/main.js ./app/bundle.js
4. mongodb 非關(guān)系型數(shù)據(jù)庫
mongoose Nodejs操作mongodb數(shù)據(jù)庫的模塊