项目在开发模式下css中用url()引用图片是正常的,但是打包后图片路径却并没有被处理或者说特别怪异,导致本地图片资源无法加载。
图片采用了url-loader加载,如果小于10kb,图片则被转化成 base64 格式的 dataUrl。而css中大于10kb的图片,则连同css文件被打包进了js文件中,如果接受不了,可以强制把css从js文件中独立出来。
经常遇见的问题是 css 中 background-image 的相对路径不能正确的引用到 img 文件夹中。但是用 ExtractTextWebpackPlugin 的 publicPath 配置就可以。
对于用 vue-cli 生成的项目,dist 目录结构如下:
dist
├── index.html
└── static
├── css
├── img
└── js
更改 build/utils.js 文件中 ExtractTextPlugin 插件的options 配置:
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
publicPath: '../../', // 注意配置这一部分,根据目录结构自由调整
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
最后附上 extract-text-webpack-plugin 的文档
因为后台使用的接口是百度图片api,所以获取资源势必会产生跨域问题。 在项目中使用的是axios,作为轻量级http请求客户端,只封装了基础的http请求。 想要解决跨域问题,还需要进行额外的配置。
最简单的方法是在后台服务器进行代理转发,在开发环境和生产环境的解决方案如下:
vue-cli的config文件里有一个参数叫proxyTable。在vuejs-templates,也就是vue-cli的使用的模板插件里,有关于API proxy的说明,使用的就是这个参数。 https://vuejs-templates.github.io/webpack/proxy.html 这个参数主要是一个地址映射表,你可以通过设置将复杂的url简化,例如我们要请求的地址是api.xxxxxxxx.com/list/1,可以按照如下设置:
proxyTable: {
'/list': {
target: 'http://api.xxxxxxxx.com',
pathRewrite: {
'^/list': '/list'
}
}
}
这样我们在写url的时候,只用写成/list/1就可以代表api.xxxxxxxx.com/list/1. 那么又是如何解决跨域问题的呢?其实在上面的'list'的参数里有一个changeOrigin参数,接收一个布尔值,如果设置为true,那么本地会虚拟一个服务端接收你的请求并代你发送该请求,这样就不会有跨域问题了,当然这只适用于开发环境。增加的代码如下所示:
proxyTable: {
'/list': {
target: 'http://api.xxxxxxxx.com',
changeOrigin: true,
pathRewrite: {
'^/list': '/list'
}
}
}
vue-cli的这个设置来自于其使用的插件http-proxy-middleware github 深入了解的话可以看该插件配置说明,似乎还支持websocket,很强大的插件
使用nginx进行代理转发。
例如,我就将本地主机http请求
XXXXX/searchImg/
代理到 https://image.baidu.com
上,
并使用rewrite,将匹配到的url重写到百度image 的接口路径上。
/searchImg/
——> /search/acjson
server {
listen 80;
root /home/ubuntu/project;
server_name project.zyy1217.com;
location / {
try_files $uri $uri/ =404;
}
location ~ /searchImg {
rewrite ^(.*)$ /search/acjson break;
proxy_pass https://image.baidu.com;
}
}