简介
unpkg 是一个前端常用的公共 CDN,它通过 URL 语法完成了别人 web 界面内才能达到的效果,简洁而优雅,在流行的类库、框架文档中常常能看到它的身影。
我发现这个项目很有趣,可以在线预览目录及文件。在网上寻找了相关资料,很少有对这个项目详细分析解读的,所以决定仔细分析一下实现原理并尝试私有化部署。
先看一下UNPKG官网的访问效果;
unpkg.com/browse/reac… 效果如下:
unpkg.com/browse/reac… 效果如下:
同时也支持源文件直接使用:unpkg.com/react@17.0.…
相关链接:
源码分析
先分析一下源码
目录视图
这里的pm2.config.js是我为了启动服务和记录日志及方便添加process.env参数所以加上的。
主要文件注释
我根据自己的理解,给主要的目录及文件添加了一些注释。
我添加了部分打印信息,帮助理解:
在浏览器可以通过打印全局变量window.DATA 查看相关参数
UNPKG的接口请求
主要请求镜像源的API,比如registry.npmjs.org 镜像源,可以通过registry.npmjs.org/react?meta
或者registry.npmjs.org/react/17.0.… 进行接口请求,获取相关npm包的信息及文件路径。
UNPKG通过对用户请求URL的解析获取请求参数packageName、packageVersion、packageSpec、filename。然后请求镜像源接口,获取到信息和stream。然后通过该SSR渲染到前端页面中预览。
工作流程
通过对源码的阅读,UNPKG的主要工作流程是这样的:
私有化部署
知道工作原理后,想私有化部署到我自己的服务器上。这里需要做少许改定。一方面是因为有cloudflare接口鉴权校验,所以需要注释掉。另一名面我不想用一级域名直接被占用,所以增加Nginx配置。
去掉接口鉴权校验:
链接替换成第三方链接或者自己的链接:
增加PM2配置,记录相关日志:
增加启动脚本;
Nginx配置
我的域名信息是timesky.top 不想一级域名被占用,只想代理/browse/开头的路径代理到我的服务端口8091就可以了,另外包请求类似timesky.top/react@17.0.… 这种path第一部分包含@的也代理到8091端口即可
location ~ ^/.+@.+/.+$ {
proxy_pass http://127.0.0.1:8091$uri;
proxy_set_header Host $proxy_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_set_header Cookie $http_cookie;
}
location ~ ^/.+@.+/.+$ {
proxy_pass http://127.0.0.1:8091$uri;
proxy_set_header Host $proxy_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_set_header Cookie $http_cookie;
}
复制代码
这里我的域名http和https都有,所以Nginx 80和443都需要配置
服务器部署代码,启动pm2服务后
大功告成,请看效果。
性能优化
部署是成功了,就是访问速度很慢,难以接受。所以想做一下优化,Redis是一个很好的优化手段,因为只要路径国定下来,内容其实每次都是不变的,只需要吧内容存到Redis中,下次请求相同的路径直接返回就好了。
Redis中间件接入及部署
- 本地和服务器安装Redis参考官网,npm包新增ioredis。
- 新增中间件getCache用于查询Redis
- 保存文件的时候保存在Redis中
- 在路由中新增查询Redis
本地调试
本地启动后,可以通过可视化客户端查看Redis缓存。
查看Redis客户端
部署服务器
服务器Linux安装Redis并修改配置,启动服务。
我们可以发现访问速度明显快了很多。
我们访问timesky.top/nest@0.1.6/…
查看服务器请求日志
查看服务器Redis记录
Redis成功存取成功,而且网站二次三次访问速度急速提升!。
在网站中查看build ID 为Build: c5df54a
刚好对应上git提交记录ID 1cd2240a03
总结
至此,UNPKG的私有化部署和性能提升告一段落,目前这个服务只能支撑个人使用,还不能应用于大流量的场景。如果是企业级别的私有化服务,还需要考虑上Redis集群,以及CDN服务。整个弄下来收货挺火,后期也可以考虑优化一下,比如协商缓存。
备注:对于公司的私有镜像,大家可以切换成自己的私有仓库镜像地址,另外针对企业私有镜像可能要处理重定向问题,这里就不再展开细说。如有需要可以私信或者评论区一起讨论。