項目在開發環境下工做正常,當打包後圖片不見了,檢查元素後發現路徑出錯了。
圖片路徑是這樣: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.js
的cssLoaders
的方法。webpack
if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader' }) }
若是是生產環境options.extract
值爲true
,會調用這個ExtractTextPlugin
插件作處理,它的做用是抽離項目中引用的樣式文件到一個獨立的CSS文件中,這樣就能夠一次加載全部的CSS文件,至關於CSS文件並行加載,能夠減小網絡請求次數,更多優勢及使用能夠查看ExtractTextWebpackPlugin。回到這個問題,它還有一個參數就是publicPath
,能夠覆蓋所指定的loader
的publicPath
配置,那麼就跟前面的配置同樣,能夠給全部的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