前端項目開發完成,須要部署在第三方服務器。因爲第三方服務器是脫離公網的環境,全部的前端服務和全部的依賴都須要在離線環境中部署。記錄下解決方案,但願能夠幫助到有相似需求的旁友。會涉及到基礎的Linux知識,對Linux不熟悉的童鞋能夠先看看資料入門。javascript
output.tar.gz
。output
bin // pm2 控制腳本
config // 配置文件
dist // webpack 產出
node_modules // 項目全部依賴,固然這裏面的內容能夠只保留服務器須要的依賴,根據需求定
server // 代理服務器,我想你的項目應該會用到
thirdparty // 運行環境目錄,這裏是node-v8.x
install.sh // 自動安裝node環境腳本
複製代碼
這裏關於前端的webpack構建就不贅述了,直接看關鍵點:html
準備node離線包。直接在Node官網下載圖示版本(這裏要根據須要下載Node的具體版本,個人項目用的是Node-LTS
),這裏下載的是linux通用的可執行文件,直接解壓就可執行,方便後續腳本化操做。 前端
output/install.sh
,讓它來完成這些事情。因爲下載的是可執行文件,解壓後就至關於直接把node安裝到了 output/thirdparty
目錄下,須要作的就是把node暴露給操做系統,讓它擁有node運行環境。經常使用的有兩種方法:
/etc/profile
後,使用 soure
調用了它,可是沒有生效,因此採用了軟連接的方法將node暴露在系統中。CentOS7
中運行測試,開發時須要安裝虛擬機模擬真實Linux環境,若是是mac,可能不能正常執行。具體安裝步驟,可自行百度。#!/bin/bash
# install nodejs
base_dir=$(dirname $(readlink -f $0))
node_dir="node-v8.12.0-linux-x64"
# 第一步:將node解壓到thirdparty,也就是當前文件夾
if [ ! -d ${base_dir}/thirdparty/${node_dir} ]; then
echo -e "\033[33m 正在解壓Node \033[0m"
tar -xvf ${base_dir}/thirdparty/node-env.tar.xz -C ${base_dir}/thirdparty
echo -e "\033[32m Node 解壓完成 \033[0m"
else
echo -e "\033[32m Node 已解壓完成 \033[0m"
fi
# 賦予執行權限
chmod u+x ${base_dir}/thirdparty/${node_dir}/bin/*
#######問題########
# 添加環境變量
# export PATH=$PATH:${base_dir}/thirdparty/${node_dir}/bin
# if [[ ! $PATH =~ "${base_dir}/thirdparty/${node_dir}/bin" ]]
# then
# echo "export PATH=$PATH:${base_dir}/thirdparty/${node_dir}/bin" >> /etc/profile
# echo "Node 環境變量已添加"
# fi
# echo $PATH
# source /etc/profile
# echo $PATH
#######問題########
# 軟連接
ln -sf ${base_dir}/thirdparty/${node_dir}/bin/node /usr/bin/node
if [ -f /usr/bin/node ]; then
echo -e "\033[32m Node 軟連接已添加 \033[0m"
else
echo -e "\033[31m Error: Node 軟連接添加失敗,確認是否以ROOT身份運行 \033[0m"
exit
fi
# 聯動pm2控制
if [ -f ./bin/control ]; then
echo -e "\033[33m 啓動Server... \033[0m"
./bin/control start
echo -e "\033[32m Server啓動成功,可以使用./bin/control維護當前服務 \033[0m"
./bin/control help
fi
複製代碼
在前端構建完成後把node壓縮包拷貝至output中。貼上個人構建腳本build.sh
(項目根目錄中),讓腳本去執行npm install balabala... 能夠參考下:java
#!/bin/sh
echo $(date +"%Y-%m-%d %H:%M:%S") 'build begin'
rm -rf node_modules
echo $(date +"%Y-%m-%d %H:%M:%S") 'rm -rf node_modules end'
npm install
echo $(date +"%Y-%m-%d %H:%M:%S") 'install end'
mkdir output
echo $(date +"%Y-%m-%d %H:%M:%S") 'mkdir output end'
npm run build
echo $(date +"%Y-%m-%d %H:%M:%S") 'npm build end'
# 將全部須要的文件統統塞到output下
cp -r build config node_modules server dist yunyi/bin thirdparty install output
echo $(date +"%Y-%m-%d %H:%M:%S") 'move files end'
# 給腳本添加運行權限
chmod +x output/bin/control
chmod +x output/install
echo $(date +"%Y-%m-%d %H:%M:%S") 'build end'
# GZ壓縮output
tar -czvf output.tar.gz output
複製代碼
若是順利的話,執行完以上腳本,你會在項目根目錄中發現一個output.tar.gz
的文件。至此,前端的離線部署包就完成了。node
CentOS7
, 有了虛擬環境,再把離線包複製到虛擬環境中,tar
解壓之...install
。install
腳本安裝node,這裏注意要以root權限運行,否則會報錯。若是終端中顯示 Node 軟連接已添加
就說明node已經安裝完成了。bin/control
。install
腳本執行完畢後會調用這個文件的start
方法,這裏根據需求自行修改吧,運行如圖:
#!/bin/sh
cd "$(dirname $0)"/.. || exit 1
PROC_NAME='proxy-server'
help(){
echo "${0} <start|stop|restart|status|monit|list|delete>"
exit 1
}
status(){
status=$(node_modules/pm2/bin/pm2 show $PROC_NAME | grep status | awk '{print $4}')
echo $status
if [ X"$status" == X"online" ]; then
return 0
else
return 1
fi
}
start(){
node_modules/pm2/bin/pm2 set pm2-logrotate:max_size 100M
node_modules/pm2/bin/pm2 set pm2-logrotate:retain 15
node_modules/pm2/bin/pm2 start ./server/app.js --name $PROC_NAME -l "../log/nf1-server"
}
list(){
node_modules/pm2/bin/pm2 list $PROC_NAME
}
restart(){
node_modules/pm2/bin/pm2 restart $PROC_NAME
}
monit(){
node_modules/pm2/bin/pm2 monit $PROC_NAME
}
stop(){
node_modules/pm2/bin/pm2 stop $PROC_NAME
}
delete(){
node_modules/pm2/bin/pm2 delete $PROC_NAME
}
case "${1}" in
monit)
monit
;;
list)
list
;;
start)
start
;;
stop)
stop
;;
delete)
delete
;;
status|health|checkhealth|st)
status
;;
restart)
restart
;;
*)
help
;;
esac
複製代碼
Shell腳本入門linux
Linux環境變量webpack
Node服務一鍵離線部署web