在很早以前,我寫了一篇 關於 在nginx上部署vue項目(history模式) 可是講的都是理論,因此今天作個demo來實戰下。有必要讓你們更好的理解,我發現搜索這相似的問題仍是挺多的,所以在寫一篇有關這方面的實戰文章。
在講解以前,咱們仍是和之前同樣,一步步來,先看下咱們項目的整個架構。javascript
|------- 項目的根目錄 | |--- app | | |--- index | | | |--- components | | | | |--- home.vue | | | | |--- index.vue | | | | |--- java.vue | | | | |--- node.vue | | | | |--- xxx.vue | | | |--- app.js | | | |--- router.js | |--- views | |--- package.json | |--- webpack.config.js
整個項目架構基本上如上一個簡單的結構。下面咱們來分別貼下代碼吧:css
app/index/components/index.vue 代碼以下:html
<style lang="stylus"> </style> <template> <div id="app"> <header> <router-link to="/home">Home</router-link> <router-link to="/java">java</router-link> <router-link to="/node">node</router-link> <router-link to='/xxx'>XXX</router-link> </header> <!-- 對應組件的內容渲染到router-view中 --> <router-view></router-view> </div> </template> <script type="text/javascript"> export default { data() { return { } } } </script>
app/index/components/home.vue 代碼以下:vue
<style lang='stylus'> .home-container width 100% </style> <template> <div class="home-container"> <h1>歡迎來到home頁面</h1> <router-view></router-view> </div> </template> <script type="text/javascript"> export default { data() { return { msg: '' } }, methods: { } } </script>
app/index/components/java.vue 代碼以下:java
<style lang='stylus'> .java-container width 100% </style> <template> <div class="java-container"> <h1>歡迎來到java類書籍</h1> <p>{{msg}}</p> </div> </template> <script type="text/javascript"> export default { data() { return { msg: '我是java組件' } }, methods: { } } </script>
app/index/components/node.vue 代碼以下:node
<style lang='stylus'> .node-container width 100% </style> <template> <div class="node-container"> <h1>歡迎來到node類書籍</h1> <p>{{msg}}</p> </div> </template> <script type="text/javascript"> export default { data() { return { msg: '我是node組件' } }, methods: { } } </script>
app/index/components/xxx.vue 代碼以下:webpack
<style lang='stylus'> .xxx-container width 100% </style> <template> <div class="xxx-container"> <h1>歡迎來到xxx</h1> <p>{{msg}}</p> </div> </template> <script type="text/javascript"> export default { data() { return { msg: '我是XXX組件' } }, created() { console.log(this.$route.params.id) } } </script>
app/index/app.js 代碼以下:nginx
import Vue from 'vue'; import Index from './components/index'; // 引入路由 import router from './router'; new Vue({ el: '#app', router: router, render: h => h(Index) }); app/index/router.js 代碼以下: import Vue from 'vue'; import VueRouter from 'vue-router'; // 告訴 vue 使用 vueRouter Vue.use(VueRouter); const routes = [ { path: '/home', name: 'home', component: resolve => require(['./components/home'], resolve) }, { path: '/java', name: 'java', component: resolve => require(['./components/java'], resolve) }, { path: '/node', name: 'node', component: resolve => require(['./components/node'], resolve) }, { path: '/xxx', name: 'xxx', component: resolve => require(['./components/xxx'], resolve) }, { path: '*', // 其餘沒有的頁面都重定向到 home頁面去 redirect: '/home' } ] var router = new VueRouter({ base: '', // 配置單頁應用的基路徑 routes: routes, mode: 'history' }); export default router;
如上就是全部的代碼。而後就是webpack.config.js 代碼了。git
webpack.config.js 代碼我就不貼代碼了,到時候你們能夠看下github源碼便可:github
package.json 代碼以下:
"scripts": { "dev": "webpack-dev-server --progress --colors --devtool cheap-module-eval-source-map --hot --inline", "build": "webpack --progress --colors --devtool cheap-module-source-map" },
如今一切準備就緒完成後,咱們運行 命令 npm run dev 後就能夠啓動咱們的服務了,而後當咱們訪問:
http://0.0.0.0:8083/java
就能夠看到以下信息了:
可是當咱們刷新下 就變成以下了:
具體什麼緣由,請看我以前的這篇文章解釋. 我這邊就再也不描述了。所以如今咱們須要在nginx上配置下便可。
實現步驟. 咱們首先 運行 npm run build 打包正式環境,而後在咱們的項目根目錄下會生成 dist 文件夾,而後再把咱們生成的dist 文件夾的全部頁面扔到nginx服務器下的html文件夾下。而後咱們就須要在nginx上配置便可。
首先執行 npm run build 打包,打包完成後,咱們能夠看到項目的根目錄下有dist目錄,以下所示:
而後咱們查看下 dist/index.html 頁面,會把css和js自動加上去,代碼以下:
如今咱們須要把dist目錄下的文件放到 nginx下的html文件夾下。所以咱們須要移動目錄了。
我本地的nginx的html目錄路徑是以下:/usr/local/Cellar/nginx/1.15.12/html 以下所示:
1. 咱們先須要在該html目錄下,新建一個文件夾,來保存全部的資源文件,假如我這邊叫 vuedemo. 建立文件以下所示:
2. 咱們如今把咱們的打包的dist目錄下的全部文件複製到 /usr/local/Cellar/nginx/1.15.12/html/vuedemo 目錄下:先進入咱們的項目根目錄下,使用命令:cp -Rf dist/* /usr/local/Cellar/nginx/1.15.12/html/vuedemo 以下所示:
而後咱們再查看下 /usr/local/Cellar/nginx/1.15.12/html/vuedemo 下的文件,看是否複製過來了沒,以下所示:
如今文件一切準備好了,如今咱們須要在咱們的nginx下配置便可:
3. 使用 sudo open /usr/local/etc/nginx/nginx.conf -a 'sublime text' 使用編輯器sublime打開)。
而後在nginx.conf 配置信息以下:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8022; server_name xxx.abc.com; root html/vuedemo; index index.html; location ~ ^/favicon\.ico$ { root html/vuedemo; } location / { index index.html index.htm; try_files $uri $uri/ @fallback; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location @fallback { rewrite ^.*$ /index.html break; } } include servers/*; }
注意:
1. 咱們的vuedemo的路徑是在nginx下的,如:/usr/local/Cellar/nginx/1.15.12/html/vuedemo 這個下的,vuedemo文件夾下是存放的是咱們使用webpack打包全部的dist目錄下的資源文件。以下所示:
所以咱們如上server中的root(根目錄) 是從 html/vuedemo 文件開始的。index index.html 這樣的,默認主頁面是 index.html. try_files的基本語法我這邊再也不描述,有興趣的話看我以前這篇文章
2. 是否注意到,我listen(監聽的)是 8022,原本應該是80的,這樣訪問頁面的時候就不用添加端口號,可是也不知道爲何我本地安裝的nginx默認的端口號不是80,而是8080. 因此若是我監聽80端口號的話,會有問題。所以這邊先無論。
如上配置完成後,咱們就能夠再頁面上訪問 http://xxx.abc.com:8022/home 就能夠訪問到頁面了,無論我頁面刷新多少次,都是這個頁面;以下所示:
點擊任何一個路由的話,好比點擊java路由,再刷新的話也是能夠的,以下所示:
所以nginx部署就完成了。