1. 程式人生 > 實用技巧 >VUE部署

VUE部署

通用指南

如果你用 Vue CLI 處理靜態資源並和後端框架一起作為部署的一部分,那麼你需要的僅僅是確保 Vue CLI 生成的構建檔案在正確的位置,並遵循後端框架的釋出方式即可。

如果你獨立於後端部署前端應用——也就是說後端暴露一個前端可訪問的 API,然後前端實際上是純靜態應用。那麼你可以將dist目錄裡構建的內容部署到任何靜態檔案伺服器中,但要確保正確的publicPath

#本地預覽

dist目錄需要啟動一個 HTTP 伺服器來訪問 (除非你已經將publicPath配置為了一個相對的值),所以以file://協議直接開啟dist/index.html是不會工作的。在本地預覽生產環境構建最簡單的方式就是使用一個 Node.js 靜態檔案伺服器,例如

serve

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

。Vue Router 的文件提供了常用伺服器配置指引

#CORS

如果前端靜態內容是部署在與後端 API 不同的域名上,你需要適當地配置CORS

#PWA

如果你使用了 PWA 外掛,那麼應用必須架設在 HTTPS 上,這樣Service Worker才能被正確註冊。

#平臺指南

#GitHub Pages

#手動推送更新

  1. 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/'
        : '/'
    }
    
  2. 在專案目錄下,建立內容如下的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 自動更新

  1. 仿照上面在vue.config.js中設定正確的publicPath

  2. 安裝 Travis CLI 客戶端:gem install travis && travis --login

  3. 生成一個擁有“repo”許可權的 GitHub訪問令牌

  4. 授予 Travis 訪問倉庫的許可權:travis set GITHUB_TOKEN=xxx(xxx是第三步中的個人訪問令牌)

  5. 在專案根目錄下建立一個.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
    
  6. .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.ymlvue.config.js檔案。GitLab CI 的管道將會被觸發: 當成功時候, 到Settings > Pages檢視關於網站的連結。

#Netlify

  1. 在 Netlify 上,使用以下設定從 GitHub 建立新專案:

    • 構建命令:npm run buildyarn build
    • 釋出目錄:dist
  2. 點選“deploy”按鈕!

也可以檢視vue-cli-plugin-netlify-lambda

如果使用 Vue Router 的 history 模式,你需要在/public目錄下建立一個_redirects檔案:

# 單頁應用的 Netlify 設定
/*    /index.html   200

詳細資訊請檢視Netlify 重定向文件

#Render

Render提供帶有全託管 SSL,全球 CDN 和 GitHub 持續自動部署的免費靜態站點託管服務。

  1. 在 Render 上建立一個新的 Web Service,並授予 Render 的 GitHub 應用訪問你的 Vue 倉庫的許可權。
  2. 在建立過程中使用以下設定:
    • 環境:Static Site
    • 構建命令:npm run build或者yarn build
    • 釋出目錄:dist

大功告成!構建結束時你的應用便會在你的 Render URL 上線。

如果使用 Vue Router 的 history 模式,你需要在站點的Redirects/Rewrites設定中新增以下改寫規則:

  • Source:/*
  • Destination:/index.html
  • Status:Rewrite

詳細資訊請檢視 Render 的重定向和改寫自定義域名文件。

#Amazon S3

參見vue-cli-plugin-s3-deploy

#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.htmldist資料夾並且配置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.shURL) 部署你的 Vue 專案。

#步驟一:安裝 Now CLI

要使用npm安裝其命令列介面,執行以下命令:

npm install -g now

#步驟二:部署

在專案根目錄執行以下命令部署你的應用:

now

此外,你還可以使用他們的GitHubGitLab整合服務。

大功告成!

你的站點會開始部署,你將獲得一個形如https://vue.now-examples.now.sh/的連結。

開箱即用地,請求會被自動改寫到index.html(除了自定義的靜態檔案) 並帶有合適的快取請求頭。

#Stdlib

未完成 | 歡迎參與貢獻。

#Heroku

  1. 安裝 Heroku CLI

  2. 建立static.json檔案:

    {
      "root": "dist",
      "clean_urls": true,
      "routes": {
        "/**": "index.html"
      }
    }
    
  3. static.json加入 Git

    git add static.json
    git commit -m "add static configuration"
    
  4. 部署到 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

  1. Bitbucket 文件建立一個命名為<USERNAME>.bitbucket.io的倉庫。

  2. 如果你想擁有多個網站, 想要釋出到主倉庫的子資料夾中。這種情況下就要在vue.config.js設定publicPath

    如果部署到https://<USERNAME>.bitbucket.io/publicPath預設將被設為"/",你可以選擇忽略它。

    如果要部署到https://<USERNAME>.bitbucket.io/<SUBFOLDER>/,設定publicPath"/<SUBFOLDER>/"。在這種情況下,倉庫的目錄結構應該反映 url 結構,例如倉庫應該有/<SUBFOLDER>目錄。

  3. 在專案中,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 部署你的應用。

  1. 安裝Docker

  2. 在專案根目錄建立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
    
  3. 在專案根目錄建立.dockerignore檔案

    設定.dockerignore檔案能防止node_modules和其他中間構建產物被複制到映象中導致構建問題。

    **/node_modules
    **/dist
    
  4. 在專案根目錄建立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;
        }
      }
    }
    
  5. 構建你的 Docker 映象

    docker build . -t my-app
    # Sending build context to Docker daemon  884.7kB
    # ...
    # Successfully built 4b00e5ee82ae
    # Successfully tagged my-app:latest
    
  6. 執行你的 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