文章开始之前,推荐一些别人写的很好的文章!感兴趣的也可以去读一下哦!
今日推荐:Electron以慢著称,为什么桌面QQ却选择它做架构升级?
文章链接:https://cloud.tencent.com/developer/article/2332111
最近在使用 electron 做本地资源管理器的时候,也在往优化方面思考,比如初始化加载页、多窗口的创建销毁、多窗口通信等。上文就给出了一些的优化思路。
前端网页能被访问的前提,一个是网址对应的资源,一个是网络发现。
所以通常来讲,把 .html
等资源放到服务器上,然后使用 nginx
等工具做网络代理,即可将网址指向前端内容。
npm run build
,得到了 dist/*
等资源文件。windows
轻量服务器。Ctrl+C
拷贝到服务器的 D://web/*
文件夹中。ssh
命令,比如 scp -r local_path username@ip:/usr/opt/web
等。WinSCP
之类的可视化工具来进行上传。[ip]/index.html
是访问不到的资源。nginx.conf
配置比如 location / { root D://web; }
后,即可访问网址则能看到内容了。windows
的 IIS
配置或 route add
命令等。当然,你也可以不用自己的服务器,而是第三方的服务器:
COS
文件服务器,用管理后台或相应 SDK
去上传即可。github pages
、vercel
、netlify
等也相当方便。至于不想只是 IP
地址来访问,而是域名,则需要域名 DNS
解析即可,就是另个小课题了。
显然,多半情况下,网络发现配置仅配置一次即可,更需要频繁更新的是上传资源,那么自动化上传提上日程。
那么就需要两个考虑,一个是自动化程序,一个是上传时机。
上传时机主要靠的是 git hooks
,比如 post-merge
之类的。
当然你说本地运行些 npm run deploy
的命令也行,但多半其实监听的也是 pre-push
之类的时机,或者比较手动的。
github
、工蜂 之类的代码托管的平台上,也多半有进行配置 git hooks
的地方,甚至有 tag push
等时机的拓展。jenkins
、bamboo
等各式持续集成工具,同样可以配置。vercel
、netlify
等,其实只是隐藏了上述内容,只需要更少的配置而已。程序就比较简单了,通常就是 NodeJs
脚本即可,只看你想在什么环境下去走这些流程,可见下一章。
另外,除了 build
和 upload
之外,这个阶段你还可以干很多事,比如加版本号、统计体积、自动化测试等。
如果是团队合作,一个用 mac
一个用 win
,一个用 nodejs18
一个用 nodejs16
,或者两人的 npm global
依赖版本不一致,
那么上述过程在本地运行,就会造成结果可能不一致,不同人部署的结果就不同。
所以,需要一个自动化环境,来保证打包结果的统一。
在上传时机板块就已经涉及到了,无论是第三方平台还是自建服务,都是比较独立的环境了。
最简单的方式就是利用各种托管平台,
比如 github actions
能自己写脚本来触发 npm run deploy
等 node
命令,
或者 vercel
、netlify
的项目配置中有个启动脚本的输入框等。
而自建部署平台,无论你用的简单 jenkins
还是什么能私有化的流水线平台,就得买个服务器了。
平台搭建完成后,去配置 git
仓库地址、配登录权限、配 git hooks
等,再写点自定义脚本即可。
还有个方式可以不使用平台,而是搞个 web hooks
,去接收代码托管平台时机被触发时发过来的消息,再进行自动化部署。
如果你的网站访问量够大,需要分流到多台服务器,那么你可能需要分布式部署了。
扯到分布式就要先了解 docker
和 k8s
,就要了解下容器化技术。
docker
可以保证不管你的服务器无论是 win
还是 linux
,始终是一样的 docker
中包含的环境。k8s
可以保证当你新加服务器时能自动部署,减少服务器时不会让网络发现打空。可以简单的把使用 docker
分为两个阶段,一个 build
,一个 run
。
比较推荐在 docker build
阶段你只放入 dist/*
打包结果文件,而非源码,这样可以让镜像更小,部署更快。
比如放的是源码,那么容器中还得有 NodeJs
软件被安装,运行容器时还有 npm install
的时间花销和 node_modules
的内存花销。
但如果是一套代码分渠道的场景,可能会使用不同的环境变量,那还是放入源码吧,在 run
阶段时就能响应一些变量的变化了。
这牵扯到 Dockerfile
的编写,按你的需求进行编写即可。
在 docker build
构建容器完成后,就是在集群中使用了
docker push
将容器推到镜像仓库去等待被拉取,前提是需要 docker login
。docker save
将容器转为 tar
压缩包,去上传到 COS
等待被拉取,或上传到 k8s
集群。docker pull
,或下载然后 docker load
,然后 docker run
即可。当出现线上问题又难以短期内解决时,你可能需要回滚版本,
而回退代码再重新部署还是繁琐了点,所以部署也需要版本管理。
当然,如果是按上面的流程搭下来,你只需要处理最后 k8s
的部分即可,拉取或下载旧版本容器然后运行即可。
但如果你的部署架构没搞容器化,那么你就需要冗余一批旧版本的打包结果了。
比如在服务器上有着 D://web-v1
和 D://web-v2
两个目录,只需改动 nginx
等的网络发现指向即可。
至于冗余多少冗余多久,就看你的需求了,或者等到服务器内存爆了再清理也不是不行。
其实部署后的内容,大概率在短期内不会变,所以加上缓存还是蛮有必要的。
咱们分两端来看,云端和客户端:
云端可以搞 CDN 缓存或自建网关服务,对指向的资源进行一定的缓存和分配。
而客户端主要是,一个 HTTP
缓存,一个浏览器缓存。
关于 HTTP
缓存,主要要修改的是各种 request headers
:
Expires
和 Cache-Control
可以去设定过期时间。也即强缓存,后续两条为协商缓存Last-Modified
和 If-Modified-Since
可以对比变更时间来判断缓存是否更新。Etag
和 If-None-Match
可以对比变更文件的 md5
值来判断缓存是否更新。关于浏览器缓存,主要就 service worker api
,毕竟浏览器对资源处理的能力有限。
当打包结果为 SPA
应用且路由方式为 history
模式时,通常 /
能正常访问但 /xx
去刷新就会 404 了。
那是因为 /xx
所指向的东西没有资源,所以 nginx
中需要 try_files $uri $uri/ /index.html
的配置。
比如你还搞了前端网关或 BFF
服务,你可以使用以上相同的逻辑去部署,
只是除了资源和网络发现外,又多了一个接口或路由的概念,但实质也可认为是资源,只是路由或接口是业务决定的,比如 koa
、express
来做。
另外,当部署 node
服务时,你可以用 pm2
、forever
等来做进程管理,
提高单个服务器中对批量网络发现的并发能力,压榨一点服务器性能。
邀请人:一起重学前端
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。