nodejs

1、什麼是NodeJS
Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。
Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。
Node.js 的包管理器 npm,成爲世界上最大的開放源代碼的生態系統。
2、NodeJS怎樣
Node.js 能夠解析JS代碼(沒有瀏覽器安全級別的限制)提供不少系統級別的API,如:
文件的讀寫
進程的管理
網絡通訊
......
3、爲何要學習NodeJs
列舉一些基於Node的工具或者框架
Node-Webkit:基於node的webkit的內核
NodeOS:基於node的操做系統
Express:基於node的框架
Jade:模板
EJS:模板
Forever:負載均衡
PM2:負載均衡
Log.io:瀏覽器打印各類輸出日誌,報錯等
Grunt、Gulp、Webpack:前端工程化工具
Mocha、Karma:前端測試工具
......
4、學習nodeJS的五個網站
node官網:https://nodejs.org/en/ -------下載node,官方API,更新日誌,發佈的動態
npm官網:https://www.npmjs.com/search?q= -------能夠搜索你須要的模塊,模塊管理、組件安裝
github:https://github.com/search?utf8=%E2%9C%93&q=nodejs ----源代碼
國外技術博客:http://stackoverflow.com/questions -----使用nodejs遇到的問題
國內的技術博客:https://segmentfault.com/ -----遇到的問題
5、nodeJS的安裝
Mac系統的安裝
windows系統的安裝
其餘系統的安裝
參照網址:http://www.runoob.com/nodejs/nodejs-install-setup.html

v6.9.5 LTS v7.5.0 Current
偶數位爲穩定版本:v6.8.x v6.6.x v6.4.x
基數位爲非穩定版本:v6.9.x v6.7.x v6.5.x
6、搭建第一個WEB服務器
本地建立一個文件server.js,代碼採用es6編寫
const http = require("http");
const homename = "127.0.0.1";
const port = 3000;
const server = http.createServer((req,res)=>{
res.statusCode = 200;
res.setHeader("Content-Type","text/plain");
res.end("hello world");
});

server.listen(port,hostname,()=>{
console.log(`server running at http://${hostname}:${port}/`);
})
es5的編寫方法
ar http = require('http');
http.createServer(function (request, response) {

// 發送 HTTP 頭部
// HTTP 狀態值: 200 : OK
// 內容類型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});

// 發送響應數據 "Hello World"
response.end('Hello World\n');
}).listen(8888);

// 終端打印以下信息
console.log('Server running at http://127.0.0.1:8888/');
7、命令行中體驗
輸入node便可進入控制檯---交互式解釋器--Node.js REPL
表示一個電腦的環境,相似 Window 系統的終端或 Unix/Linux shell,咱們能夠在終端中輸入命令,並接收系統的響應。
Node 自帶了交互式解釋器,能夠執行如下任務:
讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構並存儲在內存中。
執行 - 執行輸入的數據結構
打印 - 輸出結果
循環 - 循環操做以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。
8、helloworld
建立一個文件hello.js,代碼採用es5編寫
//console.log("hello world");
啓動一個服務器
"/favicon.ico"
打印兩次helloworld

9、模塊和包管理工具
commonJS規範
根據這個規範,每一個文件就是一個模塊,有本身的做用域。在一個文件裏面定義的變量、函數、類,都是私有的,對其餘文件不可見。

依賴關係 定義 .js文件

命名空間 糾結的編程體驗 暴露接口

代碼組織 引用


modules/pakages/system/filestems/binary/console/encodings/sockets/unit test...

不一樣於jQuery,CommonJs是一套規範

規範與實現的互爲促進
nodeJS、Webpack都基於CommonJS規範

使用npm install 來安裝模塊
使用鏡像安裝 cnpm install

案例展示

10、NPM使用
全局安裝:至關於windows系統環境變量的配置
本地安裝:不加後綴
安裝:install
寫在:uninstall
安裝模塊:npm install n -g
升級node:n stable
安裝Forever:cnpm install forever -g
本地安裝underscore:cnpm install underscore
查看模塊版本號:cnpm info underscore
選擇版本安裝:cnpm install underscore@1.0.3
查看安裝了那些模塊:cnpm list
如何管理模塊package:cnpm init
dependencies:項目依賴,經過--save加進去
devDependencies:開發依賴,線上不須要---經過--dev加進去
刪除node_modules文件夾,執行命令 cnpm install
只查看安裝模塊的中某一個模塊的信息:cnpm list | grep gulp
查看版本標識:cnpm outdated
nrm模塊--選擇和切入源:cnpm install nrm -g
nrm list
nrm test----測試速度
nrm use npm

