VUE部署
通用指南
如果你用 Vue CLI 處理靜態資源並和後端框架一起作為部署的一部分,那麼你需要的僅僅是確保 Vue CLI 生成的構建檔案在正確的位置,並遵循後端框架的釋出方式即可。
如果你獨立於後端部署前端應用——也就是說後端暴露一個前端可訪問的 API,然後前端實際上是純靜態應用。那麼你可以將dist
目錄裡構建的內容部署到任何靜態檔案伺服器中,但要確保正確的publicPath。
#本地預覽
dist
目錄需要啟動一個 HTTP 伺服器來訪問 (除非你已經將publicPath
配置為了一個相對的值),所以以file://
協議直接開啟dist/index.html
是不會工作的。在本地預覽生產環境構建最簡單的方式就是使用一個 Node.js 靜態檔案伺服器,例如
npm install -g serve
# -s 引數的意思是將其架設在 Single-Page Application 模式下
# 這個模式會處理即將提到的路由問題
serve -s dist
#使用history.pushState
的路由
如果你在history
模式下使用 Vue Router,是無法搭配簡單的靜態檔案伺服器的。例如,如果你使用 Vue Router 為/todos/42/
定義了一個路由,開發伺服器已經配置了相應的localhost:3000/todos/42
響應,但是一個為生產環境構建架設的簡單的靜態伺服器會卻會返回 404。
為了解決這個問題,你需要配置生產環境伺服器,將任何沒有匹配到靜態檔案的請求回退到index.html
#CORS
如果前端靜態內容是部署在與後端 API 不同的域名上,你需要適當地配置CORS。
#PWA
如果你使用了 PWA 外掛,那麼應用必須架設在 HTTPS 上,這樣Service Worker才能被正確註冊。
#平臺指南
#GitHub Pages
#手動推送更新
-
在
vue.config.js
中設定正確的publicPath
。如果打算將專案部署到
https://<USERNAME>.github.io/
上,publicPath
將預設被設為"/"
,你可以忽略這個引數。如果打算將專案部署到
https://<USERNAME>.github.io/<REPO>/
https://github.com/<USERNAME>/<REPO>
),可將publicPath
設為"/<REPO>/"
。舉個例子,如果倉庫名字為“my-project”,那麼vue.config.js
的內容應如下所示:module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/my-project/' : '/' }
-
在專案目錄下,建立內容如下的
deploy.sh
(可以適當地取消註釋) 並執行它以進行部署:
#!/usr/bin/env sh # 當發生錯誤時中止指令碼 set -e # 構建 npm run build # cd 到構建輸出的目錄下 cd dist # 部署到自定義域域名 # echo 'www.example.com' > CNAME git init git add -A git commit -m 'deploy' # 部署到 https://<USERNAME>.github.io # git push -f [email protected]:<USERNAME>/<USERNAME>.github.io.git master # 部署到 https://<USERNAME>.github.io/<REPO> # git push -f [email protected]:<USERNAME>/<REPO>.git master:gh-pages cd -
#使用 Travis CI 自動更新
-
仿照上面在
vue.config.js
中設定正確的publicPath
。 -
安裝 Travis CLI 客戶端:
gem install travis && travis --login
-
生成一個擁有“repo”許可權的 GitHub訪問令牌。
-
授予 Travis 訪問倉庫的許可權:
travis set GITHUB_TOKEN=xxx
(xxx
是第三步中的個人訪問令牌) -
在專案根目錄下建立一個
.travis.yml
檔案。language: node_js node_js: - "node" cache: npm script: npm run build deploy: provider: pages skip_cleanup: true github_token: $GITHUB_TOKEN local_dir: dist on: branch: master
-
將
.travis.yml
檔案推送到倉庫來觸發第一次構建。
#GitLab Pages
根據GitLab Pages 文件的描述,所有的配置都在根目錄中的.gitlab-ci.yml
檔案中。下面的範例是一個很好的入門:
# .gitlab-ci.yml 檔案應放在你倉庫的根目錄下
pages: # 必須定義一個名為 pages 的 job
image: node:latest
stage: deploy
script:
- npm ci
- npm run build
- mv public public-vue # GitLab Pages 的鉤子設定在 public 資料夾
- mv dist public # 重新命名 dist 資料夾 (npm run build 之後的輸出位置)
artifacts:
paths:
- public # artifact path 一定要在 /public , 這樣 GitLab Pages 才能獲取
only:
- master
通常, 你的靜態頁面將託管在 https://yourUserName.gitlab.io/yourProjectName 上, 所以你可以建立一個 initialvue.config.js
檔案去更新BASE_URL
要匹配的值 :
// vue.config.js 位於倉庫的根目錄下
// 確保用 GitLab 專案的名稱替換了 `YourProjectName`
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/yourProjectName/'
: '/'
}
請閱讀在GitLab Pages domains的文件來學習更多關於頁面部署 URL 的資訊。注意,你也可以使用自定義域名。
在推送到倉庫之前提交.gitlab-ci.yml
和vue.config.js
檔案。GitLab CI 的管道將會被觸發: 當成功時候, 到Settings > Pages
檢視關於網站的連結。
#Netlify
-
在 Netlify 上,使用以下設定從 GitHub 建立新專案:
- 構建命令:
npm run build
或yarn build
- 釋出目錄:
dist
- 構建命令:
-
點選“deploy”按鈕!
也可以檢視vue-cli-plugin-netlify-lambda。
如果使用 Vue Router 的 history 模式,你需要在/public
目錄下建立一個_redirects
檔案:
# 單頁應用的 Netlify 設定
/* /index.html 200
詳細資訊請檢視Netlify 重定向文件。
#Render
Render提供帶有全託管 SSL,全球 CDN 和 GitHub 持續自動部署的免費靜態站點託管服務。
- 在 Render 上建立一個新的 Web Service,並授予 Render 的 GitHub 應用訪問你的 Vue 倉庫的許可權。
- 在建立過程中使用以下設定:
- 環境:
Static Site
- 構建命令:
npm run build
或者yarn build
- 釋出目錄:
dist
- 環境:
大功告成!構建結束時你的應用便會在你的 Render URL 上線。
如果使用 Vue Router 的 history 模式,你需要在站點的Redirects/Rewrites
設定中新增以下改寫規則:
- Source:
/*
- Destination:
/index.html
- Status:
Rewrite
詳細資訊請檢視 Render 的重定向和改寫及自定義域名文件。
#Amazon S3
#Firebase
建立一個新的 Firebase 專案Firebase console。 請參考文件。
確保已經全域性安裝了firebase-tools:
npm install -g firebase-tools
在專案的根目錄下, 用以下命令初始化firebase
:
firebase init
Firebase 將會詢問有關初始化專案的一些問題。
- 選擇需要 Firebase CLI 的功能。 一定要選擇
hosting
。 - 選擇預設的 Firebase 專案。
- 將
public
目錄設為dist
(或構建輸出的位置) 這將會上傳到 Firebase Hosting。
// firebase.json
{
"hosting": {
"public": "dist"
}
}
- 選擇
yes
設定專案為一個單頁應用。 這將會建立一個index.html
在dist
資料夾並且配置hosting
資訊。
// firebase.json
{
"hosting": {
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
執行npm run build
去構建專案。
在Firebase Hosting
部署專案,執行以下命令 :
firebase deploy --only hosting
如果需要在部署的專案中使用的其他 Firebase CLI 功能, 執行firebase deploy
去掉--only
引數。
現在可以到https://<YOUR-PROJECT-ID>.firebaseapp.com
訪問你的專案了。
請參考Firebase 文件來獲取更多細節。
#ZEIT Now
ZEIT Now是一個網站和無伺服器 (Serverless) API 雲平臺,你可以使用你的個人域名 (或是免費的.now.sh
URL) 部署你的 Vue 專案。
#步驟一:安裝 Now CLI
要使用npm安裝其命令列介面,執行以下命令:
npm install -g now
#步驟二:部署
在專案根目錄執行以下命令部署你的應用:
now
此外,你還可以使用他們的GitHub或GitLab整合服務。
大功告成!
你的站點會開始部署,你將獲得一個形如https://vue.now-examples.now.sh/的連結。
開箱即用地,請求會被自動改寫到index.html
(除了自定義的靜態檔案) 並帶有合適的快取請求頭。
#Stdlib
未完成 | 歡迎參與貢獻。
#Heroku
-
建立
static.json
檔案:{ "root": "dist", "clean_urls": true, "routes": { "/**": "index.html" } }
-
將
static.json
加入 Gitgit add static.json git commit -m "add static configuration"
-
部署到 Heroku
heroku login heroku create heroku buildpacks:add heroku/nodejs heroku buildpacks:add https://github.com/heroku/heroku-buildpack-static git push heroku master
詳細資訊:https://gist.github.com/hone/24b06869b4c1eca701f9
#Surge
要使用Surge進行部署,步驟非常簡單。
首先,通過執行npm run build
來構建專案。如果還沒有安裝 Surge 的命令列工具,可以通過執行命令來執行此操作:
npm install --global surge
然後 cd 進入專案的dist/
資料夾,然後執行surge
並按照螢幕提示操作 。如果是第一次使用 Surge,它會要求設定電子郵件和密碼。確認專案資料夾以及輸入首選域來檢視正在部署的專案,如下所示。
project: /Users/user/Documents/myawesomeproject/dist/
domain: myawesomeproject.surge.sh
upload: [====================] 100% eta: 0.0s (31 files, 494256 bytes)
CDN: [====================] 100%
IP: **.**.***.***
Success! - Published to myawesomeproject.surge.sh
通過訪問myawesomeproject.surge.sh
來確保你的專案已經成功的用 Surge 釋出,有關自定義域名等更多設定詳細資訊,可以到Surge's help page檢視。
#Bitbucket Cloud
-
如Bitbucket 文件建立一個命名為
<USERNAME>.bitbucket.io
的倉庫。 -
如果你想擁有多個網站, 想要釋出到主倉庫的子資料夾中。這種情況下就要在
vue.config.js
設定publicPath
。如果部署到
https://<USERNAME>.bitbucket.io/
,publicPath
預設將被設為"/"
,你可以選擇忽略它。如果要部署到
https://<USERNAME>.bitbucket.io/<SUBFOLDER>/
,設定publicPath
為"/<SUBFOLDER>/"
。在這種情況下,倉庫的目錄結構應該反映 url 結構,例如倉庫應該有/<SUBFOLDER>
目錄。 -
在專案中,
deploy.sh
使用以下內容建立並執行它以進行部署:
#!/usr/bin/env sh # 當發生錯誤時中止指令碼 set -e # 構建 npm run build # cd 到構建輸出的目錄 cd dist git init git add -A git commit -m 'deploy' git push -f [email protected]:<USERNAME>/<USERNAME>.bitbucket.io.git master cd -
#Docker (Nginx)
在 Docker 容器中使用 Nginx 部署你的應用。
-
安裝Docker
-
在專案根目錄建立
Dockerfile
檔案FROM node:10 COPY ./ /app WORKDIR /app RUN npm install && npm run build FROM nginx RUN mkdir /app COPY --from=0 /app/dist /app COPY nginx.conf /etc/nginx/nginx.conf
-
在專案根目錄建立
.dockerignore
檔案設定
.dockerignore
檔案能防止node_modules
和其他中間構建產物被複制到映象中導致構建問題。**/node_modules **/dist
-
在專案根目錄建立
nginx.conf
檔案Nginx
是一個能在 Docker 容器中執行的 HTTP(s) 伺服器。它使用配置檔案決定如何提供內容、要監聽的埠等。參閱Nginx 設定文件以瞭解所有可能的設定選項。下面是一個簡單的
Nginx
設定檔案,它會在80
埠上提供你的 Vue 專案。頁面未找到
/404
錯誤使用的是index.html
,這讓我們可以使用基於pushState()
的路由。user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /app; index index.html; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
-
構建你的 Docker 映象
docker build . -t my-app # Sending build context to Docker daemon 884.7kB # ... # Successfully built 4b00e5ee82ae # Successfully tagged my-app:latest
-
執行你的 Docker 映象
這個例子基於官方
Nginx
映象,因此已經設定了日誌重定向並關閉了自我守護程序。它也提供了其他有利於 Nginx 在 Docker 容器中執行的預設設定。更多資訊參閱Nginx Docker 倉庫。docker run -d -p 8080:80 my-app curl localhost:8080 # <!DOCTYPE html><html lang=en>...</html>
https://cli.vuejs.org/zh/guide/deployment.html#docker-nginx