首发于 旅游与it

node是后端服务器上js的运行时(runtime),webpack只是node内置的一个组件。node后端体系和浏览器web前端体系都可以运行js基本一致(稍显简单)

解析器:将C/C++(汇编语言)代码转成数字(二进制,数字语言。这个由电脑和服务器CPU处理)。

解释器(所以js读写快,加载慢<加载需将2进制转成C/C++):将js(编程语言)等语言转成C/C++语言(汇编语言),v8将js转成C/C++。

所以js只应用在解释器(V8)上,善于将js代码转成C/C++。js不直接接触解析器(将C/C++转成2进制),所以不善于处理数字运算(运算是由2进处理的)。

v8(引擎,编译器,C++写的),本地模块(node的独特功能,C++写的),标准库(接口,js写的<实为js函数>。模抉间进行通信,在前端就是导入get和导出post)都是由c++编写的。

V8 引擎和众多本地模块都是现成的,别人已经用C++写好了,(在服务器环境中,处理二进制数据通常是必不可少的,但Javascript对此支持不足。因此,V8.Node增加了Buffer类,方便并且高效地处理二进制数据。因此,Node不仅仅简单的使用了V8,还对其进行了优化,更善于将js转成2进制)。Node.js 的主要工作就是选择合适的模块,将它们集成(封装)在一起,并编写好 JavaScript 接口(模抉间进行通信,在前端就是导入get和导出post)。

node和web可以通过express模块来写接口。

本地模块其实就是动态链接库(在 Windows 下是 .dll 文件)。

本地模块使用 C/C++ 编写。

JavaScript 解释器需要本地模块的支持,标准库在编写时也会调用本地模块的接口,而我们编写的 JavaScript 代码一般不会直接使用本地模块,所以 Web 前端程序员触及不到它们。

标准库(接口API):是用C++写的。API 接口实现计算机软件(本地模块)之间的相互通信。

本地模块使用 C/C++ 编写,而 Node.js 面向 JavaScript 开发人员,所以必须要封装本地模块的 C/C++ 接口,提供一套优雅的 JavaScript 接口给开发人员,并且要保持接口在不同平台(操作系统)上的一致性。

这套 JavaScript 接口,就是 Node 标准库。标准库是否优雅和强大,决定了 Node的易用性,直接影响 Node.js 的市场表现。

总结

V8”的 JavaScript 引擎(也即 JavaScript 解释器),它能够非常快速地解析和执行 JavaScript 代码。

JavaScript运行在网络中通过浏览器运行。JavaScript 运行在计算机上通过node运行。

V8 引擎使用 C++ 语言编写。

V8 引擎保证了 Node运行高效,Libuv 库提供了基于事件循环的异步 I/O 能力(单线程)。

运行时(环境):浏觉器和node都是,js的运行环境(条件)。

node类似浏览器,2者都内置了v8引擎(JavaScript 解释器:它能够非常快速地解析和执行 JavaScript 代码。)。只是2者的其它组件不同而已。​

Node和浏览器都是一个 JavaScript 运行时(Runtime):就是程序在运行期间需要依赖的一系列组件或者工具;

Node的组成:

Node 运行时主要由 V8 引擎、标准库和本地模块组成,尤其是本地模块的多少,从底层决定了 Node.js 功能的强弱。

V8 引擎和众多本地模块都是现成的,别人已经造好了轮子,Node的主要工作就是选择合适的模块,将它们集成在一起,并编写好 JavaScript 接口。

Node不是库,而是一个运行环境或JS语言解释器。Node不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node 是一个 JavaScript 运行时(Runtime)。

Node的诞生

JavaScript 的一生伴随着浏览器大战。JavaScript 由 Netscape(网景)浏览器发布,但是 Netscape 在和 IE 的竞争中落败,早已不复存在;后来谷歌公司的 Chrome 浏览器异军突起,凭借强悍的性能把 IE 按在地上摩擦。

谷歌公司在 Chrome 浏览器中集成了一种名为“V8”的 JavaScript 引擎(也即 JavaScript 解释器),它能够非常快速地解析和执行 JavaScript 代码。

