整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript 后端开发者必须跨的 10 道门槛

要:在IT行业中,后端开发者发挥着至关重要的作用。尤其是在技术变革日新月异的时代,更需要后端开发者不断提升自我的技能,但是,无论技术迭代如何迅速,后端开发人员的“基本功”都不可以落下。本文展开讨论成为JavaScript堆栈后端开发人员,必须经历的那些事……

原文链接:

https://billypentester.medium.com/ultimate-10-stages-to-master-backend-development-f6f65f22a327

声明:本文为CSDN翻译,转载请注明来源。

作者 | Bilal Ahmad

译者 | 朱珂欣 责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

随着时代的发展,越来越多编程语言和开发工具的出现,让开发者能够方便且快捷地开发和部署应用程序。其中,后端开发多是指服务器端编程,开发人员通过创建应用程序体系结构和业务逻辑,以此处理和存储数据并输出有用的信息。

毋庸置疑,成为后端开发人员必然有门槛,掌握Web和操作系统的基础知识、了解数据库、计算机网络协议、数据结构和算法、开发工具等,逐渐成为后端开发人员的入门技能。后端编程语言、框架和堆栈也很多,例如JavaScript、Python、PHP、Java、Ruby等。那么,成为JavaScript堆栈后端开发人员,需要面临那几个必须经历的阶段呢?


第1阶段:掌握Web基础知识

在开发人员的初始阶段,学习Web的基础知识是至关重要的。因为拥有Web概念可以帮助开发人员更好地了解互联网的工作原理,例如使用哪些协议、如何传递消息等。

首当其冲的是了解Web中的一些基本概念,例如HTTP的概念、HTTP的基本方面、HTTP 请求的类型及作用、客户端和服务器模型、OSI 模型、DNS 工作原理等。


第2阶段:了解操作系统知识
操作系统,管理着计算机上的所有软件和硬件。它执行内存和进程管理,处理输入和输出等。通过运行操作系统,进一步运行完整 Web 应用的服务器。因此,开发人员有必要了解操作系统整体实现,以最大限度地提高性能并优化内存。
在此阶段,开发需要了解操作系统体系结构、文件系统、基本CLI命令、内存和进程管理、操作系统线程等。

第3阶段:学习后端框架和语言

在开发者学习要使用的后端框架和语言的过程中,第一步是学习JavaScript。学习JavaScript的基础知识,例如数据类型、循环、选择、函数、对象、类、数组、字符串、正则表达式等。
JavaScript 由ECMAScript、文档对象模型(DOM)和浏览器对象模型(BOM)三个部分组成。ECMAScript是JavaScript所基于的脚本语言规范。它引入了新的JavaScript功能,如箭头函数,异步等待,模板文本等,这些功能可以对有效的编码很有帮助。
Node.js是一个开源的、跨平台的、后端的JavaScript运行时环境,它在JavaScript引擎上运行并执行JavaScript代码。开发人员可以学习基本的节点JavaScript模块,例如fs、path、os等。

第4阶段:使用服务器框架和API开发

首先,服务器端框架作为后端开发中的主要角色,它是前端和后端(节点应用)之间的通信网关,使编写、维护和扩展Web应用更加容易。
服务器端框架提供工具和库来实现简单、常见的开发任务,包括路由处理,数据库交互,会话支持和用户验证,格式化输出,提高安全性应对网络攻击,也能使开发人员完全控制传入和传出的请求/响应,提供端点,执行中间件功能等。
其次,API开发作为一种实践阶段,开发人员将学习如何使用Express JS和节点JS创建简单的REST API并执行CRUD操作。使用快速中间件验证传入请求,使用路由器处理端点等。
Postman 在测试 API 端点方面很有帮助。添加更多内容并了解 swagger 和 Open API。

第5阶段:使用模板引擎

通常,前端(React应用程序)和后端(快速应用程序)之间的通信是使用MERN堆栈中的API调用完成的。客户端从服务器请求数据,服务器将请求的数据发送回客户端。
但是,如果开发人员的项目很小,并且对 React 或其他前端框架不了解,可以使用模板引擎。
模板引擎可帮助开发人员创建静态HTML模板文件,并在运行时将模板文件中的变量替换为实际值,这使其成为动态网站。模板引擎与Express JS的集成一起工作。它从数据库获取数据值,并可以通过HTML 模板文件呈现这些值。


第6阶段:了解数据库

数据库在后端开发中发挥着巨大的作用。数据库用于以结构化方式存储数据以及访问和维护数据。

