extract-text-webpack-pluginReactを使用するときにウィンドウが定義されていないエラー


82

私はwebpackを使用してreactコンポーネントを構築しており、を使用しextract-text-webpack-pluginてcssを生成されたjsファイルから分離しようとしています。ただし、コンポーネントをビルドしようとすると、次のエラーが発生します Module build failed: ReferenceError: window is not defined

私のwebpack.config.jsファイルは次のようになります。

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
私は答えを見つけました。ExtractTextPlugin.extract('style-loader!css-loader')あなたが書く必要があるのではなくExtractTextPlugin.extract('style-loader', 'css-loader')
Ganonside 2015

3
それを答えに変換して、問題が解決したことを示すことができますか?ありがとう。
たJuhoVepsäläinen

今やりました。申し訳ありません。
ガノンサイド2015年

回答:


59

関数の引数style-loaderとして使用することをお勧めします。beforeextract

ネイティブ実装は次のとおりです。

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

つまり、基本的にあなたがする必要があるのは:

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

たとえば、を使用する場合sass


これは、スタイラスを使用している私にとっても解決しました。ありがとう@squixy!
ガブリエルゴドイ2016

1
sassではなくscssに問題がある場合は、indentedSyntax = trueを削除してください
Robert Leggett

43

原因の説明が見当たらないので、この回答をここに投稿しました。

https://github.com/webpack/extract-text-webpack-plugin#apiから

ExtractTextPlugin.extract([notExtractLoader], loader, [options]) 既存のローダーから抽出ローダーを作成します。

notExtractLoader (オプション)cssが抽出されない場合に使用する必要があるローダー(つまり、allChunks:falseの場合は>追加のチャンク内)

loader リソースをcssエクスポートモジュールに変換するために使用する必要があるローダー。

options

publicPath このローダーのpublicPath設定をオーバーライドします。

#extractこの方法は、その出力ローダーを受けるべきですcss。何が起こっていたのかというと、ウェブページに挿入することを目的としたjavascriptコードstyle-loaderを出力するが受信されていたということです。このコードはにアクセスしようとします。window

ローダー文字列をstyleに渡さないでください#extract。ただし...を設定するとallChunks=false、初期チャンク以外のCSSファイルは作成されません。したがって、ページに挿入するために使用するローダーを知る必要があります。

ヒント:Webpackは、本当に深く理解する必要があるツールです。そうしないと、多くの奇妙な問題が発生する可能性があります。


webpackについて聞いた中で最高のもの。
Jide 2016年

私の答えに説明がないことをお詫びします。質問と回答を投稿した時点では、webpackのドキュメントはまだ作成されていました(まだ作成されている可能性があります)。しかし、私はそれがかなりよく理解される必要があることに同意します。
ガノンサイド2016

1
ここに高品質のコンテンツ。ドキュメントがこれの半分であれば、私は本当に幸せなプログラマーになるでしょう。
ロシオ・ガルシア・ルケ

20

Webpack 2

Webpack 2を使用している場合、このバリエーションは機能します。

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

新しいextractメソッドは3つの引数をとらなくなり、V1からV2に移行する際の重大な変更としてリストされます。

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


12

私は自分の問題の解決策を見つけました:

ローダーを相互に配管する代わりに(ExtractTextPlugin.extract('style-loader!css-loader'))、各ローダーを個別のパラメーターとして渡す必要があります。ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')


8
これが@squixyが5か月前に行うと言ったことであることは間違いありません。
cchamberlain 2016

3
「各ローダーを個別のパラメーターとして」という記述は、2つのローダーにのみ当てはまり、3つ以上のローダーには当てはまりません。extractこの関数は3つのパラメータを取ります(before, loader, options)、そしてその完璧この回答カバー:stackoverflow.com/a/30982133/1346510
sompylasar

1
@sompylasarこのコメントありがとうございます。それは私の問題を解決しました!渡されたすべてのパラメータは単純にループスルーされると思いました。使用する必要がある場合は'style', 'css', 'sass'、次のように変更でき'style', 'css!sass'ます。ありがとうございます。
アレスキ2016

3
これは間違っています上記のコメントまたは回答を読んでください。誰かがこの回答を読んで、ExtractTextPluginがすべてのローダーを使用していない理由を理解できないため、これを太字で示しています。
ドンP

他の回答は他の人にも役立つようですが、質問を投稿したとき、これが私にとってうまくいったので、マークを付けました。
ガノンサイド2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.