V8 引擎使用 C++ 语言编写,可以独立运行,也可以嵌入到任何其它 C++ 程序中。谷歌公司将 V8 引擎甚至整个 Chrome 浏览器都开源了,任何人都可以免费地将 V8 应用到自己的项目中。

V8 引擎的强大,以及当年 JavaScript 的火爆,使得一名叫 Ryan Dahl 的程序员动起了“歪心思”,他希望在浏览器之外再为 JavaScript 构建一个运行时,让 JavaScript 能够直接在计算机上运行,这样 JavaScript 就能像 Python、Ruby、PHP 等其它脚本语言一样大展宏图,不必再受限于浏览器,只能做一些小事情。

Ryan Dahl 和他的团队真的做到了,并且做得很好,命名为 Node.js;

Node.js 的组成

Node.js 运行时主要由 V8 引擎、标准库和本地模块组成,尤其是本地模块的多少,从底层决定了 Node.js 功能的强弱。

1) V8 引擎:就是 JavaScript 解释器,它负责解析和执行 JavaScript 代码。

V8 引擎借鉴了 Java 虚拟机和 C++ 编译器的众多技术,它将 JavaScript 代码直接编译成原生机器码,并且使用了缓存机制来提高性能,这使得 JavaScript 的运行速度可以媲美二进制程序。

2) 本地模块:Node集成了众多高性能的开源库,它们使用 C/C++ 语言实现,就是已经被提前编译好的模块,它们是二进制文件,和可执行文件在内部结构上没有什么区别,只是不能单独运行而已。这些本地模块其实就是动态链接库(在 Windows 下是 .dll 文件)。

比如:

1.libuv 一个跨平台的、基于事件驱动的异步 I/O 库。但是 libuv 不仅限于 I/O,它还提供了进程管理、线程池、信号处理、定时器等其它功能。

2.Linux 中一切皆文件,这里的 I/O 不仅仅包括文件读写,还包括数据库读写、网络通信(socket)等。

3.nmp Node.js 包管理器,可以下载包、安装包、卸载包、更新包、上传包等。

4.http_parser 一款由C语言编写的轻量级 HTTP 解析器,用以支持 Web 应用开发。

5.zlib 工业级的数据压缩/解压模块,Nodejs 借助 zlib 来创建同步、异步或者流式的压缩/解压接口。

5.OpenSSL 该模块提供了经过严密测试的许多加密/解密功能,现代 Web 依赖这些功能来实现安全性,比如 SSL 协议和 https 协议。

6.c-ares 异步 DNS 查询和解析库(接口)。

JavaScript 的很多功能都需要本地模块的支持,比如:

Cookie 用于存储少量的用户数据,它是用户计算机上的一种小文件,使用 Cookie 必须有文件操作模块的支持。

Ajax 可以借助互联网从服务器请求数据,这是一种网络操作,必须有网络库的支持。

一步一步跟踪代码的执行流程,从中发现逻辑错误,这个过程叫做调试,需要有调试器(Debugger)的支持。

JavaScript 可以操作 HTML,这需要 HTML 解析模块提前构建起 DOM 树。

本地模块一般封装了通用功能,对性能要求较高,所以通常使用编译型语言来实现,比如C语言、C++、汇编语言等。

JavaScript 解释器需要本地模块的支持,标准库在编写时也会调用本地模块的接口,而我们编写的 JavaScript 代码一般不会直接使用本地模块,所以 Web 前端程序员触及不到它们。

3)标准库:一些内置函数。本地模块使用 C/C++ 编写,而 Node.js 面向 JavaScript 开发人员,所以必须要封装本地模块的 C/C++ 接口,提供一套优雅的 JavaScript 接口给开发人员,并且要保持接口在不同平台(操作系统)上的一致性。

这套 JavaScript 接口,就是 Node.标准库。标准库是否优雅和强大,决定了 Node的易用性,直接影响 Node的市场表现。

总结

V8 引擎和众多本地模块都是现成的,别人已经造好了轮子,Node的主要工作就是选择合适的模块,将它们集成在一起,并编写好 JavaScript 接口。

当然,并不是所有的本地模块都能找到合适的,Node也自己编写了几个模块,典型的代表就是 Libuv。Libuv 是 Node.js 最核心最基础的模块,Node完全基于 Libuv 而构建。

你可能听说过 Node采用了基于事件的、单线程的异步 I/O 架构,这是 Node最大的特点,也是它和其它脚本语言最大的区别,Node的这种能力就是依赖 Libuv 实现的。

Libuv 如此强大,官方决定将它从 Node中剥离出来,作为一个单独的网络库发布,并且开源免费。现在的 Libuv 已经变得非常流行,和传统的 Libevent 和 libev 库并称为“C/C++ 三大网络库”。

Node之所以大名鼎鼎,主要是因为它采用了 V8 引擎和 Libuv 库:V8 引擎保证了 Node.js 运行高效,Libuv 库提供了基于事件循环的异步 I/O 能力。

总结

Node 是一个 JavaScript 运行时,它让 JavaScript 脱离了浏览器环境,可以直接在计算机上运行,极大地拓展了 JavaScript 用途。我们应该将 JavaScript 和 Python、Java、Ruby 等其它编程语言同等对待,不能再将它视为一种“小玩意”。


最后我们来汇总一下 JavaScript 和 Node的历史:

Netscape 浏览器衍生出了 JavaScript 脚本,赋予网页编程能力;

Chrome 浏览器衍生了 V8 引擎,提高了 JavaScript 性能;

V8 引擎构建了 Node,拓展了 JavaScript 的编程能力;

Node 衍生了 Libuv 库,给网络开发增加了一款优秀的工具。

​Node.js 直接在计算机上运行 JavaScript 代码,并且要赋予 JavaScript 强大的能力,所以它的本地模块和浏览器中的运行时有很多大区别,甚至说几乎没有什么关联。Node.js 几乎完全抛弃了浏览器,自己从头构建了一套全新的 JavaScript 运行时。


浏览器与node中v8的部分差异:

javascript有个特点,就是原生没提供包引用的API一次性把要加载的东西全执行一遍,这里就要看各位闭包的功力了。

Node并不是提供简单的封装,然后提供API调用,Node对一些特殊用途进行了优化了替代的API,使得V8在非浏览器环境下运行得更好。


浏览器中的window下封装了不少的API (接口)比如 alert 、document、location、history 。

后端叫模块(库),前端叫接口。接口足衔接模块的。接口就是函数。

在nodejs中,接口是使用nodejs实现的包含方法、属性、索引器和事件作为成员对协定进行定义的引用类型,nodejs可以通过express模块来写接口。

node接口指的是什么

接口(软件类接口)是指对协定进行定义的引用类型。其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。

node接口是使用node.js实现的包含方法、属性、索引器和事件作为成员对协定进行定义的引用类型。nodejs可以通过express模块来写接口。

node如何写接口?

可以使用express框架,配合moment(时间格式化)中间件+cors中间件(跨域用)+body-parser(解析表单)+mysql中间件写一个接口。

Express是一个保持最小规模的灵活的 Node和Web应用程序开发框架,为Web和移动应用程序提供一组强大的功能。node可以使用express框架中的app.get与app.post等方法连接对象进行操作。

Express是一个保持最小规模的灵活的 Node.js 和Web应用程序开发框架,为Web和移动应用程序提供一组强大的功能。node可以使用express框架中的app.get与app.post等方法连接对象进行操作。

前端直接用Express框架写接口(将模块与模块连接起来,即导入与导出)。后端Express已经内置了。

直接上代码:

const express = require('express'); const app = express(); const moment = require('moment') //导入cors模块,该模块为跨域所用 const cors = require('cors'); app.use(cors()); //解析表单的插件 const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })) //创建数据库连接对象 const mysql = require('mysql'); const conn = mysql.createConnection({ host: '127.0.0.1',//数据库地址 user: 'root',//账号 password: 'root',//密码 database: 'mydb_12_9',//库名 multipleStatements: true //允许执行多条语句 })

