直接输入 node -v
输入 npm -v
或者我们直接运行一个我们本地的js也是一样的,直接node csdn_demo.js
举个例子
/**
* @author clearlove
* @aim 测试一个nodejs的全局变量
* @param time 计时变量
* @param timer 清除计时器
* setTimeout 延时操作
* setInterval 计时循环操作
*/
setTimeout(function () {
console.info("3秒过去了,我已经执行结束了")
}, 3000)
var time = 0
let timer = setInterval(function () {
time++
console.info(time)
if (time > 10) {
clearInterval(timer)
console.info("结束了")
}
}, 2000)
还有一点是我们常见的
console.info(__dirname) //w文件路径名字 不不包含文件名 这个也是bnode里面的一个全局变量
console.info(__filename) // 文件完整路径名字
其实这个global和前面两个说的一样都是node里面的全局变量,但是为什么这个要单独拿出来说呢?原因自然是他有自己不一样的地方,我们都知道js里面的全局变量是windows,我们一般都是windows.一个属性,但是在node里面他的老大就是global了,那么我们直接打印出来这个看看究竟是什么
console.info(global)
-这里就不展示运行结果了,你们自己运行吧,太长了,截图或者直接复制都比较不友好。
pass
run
stop
JS代码
V8引擎
Node
计算机直接识别JS代码
计算机不能直接识别JS代码
/**
* @auhor clearlove
* @aim 判断用户输入的数据类型
* @param {*} params 形参
*/
var counter = function(params) {
return typeof params
}
//将当前的工具函数导出去,变为一个任何引入的地方都可以直接使用
module.exports = counter
我们在node_demo.js里面我们引入他
/**
* @author clearlove
* @aim 接收模块的代码
* @parms counter 将引入的js赋值给counter
*/
let counter = require("./stuff")
console.info(counter(false))
运行效果:
这里介绍两个东西,第一是module.exports 第二是require
那这个时候就有人问了,我们一个方法这样写,多个的时候怎么办呢?看例子:
/**
* @auhor clearlove
* @aim 判断用户输入的数据类型
* @param {*} params 形参
*/
var counter = function(params) {
return typeof params
}
/**
*
* @param {*} a
* @param {*} b
*/
var add = function(a, b) {
return `计算的结果是: ${a+b}`
}
/**
* @param pi 圆周率
*/
var pi = 3.141592653589793238462643383279
//将当前的工具函数导出去,变为一个任何引入的地方都可以直接使用
module.exports.counter = counter
module.exports.add = add
module.exports.pi = pi
/**
* @author clearlove
* @aim 接收模块的代码
* @parms counter 将引入的js赋值给counter
*/
let stuff = require("./stuff") //此时的stuff是一个对象
console.info(stuff.counter(false))
console.info(stuff.add(584, 654))
console.info(stuff.pi)
这里又有人说了,那你这太麻烦了,如果一百个方法是不是你要复制一百次啊,当然不是,我们可以直接将一个对象导出去,看代码:
/**
* 将每一个方法名字均导出去
*/
module.exports = {
counter: counter,
add: add,
pi: pi
}
/**
* @param pi 圆周率
*/
var pi = 3.141592653589793238462643383279
/**
* 将每一个方法名字均导出去
*/
module.exports = {
counter: function(params) {
return typeof params
},
add: function(a, b) {
return `您计算的结果是:${a + b}`
},
pi: pi
}
这里需要解释一下上面有一句话是这样的:return
计算的结果是: ${a+b}
那么这句话是es6的一个写法,就黑我们平常写+拼接是一个意思,只是这样写是一个比较非常规的写法而已。
/**
* @author clearlove
* @aim 演示基本的事件使用的过程
* @param myEmitter 创建eventemitter对象
*/
//引入事件模块 import event from 'events' 和下面的写法是一样的,只是这个是es6的写法
var event = require('events');
//创建eventemitter对象
var myEmitter = new event.EventEmitter();
//注册一个事件 (这里解释一下什么是注册一个事件,我们使用jquery的时候会知道,我们想使用一个事件的时候我们是元素之前就创建好的 例如:Element.on('click',function (params) {}))
myEmitter.on('anyevent',function(param){
console.info(typeof param)
//return typeof param
})
//触发事件 你可以直接调用这个事件 当然也可以传递参数
//myEmitter.emit('anyevent',false) //前者是事件名字,后者是参数
myEmitter.emit('anyevent',false)
运行结果:
/**
* @author clearlove
* @aim 演示异步使用
* @param myEmitter 创建eventemitter对象
*/
var event = require('events');
var myEmitter = new event.EventEmitter();
myEmitter.on('anyevent',function(param){
console.info(param)
})
myEmitter.emit('anyevent','我是myEmitter事件')
console.info('我被执行了,在myEmitter事件之后')
运行结果:
可以看到我们的代码是顺序执行的,也就是说上面声明的事件执行结束以后下面的事件才开始执行的,那么这个时候我想翻过来执行的顺序怎么办呢?Node官方给出的解决办法是这样的,看代码:
/**
* @author clearlove
* @aim 演示异步使用
* @param myEmitter 创建eventemitter对象
*/
var event = require('events');
var myEmitter = new event.EventEmitter();
myEmitter.on('anyevent',function(param){
//EventEmitter 会按照监听器注册的顺序同步地调用所有监听器。 所以必须确保事件的排序正确,且避免竞态条件。 可以使用 setImmediate() 或 process.nextTick() 切换到异步模式
setImmediate(()=>{
console.info(param)
})
})
myEmitter.emit('anyevent','我是myEmitter事件')
console.info('我被执行了,在myEmitter事件之前')
运行结果:
具体下面还有什么once、error或者别的什么方法这里就不写了,都是如出一辙,会了一个就可以了。 多个参数的情况处理,看代码:
/**
* @author clearlove
* @aim 演示多参数
* @param myEmitter 创建eventemitter对象
*/
var event = require('events');
var myEmitter = new event.EventEmitter();
myEmitter.on('event', (a, b) => {
console.log(a + b,this);
});
myEmitter.emit('event', 1, 2);
运行结果:
当监听器被调用时,this指向的是EventEmitter对象
- 读取文件 (fs.readFile)
- 写入文件 (fs.writeFile)
- 流程:引入fs模块->调用方法->异常捕获
/**
* @author clearlove
* @aim 演示文件读写
* @param myEmitter 创建eventemitter对象
*/
//引入fs
var fs = require('fs');
//通过对象调方法 同步读取文件
var readme = fs.readFileSync('readMe.txt','utf-8');
console.info(readme)
fs.writeFileSync('writeMe.txt',readme) //同步写入文件
运行结果:
会发现写入文件的时候下面会多出一个我们刚刚写的文件
/**
* @author clearlove
* @aim 演示文件读写
*/
//引入fs
var fs = require('fs');
/**
* @readMe.txt 需要读的文件
* @utf-8 读的字符格式
* @error 抛出异常
* @data 读的内容
*/
fs.readFile(__filename,'utf-8', function (error,data) {
if(error) throw error
//在我们读取结束后将自身的内容写入到新的文件中去
writeMeSync(data)
})
/**
* @writeMeSync 写入一个文件
* @param {*} 写入的参数
*/
function writeMeSync(params) {
fs.writeFile('SyncWriteMe.txt',params,function(error,data){
if(error) throw error
})
}
-运行结果:
- 创建文件夹 fs.mkdir
- 删除文件夹 fs.rmdir
- 删除文件 fs.unlink
流程:引入fs模块->调用方法->异常捕获
看代码:
/**
* @author clearlove
* @aim 演示删除文件以及文件夹
*/
//引入fs
var fs = require('fs');
fs.unlink('SyncWriteMe.txt',function (err) {
if (err) throw err
console.info('删除成功')
})
//创建文件夹
fs.mkdirSync('views',function(err){
if (err) throw err
console.info('创建成功')
})
//删除文件夹
fs.rmdirSync('views',function(err){
if (err) throw err
console.info('删除成功')
})
/**
* @author clearlove
* @aim 演示删除文件以及文件夹
*/
//引入fs
var fs = require('fs');
//异步操作文件夹 新建一个文件夹,读当前文件内容,将最新的文件内容写到一个新的文件里面
fs.mkdir('views', function () {
fs.readFile(__filename, 'utf-8', function (err, data) {
if (err) throw err;
fs.writeFile('./views/new.js', data,function(err){
if(err) throw err
console.info('创建成功')
})
})
})
//异步删除文件夹 删除文件夹的前提是文件夹是空的,所以我们第一步是将文件夹里面的文件删除,成功以后删除文件夹
fs.unlink('./views/new.js',function (err) {
if(err) throw err
fs.mkdir('vires',function (err,data) {
if(err) throw err
console.info('文件夹删除成功')
})
})
ok,先写到这里吧,NodeJS还有很多需要学的,但是做事情不可以一蹴而就,循序渐进的来吧,下篇文章有时间的时候写一下剩下的一些关于NodeJS的知识,因为我是自学的,所以写的一些不规范或者有问题的地方可以提出来,我直接改掉,学习NodeJS注定是一条漫长的路,下一篇文章我会写一下本地怎么跑一个服务,将本地的html渲染出来,同时写一下关于buffer和stoream流的概念,共勉,感谢。