extract-text-webpack-plugin React kullanılırken pencere tanımlanmadı hatası


83

React bileşenlerimi oluşturmak için webpack kullanıyorum ve css'imi extract-text-webpack-pluginoluşturulan js dosyamdan ayırmak için kullanmaya çalışıyorum . Ben bileşeni oluşturmak için girişimi Ancak, aşağıdaki hatayı alıyorum: Module build failed: ReferenceError: window is not defined.

Webpack.config.js dosyam şöyle görünüyor:

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')
  ]
}

5
cevabı buldum. yerine ExtractTextPlugin.extract('style-loader!css-loader')sen yazma zorundaExtractTextPlugin.extract('style-loader', 'css-loader')
Ganonside

3
Bunu bir cevaba çevirip sorunu çözüldü olarak işaretleyebilir misiniz? Teşekkürler.
Juho Vepsäläinen

Az önce yaptım. Bunun için üzgünüm.
Ganonside

Yanıtlar:


60

İşlevde style-loaderbir beforeargüman olarak kullanmak isteyebilirsiniz extract.

İşte yerel uygulama:

    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("!");
        }
    };

Temel olarak yapmanız gereken şey:

{
    test: /\.sass$/,
    exclude: /node_modules/,
    loader: ExtractTextPlugin.extract('style-loader', 'css!sass?indentedSyntax=true&sourceMap=true')
},

örneğin kullanırsanız sass.


Bu benim Stylus ile çalışmam için de çözüldü. Teşekkürler @quixy!
Gabriel Godoy

1
Sass değil scss ile ilgili sorun yaşıyorsanız, indentedSyntax = true
Robert Leggett öğesini

43

Nedeni hakkında bir açıklama görmedim, bu yüzden bu cevabı buraya gönderdim.

Gönderen https://github.com/webpack/extract-text-webpack-plugin#api

ExtractTextPlugin.extract([notExtractLoader], loader, [options]) Mevcut bir yükleyiciden bir ayıklama yükleyicisi oluşturur.

notExtractLoader (isteğe bağlı) css çıkarılmadığında kullanılması gereken yükleyiciler (yani allChunks: false olduğunda> ek bir yığın halinde)

loader kaynağı bir css dışa aktarma modülüne dönüştürmek için kullanılması gereken yükleyiciler.

options

publicPath bu yükleyici için publicPath ayarını geçersiz kılın.

#extractYöntem, bir yükleyici bu çıkışları almalıdır css. Olan şey, bir web sayfasına enjekte edilmesi amaçlanan bir javascript kodustyle-loader çıktı almasıydı . Bu kod erişmeye çalışacaktır window.

Sen bir yükleyici dizesi geçirmek olmamalıdır styleiçin #extract. Ancak ... ayarlarsanız allChunks=false, başlangıç ​​olmayan parçalar için CSS dosyaları oluşturmaz. Bu nedenle, sayfaya enjekte etmek için hangi yükleyicinin kullanılacağını bilmesi gerekir.

İpucu: Webpack, gerçekten derinlemesine anlaşılması gereken bir araçtır veya birçok garip sorunla karşılaşabilirsiniz.


Webpack hakkında duyduğum en iyi şeyler.
Jide

cevabımda bir açıklama olmadığı için üzgünüm. Soru ve cevabı yayınladığım sırada web paketi belgeleri hala yazılıyordu (ve hala yazılıyor olabilir). Ama oldukça iyi anlaşılması gerektiğine katılıyorum.
Ganonside

1
Burada yüksek kaliteli içerik. Dokümanlar bunun yarısı kadar iyi olsaydı, gerçekten mutlu bir programcı olurdum.
Rocío García Luque

20

Web paketi 2

Webpack 2 kullanıyorsanız, bu varyasyon çalışır:

    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',
            }],
        }),
    }]

Yeni ayıklama yöntemi artık üç bağımsız değişken almıyor ve V1'den V2'ye geçerken bir son değişiklik olarak listeleniyor.

https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-breaking-change


12

Sorunumun çözümünü buldum:

Yükleyicileri ExtractTextPlugin.extract('style-loader!css-loader')birbirine bağlamak yerine ( ), her bir yükleyiciyi ayrı bir parametre olarak aktarmanız gerekir:ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')


8
@Squixy'nin 5 ay önce söylediği şeyin bu olduğundan oldukça eminim.
cchamberlain

3
"Her yükleyici ayrı bir parametre olarak" ifadesi yalnızca iki yükleyici için geçerlidir ve üç veya daha fazlası için yanlıştır. extract: İşlev üç parametre alır (before, loader, options)o mükemmel ve bu cevap kapakları: stackoverflow.com/a/30982133/1346510
sompylasar

1
@sompylasar bu yorum için çok teşekkür ederim. Sorunumu çözdü! Geçirilen tüm parametrelerin düz döngüsel olacağını varsaydım. Kullanmanız gerekiyorsa, 'style', 'css', 'sass'o zaman değiştirebileceğinizi söylemekten mutluluk duyarız 'style', 'css!sass'- Teşekkürler!
Aleski

3
BU YANLIŞ yukarıdaki yorumları veya cevabı okuyun. Bunu kalın harflerle yazmak, çünkü birisi bu cevabı okuyacak ve ExtractTextPlugin'in neden tüm yükleyicileri kullanmadığını anlamayacaktır.
Don P

Diğer cevaplar başkaları için işe yarıyor gibi görünüyor, ancak soruyu gönderdiğimde benim için işe yarayan şey buydu, bu yüzden onu işaretledim.
Ganonside
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.