1.history模式配置(設定mode:為history, base:基路徑’nginx上配置的目錄’)。
import Vue from 'vue';
import Router from 'vue-router';
const component = function(url) {
return () => import(`@/views/${url}`);
};
Vue.use(Router);
export default new Router({
mode: 'history', // hash / history
// /pwa-vue為nginx負載均衡配置的目錄,如果是根目錄則為“/”
base: process.env.NODE_ENV === 'production' ? '/pwa-vue' : process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: component('Home.vue')
},
{
path: '/about',
name: 'about',
component: component('About.vue')
}
]
});
nginx 配置。
# /pwa-vue/ vue base
location /pwa-vue/ {
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^/(.*) /pwa-vue/index.html last; # index放置的目錄
break;
}
}
mac 的 web 檔案放在下面,也就是
/usr/local/var/www/
===
proxy_pass
/usr/local/var/www/pwa-vue/
window 的打開下載下傳的nginx有一個html檔案夾,和上面的配置一樣扔裡面就行(Linux 的貌似也是html)。
打開頁面連結為
http://localhost/pwa-vue
2.開啟pwa配置,同時附上vue-cli3腳手架build及dev配置。(vue.config,js)
内容太多還是直接前往github檢視~
https://github.com/yaodongyi/javascript/blob/master/pwa-vuedemo/vue.config.js
3.registerServiceWorker.js裡面,配置内容更新時重新整理頁面。
// 在vue-cli3根目錄下的registerServiceWorker.js,有一個updated函數 (Dialog為vant的彈出框)
updated() {
Dialog.alert({
message: '您浏覽的網站有更新!'
}).then(() => {
window.location.reload(true);
});
console.log('New content is available; please refresh.');
},
5.附上本地調試nginx配置。
# 如果沒有https域名則直接用localhost,也就是按照上面的配置即可。
# 如果有https域名的話,配置443端口,url則為 https://waituntil.online/pwa-vue
server_name waituntil.online; # 這裡設定了https的域名 如果沒有則使用初始值
# server_name 127.0.0.1;
listen 443 ssl;
ssl_certificate ssl/*******_waituntil.online.pem; # 域名的pem 放在nginx下的ssl目錄
ssl_certificate_key ssl/*******_waituntil.online.key; # 域名的key 放在nginx下的ssl目錄
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
6.http axios攔截器。
說明 process.env.VUE_APP_API 開發環境,生産環境的檔案可以在項目根目錄增加 .env.development 和 .env.production 進行配置。
// http.js檔案
import axios from 'axios';
import qs from 'qs';
if (process.env.NODE_ENV === 'production') {
axios.defaults.baseURL = process.env.VUE_APP_API;
} else {
axios.defaults.baseURL = '/api';
}
axios.interceptors.request.use(
request => {
request.headers = {
// 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Content-Type': 'application/json; charset=UTF-8', //json
Accept: 'application/json'
};
// request.data = qs.stringify(request.data);
console.log(`%c 發送 ${request.url.replace(process.env.VUE_APP_API, '')} `, 'background:#00CC6E;color:#ffffff', request);
return request;
},
err => {
return Promise.reject(err);
}
);
axios.interceptors.response.use(
response => {
console.log(`%c 接收 ${response.config.url.replace(process.env.VUE_APP_API, '')} `, 'background:#1E1E1E;color:#bada55', response);
return response.data;
},
error => {
console.error(error);
return Promise.reject(error);
}
);
export default axios;
// 使用則 建立api.js檔案
import axios from './http.js';
/**
* 測試接口
* @param {Object} params
* @api {post} https://www.easy-mock.com/mock/5ccec7de7ffbe958f9bc418b/all
*/
export const all_api = params => {
return axios.get(`all`, params);
};