2017-07-25 63 views
1

我使用vue-cli爲我的vue項目搭建了一個webpack模板。隨後,我添加了Bulma的CSS。當我正常運行程序(npm run dev)時,CSS正確呈現。但是,在使用默認webpack配置構建生產項目(npm run build)時,Web應用程序的樣式現在未對齊。有誰知道如何解決這個問題?Vue Webpack構建突破布爾瑪CSS

對於比較:

Production Build of Vue with broken CSS

Dev version of Vue rendering CSS properly

以下是我的WebPack配置(webpack.prod.conf.js)

var path = require('path') 
 
var utils = require('./utils') 
 
var webpack = require('webpack') 
 
var config = require('../config') 
 
var merge = require('webpack-merge') 
 
var baseWebpackConfig = require('./webpack.base.conf') 
 
var CopyWebpackPlugin = require('copy-webpack-plugin') 
 
var HtmlWebpackPlugin = require('html-webpack-plugin') 
 
var ExtractTextPlugin = require('extract-text-webpack-plugin') 
 
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 
 

 
var env = config.build.env 
 

 
var webpackConfig = merge(baseWebpackConfig, { 
 
    module: { 
 
    rules: utils.styleLoaders({ 
 
     sourceMap: config.build.productionSourceMap, 
 
     extract: true 
 
    }) 
 
    }, 
 
    devtool: config.build.productionSourceMap ? '#source-map' : false, 
 
    output: { 
 
    path: config.build.assetsRoot, 
 
    filename: utils.assetsPath('js/[name].[chunkhash].js'), 
 
    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 
 
    }, 
 
    plugins: [ 
 
    // http://vuejs.github.io/vue-loader/en/workflow/production.html 
 
    new webpack.DefinePlugin({ 
 
     'process.env': env 
 
    }), 
 
    new webpack.optimize.UglifyJsPlugin({ 
 
     compress: { 
 
     warnings: false 
 
     }, 
 
     sourceMap: true 
 
    }), 
 
    // extract css into its own file 
 
    new ExtractTextPlugin({ 
 
     filename: utils.assetsPath('css/[name].[contenthash].css') 
 
    }), 
 
    // Compress extracted CSS. We are using this plugin so that possible 
 
    // duplicated CSS from different components can be deduped. 
 
    new OptimizeCSSPlugin({ 
 
     cssProcessorOptions: { 
 
     safe: true 
 
     } 
 
    }), 
 
    // generate dist index.html with correct asset hash for caching. 
 
    // you can customize output by editing /index.html 
 
    // see https://github.com/ampedandwired/html-webpack-plugin 
 
    new HtmlWebpackPlugin({ 
 
     filename: config.build.index, 
 
     template: 'index.html', 
 
     inject: true, 
 
     minify: { 
 
     removeComments: true, 
 
     collapseWhitespace: true, 
 
     removeAttributeQuotes: true 
 
     // more options: 
 
     // https://github.com/kangax/html-minifier#options-quick-reference 
 
     }, 
 
     // necessary to consistently work with multiple chunks via CommonsChunkPlugin 
 
     chunksSortMode: 'dependency' 
 
    }), 
 
    // split vendor js into its own file 
 
    new webpack.optimize.CommonsChunkPlugin({ 
 
     name: 'vendor', 
 
     minChunks: function (module, count) { 
 
     // any required modules inside node_modules are extracted to vendor 
 
     return (
 
      module.resource && 
 
      /\.js$/.test(module.resource) && 
 
      module.resource.indexOf(
 
      path.join(__dirname, '../node_modules') 
 
     ) === 0 
 
     ) 
 
     } 
 
    }), 
 
    // extract webpack runtime and module manifest to its own file in order to 
 
    // prevent vendor hash from being updated whenever app bundle is updated 
 
    new webpack.optimize.CommonsChunkPlugin({ 
 
     name: 'manifest', 
 
     chunks: ['vendor'] 
 
    }), 
 
    // copy custom static assets 
 
    new CopyWebpackPlugin([ 
 
     { 
 
     from: path.resolve(__dirname, '../static'), 
 
     to: config.build.assetsSubDirectory, 
 
     ignore: ['.*'] 
 
     } 
 
    ]) 
 
    ] 
 
}) 
 

 
if (config.build.productionGzip) { 
 
    var CompressionWebpackPlugin = require('compression-webpack-plugin') 
 

 
    webpackConfig.plugins.push(
 
    new CompressionWebpackPlugin({ 
 
     asset: '[path].gz[query]', 
 
     algorithm: 'gzip', 
 
     test: new RegExp(
 
     '\\.(' + 
 
     config.build.productionGzipExtensions.join('|') + 
 
     ')$' 
 
    ), 
 
     threshold: 10240, 
 
     minRatio: 0.8 
 
    }) 
 
) 
 
} 
 

 
if (config.build.bundleAnalyzerReport) { 
 
    var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 
 
    webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 
 
} 
 

 
module.exports = webpackConfig

回答

0

我正面臨着和你一樣的問題。經過一些調試後,我意識到這是由於css規則的順序。看起來,構建的css文件與開發服務器的規則順序不同。

我在這個主題上搜索了一下。在webpack文檔中,我發現:

請記住,管理模塊的執行順序很困難,因此請設計您的樣式表,以便順序無關緊要。 (你可以,但是,靠一個給定的CSS文件中的順序。)

我通過使用#id代替.class增加我的自定義CSS選擇器的特殊性解決我的問題。

例如:的

// my custom css rules 
#navbar a { 
    color: white 
} 

代替:

// my custom css rules 
.navbar a { 
    color: white 
} 

這樣的自定義規則兌布爾瑪者的順序並不重要,因爲優先將永遠爲idclass選擇。我希望這是有用的