webpack配置-打包后图片路径出错

webpack配置-图片路径出错

问题

项目在开发环境下工做正常,当打包后图片不见了,检查元素后发现路径出错了。
图片路径是这样:background: url(/static/img/bg_camera_tip.bd37151.png),但该路径下文件并不存在。
打包后文件目录以下:
图片描述
能够看到背景图片的路径应该是../../static而实际倒是/static,找到缘由后就好解决了javascript

方法一

查看build目录下webpack.base.conf.js的配置,图片文件会通过url-loader处理。css

module: {
    rules: [
      ...
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      ...
    ]
  }

它的做用是当文件大小小于limit限制时会返回一个base64串,其实就是把图片资源编码为base64串放在CSS文件里,这样就能够减小一次网络请求,由于每一张图片都是须要从服务端去下载的。可是若是文件太大了就会致使base64串很长,那放在CSS文件里面就会致使文件很大,CSS的文件下载时间变长,就得不偿失了,因此会有一个limit参数,在这个范围内的才会被转成base64串,它的单位是字节。对于这个问题,该loader还提供了一个publicPath参数,目的是修改引用的图片地址,默认是当前路径,那直接改它就能够了,即在options节点下添加一个参数publicPath: '../../'vue

module: {
    rules: [
      ...
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          publicPath: '../../', //你实际项目的引用地址前缀
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      ...
    ]
  }

方法二

webpack.base.conf.js里还有一条规则,每个vue文件都会通过vueLoaderConfig处理java

module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      ...
    ]
  }

vueLoaderConfig位于build/vue-loader.conf.js,它又调用了build/utils.jscssLoaders的方法。webpack

if (options.extract) {
      return ExtractTextPlugin.extract({
        use: loaders,
        fallback: 'vue-style-loader'
      })
    }

若是是生产环境options.extract值为true,会调用这个ExtractTextPlugin插件作处理,它的做用是抽离项目中引用的样式文件到一个独立的CSS文件中,这样就能够一次加载全部的CSS文件,至关于CSS文件并行加载,能够减小网络请求次数,更多优势及使用能够查看ExtractTextWebpackPlugin。回到这个问题,它还有一个参数就是publicPath,能够覆盖所指定的loaderpublicPath配置,那么就跟前面的配置同样,能够给全部的loader统一配置引用文件的路径地址。

另外这里的user:loader其实是返回一系列的loader的集合,cssLoaders的返回是web

return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
    sass: generateLoaders('sass', { indentedSyntax: true }),
    scss: generateLoaders('sass'),
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }

这也就是即使你没有在webpack.base.conf.js中配置sass-loader也能使用SASS语法的缘由。sass

相关文章
相关标签/搜索