Vue實(shí)現(xiàn)靜態(tài)資源的OSS部署的完整指南
背景與需求
業(yè)務(wù)場(chǎng)景
在大型前端項(xiàng)目的生產(chǎn)環(huán)境部署中,靜態(tài)資源(JS、CSS、字體文件等)通常占據(jù)較大的體積。將這些資源部署到對(duì)象存儲(chǔ)服務(wù)(OSS)并通過(guò) CDN 加速,可以帶來(lái)以下優(yōu)勢(shì):
- 減輕服務(wù)器壓力:靜態(tài)資源不再占用應(yīng)用服務(wù)器的帶寬和存儲(chǔ)
- 提升訪問(wèn)速度:CDN 邊緣節(jié)點(diǎn)就近分發(fā),降低延遲
- 降低服務(wù)器成本:減少服務(wù)器帶寬和存儲(chǔ)需求
- 提高可用性:CDN 的高可用性保障
需求分析
我們的項(xiàng)目需要實(shí)現(xiàn)以下功能:
- 環(huán)境區(qū)分:測(cè)試環(huán)境使用本地資源,生產(chǎn)環(huán)境使用 OSS CDN
- 選擇性上傳:只上傳
static/css/、static/fonts/、static/js/目錄 - 路徑處理:
favicon.ico和styles/目錄不上傳 OSS,使用相對(duì)路徑 - 自動(dòng)化部署:通過(guò)腳本自動(dòng)化完成上傳流程
- 版本管理:通過(guò)文件 hash 實(shí)現(xiàn)緩存控制
技術(shù)方案設(shè)計(jì)
架構(gòu)設(shè)計(jì)
┌─────────────────┐
│ 本地開發(fā)環(huán)境 │ → 相對(duì)路徑 (/)
└─────────────────┘
┌─────────────────┐
│ 測(cè)試環(huán)境構(gòu)建 │ → 相對(duì)路徑 (/) → 直接部署
└─────────────────┘
┌─────────────────┐
│ 生產(chǎn)環(huán)境構(gòu)建 │ → CDN 路徑 (https://cdn.example.com/)
└─────────────────┘
│
├─→ static/css/ → 上傳 OSS
├─→ static/fonts/ → 上傳 OSS
├─→ static/js/ → 上傳 OSS
├─→ favicon.ico → 不上傳(相對(duì)路徑)
└─→ styles/ → 不上傳(相對(duì)路徑)
技術(shù)選型
- 構(gòu)建工具:Vue CLI(基于 Webpack)
- OSS 工具:ossutil(阿里云官方命令行工具)
- 腳本語(yǔ)言:Bash Shell
- 路徑處理:Webpack 插件 + 自定義 HTML 修改插件
Vue CLI 配置詳解
1. publicPath 動(dòng)態(tài)配置
publicPath 決定了構(gòu)建后資源的引用路徑。我們需要根據(jù)環(huán)境變量動(dòng)態(tài)設(shè)置:
module.exports = {
publicPath: process.env.CDN_URL ||
(process.env.NODE_ENV === 'development' ? '/' : // 本地開發(fā)環(huán)境
process.env.VUE_APP_PATH_TYPE === 'gray' ? '/' : // 測(cè)試環(huán)境使用相對(duì)路徑
'https://js-cdn.m.cc/'), // 生產(chǎn)環(huán)境使用 CDN
outputDir: 'dist',
assetsDir: 'static',
filenameHashing: true,
}
關(guān)鍵點(diǎn)說(shuō)明:
assetsDir: 'static':所有資源輸出到static/目錄filenameHashing: true:?jiǎn)⒂梦募?hash,實(shí)現(xiàn)緩存控制- 環(huán)境判斷邏輯:
- 開發(fā)環(huán)境:始終使用相對(duì)路徑
- 測(cè)試環(huán)境(
VUE_APP_PATH_TYPE === 'gray'):使用相對(duì)路徑 - 生產(chǎn)環(huán)境:使用 CDN 路徑
2. 輸出文件名配置
為了確保文件路徑的一致性,需要顯式設(shè)置輸出文件名:
configureWebpack: config => {
// 統(tǒng)一使用 static/js/ 路徑,與 assetsDir 保持一致
config.output.filename = 'static/js/[name].[hash:8].js'
config.output.chunkFilename = 'static/js/[name].[hash:8].js'
}
為什么需要顯式設(shè)置?
雖然 assetsDir: 'static' 會(huì)自動(dòng)處理路徑,但顯式設(shè)置可以:
- 確保所有環(huán)境路徑一致
- 避免不同 Webpack 版本的差異
- 便于后續(xù)維護(hù)和理解
3. HTML 路徑修改插件
生產(chǎn)環(huán)境需要特殊處理:靜態(tài)資源使用 CDN,但 favicon.ico 和 styles/ 使用相對(duì)路徑。
實(shí)現(xiàn)原理:
在 Webpack 的 emit 階段(生成文件后,寫入磁盤前),通過(guò)自定義插件修改 HTML 內(nèi)容:
chainWebpack: config => {
// 只在生產(chǎn)環(huán)境(非測(cè)試環(huán)境)運(yùn)行
if (process.env.NODE_ENV === 'production' && process.env.VUE_APP_PATH_TYPE !== 'gray') {
class ModifyHtmlPlugin {
apply(compiler) {
compiler.hooks.emit.tapAsync('ModifyHtmlPlugin', (compilation, callback) => {
Object.keys(compilation.assets).forEach(filename => {
if (filename.endsWith('.html')) {
let html = compilation.assets[filename].source()
// 1. 先處理 BASE_URL 變量(如果還沒(méi)被 Vue CLI 替換)
html = html.replace(/href="<%= BASE_URL %>favicon\.ico" rel="external nofollow" /g, 'href="/favicon.ico" rel="external nofollow" rel="external nofollow" ')
html = html.replace(/href="<%= BASE_URL %>styles\/([^" rel="external nofollow" ]+)"/g, 'href="/styles/$1" rel="external nofollow" rel="external nofollow" ')
// 2. 替換其他 BASE_URL 變量為 CDN 路徑
const baseUrl = process.env.CDN_URL || 'https://js-cdn.m.cc/'
html = html.replace(/<%= BASE_URL %>/g, baseUrl)
// 3. 最后處理已經(jīng)被替換的 CDN 路徑(將 favicon 和 styles 改回相對(duì)路徑)
html = html.replace(/href="https:\/\/js-cdn\.modb\.cc\/favicon\.ico" rel="external nofollow" /g, 'href="/favicon.ico" rel="external nofollow" rel="external nofollow" ')
html = html.replace(/href="https:\/\/js-cdn\.modb\.cc\/styles\/([^" rel="external nofollow" ]+)"/g, 'href="/styles/$1" rel="external nofollow" rel="external nofollow" ')
compilation.assets[filename] = {
source: () => html,
size: () => html.length
}
}
})
callback()
})
}
}
config.plugin('modify-html').use(ModifyHtmlPlugin)
}
}
處理順序的重要性:
- 先處理
BASE_URL變量(模板階段) - 替換為 CDN 路徑
- 最后將特定文件改回相對(duì)路徑
這樣可以確保所有路徑都被正確處理。
4. 代碼分割優(yōu)化
為了提升加載性能,我們配置了代碼分割:
config.optimization.splitChunks = {
chunks: 'all',
minSize: 20000,
maxAsyncRequests: 20,
maxInitialRequests: 15,
cacheGroups: {
// Vue 核心庫(kù)單獨(dú)拆分
vueCore: {
name: 'chunk-vue-core',
test: /[\\/]node_modules[\\/](vue|vue-router|vuex|vue-i18n)[\\/]/,
priority: 40,
chunks: 'initial',
enforce: true
},
// 大型 UI 庫(kù)單獨(dú)拆分
elementPlus: {
name: 'chunk-element-plus',
test: /[\\/]node_modules[\\/]element-plus[\\/]/,
priority: 35,
chunks: 'initial',
enforce: true
},
// 其他配置...
}
}
優(yōu)勢(shì):
- 大型庫(kù)單獨(dú)拆分,便于緩存
- 按需加載的庫(kù)設(shè)置為
async,減少初始加載體積 - 公共代碼提取,避免重復(fù)打包
OSS 工具安裝與配置
1. 確定服務(wù)器架構(gòu)
首先需要確定服務(wù)器的 CPU 架構(gòu),以選擇正確的 ossutil 版本:
uname -m # 輸出示例: # x86_64 → 使用 ossutil64 # aarch64 → 使用 ossutilarm64
2. 下載 ossutil
根據(jù)架構(gòu)下載對(duì)應(yīng)版本(以阿里云 OSS 為例):
# 創(chuàng)建目錄 mkdir -p /root/oss cd /root/oss # 下載對(duì)應(yīng)版本(示例:ARM64 架構(gòu)) wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutilarm64 # 或者使用 curl curl -o ossutilarm64 https://gosspublic.alicdn.com/ossutil/1.7.13/ossutilarm64 # 添加執(zhí)行權(quán)限 chmod +x ossutilarm64 # 驗(yàn)證安裝 /root/oss/ossutilarm64 --version
3. 配置 OSS 憑證
ossutil 支持兩種配置方式:
方式一:命令行配置(臨時(shí))
/root/oss/ossutilarm64 config -e <endpoint> \ -i <accessKeyId> \ -k <accessKeySecret>
方式二:配置文件(推薦)
創(chuàng)建配置文件 ~/.ossutilconfig:
cat > /root/.ossutilconfig << 'EOF' [Credentials] language=EN endpoint=oss-cn-hangzhou.aliyuncs.com accessKeyID=YOUR_ACCESS_KEY_ID accessKeySecret=YOUR_ACCESS_KEY_SECRET EOF # 設(shè)置文件權(quán)限(安全考慮) chmod 600 /root/.ossutilconfig
配置說(shuō)明:
language=EN:使用英文輸出,避免編碼問(wèn)題endpoint:OSS 區(qū)域節(jié)點(diǎn)地址accessKeyID和accessKeySecret:OSS 訪問(wèn)憑證
4. 測(cè)試連接
# 測(cè)試連接 /root/oss/ossutilarm64 ls oss://your-bucket-name/ # 如果成功,會(huì)顯示 OSS 上的文件列表
上傳腳本編寫
腳本結(jié)構(gòu)設(shè)計(jì)
上傳腳本需要包含以下功能:
- 環(huán)境檢查:驗(yàn)證構(gòu)建輸出是否存在
- 連接測(cè)試:確保 OSS 連接正常
- 清理舊文件:刪除 OSS 上的舊版本文件
- 上傳新文件:上傳指定的目錄
- 驗(yàn)證上傳:確認(rèn)上傳成功
完整腳本示例
#!/bin/bash
set -e # 遇到錯(cuò)誤立即退出
echo "Starting OSS upload for production environment..."
# ========== 1. OSS 配置 ==========
# 如果使用配置文件,可以跳過(guò)此步驟
# 如果需要?jiǎng)討B(tài)配置,使用以下命令:
# /root/oss/ossutilarm64 config -e <endpoint> \
# -i <accessKeyId> \
# -k <accessKeySecret>
# ========== 2. 測(cè)試 OSS 連接 ==========
echo "Testing OSS connection..."
if /root/oss/ossutilarm64 ls oss://your-bucket-name/ 2>/dev/null > /dev/null; then
echo "OSS connection test passed"
else
echo "Warning: OSS connection test failed, but continuing..."
fi
# ========== 3. 設(shè)置構(gòu)建路徑 ==========
DIST_PATH="/u01/dist"
# ========== 4. 檢查構(gòu)建輸出 ==========
if [ ! -d "$DIST_PATH" ]; then
echo "Error: $DIST_PATH not found"
exit 1
fi
echo "Build path: $DIST_PATH"
# 檢查 static 目錄
if [ ! -d "$DIST_PATH/static" ]; then
echo "Error: $DIST_PATH/static not found"
exit 1
fi
# 檢查關(guān)鍵文件
if [ ! -f "$DIST_PATH/index.html" ]; then
echo "Error: $DIST_PATH/index.html not found"
exit 1
fi
if [ ! -f "$DIST_PATH/favicon.ico" ]; then
echo "Warning: $DIST_PATH/favicon.ico not found"
fi
if [ ! -d "$DIST_PATH/styles" ]; then
echo "Warning: $DIST_PATH/styles directory not found"
fi
# ========== 5. 清理 OSS 上的舊文件 ==========
echo ""
echo "Cleaning old files from OSS..."
# 刪除 OSS 上的 css 目錄(使用 -f 參數(shù)避免交互式提示)
echo " Deleting old CSS files..."
/root/oss/ossutilarm64 rm -r oss://your-bucket-name/static/css/ -f 2>/dev/null || echo " (CSS directory may not exist, skipping)"
# 刪除 OSS 上的 fonts 目錄
echo " Deleting old fonts files..."
/root/oss/ossutilarm64 rm -r oss://your-bucket-name/static/fonts/ -f 2>/dev/null || echo " (Fonts directory may not exist, skipping)"
# 刪除 OSS 上的 js 目錄
echo " Deleting old JS files..."
/root/oss/ossutilarm64 rm -r oss://your-bucket-name/static/js/ -f 2>/dev/null || echo " (JS directory may not exist, skipping)"
echo "Old files cleaned (if any existed)"
echo ""
# ========== 6. 上傳新文件 ==========
# 上傳 static/css/ 目錄
if [ -d "$DIST_PATH/static/css" ]; then
echo "Uploading static/css/ directory..."
/root/oss/ossutilarm64 cp -r $DIST_PATH/static/css/ oss://your-bucket-name/static/css/ -f
if [ $? -eq 0 ]; then
echo "CSS directory uploaded successfully"
else
echo "Failed to upload CSS directory"
exit 1
fi
else
echo "Warning: $DIST_PATH/static/css not found, skipping..."
fi
# 上傳 static/fonts/ 目錄
if [ -d "$DIST_PATH/static/fonts" ]; then
echo "Uploading static/fonts/ directory..."
/root/oss/ossutilarm64 cp -r $DIST_PATH/static/fonts/ oss://your-bucket-name/static/fonts/ -f
if [ $? -eq 0 ]; then
echo "Fonts directory uploaded successfully"
else
echo "Failed to upload fonts directory"
exit 1
fi
else
echo "Warning: $DIST_PATH/static/fonts not found, skipping..."
fi
# 上傳 static/js/ 目錄
if [ -d "$DIST_PATH/static/js" ]; then
echo "Uploading static/js/ directory..."
/root/oss/ossutilarm64 cp -r $DIST_PATH/static/js/ oss://your-bucket-name/static/js/ -f
if [ $? -eq 0 ]; then
echo "JS directory uploaded successfully"
else
echo "Failed to upload JS directory"
exit 1
fi
else
echo "Error: $DIST_PATH/static/js not found (required)"
exit 1
fi
# ========== 7. 驗(yàn)證上傳 ==========
echo ""
echo "Verifying upload..."
# 統(tǒng)計(jì)上傳的文件數(shù)量
JS_COUNT=$(/root/oss/ossutilarm64 ls oss://your-bucket-name/static/js/ 2>/dev/null | wc -l)
CSS_COUNT=$(/root/oss/ossutilarm64 ls oss://your-bucket-name/static/css/ 2>/dev/null | wc -l)
FONTS_COUNT=$(/root/oss/ossutilarm64 ls oss://your-bucket-name/static/fonts/ 2>/dev/null | wc -l)
echo ""
echo "Upload completed!"
echo "Upload statistics:"
echo " JS files: $JS_COUNT"
echo " CSS files: $CSS_COUNT"
echo " Fonts files: $FONTS_COUNT"
# 檢查關(guān)鍵文件是否存在
echo ""
echo "Checking key files..."
JS_CHECK=$(/root/oss/ossutilarm64 ls oss://your-bucket-name/static/js/app.*.js 2>/dev/null | head -1 | wc -l)
CSS_CHECK=$(/root/oss/ossutilarm64 ls oss://your-bucket-name/static/css/app.*.css 2>/dev/null | head -1 | wc -l)
if [ "$JS_CHECK" -gt 0 ] && [ "$CSS_CHECK" -gt 0 ]; then
echo "Key files app.js and app.css found in OSS"
echo "Upload verification passed!"
else
echo "Warning: Some key files may be missing"
fi
echo ""
echo "OSS upload process completed!"
腳本關(guān)鍵點(diǎn)說(shuō)明
1.set -e的作用
set -e
遇到任何錯(cuò)誤立即退出,避免繼續(xù)執(zhí)行可能導(dǎo)致的問(wèn)題。
2. 使用-f參數(shù)
ossutilarm64 rm -r oss://bucket/path/ -f ossutilarm64 cp -r local/path/ oss://bucket/path/ -f
-f 參數(shù)的作用:
rm -r -f:強(qiáng)制刪除,不詢問(wèn)確認(rèn)cp -r -f:強(qiáng)制覆蓋,不詢問(wèn)確認(rèn)
為什么重要:在自動(dòng)化腳本中,交互式提示會(huì)導(dǎo)致腳本掛起。
3. 錯(cuò)誤處理
command 2>/dev/null || echo "fallback message"
2>/dev/null:隱藏錯(cuò)誤輸出||:如果命令失敗,執(zhí)行后續(xù)命令- 適用于首次運(yùn)行(目錄可能不存在)的場(chǎng)景
4. 變量命名注意事項(xiàng)
避免使用可能被系統(tǒng)識(shí)別的變量名:
# ? 不推薦(可能被某些系統(tǒng)識(shí)別為系統(tǒng)變量) BUILD_PATH="/u01/dist" # ? 推薦 DIST_PATH="/u01/dist"
5. 文件計(jì)數(shù)驗(yàn)證
JS_COUNT=$(ossutilarm64 ls oss://bucket/static/js/ 2>/dev/null | wc -l)
使用 wc -l 統(tǒng)計(jì)文件數(shù)量,用于驗(yàn)證上傳是否成功。
部署流程
測(cè)試環(huán)境部署
測(cè)試環(huán)境使用相對(duì)路徑,不需要上傳 OSS:
# 1. 構(gòu)建項(xiàng)目 npm run gray # 2. 打包 tar -czf dist.gz dist/ # 3. 上傳到服務(wù)器并解壓 scp dist.gz user@server:/path/to/deploy/ ssh user@server "cd /path/to/deploy && tar -xzf dist.gz"
生產(chǎn)環(huán)境部署
生產(chǎn)環(huán)境需要上傳資源到 OSS:
# 1. 構(gòu)建項(xiàng)目 npm run build # 2. 打包 tar -czf dist.gz dist/ # 3. 上傳到服務(wù)器 scp dist.gz user@server:/u01/ scp upload-to-oss-production.sh user@server:/u01/ # 4. 在服務(wù)器上執(zhí)行部署腳本 ssh user@server << 'EOF' cd /u01 rm -rf dist && tar -zxvf ./dist.gz chmod +x upload-to-oss-production.sh ./upload-to-oss-production.sh EOF
完整部署腳本示例
可以將解壓和上傳合并到一個(gè)腳本中:
#!/bin/bash set -e # 解壓構(gòu)建文件 cd /u01 rm -rf dist && tar -zxvf ./dist.gz # 執(zhí)行 OSS 上傳腳本 ./upload-to-oss-production.sh # 部署到 Web 服務(wù)器(Nginx 示例) # cp -r dist/* /usr/share/nginx/html/ # systemctl reload nginx
注意事項(xiàng)與最佳實(shí)踐
1. 安全性
憑證管理
- 不要在腳本中硬編碼憑證
- 使用環(huán)境變量或配置文件
- 設(shè)置配置文件權(quán)限為
600
chmod 600 ~/.ossutilconfig
最小權(quán)限原則
為 OSS 訪問(wèn)密鑰設(shè)置最小必要權(quán)限:
- 只允許上傳到指定目錄
- 禁止刪除其他目錄的文件
2. 性能優(yōu)化
并行上傳
對(duì)于大量文件,可以考慮并行上傳:
# 使用后臺(tái)任務(wù)并行上傳 /root/oss/ossutilarm64 cp -r $DIST_PATH/static/css/ oss://bucket/static/css/ -f & /root/oss/ossutilarm64 cp -r $DIST_PATH/static/fonts/ oss://bucket/static/fonts/ -f & /root/oss/ossutilarm64 cp -r $DIST_PATH/static/js/ oss://bucket/static/js/ -f & # 等待所有任務(wù)完成 wait
增量上傳
如果文件很多,可以使用 --update 參數(shù)進(jìn)行增量上傳:
ossutilarm64 cp -r local/path/ oss://bucket/path/ --update
但需要注意:如果文件名包含 hash,每次構(gòu)建都是新文件,增量上傳意義不大。
3. 緩存策略
HTTP 緩存頭
在 OSS 控制臺(tái)或通過(guò) API 設(shè)置緩存頭:
Cache-Control: public, max-age=31536000
對(duì)于帶 hash 的文件名,可以設(shè)置長(zhǎng)期緩存。
CDN 緩存
如果使用 CDN,需要配置:
- 緩存規(guī)則:根據(jù)文件類型和路徑
- 緩存刷新:更新后及時(shí)刷新 CDN 緩存
4. 監(jiān)控與日志
上傳日志
記錄上傳過(guò)程的關(guān)鍵信息:
LOG_FILE="/var/log/oss-upload.log" echo "$(date): Starting OSS upload" >> $LOG_FILE # ... 上傳過(guò)程 ... echo "$(date): OSS upload completed" >> $LOG_FILE
監(jiān)控告警
- 監(jiān)控上傳失敗率
- 監(jiān)控 OSS 存儲(chǔ)使用量
- 監(jiān)控 CDN 流量
5. 回滾策略
保留歷史版本
在刪除舊文件前,可以先備份:
# 備份當(dāng)前版本 BACKUP_DIR="backup/$(date +%Y%m%d_%H%M%S)" /root/oss/ossutilarm64 cp -r oss://bucket/static/ oss://bucket/$BACKUP_DIR/ -f
快速回滾
如果需要回滾,可以從備份恢復(fù):
/root/oss/ossutilarm64 cp -r oss://bucket/$BACKUP_DIR/static/ oss://bucket/static/ -f
問(wèn)題排查
1. 路徑問(wèn)題
問(wèn)題:HTML 中的路徑不正確
癥狀:瀏覽器控制臺(tái)顯示 404 錯(cuò)誤
排查步驟:
- 檢查
dist/index.html中的路徑 - 確認(rèn)
publicPath配置是否正確 - 驗(yàn)證
ModifyHtmlPlugin是否正常運(yùn)行
解決方案:
# 檢查構(gòu)建后的 HTML cat dist/index.html | grep -E '(href|src)=' # 檢查環(huán)境變量 echo $NODE_ENV echo $VUE_APP_PATH_TYPE
2. OSS 連接問(wèn)題
問(wèn)題:ossutil 連接失敗
癥狀:ossutil: No such file or directory 或連接超時(shí)
排查步驟:
- 檢查 ossutil 是否安裝
- 檢查網(wǎng)絡(luò)連接
- 驗(yàn)證憑證是否正確
解決方案:
# 檢查 ossutil 是否存在 ls -la /root/oss/ossutilarm64 # 測(cè)試網(wǎng)絡(luò)連接 ping oss-cn-hangzhou.aliyuncs.com # 測(cè)試 OSS 連接 /root/oss/ossutilarm64 ls oss://bucket-name/
3. 上傳失敗
問(wèn)題:上傳過(guò)程中斷或失敗
癥狀:腳本執(zhí)行失敗,部分文件未上傳
排查步驟:
- 檢查磁盤空間
- 檢查網(wǎng)絡(luò)穩(wěn)定性
- 查看 OSS 控制臺(tái)的錯(cuò)誤日志
解決方案:
# 檢查磁盤空間 df -h # 檢查網(wǎng)絡(luò) curl -I https://oss-cn-hangzhou.aliyuncs.com # 重試上傳 ./upload-to-oss-production.sh
4. 文件權(quán)限問(wèn)題
問(wèn)題:ossutil 無(wú)執(zhí)行權(quán)限
癥狀:Permission denied
解決方案:
chmod +x /root/oss/ossutilarm64
5. 腳本語(yǔ)法問(wèn)題
問(wèn)題:腳本執(zhí)行報(bào)語(yǔ)法錯(cuò)誤
癥狀:syntax error: unexpected EOF 等
常見原因:
- 括號(hào)不匹配
- 引號(hào)未閉合
- 變量名包含特殊字符
解決方案:
# 檢查腳本語(yǔ)法 bash -n upload-to-oss-production.sh # 使用 shellcheck 檢查(如果已安裝) shellcheck upload-to-oss-production.sh
6. 環(huán)境變量問(wèn)題
問(wèn)題:構(gòu)建時(shí)路徑不正確
癥狀:測(cè)試環(huán)境使用了 CDN 路徑,或生產(chǎn)環(huán)境使用了相對(duì)路徑
排查步驟:
# 檢查 package.json 中的腳本 cat package.json | grep -A 5 '"scripts"' # 確認(rèn)環(huán)境變量設(shè)置 # 測(cè)試環(huán)境應(yīng)該設(shè)置 VUE_APP_PATH_TYPE=gray # 生產(chǎn)環(huán)境不應(yīng)該設(shè)置此變量
總結(jié)
本文詳細(xì)介紹了 Vue.js 項(xiàng)目將靜態(tài)資源部署到 OSS 的完整實(shí)現(xiàn)過(guò)程,包括:
- 配置層面:通過(guò) Vue CLI 配置實(shí)現(xiàn)不同環(huán)境的路徑處理
- 工具層面:OSS 命令行工具的安裝和配置
- 腳本層面:自動(dòng)化上傳腳本的編寫
- 部署層面:完整的部署流程
關(guān)鍵要點(diǎn)
- 環(huán)境區(qū)分:測(cè)試環(huán)境使用相對(duì)路徑,生產(chǎn)環(huán)境使用 CDN
- 選擇性上傳:只上傳必要的靜態(tài)資源目錄
- 路徑處理:通過(guò)自定義插件處理特殊文件的路徑
- 自動(dòng)化:通過(guò)腳本實(shí)現(xiàn)一鍵部署
- 安全性:妥善管理 OSS 憑證
- 可維護(hù)性:清晰的代碼結(jié)構(gòu)和完善的錯(cuò)誤處理
擴(kuò)展建議
- CI/CD 集成:將上傳腳本集成到 CI/CD 流程中
- 監(jiān)控告警:添加監(jiān)控和告警機(jī)制
- 多環(huán)境支持:支持多個(gè)生產(chǎn)環(huán)境的配置
- 版本管理:實(shí)現(xiàn)更完善的版本管理和回滾機(jī)制
希望本文能幫助您成功實(shí)現(xiàn)靜態(tài)資源的 OSS 部署!
以上就是Vue實(shí)現(xiàn)靜態(tài)資源的OSS部署的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Vue靜態(tài)資源OSS部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue實(shí)現(xiàn)base64編碼圖片間的切換功能
這篇文章主要介紹了Vue實(shí)現(xiàn)base64編碼圖片間的切換功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
解決Element-ui radio單選框label布爾/數(shù)值的一個(gè)坑
這篇文章主要介紹了解決Element-ui radio單選框label布爾/數(shù)值的一個(gè)坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
vue中提示$index is not defined錯(cuò)誤的解決方式
這篇文章主要介紹了vue中提示$index is not defined錯(cuò)誤的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
關(guān)于vue-router路徑計(jì)算問(wèn)題
這篇文章主要介紹了關(guān)于vue-router路徑計(jì)算問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Vue3使用時(shí)應(yīng)避免的10個(gè)錯(cuò)誤總結(jié)
Vue?3已經(jīng)穩(wěn)定了相當(dāng)長(zhǎng)一段時(shí)間了。許多代碼庫(kù)都在生產(chǎn)環(huán)境中使用它,其他人最終都將不得不遷移到Vue?3。我現(xiàn)在有機(jī)會(huì)使用它并記錄了我的錯(cuò)誤,下面這些錯(cuò)誤你可能想要避免2023-03-03
詳解vue+nodejs獲取多個(gè)表數(shù)據(jù)的方法
這篇文章主要為大家介紹了vue+nodejs獲取多個(gè)表數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12

