extract-text-webpack-plugin React를 사용할 때 창 정의되지 않음 오류


82

내 반응 구성 요소를 빌드하기 위해 webpack을 사용하고 extract-text-webpack-plugin있으며 생성 된 js 파일에서 내 CSS를 분리 하는 데 사용하려고 합니다. 그러나 구성 요소를 빌드하려고하면 다음 오류가 발생 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

3
그것을 답으로 변환하고 해결 된 문제를 표시 할 수 있습니까? 감사.
Juho Vepsäläinen 2015-04-23

난 그냥했다. 미안합니다.
Ganonside 2015

답변:


59

함수 style-loader에서 before인수 로 사용할 수 있습니다 extract.

다음은 기본 구현입니다.

    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.


이것은 Stylus로 작업하는 저에게도 해결되었습니다. 감사합니다 @squixy!
Gabriel Godoy dec.

1
당신이하지 말대꾸하는 SCS에 문제가있는 경우, 다음 indentedSyntax = 진정한 제거
로버트 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. 무슨 일이 일어 났는지 웹 페이지에 삽입되도록 의도 된 자바 스크립트 코드style-loader 를 출력 하는 을 수신하고있었습니다 . 이 코드는 .window

당신과 로더 문자열을 전달하지 말아야 style#extract. 그러나 ...를 설정하면 allChunks=false초기가 아닌 청크에 대한 CSS 파일을 빌드하지 않습니다. 따라서 페이지에 삽입하는 데 사용할 로더를 알아야합니다.

팁 : Webpack은 정말로 깊이 이해해야하는 도구입니다. 그렇지 않으면 이상한 문제가 많이 발생할 수 있습니다.


내가 웹팩에 대해들은 최고의 것들.
Jide 2016 년

내 대답에 설명이 없어서 죄송합니다. 웹팩 문서는 제가 질문과 답변을 올렸을 당시에도 여전히 작성 중이었습니다. 그러나 나는 그것이 꽤 잘 이해 될 필요가 있다는 데 동의합니다.
Ganonside

1
여기에 고품질 콘텐츠. 문서가이 정도면 정말 행복한 프로그래머가 될 것입니다.
Rocío García Luque

20

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

새 추출 방법은 더 이상 세 개의 인수를 사용하지 않으며 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

3
"개별 매개 변수로서의 각 로더"는 두 개의 로더에 대해서만 참이고 세 개 이상의 경우에는 잘못되었습니다. extract: 함수는 세 개의 매개 변수를 취 (before, loader, options)그 완벽하고,이 응답 커버 : stackoverflow.com/a/30982133/1346510
sompylasar

1
@sompylasar이 의견에 감사드립니다. 내 문제가 해결되었습니다! 전달 된 모든 매개 변수가 곧바로 반복 될 것이라고 가정했습니다. 사용이 필요한 경우 'style', 'css', 'sass'다음으로 변경할 수 있습니다 'style', 'css!sass'. 감사합니다.
Aleski

3
이것은 잘못은 위의 의견이나 대답을 참조하십시오. 누군가이 답변을 읽고 ExtractTextPlugin이 모든 로더를 사용하지 않는 이유를 이해하지 못하기 때문에 이것을 굵게 표시하십시오.
Don P

다른 답변은 다른 사람들에게 효과가있는 것 같지만 질문을 게시했을 때 이것이 저에게 효과가 있었기 때문에 표시했습니다.
Ganonside
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.