निकालने-पाठ-वेबपैक-प्लगइन रिएक्ट का उपयोग करते समय विंडो को त्रुटि नहीं मिली


82

मैं अपनी प्रतिक्रिया घटकों का निर्माण करने के लिए वेबपैक का उपयोग कर रहा हूं और extract-text-webpack-pluginअपनी जेनरेट की गई जेएस फाइल से अपनी सीएसएस को अलग करने के लिए उपयोग करने का प्रयास कर रहा हूं । हालाँकि, जब मैं घटक बनाने का प्रयास करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है 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')
गणेशसाइड

3
क्या आप इसे हल कर सकते हैं और एक समस्या को हल कर सकते हैं? धन्यवाद।
जुहो वेप्सलाएनन

मैंने अभी किया। उसके लिए माफ़ करना।
गणोंसाइड

जवाबों:


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


इसने मेरे लिए स्टाइलस के साथ काम करने का संकल्प लिया। धन्यवाद @squixy!
गेब्रियल गॉडॉय

1
यदि आप sass नहीं sss के साथ समस्या कर रहे हैं, तो indentSyntax को हटा दें = सही
रॉबर्ट लेगेट

43

कारण का स्पष्टीकरण नहीं देखा इसलिए मैंने यह उत्तर यहाँ पोस्ट किया है।

से https://github.com/webpack/extract-text-webpack-plugin#api

ExtractTextPlugin.extract([notExtractLoader], loader, [options]) मौजूदा लोडर से निकालने वाला लोडर बनाता है।

notExtractLoader (वैकल्पिक) लोडर (ओं) का उपयोग किया जाना चाहिए जब सीएसएस को नहीं निकाला जाता है (यानी जब एक अतिरिक्त चंक जब allChunks: false)

loader लोडर (ओं) का उपयोग संसाधन को css निर्यात मॉड्यूल में बदलने के लिए किया जाना चाहिए।

options

publicPath इस लोडर के लिए publicPath सेटिंग को ओवरराइड करें।

#extractविधि एक लोडर कि आउटपुट प्राप्त करना चाहिए css। क्या हो रहा था कि यह एक जावास्क्रिप्टstyle-loader आउटपुट को प्राप्त कर रहा था , जिसे एक वेबपेज में इंजेक्ट किया जाना था। यह कोड एक्सेस करने की कोशिश करेगा ।window

आप के साथ एक लोडर स्ट्रिंग पारित नहीं किया जाना चाहिए styleकरने के लिए #extract। हालांकि ... यदि आप सेट करते हैं allChunks=false, तो यह गैर-प्रारंभिक विखंडू के लिए सीएसएस फ़ाइलों का निर्माण नहीं करेगा। इसलिए यह जानना आवश्यक है कि पेज में इंजेक्ट करने के लिए किस लोडर का उपयोग किया जाए।

युक्ति: वेबपैक एक ऐसा उपकरण है जिसे वास्तव में गहराई से समझने की आवश्यकता है या आप बहुत सारे अजीब मुद्दों में भाग सकते हैं।


सबसे अच्छी चीजें जो मैंने कभी वेबपैक के बारे में सुना है।
जाइड

मेरे उत्तर में स्पष्टीकरण न होने का खेद है। जिस समय मैंने प्रश्न और उत्तर पोस्ट किया था उस समय भी वेबपैक डॉक्स लिखे जा रहे थे (और अभी भी हो सकते हैं)। लेकिन मैं मानता हूं कि इसे अच्छी तरह समझने की जरूरत है।
गणोंसाइड

1
यहाँ उच्च गुणवत्ता की सामग्री। अगर डॉक्स आधे से भी अच्छे थे, तो मैं वास्तव में खुश प्रोग्रामर बनूंगा।
रोसीओ गार्सिया लुके

20

वेबपैक २

यदि आप 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'- धन्यवाद!
एल्सकी

3
यह गलत है उपरोक्त टिप्पणी या उत्तर पढ़ें। इसे बोल्ड में डालना क्योंकि कोई व्यक्ति इस उत्तर को पढ़ेगा और यह नहीं समझ पाएगा कि ExtractTextPlugin अपने सभी लोडरों का उपयोग क्यों नहीं कर रहा है।
डॉन पी

अन्य उत्तर दूसरों के लिए काम करने लगते हैं लेकिन जब मैंने प्रश्न पोस्ट किया तो यह मेरे लिए काम कर रहा है इसलिए मैंने इसे चिह्नित किया।
गणोंसाइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.