发布网友 发布时间:2024-09-17 03:48
共1个回答
热心网友 时间:2024-10-25 21:38
nodejs编译后js文件名前缀Node.js是一个基于ChromeV8引擎的JavaScript运行环境。
Node与javaScript的区别在于,javaScript的顶层对象是window,而node是global
//这里使用的var声明的变量不是全局的,是当前模块下的,用global声明的表示是全局的
vars=100;
global.s=200;
//这里访问到的s是var生命的
console.log(s);//100
//这里访问到的才是全局变量
console.log(global.s);//200
模块:在node中,文件和模块是一一对应的,也就是一个文件就是一个模块;每个模块都有自己的作用域,我们通过var申明的变量并非全局而是该模块作用域下的。
(2)mole模块
1、文件查找
1)首先按照加载的模块的文件名称进行查找,如果没有找到,则会带上.js、.json或.node拓展名在加载
2)以'/'为前缀的模块是文件的绝对路径。例如,require('/home/marco/foo.js')会加载/home/marco/foo.js文件。
3)以'./'为前缀的模块是相对于调用require()的文件的。也就是说,circle.js必须和foo.js在同一目录下以便于require('./circle')找到它。
4)当没有以'/'、'./'或'../'开头来表示文件时,这个模块必须是一个核心模块或加载自node_moles目录。
5)如果给定的路径不存在,则require()会抛出一个code属性为'MODULE_NOT_FOUND'的Error。
2、mole作用域
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问,如果我们想一个模块能够访问另外一个模块中定义的变量,可以有一下两种方式:
1)把变量作为global对象的一个属性,但这样的做法是不推荐的
2)使用模块对象mole。mole保存提供和当前模块有关的一些信息。
在这个mole对象中有一个子对象exports对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问。
//这个方法的返回值,其实就是被加载模块中的mole.exports
require('./02.js');
3、__dirname:当前模块的目录名。
例子,在/Users/mjr目录下运行nodeexample.js:
console.log(__dirname);
//输出:/Users/mjr
console.log(path.dirname(__filename));
//输出:/Users/mjr
4、__filename:当前模块的文件名(处理后的绝对路径)。当前模块的目录名可以使用__dirname获取。
在/Users/mjr目录下运行nodeexample.js:
console.log(__filename);
//输出:/Users/mjr/example.js
console.log(__dirname);
//输出:/Users/mjr
(3)process(进程)
process对象是一个全局变量,提供Node.js进程的有关信息以及控制进程。因为是全局变量,所以无需使用require()。
1、process.argv
返回进程启动时的命令行参数。第一个元素是process.execPath。第二个元素是当前执行的JavaScript文件的路径。剩余的元素都是额外的命令行参数。
console.log(process.argv);
打印结果:
2、process.execPath返回启动进程的可执行文件的绝对路径。
3、process.env返回用户的环境信息。
在process.env中可以新增属性:
process.env.foo='bar';
console.log(process.env.foo);
可以通过delete删除属性:
deleteprocess.env.foo;
console.log(process.env);
在Windows上,环境变量不区分大小写
4、process.pid属性返回进程的PID。
5、process.platform属性返回字符串,标识Node.js进程运行其上的操作系统平台。
6、process.title属性用于获取或设置当前进程在ps命令中显示的进程名字
7、process.uptime()方法返回当前Node.js进程运行时间秒长
注意:该返回值包含秒的分数。使用Math.floor()来得到整秒钟。
8、process.versions属性返回一个对象,此对象列出了Node.js和其依赖的版本信息。
process.versions.moles表明了当前ABI版本,此版本会随着一个C++API变化而增加。Node.js会拒绝加载模块,如果这些模块使用一个不同ABI版本的模块进行编译。
9、process对象-输入输出流
vara;
varb;
process.stdout.write('请输入a的值:');
process.stdin.on('data',(chunk)={
if(!a){
a=Number(chunk);
process.stdout.write('请输入b的值:');
}else{
b=Number(chunk);
process.stdout.write('a+b的值:'+(a+b));
process.exit();
}
});
(4)Buffer缓冲器
Buffer类,一个用于更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,他是一个全局的类
1、如何创建使用buffer
Buffer.from(array)返回一个Buffer,包含传入的字节数组的拷贝。
Buffer.from(arrayBuffer[,byteOffset[,length]])返回一个Buffer,与传入的ArrayBuffer共享内存。
Buffer.from(buffer)返回一个Buffer,包含传入的Buffer的内容的拷贝。
Buffer.from(string[,encoding])返回一个Buffer,包含传入的字符串的拷贝。
Buffer.alloc(size[,fill[,encoding]])返回一个指定大小且已初始化的Buffer。该方法比Buffer.allocUnsafe(size)慢,但能确保新创建的Buffer不会包含旧数据。
Buffer.allocUnsafe(size)与Buffer.allocUnsafeSlow(size)返回一个指定大小但未初始化的Buffer。因为Buffer是未初始化的,可能包含旧数据。
//创建一个长度为10、且用01填充的Buffer。
constbuf1=Buffer.alloc(10,1);
//创建一个长度为10、且未初始化的Buffer。
//这个方法比调用Buffer.alloc()更快,但返回的Buffer实例可能包含旧数据,因此需要使用fill()或write()重写。
constbuf2=Buffer.allocUnsafe(10);
constbuf3=Buffer.from([1,2,3]);
constbuf4=Buffer.from('tést');
console.log(buf1);//Buffer01010101010101010101
console.log(buf2);//Buffer00000000080000000700
console.log(buf3);//Buffer010203
console.log(buf4);//Buffer74c3a97374
2、Buffer对象提供的toString、JSON的使用
1)buf.toString(encoding,start,end)
varbf=Buffer.from('miaov');
console.log(bf.toString('utf-8',1,4));//iaov
console.log(bf.toString('utf-8',0,5));//miaov
console.log(bf.toString('utf-8',0,6));//miaov
2)buf.write(string,offset,length,encoding)
string要写入buf的字符串。
offset开始写入的偏移量。默认0,这里指的是buffer对象的起始要写入的位置。
length要写入的字节数。默认为buf.length-offset。
encodingstring的字符编码。默认为'utf8'。
返回:已写入的字节数。
varstr="miaovhello";
varbf=Buffer.from(str);
varbf2=Buffer.alloc(8);
//从0开始写入5个
bf2.write(str,0,5);
console.log(bf);
console.log(bf2);
3)buf.toJSON()
constbuf=Buffer.from([0x1,0x2,0x3,0x4,0x5]);
constjson=JSON.stringify(buf);
console.log(json);
//输出:{"type":"Buffer","data":[1,2,3,4,5]}
3、Buffer中静态方法的使用
1)Buffer.isEncoding(encoding):判断是否是Buffer支持的字符编码,是则返回true,不是则返回false
console.log(Buffer.isEncoding('utf-8'));//true
2)Buffer.isBuffer(obj):如果obj是一个Buffer,则返回true,否则返回false。
(5)fs(文件系统)
该模块是核心模块,需要使用require('fs')导入后使用,该模块主要用来操作文件
1、fs.open(path,flags,mode,callback)
path:要打开的文件的路径;
flags:打开文件的方式读/写;
mode:设置文件的模式读/写/执行
callback(err,fd):文件打开以后,在回调函数中做相应的处理,回调函数的两个参数:
err:文件打开失败的错误保存在err里面,如果成功err为null
fd:被打开文件的标识
varfs=require('fs');
fs.open('./test.txt','r',function(err,fd){
if(err){
console.log("文件打开失败");
}else{
console.log("文件打开成功");
}
});
2、fs.openSync(path,flags,mode):返回文件描述符。
varfs=require('fs');
console.log(fs.openSync('./test.txt','r'));//3
3、fs.read(fd,buffer,offset,length,position,callback)
从fd指定的文件中读取数据;
buffer指定要写入数据的buffer;
offset指定buffer中开始写入的偏移量;
length指定要读取的字节数;
position指定文件中开始读取的偏移量。如果position为null,则从文件的当前位置开始读取;
callback有三个参数(err,bytesRead,buffer)
示例:test.txt中的值为123456789
fs.open('./test.txt','r',function(err,fd){
if(!err){
varbf=Buffer.alloc(5);
fs.read(fd,bf,0,5,0,function(){
console.log(bf.toString());//12345
})
}
});
4、fs.write(fd,buffer,offset,length,position,callback)
将buffer写入到fd指定的文件。
offset指定buffer中要开始被写入的偏移量,length指定要写入的字节数。
position指定文件中要开始写入的偏移量。如果typeofposition!=='number',则从当前位置开始写入。
callback有三个参数(err,bytesWritten,buffer),其中bytesWritten指定buffer中已写入文件的字节数。
varfs=require('fs');
fs.open('./test.txt','r+',function(err,fd){
if(!err){
varbf=Buffer.alloc(5);
fs.read(fd,bf,0,5,0,function(){
console.log(bf.toString());//12345
});
varbf=Buffer.from('test数据');
fs.write(fd,bf,0,10,0);
fs.write(fd,'测试数据2',10,'utf-8');
}
});
fs.write(fd,string,position,encoding,callback)
将string写入到fd指定的文件。如果string不是一个字符串,则会强制转换成字符串。
position指定文件中要开始写入的偏移量。如果typeofposition!=='number',则从当前位置开始写入。
encoding指定字符串的编码。
callback有三个参数(err,written,string),其中written指定字符串中已写入文件的字节数。写入的字节数与字符串的字符数是不同的。
5、fs.exists(path,callback)检查指定路径的文件或者目录是否存在
fs.appendFile(path,data,callback):将数据追加到文件,如果文件不存在则创建文件。
//检查文件是否存在
varfs=require('fs');
varfilename='./test2.txt';
fs.exists(filename,function(isExists){
if(!isExists){
fs.writeFile(filename,'miaov',function(err){
if(err){
console.log("文件创建失败");
}else{
console.log("文件创建成功");
}
});
}else{
fs.appendFile(filename,'-leo',function(err){
if(err){
console.log("文件内容追加失败");
}else{
console.log("文件内容追加成功");
}
})
}
});
(6)前端项目自动化构建
1、创建myProject项目文件以及对应的文件夹
varprojectData={
'name':'myProject',
'fileData':[
{
'name':'css',
'type':'dir'
},{
'name':'js',
'type':'dir'
},{
'name':'images',
'type':'dir'
},{
'name':'index.html',
'type':'file',
'content':'html\n\thead\n\t\ttitletitle/title\n\t/head\n\tbody\n\t\th1Hello/h1\n\t/body\n/html'
}
]
};
varfs=require('fs');
if(projectData.name){
//创建项目文件夹
fs.mkdirSync(projectData.name);
varfileData=projectData.fileData;
if(fileDatafileData.length){
fileData.forEach(function(file){
//文件或文件夹路径
file.path='./'+projectData.name+'/'+file.name;
//根据type类型创建文件或文件夹
file.content=file.content||'';
switch(file.type){
case'dir':
fs.mkdirSync(file.path);
break;
case'file':
fs.writeFileSync(file.path,file.content);
break;
default:
break;
}
});
}
}
2、自动打包多个文件
varfs=require('fs');
varfiledir='./myProject/dist';
fs.exists(filedir,function(isExists){
if(!isExists){
fs.mkdirSync(filedir);
}
fs.watch(filedir,function(ev,file){
//只要有一个文件发生了变化,我们就需要对文件夹下的所有文件进行读取、合并
fs.readdir(filedir,function(err,dataList){
vararr=[];
dataList.forEach(function(file){
if(file){
//statSync查看文件属性
varinfo=fs.statSync(filedir+'/'+file);
//mode文件权限
if(info.mode===33206){
arr.push(filedir+'/'+file);
}
}
});
//读取数组中的文件内容
varcontent='';
arr.forEach(function(file){
varc=fs.readFileSync(file);
content+=c.toString()+'\n';
});
//合并文件中的内容
fs.writeFileSync('./myProject/js/index.js',content);
})
});
});
(7)使用node进行web开发
1、搭建一个http的服务器,用于处理用户发送的http请求
//加载一个http模块
varhttp=require('http');
//通过http模块下的createServer创建并返回一个web服务器对象
varserver=http.createServer();
//开启HTTP服务器监听连接,只有调用了listen方法以后,服务器才开始工作
server.listen(8000,'localhost');
//服务器是否正在监听连接
server.on('listening',function(){
console.log("listening..........");
});
//每次接收到一个请求时触发,每个连接可能有多个请求(在HTTPkeep-alive连接的情况下)。
server.on('request',function(){
res.write('phello/p');
res.end();
});
2、request方法有两个参数:request、response
1)request:http.IncomingMessage的一个实例,获取请求的一些信息,如头信息,数据等
htt