目录

  • 一、认识nodejs
  • 二、nodejs基本概念简介
    • 1. nodejs与npm
    • 2. nodejs交互式解释器(REPL)
    • 3. nodejs异步编程
    • 4. 全局对象global
  • 三、nodejs的几个常用模块
    • 1. fs模块
    • 2. web模块
    • 3. 数据库模块
  • 总结

一、认识nodejs

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境(引自百度百科)。

我们都知道,浏览器是客户端的JavaScript运行环境,相对的,nodejs就是服务端的JavaScript运行环境。

我们说nodejs是服务端的运行环境,并不意味着nodejs只能用于为web提供后台服务。nodejs实际上是让JavaScript可以运行于浏览器之外,并且为JavaScript提供了本地文件系统访问、数据库访问,以及作为web后台服务所必需的http等接口,使JavaScript真正成为一门可以用于web后端的编程语言。JavaScript在nodejs的环境下运行,就像Java在虚拟机环境下运行一样。

因此,说nodejs是一门编程语言,这显然是错误的。nodejs本身只是为JavaScript提供了一个可以不在浏览器下运行的环境。既然是运行环境,那么它必定包含能够解析这门语言的编译器或解释器,nodejs的作者选择了性能卓越的JavaScript引擎:V8(由C++编写,主要用于Chromium和Chrome)。

仅仅有V8还是不够的,因为它只能解析JavaScript本身,无法为其提供访问操作系统其他服务的编程接口。要让JavaScript能作为服务端语言,至少要为其提供访问文件系统、数据库等的能力,并且提供http服务,nodejs的作者Ryan Dahl以及技术社区为此使用C++开发了一系列的模块,如fs(文件系统模块)、http(http服务模块)、mysql(mysql数据库模块)、oracledb(Oracle模块)等,这里的fs和http模块是核心模块,内置于nodejs核心运行环境内,无需额外安装。有了这些模块,你可以用JavaScript访问与操作系统相关的更多底层服务。

所以说,客户端的JavaScript等于ECMAScript + DOM + BOM,而服务端的JavaScript等于ECMAScript + fs + mysql + oracledb + http + os(操作系统模块) + net(TCP模块) + …

有了这些模块的支持,JavaScript才算完全脱离了浏览器环境,具备了与操作系统交互的能力,因此它可以作为web后端语言使用。

既然在nodejs环境下,JavaScript已经可以与操作系统交互了,那它就不限于作为web后端语言了。此时的JavaScript还常用于编写工具,比如常见的webpack、vue-cli、create-react-app等,甚至可以用于编写桌面应用,如微软旗下著名的基于electron的开发者工具vscode。

二、nodejs基本概念简介

1. nodejs与npm

npm是nodejs“附赠”的包管理工具,当然它也是nodejs的作者推荐的包管理工具(nodejs现已交由npm的作者来维护)。当你安装完nodejs,npm也就安装完成了。

npm的主要作用是管理第三方包(如一个vue组件、一个react组件,或者打包工具webpack以及各种脚手架等,都称为一个包)。使用npm命令,你可以从npm服务器上下载别人上传的第三方包或命令行到本地使用,也可以上传自己的本地包供别人使用。

比如你想下载webpack,可以使用以下命令:

npm install webpack -g

install webpack表示要安装webpack。-g参数表示这个包要安装到nodejs的根目录下,这样可以作为全局包使用。想要卸载已安装的包,可以使用uninstall命令。

npm访问的默认服务器地址是https://registry.npmjs.org/,上传下载第三方包的目标服务器都是它。如果使用淘宝镜像cnpm,访问的是淘宝的服务器,一般来说,该服务器每10分钟与官方服务器同步一次。

2. nodejs交互式解释器(REPL)

不同于Java,JavaScript是一门脚本语言,它的执行不需要经过编译,因此可以一行一行地执行。基于这个特点,nodejs为JavaScript提供了一个交互式解释器,用于在命令行即时编写和执行JavaScript。

安装完nodejs后,打开命令行,输入node,敲击回车,即可进入交互式执行环境:

出现一个大于号,表示已经进入交互式环境,接下来你可以输入JavaScript语句,敲击回车即可执行:

如果需要连续输入多行代码,可以按shift + 回车,解释器会换行但暂不执行上一语句。

使用nodejs提供的交互式解释器,可以方便地编写并运行少量JavaScript代码。如果代码量稍大,可以将代码保存在一个js文件中,然后用node命令执行该js文件,效果与在交互式环境下连续输入这些代码是一致的。

3. nodejs异步编程

nodejs使用了一个事件驱动、非阻塞式 I/O 的模型。它的非阻塞I/O是借助事件循环实现的。

我们都知道,JavaScript是一门单线程语言。如果同步地执行所有的任务,诸如网络请求、数据库查询这样的操作将耗费大量的时间,导致程序性能极低。所以和在浏览器中一样,nodejs也采用事件循环机制,通过回调函数来解决这个问题(图片来自菜鸟教程)。

相比于客户端JavaScript,服务端JavaScript具有更大的优势。因为客户端浏览器类型不一,版本也有所差异,对JavaScript版本的支持性差异很大,给前端页面开发带来了很大的限制。但在服务端,nodejs版本由我们决定,所以我们可以更放心地使用高版本语法,比如Generator函数、async函数等,来实现异步编程。

此外,nodejs还提供了child_process模块,为JavaScript提供多进程支持。它比浏览器端的webworker更加强大,因为webworker只是一种多线程实现,各个线程之间不具备通信能力,而由child_process创建的进程是可以通信的。

4. 全局对象global

我们知道,在浏览器环境下,全局对象是window。而在nodejs环境下,全局对象是global。

同window一样,引用global的属性也可以省略global。global的常见属性包括:

  1. __filename:当前脚本的绝对路径,含文件名
  2. __dirname:当前脚本所在的路径,不含文件名
  3. setTimeout()、clearTimeout()、setInterval()、clearInetrval():用法与浏览器环境下一致
  4. console:控制台对象,用法与浏览器下类似。不过浏览器环境下的控制台由浏览器提供,而nodejs环境的控制台通常指shell终端(即命令行窗口)。
  5. process:nodejs进程状态对象。为process绑定事件监听,可以在nodejs的各个生命周期下执行操作。与nodejs交互的过程中,我们经常会访问这个对象。

三、nodejs的几个常用模块

nodejs有很多模块,这里我们只对其中几个最为常用的进行一些简介,以对nodejs有个大致的了解。

1. fs模块

fs模块是nodejs提供的文件系统模块,提供一组类似于UNIX系统的文件操作API。引入fs模块非常简单:

let fs = require("fs");

得到了fs模块后,我们就可以像下面这样读取文件系统的一个文件:

// 异步读取
fs.readFile('input.txt', function (err, data) {if (err) {return console.error(err);}console.log("异步读取: " + data.toString());
});

还可以以同步的方式来读取文件:

// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());

实际上在Chrome浏览器中,JavaScript也具备读取本地文件内容的能力,但是向文件系统中写入内容是严格禁止的,因为这会给客户端安全带来极大的安全隐患。而在nodejs环境下,由于是服务端,不存在这类安全问题,因此nodejs提供的fs模块允许向文件系统写入内容:

var fs = require("fs");fs.writeFile('input.txt', '新内容', function(err) {if (err) {return console.error(err);}console.log("数据写入成功!");
});

这会向当前文件夹下的input.txt写入“新内容”这几个字符,如果该文件不存在,将先创建它再写入。

nodejs提供的文件系统操作接口使得它可以为各种脚手架、打包工具等提供支持。比如vue或者react的脚手架,实际上就是利用nodejs提供的fs模块,根据输入的参数,复制事先写好的模板文件到目标文件夹下。而打包工具,如webpack,则是对项目文件夹下的文件进行整合压缩和输出,也离不开nodejs提供的文件系统操作API。

2. web模块

web模块由若干子模块组成,如http模块、https模块、ws模块、net模块(提供TCP连接)、url模块等,为web服务提供支持。有了这些模块的支持,nodejs才能为JavaScript提供完整的服务端环境。此外,在nodejs环境下,JavaScript还可以实现一个简单的客户端。