后端应用程序可以通过使用MongoDB,MySQL等第三方npm包查询数据库来直接与数据库交互。如果开发人员不了解SQL或数据库语言,则需要学习任何ORM/ODM作为中间件,将对象方法转换为复杂的数据库查询,这些中间件为开发人员提供了一个名为模型的完整结构,用于在将数据输入数据库之前验证数据。此外,它在对象模型之上提供了一个额外的安全层。


第7阶段:关注安全性

安全性是企业级 Web 应用程序的一大关注点。单个漏洞会导致数据泄露或应用程序故障。Web 应用中应有适当的验证、身份验证和授权。

因此,开发人员在该阶段可能会涉及促进应用更安全的一些技术,例如:
  • JWT:使用令牌防止对受保护资源的意外访问;
  • Cookie:用于存储有关访问网页的信息;
  • 会话:用于维护与服务器的安全连接;
  • CORS:使用CORS从一个网站向另一个网站发出请求;
  • 哈希:使用中间件通过salt对密码进行哈希处理;
  • 加密/解密:使用中间件加密和解密重要数据;
  • SSL:使用SSL认证来保护事务;
  • 限制:使用中间件应用请求限制,防止DDOS攻击。


第8阶段:使用消息代理

现代应用程序非常复杂,由于时间复杂度大,CPU密集型操作、大量数据处理以及多个服务之间的API通信存在耗时的问题,会带来糟糕的用户体验。

消息代理成为帮助克服其中一些困难的解决方案之一消息代理由 3 个组件组成:

  • 制作人:生产者发送有关主题的消息。一个或多个发布者可以针对同一主题发布内容;

  • 消费者:订阅者订阅主题,发布到该主题的所有消息都将由该主题的所有订阅者接收;

  • 队列/主题:队列保存由生产者发布并由消费者访问的消息。


第9阶段:测试完整的API

在实时服务器上部署Web应用程序之前,为了减少单个错误的输入或缺少数据导致正在运行的服务器出现故障,需要进行测试。

测试可以根据多个标准在多个级别上进行,开发人员可以检查Web应用是否返回了正确的状态代码、错误消息、数据等。

在这个阶段,开发人员的主要任务是使用Jest测试完整的API。Jest是一个著名的单元测试框架,用于测试Web应用程序和API。它提供了多种方法来自动化测试过程,检查对错误或缺失数据的响应等。

第10阶段:实时服务器/云上部署Web应用程序

在部署Web应用之前,开发人员需要学习Git、GitHub的操作以及版本控制工具的使用,以使部署灵活且可扩展。

Git可以用于版本控制,通过创建多个分支,跟踪源代码中的更改,并使多个开发人员能够协同工作。GitHub是一个用于版本控制和协作的代码托管平台,可以允许开发人员和其他人共同处理项目。GitHub操作可帮助您自动执行软件开发工作流。单个操作是可重用的代码段,可用于在 GitHub上生成、测试、打包或部署项目。它还可用于自动执行工作流程的任何步骤。部署完整的Web应用非常复杂。开发者还需要一个专用服务器来响应HTTP请求,并使用在线数据库。

总的来说,从应用程序开发最初阶段的掌握Web基础知识,到最后阶段在实时服务器/云上部署Web应用程序。JavaScript堆栈后端开发者在点滴的积累中,学习和掌握了与应用开发相关的实践经验。然而,无论是对于后端开发的初学者还是对有经验工程师,无论迈过多少个阶段,学习之路都不会中断。

arbor简介

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。

作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。

提升用户使用Registry构建和运行环境传输镜像的效率。

Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。

另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

高可用架构:双主复制

主从同步

harbor官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将测试环境harbor仓库的镜像同步到生产环境harbor,类似于如下流程:

img

在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。这时,单个Registry已经无法满足大量节点的下载需求,因此要配置多个Registry实例做负载均衡。手工维护多个Registry实例上的镜像,将是十分繁琐的事情。Harbor可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题:

只要往一台Harbor上发布,镜像就会像"仙女散花"般地同步到多个Registry中,高效可靠。

如果是地域分布较广的集群,还可以采用层次型发布方式,比如从集团总部机房同步到分公司1机房,再从分公司1机房同步到分公司2机房:

然而单靠主从同步,仍然解决不了harbor主节点的单点问题。

双主复制说明

所谓的双主复制其实就是复用主从同步实现两个harbor节点之间的双向同步,来保证数据的一致性,然后在两台harbor前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor的高可用性:

这个方案有一个问题就是有可能两个Harbor实例中的数据不一致。假设如果一个实例A挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另外一个实例B中,后面即使恢复了挂掉的A实例,Harbor实例B也不会自动去同步镜像,这样只能手动的先关掉Harbor实例B的复制策略,然后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。

