node官网:http://nodejs.cn/
今天想看看node的视频,对node进一步了解,
1、我们可以从官网下载node到自己的电脑上,今天了解到node的真正概念,node时javascript在服务端的运行环境,虽然之前知道,但没有像今天一样这样的新体会,
javascript在服务端的运行环境??一般javascript是在浏览器运行的,浏览器就是javascript的一种运行环境,而node,可以让它在服务端运行,那么node环境中,有许多api,比如浏览器环境的全局对象是window,但在node环境中,全局对象是global
2、我现在用vscode来练习使用node,创建一个文件夹,用vscode打开,在这个目录下创建app.js,然后写上一些js代码,在控制台输入 node app或则node app.js 里面的js代码就会运行了
3、在node环境中 __dirname 代表的是当前目录(node中的一个全局变量) console.log出来看一下,会知道,它显示的是app.js所在的文件在电脑上的绝对路径
4、__filename :是当前文件的路径(c/xx/hello-nodejs/app.js)
5、回调函数的使用
function callFunction(fun){//回调函数的使用 fun(); } var sayBye=function(){ console.log("bye"); } callFunction(sayBye);
给回调函数传参
function callFunction(fun,name){//回调函传参 fun(name); } var sayBye=function(name){ console.log("bye"+name); } callFunction(sayBye,"名字");
给回调函数传参的另一种常用写法
function callFunction(fun,name){ fun(name); } callFunction(function(name){//调用 console.log("bye"+name); },'名字');
6、require 以及 module.exports的使用(模块)
在node中,我们要分很多模块,那么怎样在一个模块中调用另一个模块呢?
加入我们要在app模块中调用count模块中的方法
count.js:
var counter = function(arr){ return "there are " + arr.length +"elements in the array"; } module.exports=counter;//暴露出来的内容
app.js:
var counter=require("./count");//引入count.js中暴露出来的内容,这里是一个函数 console.log(counter(["nodejs","vue","bootstrap"]));
然后运行node app 就会打印出想要的东西!!
如果想暴露多个东西呢?
count.js:
var counter = function(arr){ return "there are " + arr.length +"elements in the array"; } var adder = function(a,b){ return `the sum of the 2 number is ${a+b}`; } var pi=3.14; module.exports.counter=counter; module.exports.adder=adder; module.exports.pi=pi;
app.js:
var stuff=require("./count"); console.log(stuff.counter(["nodejs","vue","bootstrap"])); console.log(stuff.adder(2,3)); console.log(stuff.pi);
这样就可以暴露出多个东西
导出多种东西也有多种写法:
count.js:
module.exports={ counter:counter, adder:adder, pi:pi }
还可以这样写
count.js:
module.exports={//es6语法
counter,
adder,
pi
}
还可以这样导出
count.js:
var adder = function(a,b){ return `the sum of the 2 number is ${a+b}`; } var pi=3.14; module.exports={ counter:function(arr){ return "there are " + arr.length +"elements in the array"; }, adder, pi }
在app调用时,也有多种写法:(反正导出的是一个对象)
console.log(require("./count").pi);
7、事件 events
node中的事件,有点像jquery中的事件,node中的事件是自定义的,先引入events核心库,创建一个事件对象,绑定上事件名,和事件的回调函数,然后出发
var events=require('events');//events是一个核心库 var myEmitter = new events.EventEmitter();//创建一个事件对象 myEmitter.on('someEvent',function(message){//给事件对象绑定一个事件名,并且绑定上一个回调函数 console.log(message); }) myEmitter.emit('someEvent','the event was emitted');//触发事件
下面来看一个应用实例:
var events=require('events');//events是一个核心库 var util=require('util');//引入工具库 (也是一个核心库) var Person=function(name){//创建一个类 this.name=name; } util.inherits(Person,events.EventEmitter);//让Person 继承这个类 var xiaoming=new Person('xiaoming');//创建3个Person 实例 var lili=new Person('lili'); var lucy=new Person('lucy'); var personArr=[xiaoming,lili,lucy];//创建一个数组,把三个实例放进去 personArr.forEach(function(person){//给每个实例 绑定一个speak事件 person.on('speak',function(message){ console.log(person.name+'said:'+message); }) }); xiaoming.emit('speak','Hi');//触发各自的事件 lili.emit('speak','i want a curry'); lucy.emit('speak','chi xi gua');
8、读写文件 fs
同步读写:
var fs = require('fs');//引入文件库(核心库) //读取文件内容(同步) var readMe = fs.readFileSync("readMe.txt","utf8");//第一个参数是 文件路径 这里实在跟目录 直接写文件名就行 第二个参数是编码格式 //写入文件内容,没有此文件将会创建这样的文件(同步),如果writeMe.txt之前有内容,之前的内容则会被覆盖 fs.writeFileSync("writeMe.txt",readMe);
同步读写就是按照代码顺序执行,文件读写不完,下面的代码就不会执行;
下面面来看一个异步的读取:
var fs = require('fs');//引入文件库(核心库) //读取文件内容(异步) var readMe = fs.readFile("readMe.txt","utf8",function(err,data){ fs.writeFile('writeMe.txt',data,function(){//异步写入 console.log("writeMe has finished"); }) }); console.log("finished");
当我们运行node app时,发现finished会先于读写的回调打印出来,这证明读写文件是异步的。注:node是多线程的,但node执行javascript时,是单线程的。
9、删除文件fs .unlink
var fs = require('fs');//引入文件库(核心库) fs.unlink('writeMe.txt',function(){//参数是文件路径和回调函数 console.log('delete writeMe.txt file'); })
删除文件是一个异步的过程,同样,加上sync就是同步的 (unlinkSync)
10、先创建一个文件,再删除(这里创建文件是用的写入文件的方法)
var fs = require('fs');//引入文件库(核心库) //这里是同步写入文件 其实我本意是 创建一个文件 fs.writeFileSync('stuff.txt','');//注意同步没有回调函数 // 删除刚刚创建的文件 fs.unlinkSync('stuff.txt');//注意同步没有回调函数
11、创建文件目录 fs.mkdirSync(对应的有异步方法)
var fs = require('fs');//引入文件库(核心库) fs.mkdirSync('stuff');//创建文件(这里是同步的,因为有Sync)
12、先创建一个文件目录,再删除(fs.rmdirSync)
var fs = require('fs');//引入文件库(核心库) fs.mkdirSync('stuff');//创建文件(这里是同步的,因为有Sync) fs.rmdirSync('stuff');
13、先创建一个目录,再在此目录中写入一个文件,(这里都采用同步的方法)
var fs = require('fs');//引入文件库(核心库) fs.mkdirSync("./stuff"); fs.writeFileSync("./stuff/aa.txt","");
14、先创建一个目录,再在目录里写一个文件,然后,删除该目录里的这个 文件,然后再删除这个目录(同步)
var fs = require('fs');//引入文件库(核心库) fs.mkdirSync("./stuff"); fs.writeFileSync("./stuff/aa.txt",""); fs.unlinkSync("./stuff/aa.txt"); fs.rmdirSync("./stuff");
15、将一个文件复制到新创建的目录中,这里都采用异步的
var fs = require('fs');//引入文件库(核心库) fs.mkdir("./stuff",function(){ fs.readFile("readMe.txt","utf8",function(err,data){ fs.writeFile("./stuff/writeMe.txt",data,function(){ console.log("write file success!"); }) }) })