Node.js简介
Posted s_kzn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js简介相关的知识,希望对你有一定的参考价值。
目录
一、什么是node.js
Node.js是JavaScript语言的服务器运行环境。
- Node.js 就是运行在服务端的 javascript。
- Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
- Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
二、为什么要用node.js
javaScript语言本身是完善的函数式语言,在前端开发时,开发人员往往写得比较随意,让人感觉JavaScript就是个“玩具语言”。无法像其他编程语言一样满足工程的需要。
但是,在Node环境下,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScript 6标准,可以完全满足工程上的需求。
Node.js 适合以下场景:
1、实时性应用,比如在线多人协作工具,网页聊天应用等。
2、以 I/O 为主的高并发应用,比如为客户端提供 API,读取数据库。
3、流式应用,比如客户端经常上传文件。
4、前后端分离。
三、node.js 中的npm
1、npm 是什么
npm(即 node package manager )是Node
的包管理工具,能解决NodeJS代码部署上的很多问题npm里面有接近60万个别人已经写好的包,到目前为止,npm差不多收集了60万个别人写好的包,其实每个包就是一个功能,一个需求,npm里面有关于创建服务器的包,启动电脑摄像头的包,如果正好我们有这些需求,那么我们就没必要自己去写代码,完全可以用别人已经写好的包
npm是随同Nodejs一起安装的包管理工具,能解决Nodejs代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用
由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入
" npm -v " 来测试是否成功安装。
命令如下,出现版本提示表示安装成功:
如果安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:
c:\\ npm install npm -g
2、npm 命令安装模块
npm 的包安装分为本地安装(local)、全局安装(global)两种,
命令如下:
npm install express //本地安装
npm install express -g //全局安装
如果出现以下错误:
npm err! Error: connect ECONNREFUSED 127.0.0.1:8087
解决办法为:
$ npm config set proxy null
(1)本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
(2)全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。
3、选用 cnpm
1、cnpm 的官方介绍是:cnpm是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。既然都一样,那么cnpm为什么要出现呢?
由于npmjs.org的服务器在国外(即在“墙”外),国(墙)内开发者做项目的时候,很多“包”的下载速度极慢,在这种环境下阿里巴巴为了众多开发者的便捷便挺身而出推出了淘宝镜像(即cnpm),它把npm官方的“包”全部搬到国内,供广大开发者使用。
官网地址为: http://npm.taobao.org
使用淘宝镜像的命令: npm install -g cnpm --registry=https://registry.npmmirror.com
2、安装cnpm,使用命令 npm install cnpm -g --registry=https://registry.npm.taobao.org 安装完成后用 cnpm -v 查看是否安装成功
3、cnpm的使用方法和npm完全一致,只需要把npm改成cnpm即可
四、node.js 的模块化
Node应用是由模块组成,遵循的是CommonJS模块规范
1、CommonJS模块规范及规范化内容
CommonJS 是一套代码规范, 目的是为了构建 JavaScript 在浏览器之外的生态系统 (服务器端, 桌面端).
通过该规范使JavaScript具备开发复杂应用、跨平台的能力
CommonJS模块规范化的内容
(1)导出模块:moudle.exports 导出模块
(2)导入模块:require('模块名称')
2、moudle对象
每个导出的模块都有一个moudle对象,该对象包含的属性有:
- moudle.exports:表示当前模块对外输出的接口,其他模块引用的是moudle.exports导出的变量 。
- exports变量:指向moudle.exports,为了操作的方便,它不能直接指向一个值
这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
3、使用require导入模块
导入并执行一个JavaScript文件,返回的是一个exports对象,若没有找到相应的对象就报错
(1)模块输出是一个函数,则该函数的输出接口不能用exports变量来导出,必须用户moudle.exports导出
(2)加载规则:
A、用来加载js文件,默认的文件扩展名为.js
var foo = require('foo');
// 等同于var foo = require('foo.js');
B、根据参数的不同格式,去不同路径下查找相应的js文件
'./(../)':表示加载路径是相对路径
'/':表示加载路径是绝对路径
既不是'./(../)'也不是'/':表示加载的模式是node的核心模块,在node安装路径的node_modules中
(3)require的内部处理的流程
require -->module.exports-->moudle._load
Node.js 简介
Node.js
Node介绍
Node.js简称Node,是一个可以使JavaScript运行在服务器端的开发平台
JavaScript本是一种Web前端语言,Node.js让JavaScript成为服务器端脚本语言
Node.js选择JavaScript作为实现语言的原因:
- JavaScript满足CommonJS标准,符合事件驱动,用户较多且门槛较低;
- Chrome的V8引擎具有出色的性能。
Node.js将 V8引擎 封装起来,作为服务器运行平台,以执行 JavasScript 编写的后端脚本程序
解释:
- Node.js运行时环境包含执行JavaScript程序所需的一切条件。该引擎会将JavaScript代码转换为更快的机器码
- Node.js进一步提升JavaScript的能力,使JavaScript可以访问文件、读取数据库、访问进程,从而胜任后端任务
- 使用Node.js 的最大优点是开发人员可以在客户端和服务器端编写JavaScript,打通了前后端
- Node.js发展迅速,目前已成为JavaScript服务器端运行平台的事实标准
解释:
- Node.js是跨平台的,能运行在Windows、macOS和Linux平台上
- Node.js除了自己的标准类库之外,还可使用大量的第三方模块系统来实现代码的分享和重用
- 与其他后端脚本语言不同的是:Node.js 已内置处理网络请求和响应的函数库,也就是自备了HTTP服务器,所以不需要额外部署HTTP服务器。
Node特点
非阻塞I/O: 非阻塞I/O又称异步式I/O,是Node.js的重要特点
- 非阻塞I/O:是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令
- 阻塞I/O:是指线程在执行过程中遇到I/O操作时,操作系统会撤销该线程的CPU控制权,使其暂停执行,处于等待状态,同时将资源转让给其他线程
事件驱动: 非阻塞I/O与事件驱动密不可分
在事件驱动模型中,会生成一个事件循环线程来监听事件,不断地检查是否有未处理的事件
- 事件驱动以事件为中心,Node.js将每一个任务都当成事件来处理。Node.js在执行过程中会维护一个事件队列,需执行的每个任务都会加入事件队列并提供一个包含处理结果的回调函数
- Node.js的异步机制是基于事件的,所有磁盘I/O、网络通信、数据库查询事件都以非阻塞的方式请求,返回的结果由事件循环线程来处理
单线程:
Node.js的应用程序是单进程、单线程的,但是通过事件和回调支持并发,性能变得非常高。
在阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须使用多线程。
在非阻塞模式下,线程不会被I/O操作阻塞,该线程所使用的CPU核心利用率永远是100%,I/O操作以事件的方式通知操作系统。
Node.js在主线程中维护一个事件队列,当接收到请求后,就将该请求作为一个事件放入该队列中,然后继续接收其他请求。
Node.js内部通过线程池来完成非阻塞I/O操作,Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。
总结:
- Node.js采用非阻塞I/O与事件驱动相结合的编程模式,与传统同步I/O线性编程思维有很大的不同
- Node.js程序的控制很大程度要依靠事件和回调函数,这不符合开发人员的常规线性思路,需要将一个完整的逻辑拆分为若干单元(事件),从而增加了开发和调试的难度
Node使用场合
适合用Node.js的场合:
- REST API:REST API是一种前后端分离的应用程序架构。
- 单页Web应用:加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序。
- 统一Web应用的UI层:Node.js是面向服务的架构,其能够更好地实现前后端的依赖分离,可以将所有的关键业务逻辑都封装成REST API,UI层只需要考虑如何用这些API构建具体的应用。
- 准实时系统:如聊天系统、微博系统、博客系统的准实时社交系统,特点是轻量级、高流量,没有复杂的计算逻辑。
- 游戏服务器:程序员不必使用C语言就能开发游戏的服务器程序。
- 微服务架构:Node.js也可用于实现基于微服务架构的应用。
不适合用Node.js的场合:
- 数据加密和解密
- 数据压缩和解压
- 模板渲染
Node组成
- JavaScript 由三部分组成,ECMAScript,DOM,BOM
- Node.js是由 ECMAScript 及 Node环境 提供的一些 附加API 组成的,包括文件、网络、路径等等一些更加强大的 API
构建Node程序
构建第一个Node.js应用程序
//1、导入Node的http模块(内置的http服务器模块)
const http = require('http');
//2、创建http服务器 req:request 客户端请求对象,用于向服务端发送请求
// res:response 服务端响应对象,用于向客户端发送相应信息
const htttpServer = http.createServer(function (req,res) {
//设置响应头信息:200是状态码:表示请求-响应成功 Content-Type:是响应信息的格式
res.writeHead(200,{'Content-Type':'text/plain'});
//2、向客户端发送字符串
res.end('Hello Word');
})
//3、注册监听
htttpServer.listen(8080,function (){
console.log(('服务器在8080端口监听'))
})
注意:在终端用 node 程序文件名 启动的方式,注意路径是否为当前目录,确保可以找到相应js文件
注意:在终端使用 npm管理器 启动 需要在package.json文件下的"scripts"
中 添加 "start" : "{node ./src/server.js }"
并使用 npm start 来启动
以上是关于Node.js简介的主要内容,如果未能解决你的问题,请参考以下文章