11、nodejs API
一、url網址解析
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
url.format(urlObject)
url.resolve(from, to)
┌─────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬┬───────────┬─────────────────┬───────────────────────────┬───────┤
│ protocol ││ auth │ host │ path │ hash │
│ ││ ├──────────┬──────┼──────────┬────────────────┤ │
│ ││ │ hostname │ port │ pathname │ search │ │
│ ││ │ │ │ ├─┬──────────────┤ │
│ ││ │ │ │ │ │ query │ │
" http: // user:pass @ host.com : 8080 /p/a/t/h ? query=string #hash "
│ ││ │ │ │ │ │ │ │
└──────────┴┴────���──────┴──────────┴──────┴──────────┴─┴──────────────┴───────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)

https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test
{
protocol: 'https:',
slashes: true,
auth: null,
host: 'www.baidu.com:8080',
port: '8080',
hostname: 'www.baidu.com',
hash: '#test',
search: '?from=1000phone&course=nodejs',
query: { from: '1000phone', course: 'nodejs' },
pathname: '/api.php',
path: '/api.php?from=1000phone&course=nodejs',
href: 'https://www.baidu.com:8080/api.php?from=1000phone&course=nodejs#test' }php


執行命令
node
url
url.parse("https://www.baidu.com")
url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level")-----query爲字符串
url.parse("https://www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)-----query爲對象
url.parse("https://www.baidu.com",true)
url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--沒有解析到協議和端口號
url.parse("//www.baidu.com:8080/api.php?from=qianfeng&course=node#level",true)--解析到host和port
將以前的解析出來的使用url.format()執行,能夠解析出一個url地址
兩段url解析成一個url.resolve("http://www.baidu.com","/api/list.php");
二、querystring網址:http://nodejs.cn/api/
querystring.escape(str)
querystring.parse(str[, sep[, eq[, options]]])
querystring.stringify(obj[, sep[, eq[, options]]])
querystring.unescape(str)

node
querystring
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""})
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",")----設置分隔符
querystring.stringify({name:"qianfeng",course:["nodejs","vue.js"],from:""},",",":")
querystring.parse(默認的字符串)

querystring.escape({"from":"beijing"}});
querystring.escape("北京")html

三、http模塊