另外,这里还需要多吐槽一句:在实际生产使用中,主从复制十分的不靠谱!!所以这里推荐使用下面要说的这种方案

高可用架构:多实例共享后端存储

方案说明

共享后端存储算是一种比较标准的方案,就是多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置LB进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障。

本次搭建以NFS作为共享存储存放Harbor相关data,并分离PostgreSQL与Redis为多个Harbor共同连接使用,使用Nginx做负载均衡。

如果最终生产环境集群中服务器较多,依赖做完LB的Harbor也无法完全达到需求时,可以使用如下架构,部署下级Harbor节点从主节点同步镜像,然后再分发给生产服务器。

这个方案在实际生产环境中部署需要考虑三个问题:

1. 共享存储的选取,Harbor的后端存储目前支持AWS S3、Openstack Swift, Ceph等,在下面的实验环境里,暂且直接使用nfs。

2. Session在不同的实例上共享,这个现在其实已经不是问题了,在最新的harbor中,默认session会存放在redis中,只需要将redis独立出来即可。可以通过redis sentinel或者redis cluster等方式来保证redis的可用性。在下面的实验环境里,暂且使用单台redis。

3. Harbor多实例数据库问题,这个也只需要将harbor中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。

环境说明

  • 操作系统:CentOS 7.6
  • 演示环境软件版本

多实例共享后端存储部署

Docker

1)安装依赖包:

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

2)官方一键脚本安装

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

3)添加内核参数

tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

net.ipv4.ip_forward赋值为1

然后刷新内核参数

sysctl -p

4)修改Docker仓库为国内镜像站

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com

5)启动Docker

systemctl enable docker && systemctl start docker

Compose

compose是Docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用compose,我们可以通过YAML文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。

由于国内政策原因,可能在海外网站上下载文件速度较慢,建议下载本地后上传至服务器

1)下载docker-compose并赋予可执行权限

# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
cd /usr/local/bin
scp 192.168.166.96:/usr/local/bin/docker-compose .

注意:由于我其他服务器已经存在,所以我直接拷贝了

2)安装bash补全命令

# curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/

重新连接终端即生效

注意:由于我其他服务器已经存在,所以我直接拷贝了

NFS

服务端

1)安装必需的RPM包

yum -y install nfs-utils rpcbind   

2)创建NFS共享目录

mkdir -p /data/harbor_data
chown nobody:nobody /data/harbor_data/ 

3)修改NFS服务配置文件

echo "/data/harbor_data 192.168.166.0/24(rw,sync,no_root_squash)"  >> /etc/exports

4)启动NFS服务器

systemctl enable rpcbind && systemctl restart rpcbind
systemctl enable nfs && systemctl restart nfs

客户端

1)安装nfs-utils

yum -y install nfs-utils

2)在NFS客户端上查看NFS的连通性

# showmount -e 192.168.166.122
Export list for 192.168.166.122:
/data/harbor_data 192.168.166.0/24

3)挂载NFS共享存储

创建挂载目录

mkdir /data

修改/etc/fstab配置文件加入以下内容

192.168.166.122:/data/harbor_data  /data  nfs defaults 0 0

mount挂载

mount -a

PostgreSQL

1)下载PostgreSQL官方YUM源配置文件包并安装

wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm 

2)安装PostgreSQL

yum  -y install postgresql96-server postgresql96-contrib 

3)初始化数据库

/usr/pgsql-9.6/bin/postgresql96-setup initdb  

4)启动数据库

systemctl enable postgresql-9.6 && systemctl restart postgresql-9.6

5)PostgreSQL数据库配置

  1. 修改密码
# su - postgres
-bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
ALTER ROLE

2、开启远程访问

vi /var/lib/pgsql/9.6/data/postgresql.conf

# listen_addresses = 'localhost' 改为 listen_addresses='*'

3、信任远程连接

vim /var/lib/pgsql/9.6/data/pg_hba.conf

加入:

host    all  all  192.168.166.203/32 trust
host    all  all  192.168.166.81/32 trust
host    all  all  192.168.166.212/32 trust

6)重启PostgreSQL服务

systemctl restart postgresql-9.6

7)验证服务

psql -h 192.168.166.203 -p 5432 -U postgres

8)迁移数据库

  1. 在postgresql所在服务器,先启动一套harbor环境

简要步骤如下:

