github文章連接:https://github.com/Vibing/blo...node
學習nodejs必需要掌握其核心,就像學JavaScript必須掌握函數、對象、數據類型、BOM、DOM等。git
nodejs
核心也很多,這裏介紹幾個核心:Events模塊、fs模塊、stream的使用、http模塊。程序員
事件驅動、非阻塞異步IO是nodejs的特色,因此Events是很是重要的模塊。而且node
中絕大多數模塊都繼承了Events
。github
事件是發佈訂閱模式的實現。在瀏覽器中,好比click
事件json
$('button').on('click',()=>{ //處理click響應 })
固然你也能夠自定義事件:api
//自定義事件 $('div').bind('hello',()=>{ alert('hello') }); //觸發事件 $('div').trigger('hello');
那麼在 node 中如何使用 Events 模塊的呢?
咱們定義一個類,讓它繼承 Events數組
const EventEmit = require('events'); //定義一個播放器類 class Player extends EventEmit { } const player = new Player(); //定義播放事件 player.on('play', ( param )=>{ console.log(`播放器播放《${param}》`) }) play.emit('play','海闊天空'); // 播放器播放《海闊天空》 play.emit('play','七里香'); // 播放器播放《七里香》
若是你想讓事件只執行一次,可使用 once :瀏覽器
//定義播放事件 player.once('play', ( param )=>{ console.log(`播放器播放《${param}》`) }) play.emit('play','海闊天空'); play.emit('play','七里香');
此時 只會打印出 播放器播放《海闊天空》服務器
上面也說了 node 中絕大多數模塊都繼承了 Events,好比 stream、fs、http等等,它們就像瀏覽器裏的 click,是原生就有的,若是你接着往下看 會對發現不少用到事件的地方。網絡
fs 全拼是 file system
即文件系統。
既然是文件系統,它的主要做用就是操做文件,好比文件的新增、修改內容、讀寫文件內容等。
查看文件夾信息
fs.stat('./logs', (err, stats) => { if (err) { console.log(err); return; } console.log('目錄:', stats.isDirectory()); console.log('文件:', stats.isFile()); console.log('大小:', stats.size); }); //打印結果 目錄: true 文件: false 大小: 160
查看文件信息
fs.stat('./fs.js', (err, stats) => { if (err) { console.log(err); return; } console.log('目錄:', stats.isDirectory()); console.log('文件:', stats.isFile()); console.log('大小:', stats.size); }); //打印結果 目錄: false 文件: true 大小: 2087
// 建立目錄 fs.mkdir("./logs", err => { if (err) { console.log(err); return; } console.log("logs目錄建立成功"); });
fs.mkdir
是異步方法,若是你想同步建立可使用 fs.mkdirSync
fs.mkdirSync('./logs2'); //同步建立文件夾
fs.writeFile('./logs2/hello.log', '你好~', err => { if (err) { console.log(err); return; } console.log('寫入成功'); });
注意: 若文件不存在則建立文件 若文件中有內容則覆蓋
有時候咱們不但願內容被覆蓋,而是追加,那麼可使用 appendFile 方法。
fs.appendFile("./logs/hello.log", "hello~\n我是程序員", err => { if (err) { console.log(err); return; } console.log("寫入成功"); });
// 讀取文件內容 fs.readFile("./logs/hello.log", "utf8", (err, stats) => { if (err) { console.log(err); return; } console.log(stats); });
// 讀取文件夾 fs.readdir("./logs", (err, files) => { if (err) { console.log(err); return; } console.log(files); //返回一個包含全部文件名稱的數組 }); //打印結果 [ 'data-write.json', 'data.json', 'traking.log' ]
// 修更名稱 把hello.log修改成tranking.log fs.rename("./logs/hello.log", "./logs/traking.log", err => { if (err) { console.log(err); return; } console.log("更名成功"); });
// 刪除目錄下文件 fs.readdirSync("./logs").map(file => { // 刪除文件unlink fs.unlink(`./logs/${file}`, err => { if (err) { console.log(err); return; } console.log("文件刪除成功"); }); });
// 只能刪除空目錄 若目錄裏不爲空則會報錯 因此要先刪除裏面的文件 再刪除文件夾 fs.rmdir("./logs", err => { if (err) { console.log(err); return; } console.log("目錄刪除成功"); });
流,可理解爲水流。只不過這裏是數據流。
流的意義在於三點:
const fs = require('fs'); const fileReadStream = fs.createReadStream('./logs/data.json'); const fileWriteStream = fs.createWriteStream('./logs/data-write.json'); /* 經過文件流的事件方式 */ fileReadStream.on('data', chunk => { fileWriteStream.write(chunk); // 可寫流寫入文件 若是文件不存在則建立文件 }); fileReadStream.on('error', err => { console.log('錯誤:', err); }); fileReadStream.on('end', () => { console.log('結束'); });
上面代碼中創建了一個流:可讀流--->可寫流。它知足了上面說的三點:有源頭(可讀流)、有終點(可寫流)、從源頭到終點(一個文件裏的數據流到了另外一個文件裏)。
代碼中也能看出,Stream 其實也繼承了 Events,它含有data、error、end等事件。
咱們把上面代碼改一下
// 監聽pipe事件 fileWriteStream.on('pipe', source => { console.log(source); }); /* 經過pipe方式 */ fileReadStream.pipe(fileWriteStream);
pipe 可理解爲水管,在可讀流和可寫流之間鏈接了水管,不須要再監聽 data 事件,使用起來很方便 能達到一樣的效果。
http 模塊主要用於搭建 http 服務,處理用戶請求信息等
const http = require('http'); // 使用發送http請求 const options = { protocol: 'http:', hostname: 'www.baidu.com', port: '80', method: 'GET', path: '/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg' }; let responseData = ''; const request = http.request(options, response => { console.log(response.statusCode); // 獲取連接請求的狀態碼 response.setEncoding('utf8'); response.on('data', chunk => { responseData += chunk; }); response.on('end', () => { console.log(responseData); }); }); request.on('error', error => { console.log(error); }); request.end();
// 使用http建立服務器 const port = 3000; const host = '127.0.0.1'; const server = http.createServer(); server.on('request', (request, response) => { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('Hello World\n'); }); server.listen(port, host, () => { console.log(`Server running at http://${host}:${port}/`); });
關於 Node 核心模塊還有不少,好比 Buffer、crypto加密、global全局變量、net網絡、os操做系統等等,只不過上面介紹的是使用頻率很是高的模塊。
後面文章會繼續介紹,詳情的api使用請參考官網