赞
踩
默认的vue项目是部署到网站根目录的。
但是,有些情况下,一个域名内需要放置多个内容。所以,只能分子域名或是子目录来部署。
譬如,当前网站的域名是:www.abc.com
使用nginx做代理的时候,分配给我们的部署vue项目的域名地址是:www.abc.com/vuedemo
先看nginx的配置:
location / {
root html;
index index.html index.htm;
gzip_static on;
}
location /vuedemo/ {
alias /usr/local/nginx/html/vuedemo/;
try_files $uri $uri/ /vuedemo/index.html;
index index.html index.htm;
}
意思是,访问www.abc.com
就指向根目录的index.html
访问www.abc.com/vuedemo
就指向根目录下面的vuedemo
这个文件夹内的index.html
这里,咱们前端不需要管到底放置到哪里。只需要知道,最后是通过哪个域名访问到我们的vue项目的index.html文件的。这里就是vuedemo
一般来说,我们在本地开发的时候,肯定是是/
,部署的时候,才换成vuedemo
所有解决办法是(针对vue路由的#哈希模式,history模式大体一致):
1、vue.config.js中的配置添加publicPath
publicPath: process.env.NODE_ENV === "production" ? "/vuedemo/" : "/",
2、因为我们是vue路由是哈希模式,所有关于改路由的base
,不用改,哈希模式不生效.
new VueRouter({
// mode: 'history', // require service support
// base:'vuedemo', 不用改,哈希不生效
routes: constantRoutes
});
3、以上解决了打包后的css、js文件引入问题。但是,还是没有解决我们vue目录下的public目录。这里面的文件,打包后是访问不到的。
譬如背景图,我们就不能写在css里,需要改写为style绑定模式
// background: #f0f2f5 url('/images/background.5825f033.svg') no-repeat 50%;
需要改写为:
handleLoginStyle() {
let url = getBaseUrl() + 'images/background.5825f033.svg'
return {
backgroundColor: '#f0f2f5',
backgroundImage: `url(${url})`,
backgroundRepeart: 'no-repeat',
backgroundPosition: '50%',
}
},
这里,我们封装了方法:
// 设置静态资源根路径(用于访问public内的图片等)
export function getBaseUrl() {
let baseUrl = ''
if (process.env.NODE_ENV === 'development') {
// 开发模式
baseUrl = '/'
} else {
// 生产环境
baseUrl = '/vuedemo/'
}
return baseUrl
}
当然,也可以直接使用vue-cli中webpack提供的环境变量。 总之,就是根据开发环境和生产环境来动态确定前缀了,不能直接一味使用/
类似,其他的代码内,引入public目录的,因为不参与打包,而是直接拷贝的,这里的文件路径,都需要做类似处理。
譬如如下写法生产环境下改为相对路径也是可以的:
language_url:process.env.NODE_ENV === 'development'? '/tinymce/langs/zh_CN.js': '../tinymce/langs/zh_CN.js',
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。