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.