2016-02-17 4 views
9

मैं:जब Webpack और कोलाहल के साथ एक प्रतिक्रिया और Redux आवेदन संकलन केवल संपत्ति को पढ़ने के लिए आवंटित नहीं किया जा सकता '__esModule'

Uncaught TypeError: Cannot assign to read only property '__esModule' of #<Object>

कुछ पुराने ब्राउज़र में (< = क्रोम 1, एंड्रॉयड 4, सफारी 5)।

यह समस्या से redux और react-reduxlib निर्माण में लाइन exports.__esModule = true; outputting लेकिन अपने आवेदन के बजाय Object.defineProperty का उपयोग कर (क्योंकि वे build loosely और मुझे नहीं पता) स्टेम लगता है।

दो समाधान हैं:

  1. भी loose मोड में अपने आवेदन का निर्माण।

  2. react-redux/src और redux/src आयात करना और इसे उसी के साथ बनाना .babelrc एप्लिकेशन के रूप में (सबकुछ ढीला नहीं है)।

जब तक वे सुसंगत और दोनों कर रहे हैं के रूप में:

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

और exports.__esModule = true; मेरी उत्पादन में नहीं सह अस्तित्व है, सब कुछ काम करता है।

मेरा सवाल है, सही समाधान क्या है? यह केवल पुराने ब्राउज़र को क्यों प्रभावित करता है? और वे संघर्ष क्यों करते हैं?

यहां एक similar question है।

"plugins": [ 
    "babel-plugin-add-module-exports" 
] 

अधिक जानकारी के this website के लिए:

+1

मुझे यकीन नहीं है कि यह क्यों विफल होगा। इसे केवल मॉड्यूल की शुरुआत में ही असाइन किया जाता है, इसे कभी भी पुनः असाइन नहीं करना चाहिए, ताकि त्रुटि बहुत अजीब हो। क्या आप यह देखने में सक्षम हैं कि यह वास्तविक त्रुटि कहां फेंक रहा है? – loganfsmyth

+0

यह पहले आयातित मॉड्यूल में फेंकता है जहां 'निर्यात .__ esModule = true; 'मौजूद है। मुझे लगता है कि पहले 'ऑब्जेक्ट.डेफिनप्रॉपर्टी' के बाद माना जाता है कि साझा निर्यात ऑब्जेक्ट केवल पढ़ा जाता है, इसलिए असाइनमेंट बाद के मॉड्यूल में टूट जाता है जो कम से कम बनाए गए थे (लेकिन केवल ब्राउज़र में फेंकते हैं)। मैं पूरी तरह से निशान खो रहा हूं क्योंकि मुझे प्रदान किए गए लिंक के बगल में इस मुद्दे के साथ किसी और को खोजना प्रतीत नहीं होता है। –

+2

हालांकि मैं इस बारे में उलझन में हूं। 'निर्यात' साझा नहीं किया जाता है, इसे केवल एक ही मॉड्यूल में स्कॉप्ड किया जाना चाहिए। – loganfsmyth

उत्तर

2

मेरा अनुमान है, तो आप babel-plugin-add-module-exports और इस प्लगइन में अपने .babelrc रजिस्टर स्थापित करने की आवश्यकता।

4

Object.defineProperty कुछ एंड्रॉइड 4 स्टॉक ब्राउज़र संस्करणों और शायद अन्य ब्राउज़रों पर टूट गया है जो वेबकिट में एक छोटी गाड़ी कार्यान्वयन का उपयोग करते हैं।

this bug report और and this other one क्रोमियम प्रोजेक्ट को सूचित किया गया।

अच्छी खबर यह है कि आप समस्या को ठीक करने के लिए this polyfill लागू कर सकते हैं।

चीज़ को आसान बनाने के लिए, आप अपने पॉंडल से पहले <script> टैग पर उस पॉलीफ़िल को कॉपी और पेस्ट कर सकते हैं।

यह आपके मुद्दों को ठीक करेगा।

+0

बाहरी संसाधनों के लिंक को प्रोत्साहित किया जाता है, लेकिन कृपया लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चल जाएगा कि यह क्या है और यह क्यों है। यदि लक्षित साइट पहुंच योग्य नहीं है या स्थायी रूप से ऑफलाइन हो जाती है, तो हमेशा एक महत्वपूर्ण लिंक के सबसे प्रासंगिक भाग को उद्धृत करें। – pableiros

+0

@pableiros, किया। टिप्पणी के लिए धन्यवाद। – landabaso

0

मेरे मामले में, मैंने प्रवेश बिंदुओं में बेबेल-रजिस्टर लाइब्रेरी जोड़ने का हल किया।

webpack.config.js में (विन्यास की Webpack 1.x संस्करण)

// As is 
entry: { 
    main: 'index.js' 
}, 

// To be 
entry: { 
    main: ['babel-register', 'index.js'] 
}, 
0

हम Android 4.0 पर इस समस्या से मुलाकात की और वर्तमान में हम Android 4.0 के लिए समर्थन में कटौती नहीं कर सकते।

वेबपैक 1.0 के लिए, बस ढीला सेट करें: जब आप babel-preset-env का उपयोग कर रहे हों तो सही। हालांकि वेबपैक 2 के लिए, ढीला मोड इस समस्या को हल नहीं कर सकता है।

अंत में, हमें यह चाल, थोड़ी बदसूरत मिली।

// client_patch.js, For Android 4.0 
var defineProperty = Object.defineProperty; 
Object.defineProperty = function (exports, name) { 
    if (name === '__esModule') { 
    exports[name] = true; 
    return; 
    } 
    return defineProperty.apply(this, arguments); 
}; 

और अपनी वेबपैक कॉन्फ़िगरेशन फ़ाइल में।

// webpack.config.js 
entry: { 
    main: [ 
    path.resolve(__dirname, 'client_patch.js'), 
    'index.js' 
    ] 
} 
संबंधित मुद्दे