बाबेल 6.x में डिफ़ॉल्ट निर्यात मान की आवश्यकता नहीं हो सकती है


85

बाबेल 5.x में, मैं निम्नलिखित कोड लिख सकता हूं:

app.js

export default function (){}

index.js

require('babel/register');
require('./app')();

फिर, मैं node index.jsबिना किसी त्रुटि के चला सकता हूं । हालाँकि, बैबल 6.x का उपयोग करते हुए, निम्न कोड चला रहा है

index.es6.js

require('babel-core/register');
require('./app')();

एक त्रुटि के परिणामस्वरूप

आवश्यकता (...) एक फ़ंक्शन नहीं है

मैं जानना चाहता हूं क्यो?


क्या आपके पास एक है .babelrc? क्या आप कहीं बाबेल विकल्पों को निर्दिष्ट कर रहे हैं? मैं पूछता हूं क्योंकि बैबल 6 डिफ़ॉल्ट रूप से कुछ भी ट्रांसपाइल नहीं करता है और आप अपने द्वारा es2015पोस्ट किए गए कोड में प्रीसेट को निर्दिष्ट नहीं कर रहे हैं ।
इगोर रौश

@IgorRaush मेरे पास वास्तव में एक है .babelrc, अन्य es6 स्क्रिप्ट सामान्य रूप से चल रही है
XGHeaven

कृपया टैग विवरण पढ़ें। कहा नाम के साथ babelएक पायथन पुस्तकालय के लिए सवाल है ।
फेलिक्स क्लिंग

बस से एक समारोह का निर्यात नहीं है app.js, लेकिन अभी इसे चलाने
Bergi

@FelixKling क्षमा करें, मुझे अजगर में भी यही नाम नहीं पता है ...
XGHeaven

जवाबों:


156

टी एल; डॉ

आपको उपयोग करना होगा

require('./app').default();

व्याख्या

बैबल 5 के लिए एक संगतता हैक किया जाता था export default: यदि एक मॉड्यूल में केवल एक निर्यात होता है, और यह एक डिफ़ॉल्ट निर्यात था, तो इसे सौंपा गया था module.exports। तो, उदाहरण के लिए, अपने मॉड्यूल app.js

export default function () {}

यह करने के लिए स्थानांतरित किया जाएगा

"use strict";

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

exports["default"] = function () {};

module.exports = exports["default"];

यह पूरी तरहrequire से बैंग-ट्रांसप्लड मॉड्यूल (जैसे आप कर रहे हैं) के साथ संगतता के लिए किया गया था । यह असंगत भी था; यदि किसी मॉड्यूल में नामित और डिफ़ॉल्ट दोनों निर्यात होते हैं, तो यह require-d नहीं हो सकता है ।

वास्तव में, ES6 मॉड्यूल कल्पना के अनुसार, एक डिफ़ॉल्ट निर्यात नाम के साथ एक नामित निर्यात से अलग नहीं हैdefault । यह सिंटैक्टिक शुगर है जिसे संकलित समय पर सांख्यिकीय रूप से हल किया जा सकता है, इसलिए यह

import something from './app';

इस के रूप में ही है

import { default as something } from './app';

यह कहा जा रहा है, ऐसा प्रतीत होता है कि बाबेल 6 ने मॉड्यूल ट्रांसप्लिंग करते समय इंटरऑपरेबिलिटी हैक को छोड़ने का फैसला किया। अब, अपने मॉड्यूल app.js रूप transpiled है

'use strict';

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

exports.default = function () {};

जैसा कि आप देखते हैं, कोई और असाइनमेंट नहीं है module.exports। करने के लिए requireइस मॉड्यूल, आप सब करने की ज़रूरत

require('./app').default();

19
मेरे लिए require('./app').default;काम किया। default()लौट आयाundefined
थिंकलिनक्स

14
@thinklinux, require(...).defaultनिर्यात किए गए फ़ंक्शन का संदर्भ देता है। default()इसे कॉल करता है। यदि आपका फ़ंक्शन कुछ भी वापस नहीं करता है (या खाली है), तो, निश्चित रूप से, परिणाम होगा undefined
इगोर रौश

10
require('path').default()काम नहीं require('path').defaultकरता है, मेरे लिए काम करता है
ach m:46 पर ach आदमखोर

2
आप का उपयोग करना चाहिए require('./app').default;यदि आप एक समारोह के बजाय एक वस्तु निर्यात करते हैं।
टोकेंयेट

7

बस ऊपर सही उत्तर के साथ पालन करने के लिए।

यदि आप डिफ़ॉल्ट निर्यात व्यवहार का उपयोग करना चाहते हैं babel@5, तो आप babel-plugin-add-मॉड्यूल-निर्यात प्लगइन का प्रयास कर सकते हैं ।

यह मेरे लिए बहुत अच्छा काम कर रहा है।


2

अगर यह काम नहीं करता है

require('./app').default()

उपयोग

require('./app').default

फ़ंक्शन के बिना अंत में कॉल करें।


जैसा कि इगोर ऊपर टिप्पणी में कहते हैं ( stackoverflow.com/questions/33704714/… ) आपके उदाहरणों में से पहला फ़ंक्शन को कॉल करेगा जबकि दूसरा इसे एक संदर्भ देगा
स्टीफनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.