Wie zu stoppen FOUC bei der Verwendung von css geladen webpack
Ich bin immer FOUC beim laden von css in meinem Einstiegspunkt, wenn mit webpack. Wenn ich das entfernen meiner css geladen werden, von webpack und gehören einfach in meine html-Datei als normalen link dann das problem mit FOUC geht Weg.
Hinweis: Dies nicht nur mit bootstrap Rahmen, die ich getestet habe, mit
Stiftung und Materialisieren, mit dem gleichen Ergebnis
Den code unten geschrieben ist nur ein test Beispiel für mein problem mit Bootstrap.
Html-code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>Navbar example</h1>
</div>
</div> <!-- /container -->
<script src="build/bundle.js"></script>
</body>
</html>
bootstrap.js main entry point
import "../node_modules/bootstrap/dist/css/bootstrap.css";
import bootstrap from 'bootstrap'
$(document).ready(function () {
console.log('bootstrap loaded')
});
webpack.config.js
var path = require('path');
const ProvidePlugin = require('webpack/lib/ProvidePlugin');
const webpack = require("webpack");
module.exports = {
entry: './src/bootstrap.js',
output: {
path: path.join(__dirname, 'build'),
filename: 'bundle.js'
},
resolve: {
extensions: ['', '.js']
},
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
'window.jQuery': 'jquery'
})
],
devtool: 'inline-source-map',
module: {
resolve: {
modulesDirectories: ['node_modules']
},
loaders: [
{
test: path.join(__dirname, 'src'),
loader: 'babel-loader',
query: {
presets: ['es2015']
}
},
{ test: /\.css?$/, loader: 'style!css'},
{ test: /\.html$/, loader: 'html' },
{ test: /\.(png|gif|jpg)$/, loader: 'url', query: { limit: 8192 } },
{ test: /\.woff2(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'url', query: { limit: 10000, mimetype: 'application/font-woff2' } },
{ test: /\.woff(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'url', query: { limit: 10000, mimetype: 'application/font-woff' } },
{ test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file' },
]
}
};
Du musst angemeldet sein, um einen Kommentar abzugeben.
ExtractTextWebpackPlugin wird Ihnen erlauben, die Ausgabe Ihrer CSS als separate Datei, anstatt es eingebettet in Ihre JS-bundle. Dann können Sie diese Datei in Ihren HTML, die, wie Sie sagte, verhindert der flash of unstyled content.
Ich würde nur empfehlen, mit diesem in Produktionsumgebungen, wie es hält heiß-laden von der Arbeit und macht Ihren kompilieren dauern länger. Ich habe meine
webpack.config.js
eingerichtet, gelten nur für das plugin, wennprocess.env.NODE_ENV === "production"
; Sie bekommen noch die FOUC, wenn du tust, eine Entwicklung, Erstellung/Ausführung, die dev-server, aber ich fühle mich wie das ist ein fair-trade-off.Weitere Informationen, wie Sie diese einrichten, werfen Sie einen Blick auf SurviveJS s guide.
Update: Wie bereits angemerkt in den Kommentaren, ExtractTextWebpackPlugin wurde nun abgelöst durch mini-css-Auszug-plugin - sollte man stattdessen verwenden.
Etwas spät zur party, aber hier ist, wie ich es mache.
Während ich erkenne die Verdienste von Extrakt-text-plugin, es ist gezeichnet von einer rebuild-Fehler, vermasselt css um, und ist ein Schmerz zu richten. Und Einstellung der timeouts in js ist nicht etwas, was jeder tun sollte (es ist hässlich und ist nicht 100% garantiert, um zu verhindern, dass fouc)...
Also mein index.html ist:
Dann, in client.js ganz am Ende füge ich hinzu:
...und einblenden.css-enthält eine einzige Zeile:
Voila, Sie sehen nichts, bis die app geladen ist.
<body bgcolor="#19191C">
.Es ist kitschige, aber ich wickle ReactDom.render() in ein setTimeout() in mein root index.js Datei.
setTimeout(ReactDOM.render(...), 0)