我们以一个简单的例子来介绍web模块(例子来自菜鸟教程):

首先我们在当前文件夹下新增一个index.html作为服务端资源,它的内容很简单:
index.html

<!DOCTYPE html>
<html><body>Hello World!</body>
</html>

然后在同级目录下新建server.js:
server.js

var http = require('http'); // http模块
var fs = require('fs');  // 文件系统模块
var url = require('url');  // url解析模块// 创建服务器
http.createServer( function (request, response) {  // 解析请求,包括文件名var pathname = url.parse(request.url).pathname;// 输出请求的文件名console.log("Request for " + pathname + " received.");// 从文件系统中读取请求的文件内容fs.readFile(pathname.substr(1), function (err, data) {if (err) {console.log(err);// HTTP 状态码: 404 : NOT FOUND// Content Type: text/htmlresponse.writeHead(404, {'Content-Type': 'text/html'});}else{             // HTTP 状态码: 200 : OK// Content Type: text/htmlresponse.writeHead(200, {'Content-Type': 'text/html'});    // 响应文件内容response.write(data.toString());        }//  发送响应数据response.end();});
}).listen(8080);console.log('Server running at http://127.0.0.1:8080/');

然后创建一个客户端文件client.js:
client.js

var http = require('http');// 用于请求的选项
var options = {host: 'localhost',port: '8080',path: '/index.html'
};// 处理响应的回调函数
var callback = function(response){// 不断更新数据var body = '';response.on('data', function(data) {body += data;});response.on('end', function() {// 数据接收完成console.log(body);});
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();

打开命令行,输入以下命令:

这样我们的服务就运行起来了,运行网址是http://127.0.0.1:8080(如果你在浏览器地址栏输入http://127.0.0.1:8080/index.html,就可以看到本地的index.html页面)。

再打开一个命令行,然后输入:

可以看到,即使没有浏览器,我们也可以通过nodejs提供的http模块,从http://127.0.0.1:8080这个网址下请求到index.html的内容。只是此时的html文件由于没有浏览器的解析,只是作为一串普通字符串返回的。基于这一点,你可以在nodejs环境下,用JavaScript写一个爬虫程序,主要过程就是不断请求网页,然后对取到的网页字符串进行分析。

不同于Java,nodejs自行封装了http服务,因此JavaScript运行在nodejs环境下时不需要其他的web容器(如Tomcat、Jetty等)。

3. 数据库模块

作为服务端环境,访问数据库是必不可少的。nodejs为各大数据库提供对应的模块,以使JavaScript可以访问这些数据库。常见的模块如MySQL数据库的mysql模块,Oracle数据库的oracledb模块、MongoDB的mongodb模块等。这些模块不是nodejs的核心模块,需要从npm下载安装。

下面我们以Oracle数据库连接来介绍nodejs的oracledb模块的简单用法(需要先安装oracledb:npm install oracledb):

var oracledb = require('oracledb');const param = {user: xxx,password: xxx,connectString: xxx(数据库地址及实例)
};
const sql = "select * from USER where id=:1";
let userId = "123";  // 待查询的用户idoracledb.getConnection(param, function(err, connection){if (err) {console.error(err.message);return;}console.log("数据库连接成功");// 数组的userId元素将替换sql语句中的:1connection.execute(sql, [userId], function(err, res){if (err) {console.error(err.message);}console.log(JSON.stringify(res.rows[0]);})
})

使用不同的数据库时,安装对应的模块即可。

总结

nodejs是JavaScript的服务端环境,它使得JavaScript不仅可以用于编写web后端,还可以用于编写各种工具、脚手架等。

nodejs用很多框架,如express、koa、eggjs等,在实际使用nodejs搭建web服务时,常常直接使用这些框架。nodejs的作者推荐使用中间件模式来开发web后台服务,每个中间件就是一个处理函数,对请求进行一步处理,类似于Java的过滤器。这样开发者就可以专注于业务逻辑的开发。

nodejs社区非常活跃,有大量可用的模块,框架也是数不胜数,这里只是nodejs初识篇,等以后在工作中深入使用后再进行更细致的了解。

