GitBucket
4.6.0
Toggle navigation
Sign in
Files
Branches
1
Tags
Issues
Pull Requests
Labels
Milestones
Wiki
08335
/
hivui-platform-template
hivui平台项目模板
Browse code
Merge branch 'master' of http://192.168.4.105:8080/gitbucket/git/08335/hivui-platform-template
master
commit
6b3710474f58474e8dc2b49ab926c4fcb80ae0cc
2 parents
be53f40
+
bca9d52
hhb
authored
on 21 Feb 2022
Showing
4 changed files
build/bin/oper.sh
build/webpack.base.conf.js
build/webpack.get-list.js
build/webpack.prod.conf.js
Ignore Space
Show notes
View
build/bin/oper.sh
#!/bin/bash ## 权限问题,用 chmod u+x *.sh ## eg: oper.sh # 用户名 # 项目名 # 操作 (create , restart , start , kill , stop , del , build , sync) # 部署路径 (upload) # 同步内容 (node_modules , build , cli) cmdDir=$( cd $(dirname "$0") pwd ) username=$1 #用户名 projectName=$2 #项目名 cmd=$3 #命令 port=$4 #端口 # *.pre2.hieap.cn==>http://192.168.4.192:8001 # *.pre.hieap.cn==>http://192.168.10.242:31167 ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` tagIp="192.168.4.193" if [[ $ip == *$tagIp* ]]; then DEV_BASE_API='http://192.168.4.106:7777/' #传给配置 .env.development 的 VITE_APP_BASE_API 做后端请求数据 else DEV_BASE_API='http://e52.hieap.cn/' #传给配置 .env.development 的 VITE_APP_BASE_API 做后端请求数据 fi tagIp192="192.168.4.192" nginxStr='' # map $http_upgrade $connection_upgrade { # default upgrade; # '' close; # } # server { # listen 8001; # location / { # proxy_pass http://192.168.4.192:36962; # proxy_http_version 1.1; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; # proxy_set_header X-real-ip $remote_addr; # proxy_set_header X-Forwarded-For $remote_addr; # proxy_set_header Origin ""; # } # } function getNginx(){ nginxStr='' location=' location / {\n\t\t' location=$location' proxy_pass http://127.0.0.1:'${1}';\n\t' location=$location' proxy_http_version 1.1;\n\t' location=$location' proxy_set_header Upgrade $http_upgrade;\n\t' location=$location' proxy_set_header Connection "upgrade";\n\t' location=$location' proxy_set_header X-real-ip $remote_addr;\n\t' location=$location' proxy_set_header X-Forwarded-For $remote_addr;\n\t' location=$location' proxy_set_header Origin "";\n\t' location=$location' index index.html index.htm;\n\t\t' location=$location' }\n' if [[ $ip == *$tagIp192* ]]; then # *.pre2.hieap.cn==>http://192.168.4.192:8001 nginxStr='\n\t\#start '${projectName}${username}'\n\t' nginxStr=$nginxStr'server {\n\t' nginxStr=$nginxStr' listen 8001;\n\t' nginxStr=$nginxStr' server_name '${projectName}'.'${username}'.pre2.hieap.cn;\n\t' nginxStr=${nginxStr}${location} nginxStr=$nginxStr' }\n\t' nginxStr=$nginxStr'\#end '${projectName}${username}'\n\n\n' elif [[ $ip == *$tagIp* ]]; then nginxStr='' else # *.pre.hieap.cn==>http://192.168.10.242:32467 nginxStr=$nginxStr'\n\t\#start '${projectName}${username}'\n\t' nginxStr=$nginxStr'server {\n\t' nginxStr=$nginxStr' listen 8001;\n\t' nginxStr=$nginxStr' server_name '${projectName}'.'${username}'.pre.hieap.cn;\n\t' nginxStr=${nginxStr}${location} nginxStr=$nginxStr' }\n\t' nginxStr=$nginxStr'\#end '${projectName}${username}'\n\n\n' fi } #BASH_SOURCE[0]用户所在的目录到脚本的路径 ## 获取eap5.0 路径 # eap5Dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" eap5Dir="${cmdDir%/hiruntime*}" projectPath=${eap5Dir}/desktop/preview tmpPath=${eap5Dir}/hiruntime/project/desktop/project-template source[0]='\t<% if(htmlWebpackPlugin.vite){%>\n\t<!--预览时 公共库-->' source[1]='\n\t<script src="\/'${projectName}'\/setting\/desktop\/development.js" type="text\/javascript"><\/script>' source[2]='\n\t<%}%>' source[3]='\n\t<% if(!htmlWebpackPlugin.vite){%>\n\t<!--发布时 公共库-->' source[4]='\n\t<script src="\/${serverName}\/render\/'${username}'\/'${projectName}'\/setting\/desktop\/appsetting.js" type="text\/javascript"><\/script>' source[5]='\n\t<%}%>\n' viteStr[0]='let socketHost = `${__HMR_HOSTNAME__ || location.hostname}:${__HMR_PORT__}`;' viteStr[1]='let socketHostSplit = socketHost.split(".");' viteStr[2]='if(isNaN(parseInt(socketHostSplit[0]))){socketHost = socketHost.substring(0,socketHost.indexOf(":"));}' nrm del zhc nrm add zhc http://npm.hieap.cn/ nrm use zhc case $cmd in "create") #创建 echo '正在创建桌面端应用...'$(date +%F%n%T) #参数个数判断,至少4个 if [ $# -lt 4 ];then echo "创建项目命令参数不对:$*" echo "创建项目命令正确参数:用户名 项目名 create 桌面预览端口" exit 1 fi # source ${cmdDir}/var_env.sh # echo ${DEV_BASE_API} echo eap5Dir: ${eap5Dir} echo projectPath: ${projectPath} if [ ! -d "${projectPath}/${username}" ];then mkdir "${projectPath}/${username}" #创用户工作空间 fi if [ -d "${projectPath}/${username}/${projectName}" ];then echo "项目名已经存在!" exit 1 fi echo "<1>git正在拉取web端项目基础文件" git clone http://192.168.4.105:8080/gitbucket/git/08335/hivui-platform-template.git "${projectPath}/${username}/${projectName}/deploy" echo "<2>初始化node环境..." # rsync -auz ${tmpPath}/node_modules ${projectPath}/${username}/${projectName}/deploy/node_modules # cp这个命令在复制零碎文件的时候是很慢的 rsync -auz ${tmpPath}/node_modules ${projectPath}/${username}/${projectName}/deploy/node_modules cd ${projectPath}/${username}/${projectName}/deploy/ rm -rf ./build/bin rm -rf ./build/doc.txt echo "<3>初始化相关配置..." ## 修改模板,重命项目名 mv project ${projectName} sed -i 's#\(VITE_APP_USERPATH \?= \?\).*#\1'"/e5/render/${username}"'#g' .env.production sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_BASE_API \?= \?\).*#\1'"${DEV_BASE_API}"'#g' .env.development ## 替换 package.json 的 name 值 author值 ,打包时候输出静态地址是这个 sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json sed -i 's#\("author": \?"\).*#\1'"${username}"'",#g' package.json ## 替换 processes.json 的 args 值 sed -i '4s#\("name": \?"\).*#\1'"vite-${username}-${projectName}"'",#g' processes.json sed -i '7s#\("args": \?"\).*#\1'"--host --port ${port}"'",#g' processes.json cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiLogin sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiMain sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiBirt sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/setting/desktop/appsetting/js/1.0.0 sed -i 's#\(projectName \?= \?\).*#\1"'"${projectName}"'";#g' appsetting.js echo "<4>配置Nginx环境" getNginx $port # /usr/local/nginx/conf/nginx.conf cd /usr/local/nginx/conf #删除原来有的配置 sed -i '/\#start '${projectName}${username}'/,/\#end '${projectName}${username}'/d' nginx.conf sed -i "s#http.*{#http {${nginxStr}#g" nginx.conf cd /usr/local/nginx/sbin # 清缓存 rm -rf /usr/local/nginx/proxy_temp ./nginx -s reload echo "<5>配置node_modules/vite环境" # node_modules/vite 环境 cd ${projectPath}/${username}/${projectName}/deploy/node_modules/vite/dist/client sed -i "s#const.*socketHost.*=.*#${viteStr[*]}#g" client.js sed -i "s#case 'update':.*#case 'update':return;#g" client.js sed -i "s#case.*'full-reload':.*#case 'full-reload':return;#g" client.js echo "<6>正在启动服务..." cd ${projectPath}/${username}/${projectName}/deploy/ npm run pm2:start pm2 save echo "桌面端创建完毕!"$(date +%F%n%T) exit 1 ;; "delete") #删除 #参数个数判断,至少3个 if [ $# -lt 3 ];then echo "删除项目命令参数不对:$*" echo "删除项目命令正确参数:用户名 项目名 delete" exit 1 fi if [ $username = "admin" -a $projectName = "systpl" ] ; then echo "系统模板,不可删除!" exit 1 fi curPid=`pm2 pid vite-${username}-${projectName}` if [ ! -z "$curPid" ];then echo "vite-${username}-${projectName} 正在关闭服务..." pm2 delete "vite-${username}-${projectName}" fi ### 删除用户项目 rm -rf ${projectPath}/${username}/${projectName} echo "用户:${username} 项目:${projectName} 删除成功!" pm2 save exit 1 ;; "restart") #重启 echo "》》》正在重启服务..." curPid=`pm2 pid vite-${username}-${projectName}` if [ ! -z "$curPid" ];then echo "vite-${username}-${projectName} 正在关闭服务..." pm2 delete "vite-${username}-${projectName}" fi cd ${projectPath}/${username}/${projectName}/deploy/ npm run rm:vite npm run pm2:start pm2 save echo "已经重启服务!!" exit 1 ;; "build") #编译 uploadPath=$4 modules=$5 #参数个数判断,至少3个 # if [ $# -lt 4 ];then # echo "编译项目命令参数不对:$*" # echo "编译项目命令正确参数:用户名 项目名 build 上传服务器路径 [指定编译模块]" # exit 1 # fi ### 用pm2管理,用pm2 重启指定的 rm -rf "${projectPath}/${username}/${projectName}/deploy/dist" cd "${projectPath}/${username}/${projectName}/deploy" if [ ! $modules ]; then echo "正在执行编译所有模块..."$(date +%F%n%T) npm run build ### 编译所有的时候要考相关配置 cd "${projectPath}/${username}/${projectName}/deploy/" if [[ ! -d "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/desklib" ]]; then mkdir -p "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/desklib" fi rsync -auz "${projectPath}/${username}/${projectName}/deploy/${projectName}/funclib/desklib" "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/" else echo "正在执行编译【指定模块】..."$(date +%F%n%T) npm run build:modules $modules fi ## 删除之前打包文件 rm -rf "${username}_${projectName}.zip" cd "${projectPath}/${username}/${projectName}/deploy/dist" mkdir -p "${projectPath}/${username}/${projectName}/deploy/dist/${username}/${projectName}" rsync -auz "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}" "${projectPath}/${username}/${projectName}/deploy/dist/${username}/" rm -rf "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}" zip -q -r "${username}_${projectName}.zip" ./* rsync -auz "${projectPath}/${username}/${projectName}/deploy/dist/${username}_${projectName}.zip" "${projectPath}/${username}/${projectName}/deploy/" rm -rf "${projectPath}/${username}/${projectName}/deploy/dist/${username}_${projectName}.zip" cd ${projectPath}/${username}/${projectName}/deploy/ if [ -z "$uploadPath" ]; then echo '未传服务器路径,请自行拷贝!' exit 1; fi if [[ ! -d "$uploadPath" ]]; then echo "编译命令: 上传文件夹不存在, 正在帮您创建目录..." mkdir -p "${uploadPath}" fi echo "正在拷到服务器目录:${uploadPath}" cp -fv "${username}_${projectName}.zip" "${uploadPath}" echo "(‐^▽^‐) 编译打包成功!"$(date +%F%n%T) ;; "sync") #同步环境 #参数个数判断,至少4个 if [ $# -lt 4 ];then echo "同步项目命令参数不对:$*" echo "同步项目命令正确参数:用户名 项目名 sync 同步方式" exit 1 fi way=$4 if [ $way = 'sysfunc' ];then #同步系统功能 echo "》》》同步系统功能..."$(date +%F%n%T) git clone http://192.168.4.105:8080/gitbucket/git/js-team2/zhc-birt-platf.git ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf rm -rf ${eap5Dir}/hiruntime/project/desktop/zhc-birt-platf rsync -auz ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf/project/* ${eap5Dir}/hiruntime/workspace/${username}/${projectName}/ rm -rf ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf echo "》》》系统功能已同步!"$(date +%F%n%T) exit fi if [ $way = 'nginx' ];then #nginx环境 #获取端口 portStr=$(cat ${projectPath}/${username}/${projectName}/deploy/processes.json | sed 's/,/\n/g' | grep "args" | sed 's/:/\n/g' | sed '1d' | sed 's/"//g') portNum=`echo $portStr | tr -cd "[0-9]"` # echo $portNum if [ $portNum = '' ];then echo '取不到端口信息!' exit 1; fi cd /usr/local/nginx/conf #删除原来有的配置 sed -i '/\#start '${projectName}${username}'/,/\#end '${projectName}${username}'/d' nginx.conf #设置相关配置 返回到nginxStr getNginx $portNum #写入配置文件 sed -i "s#http.*{#http {${nginxStr}#g" nginx.conf cd /usr/local/nginx/sbin # 清缓存 rm -rf /usr/local/nginx/proxy_temp ./nginx -s reload echo "》》》nginx环境已同步!" exit 1; fi # 以下注释不能用,多人点击同步文件会缺失 # rm -rf ${eap5Dir}/hiruntime/project/desktop/project-template # rsync -auz ${eap5Dir}/hiruntime/project/desktop/__gittmp ${eap5Dir}/hiruntime/project/desktop/project-template # rm -rf ${eap5Dir}/hiruntime/project/desktop/__gittmp case $way in "build") #同步打包环境 echo "》》》正在同步打包环境..."$(date +%F%n%T) rsync -auz ${tmpPath}/build ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/babel.config.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.postcssrc.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.browserslistrc ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/vite-plugin ${projectPath}/${username}/${projectName}/deploy/ echo "》》》打包环境已同步!"$(date +%F%n%T) exit 1 ;; "hiui") #同步hiui资源库 echo "》》》正在同步hi-ui库..."$(date +%F%n%T) cd "${tmpPath}/" npm i hi-ui -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui rsync -auz ${tmpPath}/node_modules/hi-ui ${projectPath}/${username}/${projectName}/deploy/node_modules/ ## 取hi-ui版本 并更新root package.json ## cd ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui/ ## sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json echo "hiui已同步!"$(date +%F%n%T) ;; "taskcenter") #同步环境 echo "》》》正在同步任务中心..."$(date +%F%n%T) cd "${tmpPath}/" npm i hi-taskcenter -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-taskcenter rsync -auz ${tmpPath}/node_modules/hi-taskcenter ${projectPath}/${username}/${projectName}/deploy/node_modules/ ## 取hi-taskcenter版本 并更新root package.json ## cd ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-taskcenter/ ## sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json echo "任务中心已同步!"$(date +%F%n%T) ;; "cli") #程序环境 echo "开始同步..."$(date +%F%n%T) if [[ ! -d "${eap5Dir}/hiruntime/project/desktop/__gittmp" ]]; then #可以更新 git clone http://192.168.4.105:8080/gitbucket/git/08335/hivui-platform-template.git ${eap5Dir}/hiruntime/project/desktop/__gittmp rsync -auz ${eap5Dir}/hiruntime/project/desktop/__gittmp/ ${tmpPath} else echo "已经相关人员同步中,请稍候..."; exit 1; fi rsync -auz ${tmpPath}/assets_platform ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/index.html ${projectPath}/${username}/${projectName}/deploy rsync -auz ${tmpPath}/template.html ${projectPath}/${username}/${projectName}/deploy/ echo "》》》静态共用库已同步!" rsync -auz ${tmpPath}/project/hivuiLogin ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiLogin sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》登录模板已同步!" rsync -auz ${tmpPath}/project/hivuiMain ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiMain sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》主页模板已同步!" rsync -auz ${tmpPath}/project/hivuiBirt ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiBirt sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》报表模板同步!" cd "${tmpPath}/" npm i rsync -auz ${tmpPath}/node_modules ${projectPath}/${username}/${projectName}/deploy/ echo "》》》node环境已同步!" cd "${tmpPath}/" npm i hi-ui -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui rsync -auz ${tmpPath}/node_modules/hi-ui ${projectPath}/${username}/${projectName}/deploy/node_modules/ echo "》》》hi-ui库已同步!" rsync -auz ${tmpPath}/build ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/babel.config.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.postcssrc.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.browserslistrc ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/vite-plugin ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.env.development ${projectPath}/${username}/${projectName}/deploy/.env.development rsync -auz ${tmpPath}/.env.production ${projectPath}/${username}/${projectName}/deploy/.env.production rsync -auz ${tmpPath}/.env.staging ${projectPath}/${username}/${projectName}/deploy/.env.staging rsync -auz ${tmpPath}/vite.config.js ${projectPath}/${username}/${projectName}/deploy/vite.config.js echo "》》》已同步程序环境(build、babel.config.js、.postcssrc.js、.browserslistrc、vite-plugin、.env.development、.env.production、.env.staging、vite.config.js)..." # source ${cmdDir}/var_env.sh ### 设置环境变量 cd ${projectPath}/${username}/${projectName}/deploy/ sed -i 's#\(VITE_APP_USERPATH \?= \?\).*#\1'"/e5/render/${username}"'#g' .env.production sed -i 's#\(VITE_APP_BASE_API \?= \?\).*#\1'"${DEV_BASE_API}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.staging ### node_modules/vite 环境 cd ${projectPath}/${username}/${projectName}/deploy/node_modules/vite/dist/client # sed 's/要替换的内容/新的内容/' # 将所有的数字替换成内容 # sed 's/[0-9]/好的/g' testFile2.txt sed -i "s#const.*socketHost.*=.*#${viteStr[*]}#g" client.js sed -i "s#case 'update':.*#case 'update':return;#g" client.js sed -i "s#case.*'full-reload':.*#case 'full-reload':return;#g" client.js echo "》》》程序环境已同步!"$(date +%F%n%T) # 删除临时文件标识,以准备下次更新判断 rm -rf ${eap5Dir}/hiruntime/project/desktop/__gittmp ;; esac rsync -auz ${tmpPath}/package.json ${projectPath}/${username}/${projectName}/deploy/package.json cd ${projectPath}/${username}/${projectName}/deploy/ ## 替换 package.json 的 name 值 sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json sed -i 's#\("author": \?"\).*#\1'"${username}"'",#g' package.json echo "》》》正在重启服务..."$(date +%F%n%T) pm2 stop "vite-${username}-${projectName}" pm2 delete "vite-${username}-${projectName}" npm run rm:vite npm run pm2:start pm2 save echo "》》》已经重启服务!!"$(date +%F%n%T) ;; esac
#!/bin/bash ## 权限问题,用 chmod u+x *.sh ## eg: oper.sh # 用户名 # 项目名 # 操作 (create , restart , start , kill , stop , del , build , sync) # 部署路径 (upload) # 同步内容 (node_modules , build , cli) cmdDir=$( cd $(dirname "$0") pwd ) username=$1 #用户名 projectName=$2 #项目名 cmd=$3 #命令 port=$4 #端口 # *.pre2.hieap.cn==>http://192.168.4.192:8001 # *.pre.hieap.cn==>http://192.168.10.242:31167 ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"` tagIp="192.168.4.193" if [[ $ip == *$tagIp* ]]; then DEV_BASE_API='http://192.168.4.106:7777/' #传给配置 .env.development 的 VITE_APP_BASE_API 做后端请求数据 else DEV_BASE_API='http://e52.hieap.cn/' #传给配置 .env.development 的 VITE_APP_BASE_API 做后端请求数据 fi tagIp192="192.168.4.192" nginxStr='' # map $http_upgrade $connection_upgrade { # default upgrade; # '' close; # } # server { # listen 8001; # location / { # proxy_pass http://192.168.4.192:36962; # proxy_http_version 1.1; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; # proxy_set_header X-real-ip $remote_addr; # proxy_set_header X-Forwarded-For $remote_addr; # proxy_set_header Origin ""; # } # } function getNginx(){ nginxStr='' location=' location / {\n\t\t' location=$location' proxy_pass http://127.0.0.1:'${1}';\n\t' location=$location' proxy_http_version 1.1;\n\t' location=$location' proxy_set_header Upgrade $http_upgrade;\n\t' location=$location' proxy_set_header Connection "upgrade";\n\t' location=$location' proxy_set_header X-real-ip $remote_addr;\n\t' location=$location' proxy_set_header X-Forwarded-For $remote_addr;\n\t' location=$location' proxy_set_header Origin "";\n\t' location=$location' index index.html index.htm;\n\t\t' location=$location' }\n' if [[ $ip == *$tagIp192* ]]; then # *.pre2.hieap.cn==>http://192.168.4.192:8001 nginxStr='\n\t\#start '${projectName}${username}'\n\t' nginxStr=$nginxStr'server {\n\t' nginxStr=$nginxStr' listen 8001;\n\t' nginxStr=$nginxStr' server_name '${projectName}'.'${username}'.pre2.hieap.cn;\n\t' nginxStr=${nginxStr}${location} nginxStr=$nginxStr' }\n\t' nginxStr=$nginxStr'\#end '${projectName}${username}'\n\n\n' elif [[ $ip == *$tagIp* ]]; then nginxStr='' else # *.pre.hieap.cn==>http://192.168.10.242:32467 nginxStr=$nginxStr'\n\t\#start '${projectName}${username}'\n\t' nginxStr=$nginxStr'server {\n\t' nginxStr=$nginxStr' listen 8001;\n\t' nginxStr=$nginxStr' server_name '${projectName}'.'${username}'.pre.hieap.cn;\n\t' nginxStr=${nginxStr}${location} nginxStr=$nginxStr' }\n\t' nginxStr=$nginxStr'\#end '${projectName}${username}'\n\n\n' fi } #BASH_SOURCE[0]用户所在的目录到脚本的路径 ## 获取eap5.0 路径 # eap5Dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" eap5Dir="${cmdDir%/hiruntime*}" projectPath=${eap5Dir}/desktop/preview tmpPath=${eap5Dir}/hiruntime/project/desktop/project-template source[0]='\t<% if(htmlWebpackPlugin.vite){%>\n\t<!--预览时 公共库-->' source[1]='\n\t<script src="\/'${projectName}'\/setting\/desktop\/development.js" type="text\/javascript"><\/script>' source[2]='\n\t<%}%>' source[3]='\n\t<% if(!htmlWebpackPlugin.vite){%>\n\t<!--发布时 公共库-->' source[4]='\n\t<script src="\/${serverName}\/render\/'${username}'\/'${projectName}'\/setting\/desktop\/appsetting.js" type="text\/javascript"><\/script>' source[5]='\n\t<%}%>\n' viteStr[0]='let socketHost = `${__HMR_HOSTNAME__ || location.hostname}:${__HMR_PORT__}`;' viteStr[1]='let socketHostSplit = socketHost.split(".");' viteStr[2]='if(isNaN(parseInt(socketHostSplit[0]))){socketHost = socketHost.substring(0,socketHost.indexOf(":"));}' nrm del zhc nrm add zhc http://npm.hieap.cn/ nrm use zhc case $cmd in "create") #创建 echo '正在创建桌面端应用...'$(date +%F%n%T) #参数个数判断,至少4个 if [ $# -lt 4 ];then echo "创建项目命令参数不对:$*" echo "创建项目命令正确参数:用户名 项目名 create 桌面预览端口" exit 1 fi # source ${cmdDir}/var_env.sh # echo ${DEV_BASE_API} echo eap5Dir: ${eap5Dir} echo projectPath: ${projectPath} if [ ! -d "${projectPath}/${username}" ];then mkdir "${projectPath}/${username}" #创用户工作空间 fi if [ -d "${projectPath}/${username}/${projectName}" ];then echo "项目名已经存在!" exit 1 fi echo "<1>git正在拉取web端项目基础文件" git clone http://192.168.4.105:8080/gitbucket/git/08335/hivui-platform-template.git "${projectPath}/${username}/${projectName}/deploy" echo "<2>初始化node环境..." cp -rf ${tmpPath}/node_modules ${projectPath}/${username}/${projectName}/deploy/node_modules cd ${projectPath}/${username}/${projectName}/deploy/ rm -rf ./build/bin rm -rf ./build/doc.txt echo "<3>初始化相关配置..." ## 修改模板,重命项目名 mv project ${projectName} sed -i 's#\(VITE_APP_USERPATH \?= \?\).*#\1'"/e5/render/${username}"'#g' .env.production sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_BASE_API \?= \?\).*#\1'"${DEV_BASE_API}"'#g' .env.development ## 替换 package.json 的 name 值 author值 ,打包时候输出静态地址是这个 sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json sed -i 's#\("author": \?"\).*#\1'"${username}"'",#g' package.json ## 替换 processes.json 的 args 值 sed -i '4s#\("name": \?"\).*#\1'"vite-${username}-${projectName}"'",#g' processes.json sed -i '7s#\("args": \?"\).*#\1'"--host --port ${port}"'",#g' processes.json cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiLogin sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiMain sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiBirt sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/setting/desktop/appsetting/js/1.0.0 sed -i 's#\(projectName \?= \?\).*#\1"'"${projectName}"'";#g' appsetting.js echo "<4>配置Nginx环境" getNginx $port # /usr/local/nginx/conf/nginx.conf cd /usr/local/nginx/conf #删除原来有的配置 sed -i '/\#start '${projectName}${username}'/,/\#end '${projectName}${username}'/d' nginx.conf sed -i "s#http.*{#http {${nginxStr}#g" nginx.conf cd /usr/local/nginx/sbin # 清缓存 rm -rf /usr/local/nginx/proxy_temp ./nginx -s reload echo "<5>配置node_modules/vite环境" # node_modules/vite 环境 cd ${projectPath}/${username}/${projectName}/deploy/node_modules/vite/dist/client sed -i "s#const.*socketHost.*=.*#${viteStr[*]}#g" client.js sed -i "s#case 'update':.*#case 'update':return;#g" client.js sed -i "s#case.*'full-reload':.*#case 'full-reload':return;#g" client.js echo "<6>正在启动服务..." cd ${projectPath}/${username}/${projectName}/deploy/ npm run pm2:start pm2 save echo "桌面端创建完毕!"$(date +%F%n%T) exit 1 ;; "delete") #删除 #参数个数判断,至少3个 if [ $# -lt 3 ];then echo "删除项目命令参数不对:$*" echo "删除项目命令正确参数:用户名 项目名 delete" exit 1 fi if [ $username = "admin" -a $projectName = "systpl" ] ; then echo "系统模板,不可删除!" exit 1 fi curPid=`pm2 pid vite-${username}-${projectName}` if [ ! -z "$curPid" ];then echo "vite-${username}-${projectName} 正在关闭服务..." pm2 delete "vite-${username}-${projectName}" fi ### 删除用户项目 rm -rf ${projectPath}/${username}/${projectName} echo "用户:${username} 项目:${projectName} 删除成功!" pm2 save exit 1 ;; "restart") #重启 echo "》》》正在重启服务..." curPid=`pm2 pid vite-${username}-${projectName}` if [ ! -z "$curPid" ];then echo "vite-${username}-${projectName} 正在关闭服务..." pm2 delete "vite-${username}-${projectName}" fi cd ${projectPath}/${username}/${projectName}/deploy/ npm run rm:vite npm run pm2:start pm2 save echo "已经重启服务!!" exit 1 ;; "build") #编译 uploadPath=$4 modules=$5 #参数个数判断,至少3个 # if [ $# -lt 4 ];then # echo "编译项目命令参数不对:$*" # echo "编译项目命令正确参数:用户名 项目名 build 上传服务器路径 [指定编译模块]" # exit 1 # fi ### 用pm2管理,用pm2 重启指定的 rm -rf "${projectPath}/${username}/${projectName}/deploy/dist" cd "${projectPath}/${username}/${projectName}/deploy" if [ ! $modules ]; then echo "正在执行编译所有模块..."$(date +%F%n%T) npm run build ### 编译所有的时候要考相关配置 cd "${projectPath}/${username}/${projectName}/deploy/" if [[ ! -d "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/desklib" ]]; then mkdir -p "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/desklib" fi cp -rf "${projectPath}/${username}/${projectName}/deploy/${projectName}/funclib/desklib" "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}/funclib/" else echo "正在执行编译【指定模块】..."$(date +%F%n%T) npm run build:modules $modules fi ## 删除之前打包文件 rm -rf "${username}_${projectName}.zip" cd "${projectPath}/${username}/${projectName}/deploy/dist" mkdir -p "${projectPath}/${username}/${projectName}/deploy/dist/${username}/${projectName}" cp -rf "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}" "${projectPath}/${username}/${projectName}/deploy/dist/${username}/" rm -rf "${projectPath}/${username}/${projectName}/deploy/dist/${projectName}" zip -q -r "${username}_${projectName}.zip" ./* cp -rf "${projectPath}/${username}/${projectName}/deploy/dist/${username}_${projectName}.zip" "${projectPath}/${username}/${projectName}/deploy/" rm -rf "${projectPath}/${username}/${projectName}/deploy/dist/${username}_${projectName}.zip" cd ${projectPath}/${username}/${projectName}/deploy/ if [ -z "$uploadPath" ]; then echo '未传服务器路径,请自行拷贝!' exit 1; fi if [[ ! -d "$uploadPath" ]]; then echo "编译命令: 上传文件夹不存在, 正在帮您创建目录..." mkdir -p "${uploadPath}" fi echo "正在拷到服务器目录:${uploadPath}" cp -fv "${username}_${projectName}.zip" "${uploadPath}" echo "(‐^▽^‐) 编译打包成功!"$(date +%F%n%T) ;; "sync") #同步环境 #参数个数判断,至少4个 if [ $# -lt 4 ];then echo "同步项目命令参数不对:$*" echo "同步项目命令正确参数:用户名 项目名 sync 同步方式" exit 1 fi way=$4 if [ $way = 'sysfunc' ];then #同步系统功能 echo "》》》同步系统功能..."$(date +%F%n%T) git clone http://192.168.4.105:8080/gitbucket/git/js-team2/zhc-birt-platf.git ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf rm -rf ${eap5Dir}/hiruntime/project/desktop/zhc-birt-platf cp -rf ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf/project/* ${eap5Dir}/hiruntime/workspace/${username}/${projectName}/ rm -rf ${eap5Dir}/hiruntime/project/desktop/__zhc-birt-platf echo "》》》系统功能已同步!"$(date +%F%n%T) exit fi if [ $way = 'nginx' ];then #nginx环境 #获取端口 portStr=$(cat ${projectPath}/${username}/${projectName}/deploy/processes.json | sed 's/,/\n/g' | grep "args" | sed 's/:/\n/g' | sed '1d' | sed 's/"//g') portNum=`echo $portStr | tr -cd "[0-9]"` # echo $portNum if [ $portNum = '' ];then echo '取不到端口信息!' exit 1; fi cd /usr/local/nginx/conf #删除原来有的配置 sed -i '/\#start '${projectName}${username}'/,/\#end '${projectName}${username}'/d' nginx.conf #设置相关配置 返回到nginxStr getNginx $portNum #写入配置文件 sed -i "s#http.*{#http {${nginxStr}#g" nginx.conf cd /usr/local/nginx/sbin # 清缓存 rm -rf /usr/local/nginx/proxy_temp ./nginx -s reload echo "》》》nginx环境已同步!" exit 1; fi # 以下注释不能用,多人点击同步文件会缺失 # rm -rf ${eap5Dir}/hiruntime/project/desktop/project-template # cp -rf ${eap5Dir}/hiruntime/project/desktop/__gittmp ${eap5Dir}/hiruntime/project/desktop/project-template # rm -rf ${eap5Dir}/hiruntime/project/desktop/__gittmp case $way in "build") #同步打包环境 echo "》》》正在同步打包环境..."$(date +%F%n%T) rsync -auz ${tmpPath}/build ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/babel.config.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.postcssrc.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.browserslistrc ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/vite-plugin ${projectPath}/${username}/${projectName}/deploy/ echo "》》》打包环境已同步!"$(date +%F%n%T) exit 1 ;; "hiui") #同步hiui资源库 echo "》》》正在同步hi-ui库..."$(date +%F%n%T) cd "${tmpPath}/" npm i hi-ui -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui rsync -auz ${tmpPath}/node_modules/hi-ui ${projectPath}/${username}/${projectName}/deploy/node_modules/ ## 取hi-ui版本 并更新root package.json ## cd ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui/ ## sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json echo "hiui已同步!"$(date +%F%n%T) ;; "taskcenter") #同步环境 echo "》》》正在同步任务中心..."$(date +%F%n%T) cd "${tmpPath}/" npm i hi-taskcenter -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-taskcenter rsync -auz ${tmpPath}/node_modules/hi-taskcenter ${projectPath}/${username}/${projectName}/deploy/node_modules/ ## 取hi-taskcenter版本 并更新root package.json ## cd ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-taskcenter/ ## sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json echo "任务中心已同步!"$(date +%F%n%T) ;; "cli") #程序环境 echo "开始同步..."$(date +%F%n%T) if [[ ! -d "${eap5Dir}/hiruntime/project/desktop/__gittmp" ]]; then #可以更新 git clone http://192.168.4.105:8080/gitbucket/git/08335/hivui-platform-template.git ${eap5Dir}/hiruntime/project/desktop/__gittmp rsync -auz ${eap5Dir}/hiruntime/project/desktop/__gittmp/ ${tmpPath} else echo "已经相关人员同步中,请稍候..."; exit 1; fi rsync -auz ${tmpPath}/assets_platform ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/index.html ${projectPath}/${username}/${projectName}/deploy rsync -auz ${tmpPath}/template.html ${projectPath}/${username}/${projectName}/deploy/ echo "》》》静态共用库已同步!" rsync -auz ${tmpPath}/project/hivuiLogin ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiLogin sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》登录模板已同步!" rsync -auz ${tmpPath}/project/hivuiMain ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiMain sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》主页模板已同步!" rsync -auz ${tmpPath}/project/hivuiBirt ${projectPath}/${username}/${projectName}/deploy/${projectName}/ cd ${projectPath}/${username}/${projectName}/deploy/${projectName}/hivuiBirt sed -i 's/<\/head>/'"${source[*]}"'<\/head>/g' index.html echo "》》》报表模板同步!" cd "${tmpPath}/" npm i rsync -auz ${tmpPath}/node_modules ${projectPath}/${username}/${projectName}/deploy/ echo "》》》node环境已同步!" cd "${tmpPath}/" npm i hi-ui -S rm -rf ${projectPath}/${username}/${projectName}/deploy/node_modules/hi-ui rsync -auz ${tmpPath}/node_modules/hi-ui ${projectPath}/${username}/${projectName}/deploy/node_modules/ echo "》》》hi-ui库已同步!" rsync -auz ${tmpPath}/build ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/babel.config.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.postcssrc.js ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.browserslistrc ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/vite-plugin ${projectPath}/${username}/${projectName}/deploy/ rsync -auz ${tmpPath}/.env.development ${projectPath}/${username}/${projectName}/deploy/.env.development rsync -auz ${tmpPath}/.env.production ${projectPath}/${username}/${projectName}/deploy/.env.production rsync -auz ${tmpPath}/.env.staging ${projectPath}/${username}/${projectName}/deploy/.env.staging rsync -auz ${tmpPath}/vite.config.js ${projectPath}/${username}/${projectName}/deploy/vite.config.js echo "》》》已同步程序环境(build、babel.config.js、.postcssrc.js、.browserslistrc、vite-plugin、.env.development、.env.production、.env.staging、vite.config.js)..." # source ${cmdDir}/var_env.sh ### 设置环境变量 cd ${projectPath}/${username}/${projectName}/deploy/ sed -i 's#\(VITE_APP_USERPATH \?= \?\).*#\1'"/e5/render/${username}"'#g' .env.production sed -i 's#\(VITE_APP_BASE_API \?= \?\).*#\1'"${DEV_BASE_API}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.development sed -i 's#\(VITE_APP_PN \?= \?\).*#\1'"${projectName}/${username}"'#g' ${projectPath}/${username}/${projectName}/deploy/.env.staging ### node_modules/vite 环境 cd ${projectPath}/${username}/${projectName}/deploy/node_modules/vite/dist/client # sed 's/要替换的内容/新的内容/' # 将所有的数字替换成内容 # sed 's/[0-9]/好的/g' testFile2.txt sed -i "s#const.*socketHost.*=.*#${viteStr[*]}#g" client.js sed -i "s#case 'update':.*#case 'update':return;#g" client.js sed -i "s#case.*'full-reload':.*#case 'full-reload':return;#g" client.js echo "》》》程序环境已同步!"$(date +%F%n%T) # 删除临时文件标识,以准备下次更新判断 rm -rf ${eap5Dir}/hiruntime/project/desktop/__gittmp ;; esac rsync -auz ${tmpPath}/package.json ${projectPath}/${username}/${projectName}/deploy/package.json cd ${projectPath}/${username}/${projectName}/deploy/ ## 替换 package.json 的 name 值 sed -i 's#\("name": \?"\).*#\1'"${projectName}"'",#g' package.json sed -i 's#\("author": \?"\).*#\1'"${username}"'",#g' package.json echo "》》》正在重启服务..."$(date +%F%n%T) pm2 stop "vite-${username}-${projectName}" pm2 delete "vite-${username}-${projectName}" npm run rm:vite npm run pm2:start pm2 save echo "》》》已经重启服务!!"$(date +%F%n%T) ;; esac
Ignore Space
Show notes
View
build/webpack.base.conf.js
const path = require('path'); var HtmlWebpackPlugin = require('html-webpack-plugin'); const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');//------------ const CleanWebpackPlugin = require('clean-webpack-plugin'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const ProgressBarPlugin = require('progress-bar-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const webpack = require('webpack'); const packageConfig = require('../package.json'); const utils = require('./utils') const vueLoaderConfig = require('./vue-loader.conf') let evnConfig = require('./getEnvVar') // HappyPack // 原理:每次 webapck 解析一个模块时,HappyPack 会将它及它的依赖分配到worker线程中。 // 提示:由于HappyPack 对file-loader、url-loader 支持的不友好,所以不建议对该loader使用。 // 引入 Happpack 可以在 package.json 找到你下载的 const HappyPack = require('happypack'); // 安装 OS 模块 这个主要是拿到当前电脑的CPU核数 const os = require('os'); /* 这个是设置共享线程池中的数量 size 控制设置数量 类型 只能是 整数类型 */ const cpus = os.cpus().length; const happyThreadPool = HappyPack.ThreadPool({ size: Math.floor(cpus/2)||1 });//os.cpus().length 不能开最大 // const happyThreadPool = HappyPack.ThreadPool({ size: 1 });//os.cpus().length 不能开最大 module.exports = { // entry: { // 'login': ['babel-polyfill', './project/hivuiLogin/index.js'], // 'main': ['babel-polyfill','./project/hivuiMain/index.js'] // }, // output: { // filename: '[name].[contenthash].js', // chunkFilename: '[name].[contenthash].js', // path: path.resolve(__dirname, 'dist') // }, resolve: { extensions: ['.js', '.jsx', '.vue', '.json', '.dtvevt', '.dvue'], alias: { 'vue$': 'vue/dist/vue.esm.js', 'vuex$': 'vuex/dist/vuex.esm.js', '@': path.resolve(__dirname, `${packageConfig.name}`), '@main': path.resolve(__dirname, `../${packageConfig.name}/hivuiMain`), // '@': path.resolve(__dirname, 'src'), '@birt':path.resolve(__dirname, `../${packageConfig.name}/hivuiBirt`), 'pinyin': 'js-pinyin', } }, externals: { 'vue': 'Vue', 'vuex': 'Vuex', 'vue-router': 'VueRouter', "element-ui": "ELEMENT", }, module: { rules: [ ...(utils.styleLoaders({ sourceMap: false, extract: process.env.NODE_ENV === 'production', usePostCSS: true })), { test: /\.(js|jsx|dtvevt?|babel|es6)$/, loader: 'happypack/loader?id=happy_js_jsx', // loader: 'babel-loader', // exclude: [path.resolve(__dirname, 'node_modules')]//放开,里头有些也是 可选链操作符 }, { test: /\.(vue|dvue)$/, // loader: 'happypack/loader?id=happy-vue-loader' ???不行,Make sure the rule matching .vue files include vue-loader in its use. loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../img/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/img/" //生成之后存放的路径 } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../img/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/media/" //生成之后存放的路径 } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../fonts/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/fonts/" //生成之后存放的路径 } } ] }, optimization: { minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true }), new OptimizeCSSAssetsPlugin({ cssProcessor: require('cssnano'), cssProcessorPluginOptions: { preset: ['default', { discardComments: { removeAll: true } }], }, canPrint: false }) ], runtimeChunk: { "name": "manifest" }, splitChunks: { cacheGroups: { default: false, vendors: false, vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' } } } }, plugins: [ new VueLoaderPlugin(), new HappyPack({ id: 'happy_js_jsx', //共享进程池 threadPool: happyThreadPool, loaders: ['babel-loader'] }), // new HappyPack({ // id: 'happy-vue-loader', // loaders: [{ // loader: 'vue-loader', // options:vueLoaderConfig // }], // threadPool: happyThreadPool // }), new webpack.HashedModuleIdsPlugin(), new ProgressBarPlugin(), // new CleanWebpackPlugin(['dist']), //注入全局变量的插件,通常使用该插件来判别代码运行的环境变量 new webpack.DefinePlugin({ 'process.env': evnConfig }), new webpack.DllReferencePlugin({ context: path.resolve(__dirname), manifest: require('../assets_platform/vendor_dll/vendor-manifest.json') }), //这个主要是将生成的vendor.dll.js文件加上hash值插入到页面中。[也可以手动写到html这里不做处理] // new AddAssetHtmlPlugin([{ // filepath: path.resolve(__dirname, 'js_dll/comm_vendors.dll.js'), // outputPath: 'js_dll/', // publicPath: 'js_dll/', // includeSourcemap: false, // hash: true, // }]), // new CopyWebpackPlugin([ // { // from: path.resolve(__dirname, 'assets_platform'), // to: path.resolve(__dirname, 'dist/assets_platform') // }, // // { // // from: path.resolve(__dirname, 'js_dll'), // // to: path.resolve(__dirname, 'dist') // // } // ]) ] };
const path = require('path'); var HtmlWebpackPlugin = require('html-webpack-plugin'); const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');//------------ const CleanWebpackPlugin = require('clean-webpack-plugin'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const ProgressBarPlugin = require('progress-bar-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const webpack = require('webpack'); const packageConfig = require('../package.json'); const utils = require('./utils') const vueLoaderConfig = require('./vue-loader.conf') let evnConfig = require('./getEnvVar') // HappyPack // 原理:每次 webapck 解析一个模块时,HappyPack 会将它及它的依赖分配到worker线程中。 // 提示:由于HappyPack 对file-loader、url-loader 支持的不友好,所以不建议对该loader使用。 // 引入 Happpack 可以在 package.json 找到你下载的 const HappyPack = require('happypack'); // 安装 OS 模块 这个主要是拿到当前电脑的CPU核数 const os = require('os'); /* 这个是设置共享线程池中的数量 size 控制设置数量 类型 只能是 整数类型 */ const cpus = os.cpus().length; const happyThreadPool = HappyPack.ThreadPool({ size: Math.floor(cpus/2)||1 });//os.cpus().length 不能开最大 // const happyThreadPool = HappyPack.ThreadPool({ size: 1 });//os.cpus().length 不能开最大 module.exports = { // entry: { // 'login': ['babel-polyfill', './project/hivuiLogin/index.js'], // 'main': ['babel-polyfill','./project/hivuiMain/index.js'] // }, // output: { // filename: '[name].[contenthash].js', // chunkFilename: '[name].[contenthash].js', // path: path.resolve(__dirname, 'dist') // }, resolve: { extensions: ['.js', '.jsx', '.vue', '.json', '.dtvevt', '.dvue'], alias: { 'vue$': 'vue/dist/vue.esm.js', 'vuex$': 'vuex/dist/vuex.esm.js', '@': path.resolve(__dirname, `${packageConfig.name}`), '@main': path.resolve(__dirname, `../${packageConfig.name}/hivuiMain`), // '@': path.resolve(__dirname, 'src'), '@birt':path.resolve(__dirname, `../${packageConfig.name}/hivuiBirt`), 'pinyin': 'js-pinyin', } }, externals: { 'vue': 'Vue', 'vuex': 'Vuex', 'vue-router': 'VueRouter', "element-ui": "ELEMENT", }, module: { rules: [ ...(utils.styleLoaders({ sourceMap: false, extract: process.env.NODE_ENV === 'production', usePostCSS: true })), { test: /\.(js|jsx|dtvevt?|babel|es6)$/, loader: 'happypack/loader?id=happy_js_jsx', // loader: 'babel-loader', // exclude: [path.resolve(__dirname, 'node_modules')]//放开,里头有些也是 可选链操作符 }, { test: /\.(vue|dvue)$/, // loader: 'happypack/loader?id=happy-vue-loader' ???不行,Make sure the rule matching .vue files include vue-loader in its use. loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../img/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/img/" //生成之后存放的路径 } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../img/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/media/" //生成之后存放的路径 } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: '[name].[hash:7].[ext]', publicPath: "../fonts/", //替换CSS引用的图片路径 可以替换成爱拍云上的路径 outputPath: "static/fonts/" //生成之后存放的路径 } } ] }, optimization: { minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true }), new OptimizeCSSAssetsPlugin({ cssProcessor: require('cssnano'), cssProcessorPluginOptions: { preset: ['default', { discardComments: { removeAll: true } }], }, canPrint: false }) ], runtimeChunk: { "name": "manifest" }, splitChunks: { cacheGroups: { default: false, vendors: false, vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' } } } }, plugins: [ new VueLoaderPlugin(), new HappyPack({ id: 'happy_js_jsx', //共享进程池 threadPool: happyThreadPool, loaders: ['babel-loader'] }), // new HappyPack({ // id: 'happy-vue-loader', // loaders: [{ // loader: 'vue-loader', // options:vueLoaderConfig // }], // threadPool: happyThreadPool // }), new webpack.HashedModuleIdsPlugin(), new ProgressBarPlugin(), // new CleanWebpackPlugin(['dist']), //注入全局变量的插件,通常使用该插件来判别代码运行的环境变量 new webpack.DefinePlugin({ 'process.env': evnConfig }), new webpack.DllReferencePlugin({ context: path.resolve(__dirname), manifest: require('../assets_platform/vendor_dll/vendor-manifest.json') }), //这个主要是将生成的vendor.dll.js文件加上hash值插入到页面中。[也可以手动写到html这里不做处理] // new AddAssetHtmlPlugin([{ // filepath: path.resolve(__dirname, 'js_dll/comm_vendors.dll.js'), // outputPath: 'js_dll/', // publicPath: 'js_dll/', // includeSourcemap: false, // hash: true, // }]), // new CopyWebpackPlugin([ // { // from: path.resolve(__dirname, 'assets_platform'), // to: path.resolve(__dirname, 'dist/assets_platform') // }, // // { // // from: path.resolve(__dirname, 'js_dll'), // // to: path.resolve(__dirname, 'dist') // // } // ]) ] };
Ignore Space
Show notes
View
build/webpack.get-list.js
const path = require("path"); const fs = require("fs"); // const {Chalk} = require('chalk') const merge = require('webpack-merge'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const baseWebpackConfig = require('./webpack.base.conf'); const packageConfig = require('../package.json'); console.log('---------------------webpack.get-list.js------------', process.env.NODE_ENV) // 用来记录当前打包的模块路径列表,判断进程参数 let argvs = (process.argv[2] || "").replace(/\s*$/g, "") let moduleList = require('./webpack.get-module').moduleList || []; if(argvs){ console.log('指定模块编译:') moduleList = argvs.split(',') } let evnConfig = require('./getEnvVar') let webpackList = []; //构建webpack 配置 for (let i = 0, l = moduleList.length; i < l; i++) { let MODULE = moduleList[i]; // console.log(i, MODULE); //添加每个模块的webpack 配置 let MODULE_NAME = MODULE.split('/').pop(); let entry = {}; let outputPath = path.resolve(__dirname, '../dist', MODULE) entry[MODULE_NAME] = ['babel-polyfill', `${MODULE}/index.js`];// @babel/polyfill let wpk = merge({ mode: 'production', // mode: 'development', // devtool: 'source-map', }, baseWebpackConfig, { entry: entry, output: { path: outputPath, filename: `static/js/[name].js`, // publicPath:'./' // publicPath: `/${evnConfig.VITE_APP_SERVER.replace(/"/gi,"")}/render/${packageConfig.author}/${MODULE.replace('./', '')}/` publicPath: `${evnConfig.VITE_APP_USERPATH.replace(/"/gi,"")}/${MODULE.replace('./', '')}/` } }); let htmlTemplate = `${MODULE}/index.html` var checkPath = fs.existsSync(htmlTemplate); //如果目录存在 返回 true ,如果目录不存在 返回false if (checkPath == false) { htmlTemplate = path.resolve(__dirname, './template.html') } wpk.plugins.push(new CleanWebpackPlugin([outputPath], { root: path.resolve(__dirname, '../'), //根目录 //其他配置按需求添加 })); wpk.plugins.push( new MiniCssExtractPlugin({ filename: 'static/css/[name].[contenthash].css', chunkFilename: `static/css/[name].[contenthash].css` }) ); wpk.plugins.push( new HtmlWebpackPlugin({ filename: path.resolve(__dirname, '../dist', MODULE, 'index.html'), template: htmlTemplate,//如果html 不存在考虑用全局根目录下 inject: true, minify: { removeComments: true,//去除注释 collapseWhitespace: true,//是否去除空格 removeAttributeQuotes: true//去除空属性 }, compile: true })) webpackList.push(wpk); } module.exports = webpackList;// [webpackList[4]] ////[webpackList[3]];//27
const path = require("path"); const fs = require("fs"); // const {Chalk} = require('chalk') const merge = require('webpack-merge'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const baseWebpackConfig = require('./webpack.base.conf'); const packageConfig = require('../package.json'); console.log('---------------------webpack.get-list.js------------', process.env.NODE_ENV) // 用来记录当前打包的模块路径列表,判断进程参数 let argvs = (process.argv[2] || "").replace(/\s*$/g, "") let moduleList = require('./webpack.get-module').moduleList || []; if(argvs){ console.log('指定模块编译:') moduleList = argvs.split(',') } let evnConfig = require('./getEnvVar') let webpackList = []; //构建webpack 配置 for (let i = 0, l = moduleList.length; i < l; i++) { let MODULE = moduleList[i]; // console.log(i, MODULE); //添加每个模块的webpack 配置 let MODULE_NAME = MODULE.split('/').pop(); let entry = {}; let outputPath = path.resolve(__dirname, '../dist', MODULE) entry[MODULE_NAME] = ['babel-polyfill', `${MODULE}/index.js`]; let wpk = merge({ mode: 'production', // devtool: 'source-map', }, baseWebpackConfig, { entry: entry, output: { path: outputPath, filename: `static/js/[name].js`, // publicPath:'./' // publicPath: `/${evnConfig.VITE_APP_SERVER.replace(/"/gi,"")}/render/${packageConfig.author}/${MODULE.replace('./', '')}/` publicPath: `${evnConfig.VITE_APP_USERPATH.replace(/"/gi,"")}/${MODULE.replace('./', '')}/` } }); let htmlTemplate = `${MODULE}/index.html` var checkPath = fs.existsSync(htmlTemplate); //如果目录存在 返回 true ,如果目录不存在 返回false if (checkPath == false) { htmlTemplate = path.resolve(__dirname, './template.html') } wpk.plugins.push(new CleanWebpackPlugin([outputPath], { root: path.resolve(__dirname, '../'), //根目录 //其他配置按需求添加 })); wpk.plugins.push( new MiniCssExtractPlugin({ filename: 'static/css/[name].[contenthash].css', chunkFilename: `static/css/[name].[contenthash].css` }) ); wpk.plugins.push( new HtmlWebpackPlugin({ filename: path.resolve(__dirname, '../dist', MODULE, 'index.html'), template: htmlTemplate,//如果html 不存在考虑用全局根目录下 inject: true, minify: { removeComments: true,//去除注释 collapseWhitespace: true,//是否去除空格 removeAttributeQuotes: true//去除空属性 }, compile: true })) webpackList.push(wpk); } module.exports = webpackList;// [webpackList[4]] ////[webpackList[3]];//27
Ignore Space
Show notes
View
build/webpack.prod.conf.js
// 多进程 编译所有 //parallel-webpack允许您并行运行多个Webpack构建,从而将工作分散到各个处理器上,从而有助于显着加快构建速度 let argvs = (process.argv[2] || "").replace(/\s*$/g, "") var run = require('parallel-webpack').run, configPath = require.resolve('./webpack.get-list.js'), options = { watch: false, maxRetries: 1, stats: false, // defaults to false maxConcurrentWorkers: 1,// use 2 workers cup个数 argv: [argvs] }; function notify(res) { //多打包时,如果其中一个模块出错,不知道是哪个模块 console.log('\n--------编译完成------- \n'); } let moduleList = argvs!=""?argvs.split(','):[]; let len = moduleList.length; if (len == 0) { moduleList = require('./webpack.get-module').moduleList || []; console.log(`=========进入全模块编译状态(${moduleList.length})模块...=============`) run(configPath, options, notify); } else { let webpack = require('webpack') let webpackList = require('./webpack.get-list.js'); console.log(`=========指定--模块编译状态(${len})模块...=============`) webpack(webpackList, (err, stats) => { //这个回调一定要写,不然打包不出来 if (err || stats.hasErrors()) {//编译错误不在 err 对象内,而是需要使用 stats.hasErrors() 单独处理 let info ={}; try{ info = stats.toJson(); }catch(e){ info={ errors:[] }; console.log('stats.toJson()',err,stats) } // console.error(info.errors); for (let i = 0, l = info.errors.length; i < l; i++) { // console.log(chalk.red(info.errors[i].message)); // console.error(info.errors[i].message) console.error(info.errors[i]) } } // 处理完成 }) }
// 多进程 编译所有 //parallel-webpack允许您并行运行多个Webpack构建,从而将工作分散到各个处理器上,从而有助于显着加快构建速度 let argvs = (process.argv[2] || "").replace(/\s*$/g, "") var run = require('parallel-webpack').run, configPath = require.resolve('./webpack.get-list.js'), options = { watch: false, maxRetries: 1, stats: false, // defaults to false maxConcurrentWorkers: 1,// use 2 workers cup个数 argv: [argvs] }; function notify(res) { //多打包时,如果其中一个模块出错,不知道是哪个模块 console.log('\n--------编译完成------- \n'); } let moduleList = argvs!=""?argvs.split(','):[]; let len = moduleList.length; if (len == 0) { moduleList = require('./webpack.get-module').moduleList || []; console.log('=========进入全模块编译状态...=============') console.log('=========共有'+moduleList.length+'模块=============') run(configPath, options, notify); } else { let webpack = require('webpack') let webpackList = require('./webpack.get-list.js'); console.log('=========指定模块编译状态...==============') console.log('=========共有'+len+'模块=============') webpack(webpackList, (err, stats) => { //这个回调一定要写,不然打包不出来 if (err || stats.hasErrors()) {//编译错误不在 err 对象内,而是需要使用 stats.hasErrors() 单独处理 const info = stats.toJson(); // console.error(info.errors); for (let i = 0, l = info.errors.length; i < l; i++) { // console.log(chalk.red(info.errors[i].message)); // console.error(info.errors[i].message) console.error(info.errors[i]) } } // 处理完成 }) }
Show line notes below