From 4f754ba085d747245c7bc72b66e39f134fc06875 Mon Sep 17 00:00:00 2001 From: "142vip.cn" Date: Mon, 18 Dec 2023 17:28:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EES5=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 ++-- code/node/es6/es5-2009-every.ts | 10 + code/node/es6/es5-2009-forEach.ts | 8 + code/node/es6/es5-2009-indexOf.ts | 7 + code/node/es6/es5-2009-isArray.ts | 3 + code/node/es6/es5-2009-lastIndexOf.ts | 7 + code/node/es6/es5-2009-reduceRight.ts | 5 + code/node/es6/es5-2009-some.ts | 10 + docs/manuscripts/microservice/grpc.md | 32 ++- .../server-end/es-version/ES5-2009.md | 226 ++++++++++++++++++ ...00\344\275\263\345\256\236\350\267\265.md" | 2 +- 11 files changed, 316 insertions(+), 35 deletions(-) create mode 100644 code/node/es6/es5-2009-every.ts create mode 100644 code/node/es6/es5-2009-forEach.ts create mode 100644 code/node/es6/es5-2009-indexOf.ts create mode 100644 code/node/es6/es5-2009-isArray.ts create mode 100644 code/node/es6/es5-2009-lastIndexOf.ts create mode 100644 code/node/es6/es5-2009-reduceRight.ts create mode 100644 code/node/es6/es5-2009-some.ts diff --git a/README.md b/README.md index 5bfa62924..fd9d56fc1 100644 --- a/README.md +++ b/README.md @@ -186,12 +186,12 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 #### 插件使用 -- [egg-validate参数校验]() -- [egg-view-ejs页面渲染]() -- [egg-redis缓存]() -- [egg-mysql]() -- [egg-sequelize]() -- [egg-socket.io即时通讯]() +- [ ] [egg-validate参数校验]() +- [ ] [egg-view-ejs页面渲染]() +- [ ] [egg-redis缓存]() +- [ ] [egg-mysql]() +- [ ] [egg-sequelize]() +- [ ] [egg-socket.io即时通讯]() #### 最佳实践 @@ -221,14 +221,14 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 - [ ] 索引 - [ ] sql优化 - [ ] [基于GTID主从复制的原理和基础配置]() -- [MySQL日志类型把我难哭了,你学废了吗?]() +- [ ] [MySQL日志类型把我难哭了,你学废了吗?]() ### Redis -- [key命名规范与建议]() -- [redis开发使用规范]() -- [redis基础介绍]() -- [redis的简单安装和部署](https://mp.weixin.qq.com/s/Xe-ZDf2kgUWfYSkuULAdlw) +- [ ] [key命名规范与建议]() +- [ ] [redis开发使用规范]() +- [ ] [redis基础介绍]() +- [ ] [redis的简单安装和部署](https://mp.weixin.qq.com/s/Xe-ZDf2kgUWfYSkuULAdlw) - [ ] 数据类型 - [ ] [redis简单主从集群部署-docker方式]() - [ ] [memCache与Redis比较]() @@ -349,7 +349,7 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 ### Nacos -> 阿里巴巴出品,适用于微服务下的配置管理,支持Java、Nodejs等主流语言,目前生态良好,技术支持表现一般,属于Apollo替代产品|发、、 +> 阿里巴巴出品,适用于微服务下的配置管理,支持Java、Nodejs等主流语言,目前生态良好,技术支持表现一般,属于Apollo替代产品 ## 消息中间件 @@ -364,13 +364,13 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 ### gRPC > gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统,tensorflow分布式与tensorflow -> serving底层通信都是是用的grpc。我自己基于JavaScript技术栈上较多的接触到gRPC,传送门:[基于js下各框架grpc的使用]() +> serving底层通信都是是用的gRPC。我自己基于JavaScript技术栈上较多的接触到gRPC,传送门:[基于js下各框架gRPC的使用]() -- [ ] nodejs下grpc的简单实用 -- [ ] grpc集成express框架 -- [ ] grpc集成koa框架 -- [ ] grpc在egg.js下的应用 -- [ ] grpc插件开发示例 +- [ ] nodejs下gRPC的简单实用 +- [ ] gRPC集成express框架 +- [ ] gRPC集成koa框架 +- [ ] gRPC在egg.js下的应用 +- [ ] gRPC插件开发示例 ### Dubbo @@ -390,7 +390,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 ### Logstash -> > 数据收集 ### Kibana @@ -399,8 +398,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 ## 监控工具 -> 常用工具:Prometheus 、Grafana、zabbix、lepus等 - ### Prometheus ### Grafana @@ -459,8 +456,6 @@ Nuxt.js是在vue框架上进行封装的,主要是用来解决单体页面的 ### Redis集群 -> 持续整理中... - #### 主从模式 #### 哨兵模式 diff --git a/code/node/es6/es5-2009-every.ts b/code/node/es6/es5-2009-every.ts new file mode 100644 index 000000000..a33847110 --- /dev/null +++ b/code/node/es6/es5-2009-every.ts @@ -0,0 +1,10 @@ +const nums = [12, 14, 33, 25, 28] + + +// 判断数组中的值是否全部超过15的 +const over15 = nums.every(num => { + return num > 15 +}) + +// 输出 false +console.log(over15) diff --git a/code/node/es6/es5-2009-forEach.ts b/code/node/es6/es5-2009-forEach.ts new file mode 100644 index 000000000..d00b1219c --- /dev/null +++ b/code/node/es6/es5-2009-forEach.ts @@ -0,0 +1,8 @@ +const arr = [1, 2, 3] + +const result: number[] = [] +arr.forEach(a => { + result.push(a * a) +}) +// 返回 [1,4,9] +console.log(result) diff --git a/code/node/es6/es5-2009-indexOf.ts b/code/node/es6/es5-2009-indexOf.ts new file mode 100644 index 000000000..77fac456a --- /dev/null +++ b/code/node/es6/es5-2009-indexOf.ts @@ -0,0 +1,7 @@ +const stu = ['142vip', 'Lisa', '142vip'] + +// 输出 0,数组中角标为0对应的就是142vip +console.log(stu.indexOf('142vip')) + +// 支持指定起始索引 +console.log(stu.indexOf('142vip', 1)) diff --git a/code/node/es6/es5-2009-isArray.ts b/code/node/es6/es5-2009-isArray.ts new file mode 100644 index 000000000..015553436 --- /dev/null +++ b/code/node/es6/es5-2009-isArray.ts @@ -0,0 +1,3 @@ +const arr = [1, 2, 3] +// 返回 true +Array.isArray(arr) diff --git a/code/node/es6/es5-2009-lastIndexOf.ts b/code/node/es6/es5-2009-lastIndexOf.ts new file mode 100644 index 000000000..554d39a6e --- /dev/null +++ b/code/node/es6/es5-2009-lastIndexOf.ts @@ -0,0 +1,7 @@ +const stu = ['Tom', 'Lisa', '142vip'] + +// 输出 2,数组中角标为2对应的就是142vip +console.log(stu.lastIndexOf('142vip')) + +// 支持指定起始索引 +console.log(stu.lastIndexOf('142vip', 2)) diff --git a/code/node/es6/es5-2009-reduceRight.ts b/code/node/es6/es5-2009-reduceRight.ts new file mode 100644 index 000000000..1687a9dc3 --- /dev/null +++ b/code/node/es6/es5-2009-reduceRight.ts @@ -0,0 +1,5 @@ +const nums = [12, 14, 33, 25, 28] + +const reuslt = 1 + +nums.reduceRight() diff --git a/code/node/es6/es5-2009-some.ts b/code/node/es6/es5-2009-some.ts new file mode 100644 index 000000000..706537aa0 --- /dev/null +++ b/code/node/es6/es5-2009-some.ts @@ -0,0 +1,10 @@ +const nums = [12, 14, 33, 25, 28] + + +// 判断数组中的值是否存在超过15的 +const over15 = nums.some(num => { + return num > 15 +}) + +// 输出 true +console.log(over15) diff --git a/docs/manuscripts/microservice/grpc.md b/docs/manuscripts/microservice/grpc.md index 333f66f50..b2e702263 100644 --- a/docs/manuscripts/microservice/grpc.md +++ b/docs/manuscripts/microservice/grpc.md @@ -5,7 +5,8 @@ permalink: /manuscripts/microservice/grpc.html # gRPC -**gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序** +**gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。允许你像本地方法调用一样调用、调试分布式应用程序 +** gRPC 是一个现代开源高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持, 有效地连接数据中心内和跨数据中心的服务,基于Protobuf序列化协议开发,且支持众多开发语言。 @@ -54,7 +55,8 @@ rpc SayHello(HelloRequest) returns (HelloResponse); - 服务器流式 RPC -其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。**gRPC 保证单个 RPC 调用中的消息排序** +其中客户端向服务器发送请求并获取流以读取一系列消息。客户端从返回的流中读取,直到没有更多消息为止。**gRPC 保证单个 RPC +调用中的消息排序** ```protobuf rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse); @@ -62,7 +64,8 @@ rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse); - 客户端流式 RPC -其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC 再次保证单个 RPC 调用中的消息排序。 +其中客户端写入一系列消息并将它们发送到服务器,再次使用提供的流。客户端完成消息写入后,它会等待服务器读取消息并返回响应。gRPC +再次保证单个 RPC 调用中的消息排序。 ```protobuf rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse); @@ -78,15 +81,17 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse); ### 使用 API -从文件中的服务定义开始`.proto`,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些 API,并在服务器端实现相应的 API。 +从文件中的服务定义开始`.proto`,gRPC 提供生成客户端和服务器端代码的协议缓冲区编译器插件。gRPC 用户通常在客户端调用这些 +API,并在服务器端实现相应的 API。 - 在服务器端,服务器实现服务声明的方法,并运行一个 gRPC 服务器来处理客户端调用。gRPC 基础结构解码传入请求、执行服务方法并对服务响应进行编码。 -在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。 + 在客户端,客户端有一个称为存根(对于某些语言,首选术语是客户端)的本地对象,它实现与服务相同的方法。 - 客户端然后可以在本地对象上调用这些方法,这些方法将调用的参数包装在适当的协议缓冲区消息类型中,将请求发送到服务器,并返回服务器的协议缓冲区响应。 ### 同步与异步 -在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。**另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动 RPC 是很有用的**。 +在响应从服务器到达之前阻塞的同步 RPC 调用最接近于 RPC 所追求的过程调用的抽象。**另一方面,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下启动 +RPC 是很有用的**。 ## RPC 生命周期 @@ -101,7 +106,8 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse); ### 服务器流式 RPC -服务器流式 RPC 类似于一元 RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。 +服务器流式 RPC 类似于一元 +RPC,不同之处在于服务器返回消息流以响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选的状态消息)和可选的尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端在收到服务器的所有消息后完成。 ### 客户端流式 RPC @@ -140,17 +146,21 @@ rpc BidiHello(stream HelloRequest) returns (stream HelloResponse); 优点: -- **实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC 服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。 -- **具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的 OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。 +- **实现的进程间通信方式高效。** gRPC 不使用 JSON 或 XML 等文本格式,而是使用基于二进制协议的protocol buffer与 gRPC + 服务、客户端进行通信。此外,gRPC 是在 HTTP/2 之上实现的protocol buffer,这使得进程间通信更快。 +- **具有简单、定义良好的服务接口和协议。** 你首先定义服务接口,然后处理实现细节。因此,与用于RESTful服务定义的 + OpenAPI/Swagger 和用于 SOAP Web 服务的 WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。 - **强类型。** protocol buffer清楚地定义了应用程序之间通信的数据类型,这使得分布式应用程序开发更加稳定。因为静态类型有助于减少你在构建跨多个团队和技术的云原生应用程序时遇到的大多数运行时和交互错误。 -- **支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择grpc支持的任意语言,并与任何现有的 gRPC 服务或客户端进行通信。 +- **支持多语言。** gRPC被设计成支持多种编程语言。使用protocol buffer的服务定义与语言无关。因此,你可以选择gRPC支持的任意语言,并与任何现有的 + gRPC 服务或客户端进行通信。 - **支持双向流式传输。** gRPC 对客户端或服务器端流式传输具有原生支持,这使得开发流媒体服务或流媒体客户端变得更加容易。 - **内置多种高级特性。** gRPC 提供对高级特性的内置支持,例如身份验证、加密、元数据交换、压缩、负载平衡、服务发现等。 - **与云原生生态系统高度集成。** gRPC 是 CNCF 的一部分,大多数现代框架和技术都为 gRPC 提供了开箱即用的原生支持。 缺点: -- **可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对 gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。 +- **可能不适合面向外部的服务。** 当你想将应用程序或服务提供给外部客户端使用时,gRPC 可能不是最合适的协议,因为大多数外部使用者对 + gRPC 还很陌生。而且,gRPC 服务的协议驱动、强类型化特性可能会降低你向外部提供的服务的灵活性,因为外部使用者可以控制的东西要少得多。 - **生态系统相对较小。** 与传统的 REST/HTTP 协议相比,gRPC 生态系统仍然相对较小。浏览器和移动应用程序对 gRPC 的支持仍处于初级阶段。 ## 参考资料 diff --git a/docs/manuscripts/server-end/es-version/ES5-2009.md b/docs/manuscripts/server-end/es-version/ES5-2009.md index 397cba7df..586883f38 100644 --- a/docs/manuscripts/server-end/es-version/ES5-2009.md +++ b/docs/manuscripts/server-end/es-version/ES5-2009.md @@ -4,3 +4,229 @@ permalink: /manuscripts/server-end/es-version/es5-2009.html --- # ES5 + +`ES5` 发行于2009年,按照`ECMAScript`命名风格,E`S5`也被称作`ECMAScript 2009`, 是`JavaScript`历史上第一个主要的版本。 + +## 严格模式 + +使用`use strict`定义代码应该在严格模式下执行,协助写出更加清晰的代码,一定程度上约定代码规范,例如: 禁止使用未声明的变量 + +`use strict`只是一个字符串表达式。旧的浏览器如果不理解的话不会抛出错误。 + +```js +"use strict"; +// 抛错,变量未定义 +PI = 3.14; + +// 正常使用 +const name = '142vip' +console.log(name) +``` + +## 字符串 + +### charAt方法 + +使用charAt()方法返回字符串中字符所有的角标位置(Index)值,例如: + +```js +var str = "HELLO"; +// 返回 E +str.charAt(1); +``` + +### 多行显示 + +使用反斜杠`\`转义,允许多行字符串,例如: + +```js +// 转义字符可能支持的不是很好 +const msg = "Hello \ +Dolly!"; + +// 更安全的做法 +const newMsg = "Hello " + + "Dolly!"; +``` + +### trim方法 + +使用trim()方法可以删除字符串两侧的空格,例如: + +```js +const name = " 142vip.cn "; +// 返回 142vip.cn +console.log(name.trim()) +``` + +## 数组 + +### isArray方法 + +在`Array`对象中使用`isArray()`方法,可以检查对象是否为数组,例如: + +@[code ts](@code/node/es6/es5-2009-isArray.ts) + +### forEach方法 + +`forEach()`方法为每个数组元素调用一次回调函数,可以用来处理数组,例如: + +@[code ts](@code/node/es6/es5-2009-forEach.ts) + +### map方法 + +### filter + +### reduce + +### reduceRight() + +### every() + +判断数组中的元素是否全部满足特定函数的情况,返回`true` | `false`,全部满足才会返回`true`,例如: + +@[code ts](@code/node/es6/es5-2009-every.ts) + +### some() + +判断数组中的元素是否存在满足特定函数的情况,返回`true` | `false`,部分满足即返回`true`,例如: + +@[code ts](@code/node/es6/es5-2009-some.ts) + +### indexOf() + +定义: + +- `indexOf(searchElement: T, fromIndex?: number): number` + +`indexOf()`方法支持从数组开头开始查找所有,找到第一个符合条件值的索引(角标),例如: + +@[code ts](@code/node/es6/es5-2009-indexOf.ts) + +### lastIndexOf() + +定义: + +- `lastIndexOf(searchElement: T, fromIndex?: number): number` + +`lastIndexOf()`方法支持从数组结尾开始查找所有,找到第一个符合条件值的索引(角标),例如: + +@[code ts](@code/node/es6/es5-2009-lastIndexOf.ts) + +## 序列化 + +### JSON.parse() + +反序列化方法,支持将JSON字符串还原为对象,例如: + +```ts +const student = JSON.parse('{"name":"142vip","age":18}') + +console.log(student) +``` + +### JSON.stringify() + +序列化方法,支持将对象转化为JSON字符串,例如: + +```ts +const student = { + name: '142vip', + age: 18 +} + +// 序列化为字符串 +console.log(JSON.stringify(student)) +``` + +## 日期 + +### now() + +`Date.now()`返回自零日期(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数,例如: + +```ts +// 输出:1702525268142 +console.log(Date.now()) +``` + +### toISOString() + +`toISOString()`方法使用 `ISO` 标准格式将 `Date` 对象转换为字符串,例如: + +```ts +const today = new Date(); + +// 输出:2023-12-14T03:31:56.160Z +console.log(today.toISOString()) +``` + +### toJSON() + +`toJSON()`将 `Date` 对象转换为字符串,格式为 `JSON` 日期。`JSON` 日期的格式与 `ISO-8601` +标准相同:`YYYY-MM-DDTHH:mm:ss.sssZ`,例如: + +```ts +const today = new Date() + +// 输出: 2023-12-14T03:27:50.441Z +console.log(today.toJSON()) +``` + +## 获取器和设置器 + +## 对象方法 + +新增了一些对象方法, + +```ts + +Object.create(parent, donor) + +// Adding or changing an object property +Object.defineProperty(object, property, descriptor) + +// Adding or changing object properties +Object.defineProperties(object, descriptors) + +// Accessing Properties +Object.getOwnPropertyDescriptor(object, property) + +// Returns all properties as an array +Object.getOwnPropertyNames(object) + +// Accessing the prototype +Object.getPrototypeOf(object) + +// Returns enumerable properties as an array +Object.keys(object) +``` + +## 函数绑定 + +## 尾随逗号 + +`ES5`允许在定义对象和数组中使用`尾随逗号`,对于`JSON`数据格式是支持`尾随逗号`,例如: + +对象和数组的数据中,最后的一个元素末尾可以跟随逗号。 + +```ts +const person = { + name: "Tom" + age: 18, +} + +const arr = [1, 2, 3,] +``` + +`JSON`数据格式末尾不支持尾随逗号。 + +```ts +// 支持 +const badStu = '{"name":"Tom", , "age":18}' +JSON.parse(person) + +// 不支持 +const goodStu = '{"name":"Tom", , "age":18,}' +JSON.parse(person) +``` diff --git "a/docs/manuscripts/server-end/framework/egg/\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/docs/manuscripts/server-end/framework/egg/\346\234\200\344\275\263\345\256\236\350\267\265.md" index 44b017804..db5e103a4 100644 --- "a/docs/manuscripts/server-end/framework/egg/\346\234\200\344\275\263\345\256\236\350\267\265.md" +++ "b/docs/manuscripts/server-end/framework/egg/\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -233,7 +233,7 @@ ENV EGG_SERVER_ENV='xxxxx' CMD ["npm","run","start"] ``` -在没有外网连接的基础时,grpc的部署需要先将模块包导入再应用; +在没有外网连接的基础时,gRPC的部署需要先将模块包导入再应用; ```dockerfile ## 忽略脚本安装