Qiankun+Nuxt微应用静态化部署
为什么这么做
- qiankun 是基于 single-spa 做了二次封装的微前端框架,我们项目当前的服务端渲染是完全没法用了。
在服务端没法用的前提下,其实nuxt启动的node服务,就只是启动了一个服务而已 并没有任何服务端渲染。
而如果只是启动个服务、做一下代理的话nginx轻量化的多。 - 部署效率上,当前灵洞在gitlab上执行一次CI自动化部署 耗时15-19分钟,太慢了。
主要时间被浪费在了npm run build 和 (docker build的时候node_modules里面这5-6万个文件)。
而如果使用静态化的部署方式 npm run build 会快很多,docker build的时候也不需要node_modules。
速度就快很多了 耗时1-2分钟。
因为我们做的是微前端,原来部署一个项目,现在要部署10个左右的项目,所以提高部署效率很有必要。 - 服务器资源消耗少很多,部署到生产环境,node服务300-600M,nginx服务 140M左右。
(。・ω・。)
配置文件
nuxt.config.js
1
2
3export default {
mode: 'spa',
}Dockerfile
1
2
3
4FROM xxx.com:xxxx/common/nginx:latest
ADD front.tar.gz /etc/nginx/html/
ADD nginx.conf /etc/nginx/
EXPOSE 10001nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 10001;
server_name localhost;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
location / {
root html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~/system-api/ {
proxy_pass 需要代理的地址;
}
}
}配置CI
.gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65variables:
CI_PROJECT_DIR: 仓库地址
SERVICE_TAG: 1.0.0
GIT_STRATEGY: clone
stages:
- pull
- build
- deploy
- push
pull-code-job:
stage: pull
only:
- master
tags:
- run213
script:
- cd $CI_PROJECT_DIR && git pull
build-main-job:
stage: build
needs:
- pull-code-job
only:
- master
tags:
- run213
script:
- cd $CI_PROJECT_DIR && npm install && npm run build && tar -zcvf front.tar.gz -C dist .
deploy-main-job:
stage: deploy
needs:
- build-main-job
only:
- master
tags:
- run213
script:
- cd $CI_PROJECT_DIR && sh deploy_docker.sh
push-main-job:
stage: push
when: manual
variables:
PRO_NAME: h-wei
SERVICE_NAME: h-public-report
TAG: 1.0.0
needs:
- deploy-main-job
only:
- master
tags:
- run213
script:
- >
if [ "$TAG" == "$SERVICE_TAG" ]; then
docker push xxx.com:11443/$PRO_NAME/$SERVICE_NAME:$SERVICE_TAG
else
docker tag xxx.com:11443/$PRO_NAME/$SERVICE_NAME:$SERVICE_TAG xxx.com:11443/$PRO_NAME/$SERVICE_NAME:$TAG
docker push xxx.com:11443/$PRO_NAME/$SERVICE_NAME:$TAG
docker rmi xxx.com:11443/$PRO_NAME/$SERVICE_NAME:$TAG
fish deploy_docker.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51pro_name=h-wei
service_name=h-public-system
version=1.0.0
if [ -n "$1" ]; then
pro_name=$1
fi
if [ -n "$2" ]; then
service_name=$2
fi
if [ -n "$3" ]; then
version=$3
fi
# shellcheck disable=SC2164
CURRENT_DIR=$(cd "$(dirname "$0")"; pwd)
echo "进入目录:${CURRENT_DIR}"
# shellcheck disable=SC2164
cd "${CURRENT_DIR}"
echo "#########################检测旧的镜像文件以及正在运行的容器#########################"
# shellcheck disable=SC2006
CID_LIST=`docker ps -a --format "{{.ID}}\t{{.Image}}" | grep xxx.com:11443/${pro_name}/${service_name}:${version} | awk '{print $1}'`
for CID in ${CID_LIST}
do
echo "关闭容器:${CID}"
docker stop "${CID}"
echo "删除容器:${CID}"
docker rm "${CID}"
done
# shellcheck disable=SC2006
IMAGES_LIST=`docker images --format "{{.Repository}}:{{.Tag}}" | grep xxx.com:11443/${pro_name}/${service_name}:${version}`
if [ -n "${IMAGES_LIST}" ]; then
# shellcheck disable=SC2162
echo "${IMAGES_LIST}" | while read IMAGE_LINE
do
if [ -n "${IMAGE_LINE}" ]; then
echo "删除旧的镜像文件:${IMAGE_LINE}"
docker rmi "${IMAGE_LINE}"
fi
done
fi
# shellcheck disable=SC2034
cd "${CURRENT_DIR}" && docker build -f "${CURRENT_DIR}"/Dockerfile -t xxx.com:11443/${pro_name}/${service_name}:${version} .
docker run -d --name=${service_name} --net=host xxx.com:11443/${pro_name}/${service_name}:${version}相关命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28压缩dist文件夹内的文件,不包含dist文件夹
tar -zcvf front.tar.gz -C dist .
解压缩
tar -zxvf front.tar.gz -C 解压到哪
编译镜像
docker build -t 镜像名称:标签 .
基于镜像创建并启动容器
docker run -d --name=容器名称 --net=镜像名称:标签
查询容器
docker ps -a | grep 容器名称
停止并删除容器
docker stop 容器名称 && docker rm 容器名称
重启容器
docker restart 容器名称
查看当前容器的日志
docker logs -f --tail=行数 容器名称
进入容器
docker exec -it 容器名称 bash
查询镜像
docker images | grep 镜像名称
删除镜像
docker rmi (镜像名称:标签)/ 镜像ID
查看操作历史
history
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CY的笔记!