VUE踩坑总结
本章记录在实际使用vue的过程中踩过的坑,以及解决办法,欢迎补充添加,请提issue
VUE项目部署后的路径
1、vue项目部署在服务器后刷新时会出现404的错误
解决办法见vue-router官网说明,需要后台配置和服务器设置
nginx服务器解决方案:修改.conf 配置文件
有两种解决方案
方案一
location / {
try_files $uri $uri/ @router;
index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
2
3
4
5
6
7
方案二
location / {
error_page 404 /index.html;
#try_file $uri $uri/ /index.html =404;
}
2
3
4
apach服务器解决方案(假设放在csdn目录下)分以下几步
1.配置路由:使用history模式,并且配置base
2.在config/index.js文件里的assetsPublicPath改成你放在服务器的文件路径里,根目录就是‘/’ 如果是放在某个文件夹,例: /csdn/‘’
3.修改Apache的httpd.conf文件,使其支持 .htaccess
4.在对应的文件夹项目下添加.htaccess文件,(这里需要注意的是因为windows不支持无文件名的格式 即 .***, 所以需要先新建一个文本文档,把内容写好,然后ftp上传到对应目录,然后重命名,这里重命名后会看不到,需要把ftp设置为可以查看隐藏文件)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /csd/
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /csd/index.html [L]
</IfModule>
2
3
4
5
6
7
8
5.重启服务器 这里也是在网上搜到的方法,nginx的亲测可用,Apache未亲测
配置以后可能仍然会报错,仔细查看发现是路径问题
// config/index.js
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/', //部署时一定不能改成./ 会导致多层嵌套路由刷新时路径出错
2
3
4
5
6
7
8
9
10
关于上面的路径问题,需要特别说明一下,vuecli的版本3.xx开始没必要手动配置上面的路径,2.xx版本的默认也是不需要配置的,但是网上有很多教程会告诉你那里的'/'要改成'./',才能在本地不报错,服务器部署时请一定记得改回来
2、vue项目打包部署后icon或图片不能正常显示的问题
(虽未实测,该问题貌似在vuecli 3.xx版本不存在,所以个人强烈建议使用3.xx)
方法一:在build/utils文件中的下图所示位置添加../../公共路径
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath:'../../' //解决部署时img路径问题
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
2
3
4
5
6
7
8
9
10
方法二和三请点这里
style-loder 无法自己设置publicpath, 所以只能在ExtractTextPlugin后的css目录路径 和 webpack.base.conf做文章的,
方法二:是在webpack.base.conf 里设置assetsPublicPath:'/' 根目录,assetsSubDirectory: './在服务器中的相对路径/static',
config/index.js
assetsSubDirectory: 'AbsolutePath/projectPath/static',
assetsPublicPath: '/',
2
方法三:是在ExtractTextPlugin,css目录路径,把脱离出来的css路径裸在项目路径,在webpack.prod.conf中设置
// 不需要提到static/css 中
//new ExtractTextPlugin(utils.assetsPath('css/[name].[contenthash].css')),
new ExtractTextPlugin('[name].[contenthash].css'),
2
3
config/index.js
assetsSubDirectory: 'static',
assetsPublicPath: './',
2
总结
以上三种方法都可以解决img在部署时的路径问题,首推方法一,在知道项目的绝对路径时可以用方法二,不知道项目的绝对路径可以用方法三,(只是css文件裸在youproject中,看起来很low)
实现动态修改服务器URL方法
需求:服务器地址(API的base_url)可以手动修改
实现方法可能不止一种,下面是个人觉得最简单最易理解的一种
1、在public文件夹内创建settings.json文件
这个文件就是需要手动更改的服务器地址,因为在public文件夹内,所以不会被webpack打包,只会被复制到build后的dist文件夹内
{
"api_baseURL":"http://172.16.75.170"
}
2
3
2、main.js内,vue实例化部分代码,其他无关代码略
当settings.json文件内地址更改后,刷新页面就会按照新地址重新配置axios的baseURL,即每次实例化vue之前都会获取当时设置的api_baseURLapi地址
const getConfigJson = function () {
Axios.get('/settings.json').then(res => {
// 挂载到vue上,成为全局属性
// Vue.prototype.api_baseURL = res.data.api_baseURL
// 设置为每次请求的base_url
Axios.defaults.baseURL = res.data.api_baseURL + '/api/'
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: {
App
},
// template: '<App/>'
render: h => h(App)
})
}).catch(err => console.log(err))
}
getConfigJson()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20