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, http:// 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、缺陷分析、问题反馈、输出测试报告。