微前端做爲解決巨石應用模塊化和下降技術框架變更風險的神器,我以爲是當下前端發展的一大方向,能夠在將來5-10年內保持生命力。
做者從2019年12月第一次使用qiankun框架落地微服務以來已通過去了一年多的時間,造成了、腳手架、工程結構設計、平常開發維護、性能優化、部署等一整套流程。
以前有兩篇文章講了qiankun的入門文章:
qiankun微前端實戰看這篇就夠了 - Vue項目篇:這篇文章編寫的較早,大體在19年12月份當時qiankun還在1.x版本,如今關於微應用註冊及應用間通訊的部分已經和現版本再也不合適,所以再也不建議剛接觸qiankun的同窗閱讀了
vue3.0&qiankun2.0極速嚐鮮,微前端進階實戰!:這篇是基於qiankun2.0的入門文章,以及如何將1.0平滑升級至2.0版本,另外也探討了主應用+n子應用的雙端口配置方案
下面講講做者在部署上作的一系列方案探索(如下兩種方案都更適合一個團隊維護N個微應用的場景):html
1 腳本部署
2 docker部署前端
腳本部署是指使用npm run xx的形式一個命令便可將前端靜態資源推送至服務器的方式vue
添加目標服務器信息node
一鍵部署linux
其中node讀寫、inquirer命令行交互插件、ssh2-sftp-client將文件推送到服務器都是很成熟的插件,另外多個項目一鍵下載依賴、一鍵打包、一鍵部署腳本地址:多個微應用操做腳本,此外還能夠繼續優化,將拉取代碼、打包、部署作到一塊兒去,更適合非程序人員。nginx
做者剛接觸docker幾天時間,若有不對之處,歡迎斧;更歡迎指點更多巧妙姿式。
既然是多個微應用,那直接來docker-compose吧。官方簡介是這麼介紹compose的:負責實現對 Docker 容器集羣的快速編排
。
按docker文檔將docker及docker-compose等相關配置都作好:(win版docker自帶docker-compose,開啓鏡像加速便可;contos須要設置docker用戶組、鏡像加速、單獨安裝docker-compose等,都按上面官方簡介文檔操做便可)
docker自帶前端運行環境,無需再面對在我這好好的在他那那會不能跑呢的尷尬局面git
此方案每次微應用內容變動或nginx配置變動以後都須要從新打包鏡像,很是繁瑣,即使是在docker內npm run build打包並將dist COPY 至鏡像空間也依舊如此,且沒法保證git pull的代碼是功能完整且無錯的github
此方案推薦指數:**web
docker-compose.yml
文件。經過docker-compose去調度每一個子應用和node服務裏面的Dockerfileservices:
# 服務端配置
wl-mfe.server:
container_name: wl-mfe.server
restart: always
build:
context: ./_server
dockerfile: Dockerfile
ports:
- '3700:3700'
# 主應用配置
master: # docker-compose內的容器名
container_name: master # 容器名
restart: always # 重啓策略: 容器退出時老是重啓容器
build:
context: ./master # 服務指定上下文目錄
dockerfile: Dockerfile # 相對於context的dockerfile文件路徑
environment:
NODE_ENV: 'production'
ports:
- '2750:2750' # 端口映射,宿主機端口:容器端口
# subapp-login配置
login:
container_name: subapp-login
restart: always
build:
context: ./subapp-login
dockerfile: Dockerfile
environment:
NODE_ENV: 'production'
ports:
- '2753:2753'
depends_on: # 依賴容器名,會在此容器啓動以後啓動
- master
# ...其餘子應用配置方法如上
複製代碼
Dockerfile
和對應的nginx配置文件yourname.conf
。Dockerfile文件,注意裏面路徑便可;另外注意在每一個應用目錄添加.dockerignore文件,忽略下node_modulesdocker
# 從官方拉取nginx鏡像
FROM nginx
# 複製dist文件夾到鏡像空間,注意docker-compose.yml中指定master的build從./master文件夾開始
COPY dist/ /usr/local/web/master/
# 複製master.conf到鏡像空間
COPY master.conf /etc/nginx/conf.d/master.conf
複製代碼
master.conf文件,這裏nginx配置和普通無二,主應用比子應用多了接口代理,少了容許跨域頭信息,其餘一致。
server {
listen 2750;
server_name 127.0.0.1;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/future/web/master;
index index.html index.htm;
try_files $uri $uri/ /index.html;
# 普通模塊接口地址
location ^~ /Api/ {
proxy_pass $host:3700/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
#因爲服務器端源碼(建議你們作好大小寫匹配)只匹配了"Upgrade"字符串,因此若是這裏填"upgrade"服務器端會將這條http請求當成普通的請求,致使websocket握手失敗
proxy_set_header Connection "Upgrade";
proxy_set_header Remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
}
# 解決 nginx 禁止post請求問題,須要後臺配置跨域
error_page 405 =200 http://$host$request_uri;
}
error_page 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/future/web/master;
}
}
複製代碼
docker-compose up -d
打包並啓動鏡像或 docker-compose build
打包鏡像,上傳阿里雲或其餘私有鏡像中心便可啓動成功後能夠在終端看到容器信息。 代碼地址:Github & node服務Dockerfile & 主應用Dockerfile & 子應用Dockerfile
此方案除了node服務端外,將全部web端微應用掛載到nginx鏡像下,其原理和正常一個nginx啓動所有前端靜態資源服務同樣。這樣部署的時候即帶nginx環境一塊兒部署,也不須要維護過多的鏡像資源,只把全部微應用打包好的dist目錄經過volumes掛載至nginx鏡像便可。
此方案推薦指數:**
docker-compose.yml
文件。# by weilan in 2020.01.25
version: '3'
services:
# 服務端配置
wl-mfe.server:
container_name: wl-mfe.server
restart: always
build:
context: ./_server
dockerfile: Dockerfile
ports:
- '3700:3700'
wl-mfe.web:
image: nginx
restart: always
container_name: nginx
environment:
- TZ=Asia/Shanghai
ports:
# nginx端口與宿主機端口映射
- "8080:80"
- "80:80"
- "443:443"
# 下面是各個微前端的端口映射
- "2750:2750"
- "2751:2751"
- "2752:2752"
- "2753:2753"
volumes:
# 掛載nginx配置
- ./_docker/nginx/default.conf:/etc/nginx/nginx.conf
# 掛載各個微前端靜態資源
- ./master/dist/:/usr/local/web/master/
- ./subapp-blog/dist/:/usr/local/web/subapp-blog/
- ./subapp-login/dist/:/usr/local/web/subapp-login/
- ./subapp-ui/dist/:/usr/local/web/subapp-ui/
複製代碼
docker-compose up -d
打包並啓動鏡像或 docker-compose build
打包鏡像,上傳阿里雲或其餘私有鏡像中心便可此方案解決了運維除了關注鏡像還得關注代碼的問題,而且全部前端模塊都打包進一個鏡像內部,下降運維門檻
此方案推薦指數 ****
docker-compose.yml
文件# by weilan in 2020.02.22
version: '3'
services:
# 服務端配置
wl-mfe.server:
container_name: wl-mfe.server
restart: always
build:
context: ./_server
dockerfile: Dockerfile
ports:
- '3700:3700'
wl-mfe.web:
image: nginx
restart: always
container_name: nginx
build: .
environment:
- TZ=Asia/Shanghai
ports:
# 下面是各個微前端的端口映射
- "2750:2750"
- "2751:2751"
- "2752:2752"
- "2753:2753"
volumes:
# 掛載nginx配置
- ./_docker/nginx/default.conf:/etc/nginx/nginx.conf
複製代碼
FROM nginx
COPY master/dist/ /usr/local/future/web/master/
COPY subapp-login/dist/ /usr/local/web/subapp-login/
COPY subapp-ui/dist/ /usr/local/web/subapp-ui/
COPY subapp-blog/dist/ /usr/local/web/subapp-blog/
複製代碼
注意Dockerfile文件平級添加.dockerignore忽略一下依賴目錄
docker-compose up -d
打包並啓動鏡像或 docker-compose build
打包鏡像,上傳阿里雲或其餘私有鏡像中心便可此方案和docker部署方案1大體相同,只是把主應用將nginx配置copy至鏡像內部改成數據卷掛載的方式,所以平常調整nginx只重啓容器便可
docker-compose.yml
文件。和docker部署方案1相同,可是在master應用下增長數據卷掛載nginxservices:
# 服務端配置
wl-mfe.server:
container_name: wl-mfe.server
restart: always
build:
context: ./_server
dockerfile: Dockerfile
ports:
- '3700:3700'
# 主應用配置
master: # docker-compose內的容器名
container_name: master # 容器名
restart: always # 重啓策略: 容器退出時老是重啓容器
build:
context: ./master # 服務指定上下文目錄
dockerfile: Dockerfile # 相對於context的dockerfile文件路徑
environment:
NODE_ENV: 'production'
ports:
- '2750:2750' # 端口映射,宿主機端口:容器端口
volumes:
# 掛載nginx配置
- ./nginx.conf:/etc/nginx/nginx.conf
# subapp-login配置
login:
container_name: subapp-login
restart: always
build:
context: ./subapp-login
dockerfile: Dockerfile
environment:
NODE_ENV: 'production'
ports:
- '2753:2753'
depends_on: # 依賴容器名,會在此容器啓動以後啓動
- master
# ...其餘子應用配置方法如上
複製代碼
Dockerfile
和對應的nginx配置文件yourname.conf
。這一步只有master項目下有修改,由於在docker-compose中的master掛載了nginx配置,master的Dockerfile中須要將COPY nginx配置
的命令去掉
3. 運行 docker-compose up -d
打包並啓動鏡像或 docker-compose build
打包鏡像,上傳阿里雲或其餘私有鏡像中心便可 4. 編寫腳本幫助咱們一鍵處理n個鏡像的打包上傳操做
目前使用jenkins,社區內教程很是之多,docker的教程也很多,後續研究完補上。