四、http小爬蟲
建立一個文件spider.js
網址:https://www.lagou.com
var http = require("http");
var https = require("https");
var url = "https://www.lagou.com";
https.get(url,function(res){
var html="";
res.on("data",function(data){
html+=data;
)
res.on("end",function(){
console.log(html);
})
res.on("error",function(err){
console.log(err);
})
})

引入一個第三方工具
cnpm install cheerio --save-dev
注意:
--save表示安裝到本地---項目依賴--dependencies
-dev表示安裝到開發依賴----devDependencies---項目上線時不須要開發依賴

var http = require("http");
var https = require("https");
var cheerio = require("cheerio");
var url = "https://www.lagou.com";
function filter(html){
var $ = cheerio.load(html);
var menu = $(".menu_main");
var menuData = [];
menu.each(function(index,value){
var menuTitle = $(value).find("h2").text();
var menuLists = $(value).find("a");
var menulist = [];
menuLists.each(function(index,value){
menulist.push($(value).text())
})
menuData.push({menuTitle:menuTitle,menulist:menulist})
})
return menuData


}

https.get(url,function(res){
var html="";
res.on("data",function(data){
html+=data;
)
res.on("end",function(){
console.log(html);
var result = filter(html);
printMenu(result);
})
res.on("error",function(err){
console.log(err);
})
})

function printMenu(menu){
menu.forEach(function(value){
console.log(value.menuTitle+"\n");
value.menuList.forEach(function(value){
console.log(value);
}
)
})
}前端

五、request方法
新建文件requestGet.js https://developers.douban.com/wiki/?title=movie_v2#top250
請求的數據http://api.douban.com/v2/movie/top250
http://json.cn/
const https = require('https')
var options = {
hostname: 'api.douban.com',
port: 443,
method: 'GET',
path: '/v2/movie/top250'
}
var responseData = ''
var request = https.request(options, (response) => {
// console.log(response)
// console.log(response.statusCode)
// console.log(response.headers)
response.setEncoding('utf8')
response.on('data', (chunk) => {
responseData += chunk
})
response.on('end', () => {
JSON.parse(responseData).subjects.map((item) => {
console.log(item.title)
})
})
})

request.on('error', (error) => {
console.log(error)
})

request.end()

新建文件requestPost.js
const http = require('http')
const querystring = require('querystring')

var postData = querystring.stringify({
'question[title]':'這個視頻不錯2',
'question[content]':'<p>贊一個</p>',
'question[courseId]':'227',
'question[lessonId]':'1753',
'_csrf_token':'32b0e1e07c657000e1f7250cdeac0377e6af688f'
})

var options = {
hostname: 'www.codingke.com',
port: 80,
method: 'POST',
path: '/ajax/create/course/question',
headers: {
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',
'Connection':'keep-alive',
'Content-Length': postData.length,
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'PHPSESSID=qsqkoo0bq1grc6a5jo7kgk5tn7; CNZZDATA1256018185=1839628736-1476447839-null%7C1485424829; Hm_lvt_9f92046de4640f3c08cf26535ffdd93c=1485410187,1485420976; Hm_lpvt_9f92046de4640f3c08cf26535ffdd93c=1485426828',
'Host':'www.codingke.com',
'Origin':'http://www.codingke.com',
'Referer':'http://www.codingke.com/v/398-chapter-227-course',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36',
'X-CSRF-Token':'32b0e1e07c657000e1f7250cdeac0377e6af688f',
'X-Requested-With':'XMLHttpRequest'
}
}

var request = http.request(options, (res) => {
console.log('Status:' + res.statusCode)
console.log('headers:' + JSON.stringify(res.headers))
res.setEncoding('utf8')
res.on('data', (chunk) => {
console.log(chunk)
})
res.on('end', () => {
console.log('技術問答提交完畢!')
})
})

request.on('error', (error) => {
console.log(error)
})

request.write(postData)

request.end()vue

七、event事件
events
使用事件:EventEmitter
事件的參數
只執行一個的事件監聽器

建立一個文件event_emitter.js
const EventEmitter = require('events')
class Player extends EventEmitter {}
var player = new Player()
player.once('play', (track) => {
console.log(`正在播放:《${track}》`)
})
player.emit('play', '精絕古城')
player.emit('play', '黃皮子墳')node

八、File System
獲得文件與目錄的信息:stat
建立一個目錄:mkdir
建立文件並寫入內容:writeFile,appendFile
讀取文件的內容:readFile
列出目錄的東西:readdir
重命名目錄或文件:rename
刪除目錄與文件:rmdir,unlink

建立fs_1.js---查看狀態

const fs = require('fs')git

fs.stat('hello.js', (error, stats) =>{
if(error){
console.log(error)
} else {
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目錄:${stats.isDirectory()}`)
}
})

建立fs_2.js---建立目錄
const fs = require('fs')
fs.mkdir('logs', (error) => {
if(error){
console.log(error)
} else {
console.log('成功建立目錄:logs')
}
})

建立fs_3.js---寫入文件
const fs = require('fs')
fs.writeFile('logs/hello.log', '您好 ~ \n', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功寫入文件')
}
})

fs.appendFile('logs/hello.log', 'hello ~ \n', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功寫入文件')
}
})es6

建立fs_4.js---讀取文件
const fs = require('fs')
fs.readFile('logs/hello.log', 'utf8', (error, data) =>{
if (error) {
console.log(error)
} else {
console.log(data)
}
})
建立fs_5.js---讀取文件夾
const fs = require('fs')
fs.readdir('logs', (error, files) => {
if (error) {
console.log(error)
} else {
console.log(files)
}
})
建立fs_6.js--文件重命名
const fs = require('fs')
fs.rename('logs/hello.log', 'logs/greeting.log', (error) =>{
if (error) {
console.log(error)
} else {
console.log('重命名成功')
}
})github

建立fs_7.js--刪除目錄
const fs = require('fs')
fs.readdirSync('logs').map((file) => {
fs.unlink(`logs/${file}`, (error) => {
if (error) {
console.log(error)
} else {
console.log(`成功的刪除了文件: ${file}`)
}
})
})

fs.rmdir('logs', (error) =>{
if (error) {
console.log(error)
} else {
console.log('成功的刪除了目錄:logs')
}
})
九、Stream
讀取文件流
可讀流的事件
可寫的文件流
pipe
鏈式使用 pipe

建立文件stream.js
const fs = require('fs')
var fileReadStream = fs.createReadStream('data.json')
var fileWriteStream = fs.createWriteStream('data-1.json')
var count = 0
fileReadStream.once('data', (chunk) => {
console.log(chunk.toString())
fileWriteStream.write(chunk)
})
fileReadStream.on('data', (chunk) => {
console.log(`${ ++count } 接收到:${chunk.length}`)
fileWriteStream.write(chunk)
})
fileReadStream.on('end', () => {
console.log('--- 結束 ---')
})
fileReadStream.on('error', (error) => {
console.log(error)
})
流的操做
const fs = require('fs')
var fileReadStream = fs.createReadStream('data.json')
var fileWriteStream = fs.createWriteStream('data-1.json')
fileReadStream
.pipe(fileWriteStream)
進一步處理---寫入以前進行壓縮
const fs = require('fs')
const zlib = require('zlib')

var fileReadStream = fs.createReadStream('data.json')
var fileWriteStream = fs.createWriteStream('data.json.gz')

fileWriteStream.on('pipe', (source) => {
console.log(source)
})

fileReadStream
.pipe(zlib.createGzip())
.pipe(fileWriteStream)web

相關文章
相關標籤/搜索