NodeJs
// 查看版本
node -v
node --version
//查看安裝的版本
nvm list
nvm ls
// 創(chuàng)建一個文件夾
mkdir NodeDemo
// 創(chuàng)建一個app.js 文件
touch app.js
輸入內(nèi)容
console.log("hello node");
運行
node app.js
hello node
全局對象
console.log("hello node");
//全局對象
// 定時器
// setTimeout(function () {
// console.log('3 seconds have passed');
// },3000);
//
// var time = 0;
// var timer = setInterval(function () {
// time += 2;
// console.log(time + 'seconds have passed');
// if(time === 6){
// clearInterval(timer);
// }
// },2000);
// 路徑
// 不包含文件名
console.log(__dirname);
// 包含文件名
console.log(__filename);
//global
console.log(global);
引擎
js引擎
電腦不識別也不理解js
js引擎的作用就是讓電腦識別js代碼
nodejs是使用c++寫的
V8 是Node.js的核心
V8的作用就是讓js代碼能夠讓電腦識別
流程梳理
js
c++ node v8
電腦
模塊 module
stuff.js
var counter = function (arr) {
return '一共有' + arr.length + '個元素在數(shù)組中';
}
// console.log(counter(['a', 'b', 'c']));
var adder = function (a,b) {
return `你需要計算的兩個值得和為:${a+b}`;
}
var PI = 3.142;
// module
// module.exports = counter;
// module.exports.counter = counter;
// module.exports.adder = adder;
// module.exports.PI = PI;
module.exports = {
counter: counter,
adder: adder,
PI: PI
}
app.js
// require
// var counter = require('./stuff')
// console.log(counter(['a', 'b', 'c']));
var stuff = require('./stuff')
console.log(stuff.counter(['a', 'b', 'c']));
console.log(stuff.adder(5, stuff.PI));
事件模塊
1 大多數(shù)Node核心API都是采用異步事件驅(qū)動架構(gòu)(fs/http)
2 所有能觸發(fā)事件的對象都是EventEmitter類的實例
3 事件流程:引入模塊 》創(chuàng)建EventEmitter對象 》注冊事件 》觸發(fā)事件
// 事件模塊
// 1 引入事件模塊
//var stuff = require('./stuff')
// 引入node自帶的模塊不需要路徑
var events = require('events');
// 2 創(chuàng)建EventEmitter 對象
var myEmitter = new events.EventEmitter();
// 3 注冊事件
myEmitter.on('someEvent',function (msg) {
console.log(msg);
})
// 觸發(fā)事件
myEmitter.emit('someEvent','事件粗發(fā)并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中');
結(jié)果:
事件粗發(fā)并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中
異步的事件
// 事件模塊
// 1 引入事件模塊
//var stuff = require('./stuff')
// 引入node自帶的模塊不需要路徑
var events = require('events');
// 2 創(chuàng)建EventEmitter 對象
var myEmitter = new events.EventEmitter();
// 3 注冊事件
myEmitter.on('someEvent',function (msg) {
console.log(msg);
})
// 觸發(fā)事件
myEmitter.emit('someEvent','事件事件并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中');
console.log(1);
結(jié)果:
事件事件并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中
1
上面的結(jié)果說明是同步的
如果要異步,看下面的代碼
// 事件模塊
// 1 引入事件模塊
//var stuff = require('./stuff')
// 引入node自帶的模塊不需要路徑
var events = require('events');
// 2 創(chuàng)建EventEmitter 對象
var myEmitter = new events.EventEmitter();
// 3 注冊事件
myEmitter.on('someEvent',function (msg) {
// es6
// setImmediate(() => {
// console.log('異步進行:'+msg);
// });
setImmediate(function () {
console.log('異步進行:'+msg);
});
})
// 觸發(fā)事件
myEmitter.emit('someEvent','事件事件并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中');
console.log(1);
結(jié)果:
1
異步進行:事件事件并傳遞參數(shù)到注冊事件的回調(diào)函數(shù)中
文件系統(tǒng)
文件系統(tǒng)主要對項目中的文件進行操作
1 讀取文件 fs.readFile
2 寫入文件 fs.writeFile
3 流程:引入fs模塊 》調(diào)用方法 》異常捕獲
//新建一個文本文件readMe.txt,并輸入內(nèi)容
一只蛤蟆
四條腿
四個美眉
八只__
編寫代碼
// 文件系統(tǒng)
// 1 引入文件系統(tǒng)模塊
var fs = require('fs');
// 2 通過對象調(diào)用方法
//var readMe = fs.readFileSync('readMe.txt');
// 沒有字符參數(shù)
/*
<Buffer e4 b8 80 e5 8f aa e8 9b a4 e8 9f 86 0a 20 20 20 20 e5 9b 9b e6 9d a1 e8 85 bf 0a 20 20 20 20 20 20 20 20 e5 9b 9b e4 b8 aa e7 be 8e e7 9c 89 0a 20 20 ... >
*/
// 添加了字符參數(shù)
//var readMe = fs.readFileSync('readMe.txt','utf8');
/*
一只蛤蟆
四條腿
四個美眉
八只__
*/
// console.log(readMe);
// 會創(chuàng)建一個writeMe.txt文件,并寫入讀取出來的readMe的值
// fs.writeFileSync('writeMe.txt',readMe);
// 異步讀取文件
fs.readFile('readMe.txt','utf8',function (err,data) {
if (err) throw err;
console.log(data);
})
// 異步寫入文件
fs.readFile('readMe.txt','utf8',function (err,data) {
if (err) throw err;
fs.writeFile('writeMe2.txt',data);
})
console.log(1);
結(jié)果:
1 控制臺輸入下面的內(nèi)容
2 多了一個writeMe2.txt文件并寫入了內(nèi)容
// 我是控制臺輸出的內(nèi)容
1
一只蛤蟆
四條腿
四個美眉
八只__
文件系統(tǒng)操作
文件系統(tǒng)主要對項目中的文件進行操作
1 創(chuàng)建文件夾 fs.mkdir
2 刪除文件夾 fs.rmdir
3 刪除文件 fs.unlink
4 流程:引入fs模塊 》調(diào)用方法 》異常捕獲
// 命令行的一點小補充
rmdir刪除空目錄,不過一旦目錄非空會提示
Directiry not empty
使用rm既可以刪除文件又可以刪除文件夾
刪除文件夾(無論文件夾是否為空),使用 -rf 命令即可。
即:rm -rf 目錄名字
-r 就是向下遞歸,不管有多少級目錄,一并刪除
-f 就是直接強行刪除,不作任何提示的意思
// 文件系統(tǒng)
// 1 引入文件系統(tǒng)模塊
var fs = require('fs');
// 2 通過對象調(diào)用方法
//var readMe = fs.readFileSync('readMe.txt');
// 沒有字符參數(shù)
/*
<Buffer e4 b8 80 e5 8f aa e8 9b a4 e8 9f 86 0a 20 20 20 20 e5 9b 9b e6 9d a1 e8 85 bf 0a 20 20 20 20 20 20 20 20 e5 9b 9b e4 b8 aa e7 be 8e e7 9c 89 0a 20 20 ... >
*/
// 添加了字符參數(shù)
//var readMe = fs.readFileSync('readMe.txt','utf8');
/*
一只蛤蟆
四條腿
四個美眉
八只__
*/
// console.log(readMe);
// 會創(chuàng)建一個writeMe.txt文件,并寫入讀取出來的readMe的值
// fs.writeFileSync('writeMe.txt',readMe);
// 異步讀取文件
// fs.readFile('readMe.txt','utf8',function (err,data) {
// if (err) throw err;
// console.log(data);
// })
// 異步寫入文件
// fs.readFile('readMe.txt','utf8',function (err,data) {
// if (err) throw err;
// fs.writeFile('writeMe2.txt',data);
// })
//
// console.log(1);
// fs.unlink('writeMe2.txt',function (err) {
// if (err) throw err;
// console.log('文件刪除成功');
// })
//創(chuàng)建文件夾 同步
// fs.mkdirSync('stuff');
//刪除文件夾 同步
// fs.rmdirSync('stuff');
// 異步創(chuàng)建文件夾和刪除文件夾
// fs.mkdir('stuff',function () {
// fs.readFile('readMe.txt','utf8',function (err,data) {
// if (err) throw err;
// fs.writeFile('./stuff/writeMe.txt',data);
// })
// })
// 異步刪除文件夾
// 1 先刪除文件夾中的文件 2 再刪除外部的文件夾
fs.unlink('./stuff/writeMe.txt',function () {
fs.rmdir('stuff',function (err) {
if (err) throw err;
console.log('文件夾刪除成功');
})
})