2016-09-22 12 views
6

vue cliの使用。Vue Cli WebpackバックグラウンドURLパスの問題

何らかの理由で、私がscssで直接それらを参照し、それらを私のvueオブジェクトに動的にバインドしないと、イメージのいくつかが相対パスに問題があります。

私はボックスと呼ばれるdivを持つvueテンプレートがあります。 ボックスは、この背景のURLを持っています

■は{ 背景:私は、NPMの実行DEVを実行すると、ローカルだけで正常に動作し、URL( '../ IMG/box.jpg')

。 しかし、私がビルドを実行すると、動作しません。 404エラー。 また、私はこれをやって試してみました:

.box{ 
background: url('~../img/box.jpg') 

をそして、それは動作しませんでした。

だから、このあります:

webpack css-loader not finding images within url() reference in an external stylesheet

を私はwebpack.configでこれを変更する場合:

output: { 
    path: path.resolve(__dirname, './dist'), 
    publicPath: '/dist/', 
    filename: 'build.js' 
    }, 

へ:

output: { 
    path: path.resolve(__dirname, './dist'), 
    publicPath: './dist/', 
    filename: 'build.js' 
    }, 

それはでチャンクイメージを作成します私のwebpackはキャッシュするためのハッシュでビルドします。また、vueオブジェクトにバインドされていない特定のイメージに対してのみ。

そして、それらのイメージをルートdistフォルダにドラッグする必要があります。私がやりたいことではなく、htmlファイル(単にhtmlファイルです)を基準にしてimgフォルダに保存します。

<html lang="en"> 
    <head> 

    <meta charset="utf-8"> 
    <title>vue</title> 

    </head> 
    <body> 
    <script src="https://code.jquery.com/jquery-2.2.0.min.js"></script> 


    <app></app> 
    <script src="dist/build.js"></script> 
    </body> 
</html> 

質問ですが、データからすべての単一のイメージIDをバインドする必要がありますか...変更されないことがわかったら画像を直接参照することはできません。

また、私の嫌なローダー/ウェブパックにはいくつかの設定があります。

var path = require('path') 
var webpack = require('webpack') 

module.exports = { 
    entry: './src/main.js', 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    publicPath: './dist/', 
    filename: 'build.js' 
    }, 
    resolveLoader: { 
    root: path.join(__dirname, 'node_modules'), 
    }, 
    vue: { 
    html: { 
     root: path.resolve(__dirname, './dist') 
    } 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.vue$/, 
     loader: 'vue' 
     }, 
     { 
     test: /\.js$/, 
     loader: 'babel', 
     exclude: /node_modules/ 
     }, 
     { 
     test: /\.json$/, 
     loader: 'json' 
     }, 
     { 
     test: /\.html$/, 
     loader: 'vue-html' 
     }, 
     { 
     test: /\.scss$/, 
     loaders: ["style", "css", "sass"] 
     }, 
     { 
     test: /\.(png|jpg|gif|svg)$/, 
     loader: 'url', 
     query: { 
      limit: 10000, 
      name: '[name].[ext]?[hash]' 
     } 
     } 
    ] 
    }, 
    devServer: { 
    historyApiFallback: true, 
    noInfo: true 
    }, 
    devtool: '#eval-source-map' 
} 

if (process.env.NODE_ENV === 'production') { 
    module.exports.devtool = '#source-map' 
    // http://vue-loader.vuejs.org/en/workflow/production.html 
    module.exports.plugins = (module.exports.plugins || []).concat([ 
    new webpack.DefinePlugin({ 
     'process.env': { 
     NODE_ENV: '"production"' 
     } 
    }), 
    new webpack.optimize.UglifyJsPlugin({ 
     compress: { 
     warnings: false 
     } 
    }), 
    new webpack.optimize.OccurenceOrderPlugin() 
    ]) 
} 

答えて

0

は、私は、次の手順を使用して、問題を再現するために管理:次のディレクトリを想定し

root/ 
    dist/ 
    src/ 
    assets/ 
     |--box.jpg 
    components/ 
     |--home.vue 

と家庭

は、ここに私のWebPACKの設定です。VUE:アプリケーションを構築した後

<template> 
    <div class="foo"> 

    </div> 
</template> 

<script> 
    export default { 
    } 
</script> 

<style> 
    .foo { 
    background: url('../assets/box.jpg') 
    } 
</style> 

distフォルダ内のファイルを保存し、私はdistフォルダ(私は簡単にするためlite-serverを使用)の内側には、このコマンドを使用して作成されたファイルを提供する場合はすべての作品:

lite-server index.html 
私は戻ってルートフォルダに移動して、同じことをしようとした場合

しかし、:

​​

私は同じPROBが発生しますあなたはレムです。私は通常これを回避する方法

最初の画像をインポートして、インラインスタイルでそれを使用することです:

<template> 
    <div v-bind:style= "{ 'background-image': 'url(' + box + ')' }"> 
    Placeholder 
    </div> 
</template> 

<script> 
    // @ is an alias to /src 
    import box from '@/assets/box.jpg'; 

    export default { 
    data() { 
     return { box }; 
    } 
    } 
</script> 

はまた、以下の議論をチェックアウト:

0

どこルートセットに依存

を動作するはずです、あなたはそれらの background: url('~/assets/img/box.jpg')または background: url('~/src/assets/img/box.jpg')
1を試みることができます
関連する問題