Używam pakietu webpack do budowania moich komponentów reagowania i próbuję użyć extract-text-webpack-plugin
do oddzielenia mojego css od mojego wygenerowanego pliku js. Jednak, gdy próbuję zbudować komponentu pojawia się następujący błąd:
Module build failed: ReferenceError: window is not defined
.
Mój plik webpack.config.js wygląda następująco:
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: {
MainComponent: './src/main.js'
},
output: {
libraryTarget: 'var',
library: 'MainComponent',
path: './build',
filename: '[name].js'
},
module: {
loaders: [{
test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader!css-loader')
}]
},
plugins: [
new ExtractTextPlugin('styles.css')
]
}
ExtractTextPlugin.extract('style-loader!css-loader')
pisaćExtractTextPlugin.extract('style-loader', 'css-loader')
Odpowiedzi:
Możesz użyć
style-loader
jakobefore
argumentu wextract
funkcji.Oto natywna implementacja:
ExtractTextPlugin.extract = function(before, loader, options) { if(typeof loader === "string") { return [ ExtractTextPlugin.loader(mergeOptions({omit: before.split("!").length, extract: true, remove: true}, options)), before, loader ].join("!"); } else { options = loader; loader = before; return [ ExtractTextPlugin.loader(mergeOptions({remove: true}, options)), loader ].join("!"); } };
Więc w zasadzie to, co musisz zrobić, to:
{ test: /\.sass$/, exclude: /node_modules/, loader: ExtractTextPlugin.extract('style-loader', 'css!sass?indentedSyntax=true&sourceMap=true') },
jeśli na przykład używasz
sass
.źródło
Nie widziałem wyjaśnienia przyczyny, więc zamieściłem tę odpowiedź tutaj.
Z https://github.com/webpack/extract-text-webpack-plugin#api
#extract
Sposób powinien otrzymać Loader wyjściacss
. To, co się działo, polegało na tym, że otrzymywał plik,style-loader
który generuje kod javascript , który ma zostać wstrzyknięty na stronę internetową. Ten kod będzie próbował uzyskać dostępwindow
.Nie należy przekazywać ciągu ładującego z
style
do#extract
. Jednak ... jeśli ustawiszallChunks=false
, nie będzie budować plików CSS dla fragmentów innych niż początkowe. Dlatego musi wiedzieć, jakiego modułu ładującego użyć, aby wstrzyknąć na stronę.Wskazówka: Webpack to narzędzie, które naprawdę wymaga dogłębnego zrozumienia, w przeciwnym razie możesz napotkać wiele dziwnych problemów.
źródło
Pakiet internetowy 2
Jeśli używasz Webpack 2, ta odmiana działa:
rules: [{ test: /\.css$/, exclude: '/node_modules/', use: ExtractTextPlugin.extract({ fallback: [{ loader: 'style-loader', }], use: [{ loader: 'css-loader', options: { modules: true, localIdentName: '[name]__[local]--[hash:base64:5]', }, }, { loader: 'postcss-loader', }], }), }]
Nowa metoda wyodrębniania nie przyjmuje już trzech argumentów i jest wyświetlana jako istotna zmiana podczas przechodzenia z wersji V1 do V2.
https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-breaking-change
źródło
Znalazłem rozwiązanie mojego problemu:
Zamiast podłączać moduły
ExtractTextPlugin.extract('style-loader!css-loader')
ładujące do siebie nawzajem ( ), musisz przekazać każdy moduł ładujący jako oddzielny parametr:ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')
źródło
extract
Funkcja przyjmuje trzy parametry:(before, loader, options)
i ta odpowiedź pokryw, które doskonale: stackoverflow.com/a/30982133/1346510'style', 'css', 'sass'
mogę powiedzieć, że jeśli potrzebujesz , możesz po prostu zmienić to na'style', 'css!sass'
- Dzięki!