1、Node是什么?(转自:https://blog.csdn.net/m0_37938910/article/details/103673105)
Node.js 就是运行在服务端的 JavaScript。
Node.js不是一种独立的语言,也不是一个JavaScript的框架,Node.js只是一个让JavaScript运行在浏览器之外的平台。它采用事件驱动、异步编程、为网络服务而设计,实现了诸如文件系统、模块、包、操作系统 API、网络通信等 Core JavaScript 没有或者不完善的功能。
Node能做什么?
● 具有复杂逻辑的网站
● 基于社交网络的大规模web应用
● web Socket网站
● TCP\UDP套接字应用程序
● 命令行工具
● 交互式终端程序
● 带有图形用户界面的本地应用程序
● 单元测试工具
● 客户端Javascript编译器
Node的特点
node最大的特点是采用异步式I\O与事件驱动
异步式 I/O 与事件驱动
Node.js 使用的是单线程模型,对于所有I/O都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。
Node的异步机制是基于事件的,所有的磁盘I/O,网络通信,数据库差选都是以非阻塞的的方式来请求,返回的结果有事件循环来处理,如图所示
Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU和内存在同一时间集中处理一件事,同时尽可能让耗时的I/O操作并行执行。对于低速连接攻击,Node.js只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高 Web 应用的健壮性,防止恶意攻击。
最重要的是:Node中的js不需要考虑浏览器的兼容问题!
2、Node与PHP、Java的区别
PHP 和 Node.js 的基本区别在于 PHP 是一种编程语言,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
性能:
由于 Node.js 遵循事件驱动的非阻塞I/O模型,与传统的后端技术相比,Node.js 能够处理大量的服务器请求。PHP 遵循一个阻塞模型,其中在服务器端创建多个线程来处理多个客户端请求,如果代码没有被优化,它会导致高服务器负载和响应时间。
托管和部署:
PHP 应用程序可以在包括 Nginx 和 Apache 以及 Windows 和 Linux 平台在内的任何服务器上运行,这使得部署过程变得更容易,而 Node.js,则需要具有 SSH 访问权限的虚拟服务器。因此,在没有任何控制台命令和 Secure Shell(SSH)知识的情况下,用 PHP 部署小型企业和个人应用会更好。
外部依赖:
Node.js 依赖关系较少,用几行代码就可以设置一个 Web 服务器。但运行 PHP 应用程序,就需要外部服务器软件。用 Node.js 的开发人员只需要 NPM(节点包管理器)就可以下载 Node 模块,这些模块可以轻松地集成到应用程序中,提供额外的功能。
CPU 扩展任务:
Node.js 可能在高吞吐量方面表现优异,但是当应用程序繁重,需要 CPU 做大量工作时,Node.js 肯定会有所欠缺。在这种情况下,PHP 最适合做 Web 应用程序的后端。
相似的情况在比较或选择用于 Web,桌面和移动开发的其他技术时。Node.js 有前途,并且肯定会占据PHP市场的一部分,但是不能完全取代 PHP。
Node.js和java之间:
1、Node.js可以说是动态语言,java是静态语言(不能改变它的类型的语言,是静态语言;能够随时改变它的类型的语言,是动态语言),要到运行时才知道类型错误,测试就得些的更好更详细。
2、前者解释型语言, 编写的程序不需要编译。解释型语言在运行的时候才翻译, java编译型语言, 写的程序执行之前,需要一个专门的编译过程,把高级语言翻译成机器语言(解释型语言的特点是,跨平台、知识产权保护性弱、运行效率低, 编译型语言特点与解释型语言相反)
3、语法方面node.js比Java更简洁,干净。
4、javascript支持函数作为参数,java得搞一个类。
5、node相对java学习学习曲线低,前后端语言统一方便技术交流提升。
6、node开发快,java开发慢,但是如果项目大、复杂的话,用java就不容易乱,管理起来比node.js简单。
3、同步和异步区别(转自:https://blog.csdn.net/singit/article/details/47724303)
他们最大的区别:同步需要等待,而异步无需等待。
同步是按顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
例子:
普通B/S模式(同步)AJAX技术(异步)
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干别的事。
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕。
``
线程就是异步实现的一个方式。
异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。
异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。
实现异步可以采用多线程技术或则交给另外的进程来处理。
``
同步可以避免出现死锁,读脏数据的发生。
一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
但是,同步需要等待资源访问结束,浪费时间,效率低。
异步则可以提高效率。
现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
但是安全性较低。
3、判断文件夹下文件状态
fs.readdir(__dirname,(err,files)=>{ //读取当前目录下所有文件
if(err) throw err;
for(let i in files){//遍历所有文件
fs.stat(files[i],(err,stats)=>{//判断当前文件的状态
//如果是文件就输出文件名是文件,如果是文件夹就输出文件夹名是文件夹
stats.isFile()?console.log(`${files[i]}是文件`):console.log(`${files[i]}是文件夹`);
})
}
});
在cmd中输入node fs.js运行创建的js文件,会输出如下内容: