Node
介绍
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具!
-
脱离浏览器运行,Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使 Node.js 表现得非常出色。
-
Node.js 应用程序运行于单个进程中,无需为每个请求创建新的线程。 Node.js 在其标准库中提供了一组异步的 I/O 原生功能(用以防止 JavaScript 代码被阻塞),并且 Node.js 中的库通常是使用非阻塞的范式编写的(从而使阻塞行为成为例外而不是规范)。
当 Node.js 执行 I/O 操作时(例如从网络读取、访问数据库或文件系统),Node.js 会在响应返回时恢复操作,而不是阻塞线程并浪费 CPU 循环等待。
这使 Node.js 可以在一台服务器上处理数千个并发连接,而无需引入管理线程并发的负担(这可能是重大 bug 的来源)。
-
在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准,因为不必等待所有用户更新其浏览器,你可以通过更改 Node.js 版本来决定要使用的 ECMAScript 版本,并且还可以通过运行带有标志的 Node.js 来启用特定的实验中的特性。
-
Node.js 是一个底层的平台。 为了使开发者做事变得容易又来劲,社区在 Node.js 上构建了数千个库。
定义
Node.js是一个javaScript运行是环境
Nodejs与浏览器的区别
-
浏览器和 Node.js 均使用 JavaScript 作为其编程语言。
-
在浏览器中,大多数时候做的是与 DOM 或其他 Web 平台 API(例如 Cookies)进行交互。 当然,那些在 Node.js 中是不存在的。 没有浏览器提供的 document、window、以及所有其他的对象。而且在浏览器中,不存在 Node.js 通过其模块提供的所有不错的 API,例如文件系统访问功能
-
在 Node.js 中,可以控制运行环境。 除非构建的是任何人都可以在任何地方部署的开源应用程序,否则你能知道会在哪个版本的 Node.js 上运行该应用程序。 与浏览器环境(你无法选择访客会使用的浏览器)相比起来,这非常方便。这意味着可以编写 Node.js 版本支持的所有现代的 ES6-7-8-9 JavaScript。
-
由于 JavaScript 发展的速度非常快,但是浏览器发展得慢一些,并且用户的升级速度也慢一些,因此有时在 web 上,不得不使用较旧的 JavaScript / ECMAScript 版本。
可以使用 Babel 将代码转换为与 ES5 兼容的代码,再交付给浏览器,但是在 Node.js 中,则不需要这样
-
Node.js 使用 CommonJS 模块系统,而在浏览器中,则还正在实现 ES 模块标准。
在实践中,这意味着在 Node.js 中使用 require(),而在浏览器中则使用 import。
REPL(交互式解释器)
表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
Node.js 回调函数
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步
Node.js 事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 几乎每一个 API 都是支持回调函数的。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现
Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
__filename 表示当前正在执行的脚本的文件名。
__dirname 表示当前执行脚本所在的目录。
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)
setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。
console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。
process 是一个全局变量,即 global 对象的属性。
它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。通常在你写本地命令行程序的时候,少不了要 和它打交道。
Global 是node的中的对象,node中声明的变量不会挂载到global中,并且在node中this是指向模块的
Node.js 常用工具
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心 JavaScript 的功能 过于精简的不足
Nodejs 语法
- Ecmascript
注:不包含BOM,DOM对象
- 模块系统
注:在node中没有全局作用域的概念
在node中通过require方法来加载执行多个javaScript脚本模块,在模块中都提供了一
个对象 exports 来暴露对外接口
模块化(文件作用域,通信规则(导入,导出)) 如: commonjs
require 加载规则(1. 优先从缓存中加载 2. 标识符分析)
模块标识符的(“/”)的定义(相当于盘符问题)
- 核心模块
fs(文件操作),os(系统操作),http(网络操作),path(文件路劲),error(错误处理)
url(请求路径),buffer(文件缓存),stream(二进制流),events(事件处理),queryString(查询字符串)
net(网络通信),utils(工具类),child_process(子线程)
- 第三方模块
npm install xxx ; 框架等(art-template,express)
-
自定义模块
- require
执行被加载模块中的代码
得到被加载模块的exports导出的接口
2. exports
导出文件中所有的成员只在当前文件模块有效
导出多个
3. module.exports
导出单个(module.exports = exports)
扩展
CommonJS
CommonJS旨在将运行在浏览器之外的JS进行标准化,并已经解决了大量的JS问题(如全局命名冲突)。Node对CommonJS的实现中,每个模块都会被封装在一个单独的JS文件中,即一个文件就是一个模块,而文件路径就是模块名。在编写每个模块时,都有以下三个预定义好的变量可供使用:
- require()
该函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可以使用相对路径(以./开头),也可以使用绝对路径(以/或C: 之类的盘符开头)。另外,模块名中的.js 扩展名是可以省略的,此时Node会寻找同名的文件夹,如果找不到,则寻找同名的js文件。还可以使用该函数加载和使用一个JSON文件,但此时.json 扩展名不可省略。
- exports
该对象是当前模块的导出对象,用于导出模块公有方法和属性,默认为一个空对象{}。别的模块通过require()函数使用当前模块时得到的就是当前模块的exports对象。
- Module.exports
该对象用于提供当前模块的元数据等相关信息,但用途最多的是使用其exports属性替换当前模块的导出对象
注:require.js AMD
Sea.js CMD
npx
npx是执行Node软件包的工具,它从 npm5.2版本开始,就与npm捆绑在一起。
npm
项目包管理工具
package.json
npm包管理文件
npm init -y(yes,一键确认) 创建包管理文件(package.json)
描述
name:项目/模块名称
长度必须小于等于214个字符,不能以"."(点)或者"_"(下划线)开头,不能包含大写字母。
version:项目版本。
author:项目开发者,它的值是你在https://npmjs.org网站的有效账户名
遵循“账户名<邮件>”的规则,例如:zhangsan zhangsan@163.com。
description:项目描述,是一个字符串。
它可以帮助人们在使用npm search时找到这个包。
keywords:项目关键字,是一个字符串数组。
它可以帮助人们在使用npm search时找到这个包。
private:是否私有,设置为 true 时,npm 拒绝发布。
license:软件授权条款,让用户知道他们的使用权利和限制。
bugs:bug 提交地址。
contributors:项目贡献者 。
repository:项目仓库地址。
homepage:项目包的官网 URL。
dependencies:生产环境下,项目运行所需依赖。
devDependencies:开发环境下,项目所需依赖。
scripts:执行 npm 脚本命令简写
比如 “start”: “react-scripts start”, 执行 npm start 就是运行 “react-scripts start”。
bin:内部命令对应的可执行文件的路径。
main:项目默认执行文件,
比如 require(‘webpack’);就会默认加载 lib 目录下的 webpack.js 文件,如果没有设置, 则默认加载项目跟目录下的 index.js 文件。
module:是以 ES Module(也就是 ES6)模块化方式进行加载
因为早期没有 ES6 模块化方案时,都是遵循 CommonJS 规范,而 CommonJS 规范的 包是以 main 的方式表示入口文件的,为了区分就新增了 module 方式,但是 ES6 模 块化方案效率更高,所以会优先查看是否有 module 字段,没有才使用 main 字段。
eslintConfig:EsLint 检查文件配置,自动读取验证。
engines:项目运行的平台。
browserslist:供浏览器使用的版本列表。
style:供浏览器使用时,样式文件所在的位置;
样式文件打包工具parcelify,通过它知道样式文件的打包位置。
files:被项目包含的文件名数组。
注:npm i安装命令中的-g -D -S的区别
npm i xx -g:npm install xx --global的简写,对模块进行全局安装。
所谓全局安装,是指把模块安装到操作系统上,全局是指操作系统,全局安装完成后,一般会安装到AppDataAppData\Roaming\npm目录下。如:npm install webpack -g,就是全局安装webpack,在操作系统的任何一个目录下都可以使用webpack所提供的指令。
npm i xx -D:npm install xx --save-dev的简写
对模块进行局部安装,模块写入到 devDependencies 对象。
局部的意思是只针对当前项目,模块一般安装到项目文件夹下的node_modules文件夹下。
devDependencies对象,是我们开发的时候需要用到的一些包,只用于开发阶段,真正打包上线的时候并不需要这些包,因为这些工具只是你用来打包代码的,是用来识别特定文件以及代码,帮助我们生产最终文件的。如npm i vue-loader vue-template-complier -D,就是在Vue项目中安装vue模板文件的解析插件,经过配置后即可在项目中解析vue模板
npm i xx -S:npm install xx --save 的简写
同上也是对模块进行局部安装,不同的是模块写入到 dependencies对象。
模块同上一样将安装到项目文件夹下的node_modules文件夹下。
dependencies对象,这个与devDependencies不同,是需要发布到生产环境中的,就比如你要跑一个基于vue的项目,所以需要vue.js来支持,vue.js文件就需要跟随项目到最终的生产环境。npm i vue -S即可将Vue模块安装到项目的依赖中,并一同发布到生产环境。
npm 命令工具
常用命令
-
npm init -y
-
npm install
-
npm install xxx
-
npm install xxx -S/D/g
-
npm uninstall xxx -S/D/g
-
npm updata xxx
npm 镜像问题
npm.taobao.org 淘宝镜像
npm config set registry https://registry.npm.taobao.org 配置淘宝镜像
查看 npm config list
不安装淘宝镜像,配置淘宝镜像
art-template
art-template是一个简单且超快速的模板引擎,可通过范围内预先声明的技术优化模板渲染速度,从而实现接近JavaScript极限的运行时性能。同时,它同时支持NodeJS和浏览器。
Express
定义
Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用
丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单
路由
静态文件
中间插件
Socket.io
通信服务
Mongodb
npm mongodb 原生的api(不建议使用)
npm mongoose 第三方
- Schema
- Connection
- Model
- Documnet
- Aggregate(聚合管道)
| 操作符 | 含义 |
|---|---|
| $group | 将collection中的document分组,可用于统计结果 |
| $match | 过滤数据,只输出符合结果的文档 |
| $project | 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等) |
| $sort | 将结果进行排序后输出 |
| $limit | 限制管道输出的结果个数 |
| $skip | 跳过制定数量的结果,并且返回剩下的结果 |
| $unwind | 将数组类型的字段进行拆分 |
| $sum | 计算总和,{KaTeX parse error: Expected 'EOF', got '}' at position 7: sum: 1}̲表示返回总和×1的值(即总和的…sum: ‘$制定字段’}也能直接获取制定字段的值的总和 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", content_sum : {sum:"sum : "sum:"likes"}}}]) |
|---|---|---|
| $avg | 平均值 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", content_sum : {avg:"avg : "avg:"likes"}}}]) |
| $min | 获取集合中所有文档对应值得最小值 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", content_sum : {min:"min : "min:"likes"}}}]) |
| $max | 获取集合中所有文档对应值得最大值 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", content_sum : {max:"max : "max:"likes"}}}]) |
| $push | 在结果文档中插入值到一个数组中 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {push:"push : "push:"url"}}}]) |
| $addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {addToSet:"addToSet : "addToSet:"url"}}}]) |
| $first | 根据资源文档的排序获取第一个文档数据 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {first:"first : "first:"url"}}}]) |
| $last | 根据资源文档的排序获取最后一个文档数据 | db.collection.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {last:"last : "last:"url"}}}]) |
Node-mysql
Mysql
Connection
query
转义
连接池
Nodemon
nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序。(热部署)进程管理工具
Cookie
简单来说,cookie就是标识。
严格来说,cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储 Cookie 的请求,依靠这样的手段,服务器可以识别客户端。
具体来说,浏览器首次向服务器发起请求时,服务器会生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,之后每次发起的请求中,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。
*你可以在cookie中存放任意类型的文本数据,但通常是在客户端存放一个会话cookie********,这样你就能在服务器端保留完整的用户状态。*
Session
cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。
流程
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对,
然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。
客户的信息都保存在session中。
Node.js是一个跨平台的JavaScript运行时环境,使用V8引擎,擅长处理高并发。它在单线程中利用异步I/O避免阻塞,并通过回调函数处理事件。Node.js提供了CommonJS模块系统,允许通过require()导入模块。此外,它拥有丰富的核心模块如fs、http等,以及npm包管理工具,方便开发。Express框架简化了Web应用的创建,MongoDB则提供了NoSQL数据库支持。

被折叠的 条评论
为什么被折叠?