nodejs技术摘要相关推荐

  1. 字节跳动小程序技术摘要

    微信H5支付抖音小程序支付宝APP支付 微信 H5支付 官网文档链接:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 流程图: 1 ...

  2. Java | 加密技术 | 摘要加密算法(不含原理)

    一.背景简介 1.1 含义 消息摘要采用单向Hash函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密 ...

  3. web2.0涉及的一些技术摘要

    1   web2.0概念: Blogger Don在他的"WEB2.0概念诠释"一文中提到"Web2.0是以 Flickr.Craigslist.Linkedin.Tri ...

  4. nodejs配置摘要

    在window7系统下,nodejs配置: 1.首先下载nodejs,然后安装. 2.安装成功后,按键盘window键 + r,弹出运行窗口,输入cmd后,再按回车键.弹出一个黑色的window命令窗 ...

  5. java基于springboot+vue的旧衣服捐赠系统 毕业设计nodejs技术

    随着人们生活条件的改善,人们的衣物也越来越多了.但是对于一些贫困地区来说,他们很可能没有一件合身的衣物.尤其是对贫困山区的孩子们来说,如果长期的穿不暖,吃不饱,很可能会发生一些疾病.对于城市中的一些年 ...

  6. 深入Nodejs技术栈

    一.Nodejs定义及相关知识 1.nodejs介绍 2.浏览器内核及渲染 3.JavaScript引擎                          4.浏览器和nodejs架构区别 5.nod ...

  7. java nio node_支撑 Java NIO 与 NodeJS 的底层技术

    众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我们今天要讨论的话题就是支撑这些技术的底层技术. 开 ...

  8. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  9. nodejs 获取文件路径_Qunar 酒店 Nodejs 覆盖率收集实践

    作者介绍 马涛,2013 年加入去哪儿网技术团队,目前在目的地事业部,负责 H5.小程序类应用开发.个人对移动端技术领域和前后端工程化有浓厚兴趣,勇于探索实践追求极致. 概述 一般来讲我们是通过写单元 ...

最新文章

  1. 日程来了!2021年佛山敏捷之旅暨第1届佛山DevOps社区Meetup
  2. 软件配置文件如何读写
  3. 2022年文化潮流趋势报告
  4. 2022年中国全屋智能行业研究白皮书
  5. linux内核的外部接口函数,linux内核中GPIO的使用(二)--标准接口函数
  6. 关于STM32系列单片机中断触发时间问题
  7. linux shell脚本date命令 按照不同格式输出
  8. leetcode第12题Python版整数转罗马字符串
  9. 华为网络计算机登陆,华为路由器如何登录192.168.3.1入口设置界面
  10. 2022年机器视觉综述论文
  11. 线性代数及矩阵论(七)
  12. 电脑插了耳机后声音还是外放解决方案
  13. 023.二叉树的最近公共祖先
  14. C/C++编程:libcurl学习(linux + cmake windows10 + vs2019)
  15. Echarts字体和线条颜色设置操作笔记
  16. 小软件Gnutella掀起因特网大风暴
  17. 全网最全的唐诗,让你了解唐诗。让你明白唐诗皎洁的月光洒到床前,迷离中疑是秋霜一片。仰头观看明月呵明月,低头乡思连翩呵连翩。国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。烽火连三月,家书抵万金。白头搔
  18. 集成融云 SDK 怎么实现多端同步未读数
  19. w10运行游戏计算机中丢失xinput1-3.dll,win10提示xinput1_3.dll丢失解决方法介绍
  20. JS随笔,想到什么写什么

热门文章

  1. 2019年工行总行本部暑期实习生才选AI面试经历
  2. 【burpsuite】核心使用方法
  3. Kooboo中怎么新增一个关联的Details 动态页面。
  4. 总线锁,缓存锁,emsi
  5. 迅为IMX6开发板设备树内核-sys方式控制GPIO-SYSFS配置
  6. python内置函数min,max
  7. addAll方法——向Set集合添加另一个集合的所有内容
  8. gradle kotlin DSL中引用项目下libs文件夹的jar及在gradle配置启动主程序
  9. 男子陷连环计借万元送人
  10. 古代文学经典、现代文学经典