2017-07-25 3 views
1

Ich rüste eine Webpack-Vorlage für mein Vue-Projekt mit dem Vue-CLI. Anschließend fügte ich Bulmas CSS hinzu. Wenn ich das Programm normal ausführe (npm run dev), rendert das CSS richtig. Wenn Sie jedoch das Projekt für die Produktion (npm run build) mit der Standardkonfiguration für das Webpack erstellen, ist das Design der Webanwendung nicht mehr korrekt ausgerichtet. Kann jemand dieses Problem lösen?Vue Webpack Build bricht Bulma CSS

Zum Vergleich:

Production Build of Vue with broken CSS

Dev version of Vue rendering CSS properly

Das folgende ist mein webpack config (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

Antwort

0

Ich hatte das gleiche Problem wie Sie. Nach einigem Debuggen merke ich, dass dies auf die Reihenfolge der CSS-Regeln zurückzuführen ist. Es scheint, dass die eingebaute CSS-Datei nicht die gleiche Reihenfolge wie der Dev-Server hat.

Ich suchte ein wenig zu diesem Thema. Auf der Webpack-Dokumentation habe ich Folgendes gefunden:

Denken Sie daran, dass es schwierig ist, die Ausführungsreihenfolge der Module zu verwalten, also gestalten Sie Ihre Stylesheets so, dass die Reihenfolge keine Rolle spielt. (Sie können jedoch verlassen sich auf die Reihenfolge innerhalb einer bestimmten CSS-Datei.)

ich mein Problem gelöst durch die Spezifität von meiner benutzerdefinierten CSS-Selektoren zu erhöhen, indem #id statt .class verwenden.

ex:

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

statt:

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

So ist die Reihenfolge der benutzerdefinierten Regeln im Vergleich zu den bulma diejenigen, spielt keine Rolle, weil die Priorität immer für die id über die class sein Wähler.

Ich hoffe, das ist nützlich