# yum install -y yum-utils   device-mapper-persistent-data   lvm2
# curl -fsSL get.docker.com -o get-docker.sh
# sh get-docker.sh --mirror Aliyun
#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
# systemctl enable docker && systemctl start docker
# cd /usr/local/bin
# scp 192.168.166.96:/usr/local/bin/docker-compose .
# scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/
# cd ~
# scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .
# tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
# cd /usr/local/harbor/
# vim harbor.yml ###修改hostname: 192.168.166.203  ####注释掉https段即可
# ./prepare 
# ./install.sh 
# docker-compose up -d

2、进入harbor-db容器导出相关表及数据

# docker container exec -it harbor-db /bin/bash
pg_dump -U postgres registry > /tmp/registry.sql 
pg_dump -U postgres notarysigner > /tmp/notarysigner.sql  
pg_dump -U postgres notaryserver > /tmp/notaryserver.sql

3、导出数据库

docker container cp harbor-db:/tmp/registry.sql /tmp
docker container cp harbor-db:/tmp/notarysigner.sql /tmp
docker container cp harbor-db:/tmp/notaryserver.sql /tmp

4、将数据导入至外部PostgreSQL数据库

# psql -h 192.168.166.203 -U postgres
postgres=# create database registry;
CREATE DATABASE
postgres=# create database notarysigner;
CREATE DATABASE
postgres=# create database notaryserver;
CREATE DATABASE
psql -h 192.168.166.203 -U postgres registry < /tmp/registry.sql
psql -h 192.168.166.203 -U postgres notarysigner  < /tmp/notarysigner.sql
psql -h 192.168.166.203 -U postgres notaryserver < /tmp/notaryserver.sql

Redis

1)安装redis

yum -y install redis

2) 修改配置参数

sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.conf   
sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf   

3)启动并测试redis连接

systemctl enable redis && systemctl restart redis
redis-cli 

Harbor

下载Harbor离线安装包,离线安装包文件较大(约为:590M),建议在本地使用多线程工具下载后上传服务器使用。

1)下载

cd ~
scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .

2)解压

tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/

3)修改配置文件

# cd /usr/local/harbor/
# vim harbor.yml 

修改的内容有

  • hostname修改为本机ip
  • 注释掉https
  • 修改harbor默认的admin账号密码
  • 数据存储位置,改为nfs挂载目录,因为我们本来就挂载到了/data目录下,所以不用动
  • 注释掉database
  • 注释掉clair
  • 打开external_databaseexternal_redis块的注释,并改为刚刚部署的地址

修改完的样例文件,如下

hostname: 192.168.166.81
http:
  port: 80
harbor_admin_password: Harbor12345
data_volume: /data
jobservice:
  max_job_workers: 10
notification:
  webhook_job_max_retry: 10
chart:
  absolute_url: disabled
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 1.10.0
external_database:
  harbor:
    host: 192.168.166.203
    port: 5432
    db_name: registry
    username: postgres
    password: postgres
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  clair:
    host: 192.168.166.203
    port: 5432
    db_name: clair
    username: postgres
    password: postgres
    ssl_mode: disable
  notary_signer:
    host: 192.168.166.203
    port: 5432
    db_name: notarysigner
    username: postgres
    password: postgres
    ssl_mode: disable
  notary_server:
    host: 192.168.166.203
    port: 5432
    db_name: notaryserver
    username: postgres
    password: postgres
    ssl_mode: disable
external_redis:
  host: 192.168.166.245
  port: 6379
  password:
  registry_db_index: 1
  jobservice_db_index: 2
  chartmuseum_db_index: 3
  clair_db_index: 4
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - clair

4)生成harbor运行的必要文件(环境)以及docker-compose.yml文件;执行后会通过网络获取Docker Image,建议提前修改好国内镜像站加速。

./prepare 

5)安装Harbor

./install.sh 

Nginx

1)安装nginx

安装可以参考https://wiki.clay-wangzhi.com/7-nginx/1.-chu-shi-nginx#4-bian-yi-an-zhuang-nginx

这里我就不再详细讲了

2)编写配置文件

# cat harbor.schengle.com.conf 
upstream harbor {
    ip_hash;
    server 192.168.166.81:80;
    server 192.168.166.212:80;
}
server {
    listen       80;
    server_name  harbor.***.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen  443 ssl;
    server_name harbor.schengle.com;
    
    ssl_certificate ***.crt;
    ssl_certificate_key ***.key;
    client_max_body_size 0;
    chunked_transfer_encoding on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_pass http://harbor;
		proxy_redirect default;
        proxy_http_version 1.1;
}
    location /v2/ {
        proxy_pass http://harbor/v2/;
		proxy_redirect default;
        #proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

3)平滑重启nginx

nginx -s reload

参考文章

https://www.cnblogs.com/kevingrace/p/11422710.html

https://juejin.im/post/5d973e246fb9a04dfa0963fb#heading-18