get表中的数据:

appget('/api(用Express写好的接口)/getlist', (req, res) => { const sqlStr = 'select * from zdcx ' conn.query(sqlStr, (err, results) => { if (err) return res.json({ err_code: 1, message: '资料不存在', affextedRows: 0 }) res.json({ err_code: 200, message: results, affextedRows: results.affextedRows }) }) })

按条件查询:

app.get('/api/getlistdetl', (req, res) => { const number = req.query.number const sqlStr = 'select * from zdcx where number=?' conn.query(sqlStr, number, (err, results) => { if (err) return res.json({ err_code: 1, message: '资料不存在', affextedRows: 0 }) res.json({ err_code: 200, message: results, affextedRows: results.affextedRows }) }) })

添加数据:

//添加 app.post('/api/addcard', (req, res) => { const user = req.body user.ctime = moment().format('YYYY-MM-DD HH:mm:ss')//格式化日期 const sqlStr = 'insert into bank set ?' conn.query(sqlStr, user, (err, results) => { if (err) return res.json({ err_code: 1, message: err, affectedRows: 0 }) res.json({ err_code: 0, message: '恭喜成功', affectedRows: results.affectedRows }) }) })

端口监听:

app.listen(3000, () => { console.log('正在监听端口3000, 192.168.1.114:3000 '); //192.168.1.114换成你的ip,本机ip查询用cmd=>ipconfig })Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以让JavaScript在服务器端运行,具有高效、轻量、跨平台等特点。

在Node中常用的模块接口:

1. fs模块

fs模块是Node.js中用于文件操作的模块,它提供了很多方法,如读取文件、写入文件、创建文件夹、删除文件等。

常用方法:

- fs.readFile(path[, options], callback):异步读取文件内容。

- fs.writeFile(file, data[, options], callback):异步写入文件内容。

- fs.mkdir(path[, options], callback):异步创建文件夹。

- fs.rmdir(path, callback):异步删除文件夹。

2. http模块

http模块是Node.js中用于创建HTTP服务器的模块,它提供了很多方法,如创建服务器、发送请求、处理响应等。

常用方法:

- http.createServer([options][, requestListener]):创建HTTP服务器。

- server.listen(port[, hostname][, backlog][, callback]):启动HTTP服务器监听指定端口。

- http.request(options[, callback]):发送HTTP请求。

- response.writeHead(statusCode[, statusMessage][, headers]):设置响应头。

- response.write(chunk[, encoding][, callback]):向响应中写入数据。

- response.end([data][, encoding][, callback]):结束响应。

3. path模块

path模块是Node.js中用于处理文件路径的模块,它提供了很多方法,如获取文件名、获取文件扩展名、拼接路径等。

常用方法:

- path.basename(path[, ext]):获取文件名。

- path.extname(path):获取文件扩展名。

- path.join([...paths]):拼接路径。

- path.resolve([...paths]):将路径或路径片段解析为绝对路径。

4. url模块

url模块是Node.js中用于处理URL的模块,它提供了很多方法,如解析URL、格式化URL等。

常用方法:

- url.parse(urlString[, parseQueryString[, slashesDenoteHost]]):解析URL。

- url.format(urlObject):格式化URL。

5. events模块

events模块是Node.js中用于处理事件的模块,它提供了很多方法,如绑定事件、触发事件等。

常用方法:

- events.EventEmitter:事件发射器。

- emitter.on(eventName, listener):绑定事件。

- emitter.emit(eventName[, ...args]):触发事件。

以上就是Node中常用的模块接口,它们可以帮助我们更方便地进行文件操作、创建HTTP服务器、处理文件路径、处理URL和处理事件等。


后端工程师:约定接口、开发 API、编写文档、单元测试

前端工程师:约定接口、页面开发、Mock API、前后联调

技术管理者:技术评审、工期评估、管理文档

测试工程师:自动化测试 API、缺陷分析、问题反馈、输出测试报告。


编辑于 2023-08-10 00:29 ・IP 属地新疆

文章被以下专栏收录