2015-06-26 17 views
40

का उपयोग कर रूट निर्देशिका से नोड मॉड्यूल आयात करना मैं बेबेल ट्रांस्लर का उपयोग करके es6 के साथ एक नोड ऐप लिख रहा हूं।es6 और babel-node

मैं अपने रूट निर्देशिका पर 2 फ़ाइलें index.js & my-module.js है

- index.js 
- my-module.js 

मेरी-module.js

export let myFunc =() => { 
    console.log('myFunc was called!!!'); 
} 

index.js

import {myFunc} from './my-module'; 
myFunc(); 

अगर मैं निम्न पंक्ति को चलाने कमांड लाइन से सबकुछ अपेक्षित काम करता है।

$ babel-node index.js >> myFunc was called!!! 

लेकिन अगर मैं जब मेरे मॉड्यूल आयात करने डॉट को दूर:

import {myFunc} from '/my-module'; 
myFunc(); 

मैं एक त्रुटि हो रही है:

Error: Cannot find module '/my-module' 

किसी भी कारण है कि मैं का उपयोग कर मॉड्यूल आयात नहीं कर सकते एक पूर्ण पथ? वैसे भी इसे बदलने के लिए .babelrc कॉन्फ़िगरेशन को बदलने के लिए?

धन्यवाद

उत्तर

53

की तरह (लगभग) किसी भी उपकरण '/ एक्स' अपने फाइल सिस्टम के रूट में 'एक्स' का मतलब है। कोलाहल वास्तव में, रास्तों पर गौर नहीं करता यह सिर्फ

import {myFunc} from '/my-module'; 

संकलित

var _myModule = require('/my-module'); 

में और नोड वास्तव में मॉड्यूल को लग रहा है।


यदि आप वास्तव में प्रोजेक्ट की रूट के सापेक्ष आयात करना चाहते हैं, तो आप प्लगइन का उपयोग कर सकते हैं। मैं ऐसी किसी चीज का उपयोग करने की अनुशंसा करता हूं जो बहुत अस्पष्ट नहीं है, और सुनिश्चित करें कि आप इसे अपने कोड को पढ़ने वाले अगले व्यक्ति के लिए दस्तावेज़ दें!

यहां एक उदाहरण है जहां हम प्रोजेक्ट रिश्तेदार के लिए अग्रणी ~ का उपयोग करते हैं। आप जो भी चाहें उसका इस्तेमाल कर सकते हैं उदा। ^ भी अच्छा होगा।

उदाहरण इनपुट:

import {a} from '~my-module'; 
import {b} from '/my-module'; 
import {c} from './my-module'; 

लिपियों/कोलाहल-प्लगइन-परियोजना-रिश्तेदार-require.js

module.exports = function (babel) { 
    // get the working directory 
    var cwd = process.cwd(); 

    return new babel.Transformer("babel-plugin-project-relative-require", { 
    ImportDeclaration: function(node, parent) { 
     // probably always true, but let's be safe 
     if (!babel.types.isLiteral(node.source)) { 
     return node; 
     } 

     var ref = node.source.value; 

     // ensure a value, make sure it's not home relative e.g. ~/foo 
     if (!ref || ref[0] !== '~' || ref[1] === '/') { 
     return node; 
     } 

     node.source.value = cwd + '/' + node.source.value.slice(1); 

     return node; 
    } 
    }); 
}; 

.babelrc

{ 
    "plugins": [ 
     "./scripts/babel-plugin-project-relative-require.js" 
    ] 
} 

आउटपुट (अगर/tmp में चला):

'use strict'; 

var _tmpMyModule = require('/tmp/my-module'); 

var _myModule = require('/my-module'); 

var _myModule2 = require('./my-module'); 
+0

btw जब आपके संलग्न प्लगइन चल मैं निम्नलिखित मिल: लेखन त्रुटि: प्लगइन "./scripts/babel-plugin-project-relative-require। जेएस "एक प्लगइन उदाहरण – Gavriguy

+1

@Gavriguy अद्यतन बेबेल निर्यात नहीं किया था? सुनिश्चित करें कि स्थानीय और वैश्विक संस्करण अद्यतित हैं, 'npm i -g babel @ नवीनतम; npm i -D babel-core @ नवीनतम' – FakeRainBrigand

+0

एक बार जब मैंने प्लगइन को नोड मॉड्यूल के रूप में पैक किया ('npm https://github.com/gavriguy/babel-plugin-project-relative-require.git --save' इंस्टॉल करें) यह एक जादू की तरह काम करता है। बहुत सराहना @FakeRainBrigand – Gavriguy

7

सबसे पहले, बेबेल ES2015 से ES5 वाक्यविन्यास तक केवल एक ट्रांसपरर है।

import {myFunc} from '/my-module' 
इस में

: अपना काम इस transpile है

var _myModule = require('/my-module'); 

वास्तविक मॉड्यूल नोड द्वारा किया जाता आवश्यकता होती है, और कैसे नोड यह करता है तुम यहाँ विवरण में पढ़ सकते हैं: https://nodejs.org/api/modules.html#modules_file_modules

सारांश करने के लिए

, ./module का मतलब स्थानीय निर्देशिका से संबंधित मॉड्यूल का पथ है, /module मॉड्यूल के लिए एक पूर्ण पथ है, module स्थानीय node_modules निर्देशिका में मॉड्यूल की तलाश करने के लिए नोड को ट्रिगर करता है और सभी आरोही होते हैं।

39

FakeRainBrigand/Gavriguy का समाधान अच्छा है और अच्छी तरह से काम करता है। इसलिए मैंने एक प्लगइन विकसित करने का निर्णय लिया जिसे आप आसानी से एनपीएम के साथ स्थापित कर सकते हैं और एक सरल बेबेल-प्लगइन का उपयोग कर सकते हैं।

https://github.com/michaelzoidl/babel-root-import

आशा इस मदद करता है ...

+3

कोई समस्या नहीं होने के कारण मेरी समस्या हल करती है। धन्यवाद –

+1

इस प्लगइन में विंडोज़ ऑपरेटिंग सिस्टम के स्रोतपैथ दिए गए विंडोज़ पर काम करने में कुछ परेशानी हैं। लिनक्स पर यह ठीक विचार करता है – Borjante

+2

फिर से जांचें :) हम अंतिम रिलीज के बाद से विंडोज़ का समर्थन करते हैं \ o/ –