http://dwz-9.cn/_L4me

篇幅有限,关于生产级harbor可用的搭建就介绍到这了,大家感兴趣也可以自己测试一下。

后面会分享更多运维方面内容,感兴趣的朋友可以关注下!

言:

随着JavaScript的不断发展,开发者们正在寻找更灵活和可扩展的方式来修改或扩展现有的代码。其中一种广泛应用的技术是"Hook",它允许开发者拦截和修改现有的函数或方法的行为。本文将详细介绍JavaScript中的Hook技术,包括其特性、优点、缺点和使用场景,并提供示例代码进行说明。

什么是Hook?

在JavaScript中,Hook是一种能够拦截和修改函数或方法行为的技术。通过使用Hook,开发者可以在现有的函数执行前、执行后或者替换函数的实现逻辑。这种灵活的能力使得开发者能够定制和扩展现有代码的行为,而无需修改原始代码。

Hook的特性

  1. 拦截和修改函数行为:Hook技术允许开发者在函数执行前、执行后或者替换函数的实现逻辑,从而可以拦截并修改函数的行为。
  2. 无需修改原始代码:使用Hook技术,开发者可以在不修改原始代码的情况下,对其行为进行定制和扩展。这种无侵入性的特性使得Hook成为修改现有代码的强大工具。
  3. 灵活性和可扩展性:Hook技术提供了灵活性和可扩展性,使得开发者能够根据自己的需求,对现有代码进行精确的修改或扩展。

Hook的优点

  1. 解耦合和可维护性:使用Hook技术,开发者可以将定制和扩展的逻辑与原始代码解耦合。这种解耦合使得代码更易于维护,因为修改或扩展的逻辑可以在独立的Hook函数中进行管理。
  2. 代码复用:通过将定制和扩展的逻辑封装在Hook函数中,开发者可以在多个地方重复使用相同的Hook函数,从而实现代码复用,减少重复编写相似逻辑的工作量。
  3. 快速原型开发:使用Hook技术,开发者可以迅速修改现有代码的行为,以便进行快速原型开发和实验。这种能力可以帮助开发者更快地迭代和验证想法。

Hook的缺点

  1. 潜在的性能影响:由于Hook技术会对函数的执行过程进行拦截和修改,可能会导致性能方面的损失。特别是在大规模应用中使用复杂的Hook逻辑时,需要仔细考虑性能问题。
  2. 隐含的复杂性:Hook技术引入了代码中的额外逻辑和复杂性。开发者需要仔细设计和组织Hook逻辑,以确保其正确性和可维护性。
  3. 潜在的兼容性问题:在使用Hook技术时,需要注意兼容性问题。某些函数可能无法被成功Hook,或者在不同的JavaScript环境中表现不一致。

使用场景

  1. 日志和调试:Hook技术可用于拦截函数的执行,并记录函数的输入、输出和执行时间等信息,以便进行日志和调试。
  2. 性能监测:通过使用Hook技术,开发者可以收集函数的执行时间和资源消耗等指标,从而进行性能监测和优化。
  3. 行为定制和扩展:Hook技术可以用于在函数执行前、执行后或替换函数实现逻辑,实现定制和扩展函数的行为。

示例代码:

下面是一个使用Hook技术的示例代码,用于在函数执行前后打印日志:

function withLogging(fn) {
  return function (...args) {
    console.log(`Calling function ${fn.name} with arguments: ${args.join(', ')}`);
    const result = fn.apply(this, args);
    console.log(`Function ${fn.name} returned: ${result}`);
    return result;
  }
}

function add(a, b) {
  return a + b;
}

const hookedAdd = withLogging(add);
const result = hookedAdd(2, 3); // Output: Calling function add with arguments: 2, 3
                               //         Function add returned: 5
console.log(result); // Output: 5

在上面的示例中,withLogging函数是一个Hook函数,用于拦截目标函数add的执行,并在执行前后打印日志信息。通过调用hookedAdd函数,可以触发拦截和日志输出的过程。

结论:

通过使用Hook技术,JavaScript开发者可以灵活地修改和扩展现有代码的行为,而无需修改原始代码。尽管Hook技术具有一些潜在的缺点和复杂性,但在日志、调试、性能监测以及行为定制和扩展等场景中,它仍然是一个强大且有用的工具。开发者可以根据自己的需求,灵活地使用Hook技术来满足特定的编程需求。

如果您对文章内容有不同看法,或者疑问,欢迎到评论区留言,或者私信我、到我们的官网找客服号都可以。

如遇自己js加密源码加密后没备份,可以找我们解决解出恢复源码,任何加密都可以