浅理解node.js
最近开始了解node.js,在这里把最近了解的大概串一下,加深一下理解。
node.js是一个解析器——一种运行环境,允许JS使用运行环境提供的内置对象和方法做一些事情。例如fs/http内置对象。
——运行在服务端的JavaScript
1 先来个实际点的小例子,感受一下nodejs
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8888); console.log('Server running at http://127.0.0.1:8888/');
这样就创建了一个http服务器了。在http://127.0.0.1:8888上用浏览器访问,就可以看到输出的Hello World了。
2 模块
require //引用模块
main.js中引用其它模块
1 | var hello=require( './hello.js' ); |
exports //导出对象给require改模块的模块使用
exports.hello=function(){console.log('hello world');}
function hello(){ console.log('hello world'); } exports.hello=hello;
module //可访问当前模块的信息,主要用于替换模块的默认导出对象
注意:模块中的代码仅在初始化时执行一次,再次利用时调用缓存重复利用
当一个包中有多个模块,可将主模块名为index.js,或者package.json,通过目录作为访问包的入口(而不是文件路径);
package.json { "name":"package" //模块的当前文件夹所在的文件夹 “main”:"./lib/main.js" // / home /node/package/lib/xx.js } //访问模块 require('/home/node/package') 哈,一看就是访问包的感觉
4 npm
获取第三方包
下载第三方包 npm install agrv;
或者在package.json 里配置
{ "name": "node-echo", "main": "./lib/echo.js", "dependencies": { "argv": "0.0.2" } }
5 文件处理,文件处理一般存在两个版本:同步,异步。
//文件的读取
fs.readFile(filename,[encoding],[callback(err,data)])
fs.readFileSync(filename,[encoding],[callback(err,data)]) //同步
- filename(必选),表示要读取的文件名。
- encoding(可选),表示文件的字符编码。
- callback 是回调函数,用于接收文件的内容。
如 果不指 定 encoding,则 callback 就是第二个参数。回调函数提供两个参数 err 和 data,err 表 示有没有错误发生,data 是文件内容。如果指定了 encoding,data 是一个解析后的字符 串,否则 data 将会是以 Buffer 形式表示的二进制数据。
小文件的copy
var fs=require('fs') //内置文件模板 function copy(src,dst){ fs.writeFileSync(dst,readFileSync(src)) } function main(argv){ copy(argv[0],argv[1]); } main(process.argv.slice[2]);//argv[0],argv[2]分别储存的执行程序和主模块的绝对路径
上述小文件属于一次性写入内存,一次性读出,会引起内存爆仓
大文件的写入(流水式)
var fs = require('fs'); function copy(src, dst) { fs.createReadStream(src).pipe(fs.createWriteStream(dst)); //(边读边写) } function main(argv) { copy(argv[0], argv[1]); } main(process.argv.slice(2));
6 event的对象,eventemitter 事件发射和事件监听功能的封装
每个事件有一个事件名(字符串)和若干参数组成,一个事件可以有多个事件监器
var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { //注册事件监听器 console.log('第一个事件', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('第二个事件', arg1, arg2); }); emitter.emit('someEvent', 'byvoid', 1991); //发射事件,依次调用事件监听
eventemitter API:
eventemitter.on(event,listener);
eventemitter.once(event,listener);事件只用一次解除
eventemitter.removeListener(event,listener);移除事件
error是eventemitter的特殊事件
遇到异常是发射error事件,调用监听函数,避免程序崩溃
var events = require('events'); var emitter = newevents.EventEmitter(); emitter.on('error',function(){ console.log('error') }) emitter.emit('error');
关于继承:大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
7 全局变量
process:
process.argv 命令行参数数组
process.stdout/process.stdin
process.stdin.resume(); process.stdin.on('data', function(data) { process.stdout.write('read from console: ' + data.toString()); });
process.nextTick(callback),为时间循环设置任务,下次循环响应事调用callback,把复杂的工作拆分成小时间,提高响应速度,节省响应时间(本人此处理解不太透)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!