क्या उत्पादन में बेबल-नोड का उपयोग करना ठीक है


87

मैं ईएस 6 सिंटैक्स का समर्थन करने के लिए बैबिल-नोड का उपयोग करके एक साइट विकसित कर रहा हूं और बैबिलिफ़ ट्रांसफ़ॉर्म के साथ ब्राउज़र करता हूं।

मैं सिर्फ सोच रहा हूं, क्या मैं इसके बजाय उत्पादन में इसे चला सकता हूंbabel-node server node server नोड में ईएस 6 को चलाने के लिए मेरे पास और क्या विकल्प हैं?

यहां वे कमांड हैं जो मैं निर्माण और विकास में शुरू करने के लिए चला रहा हूं

// npm run build
browserify -t [babelify] client.js > public/js/bundle.js",

// npm start
babel-node server.js"

यहां मेरी देव निर्भरताएं हैं

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"

जवाबों:


114

क्लाइंट साइड कोड के लिए , आप सही काम कर रहे हैं। babelifyयह और यह ग्राहक के लिए जहाज।


सर्वर साइड कोड के लिए , मैं बैबिल-क्ली का उपयोग करके एक नियमित निर्माण करूंगा

के अनुसार http://babeljs.io/docs/setup/#babel_register , babel-registerहै उत्पादन प्रयोग के लिए नहीं - की आवश्यकता होती है हुक मुख्य रूप से साधारण मामलों के लिए सिफारिश की है।

बैबल 6+ के लिए

बैबल 6 के रूप में, कोई परिवर्तन डिफ़ॉल्ट रूप से शामिल नहीं है। तो चलो की स्थापना के द्वारा शुरू करते हैं babel-cliऔर babel-preset-es2015

$ npm install --save-dev babel-cli babel-preset-es2015

अपनी .babelrcफ़ाइल में एक परिवर्तन जोड़ें - यह वह प्रतिमान मॉड्यूल है जिसे हमने ऊपर डाउनलोड किया है। प्रीसेट की पूरी सूची पर एक नज़र डालें कि कौन सा आपके लिए सबसे अच्छा है।

{
  "presets": ["es2015"]
}

buildअपने लिए एक स्क्रिप्ट जोड़ें package.json। नीचे srcआपकी इनपुट फ़ाइलें हैं और buildपरिवर्तित आउटपुट फ़ाइलें हैं

"scripts": {
  "build": "babel src -d build"
}

फिर इसका निर्माण करें!

$ npm run build

फिर अपना कोड रन करें। इस बिंदु पर, आप अपनी buildनिर्देशिका में फ़ाइलों को निष्पादित करना चाहते हैं

$ npm start

बैबल <= 5 के लिए, बस आवश्यकता हुक का उपयोग करें।

require("babel/register");

एक्सटेंशन के साथ नोड द्वारा आवश्यक सभी बाद की फाइलें .es6 , .es , .jsx और .js बबेल द्वारा बदल दी जाएंगी। Polyfill भी स्वतः ही आवश्यक है।

आप अपने स्रोत फ़ाइलों को ES6 में रख पाएंगे, लेकिन फिर भी उनका उपयोग करके निष्पादित कर सकते हैं node server.js


आपकी टिप्पणियों के अनुसार, आपको थोड़ी परेशानी हो रही है। ऊपर दिए गए पीले उजागर भाग पर विशेष ध्यान दें। आपकी पहली फ़ाइल केवल ES5 हो सकती है, जो नोड द्वारा ही चलाई जाती है। सभी बाद की आवश्यकता है बबेल द्वारा बदल दी जाएंगी ...

यहाँ एक विशिष्ट सेटअप कैसा दिख सकता है

server.js

// only ES5 is allowed in this file
require("babel/register");

// other babel configuration, if necessary

// load your app
var app = require("./app.js");

app.js

// this file will be loaded through babel
// you can now use ES6 here and in every other include

आग लगाओ!

$ node server.js

9
वास्तव में मैंने अभी-अभी यह कोशिश की है, require("babel/register");अपने सर्वर में डाल रहा हूं। जेएस और जब मैं चलाऊंगा तो मुझे node server.jsत्रुटि मिलेगी: Unexpected reserved word: import ... इसलिए यह काम नहीं कर रहा था
svnm

1
@steveniseki मेरे अपडेट में यह दिखाया जाना चाहिए कि चीजों को कैसे उठना और चलाना है।
शुक्रिया

बहुत बढ़िया, इसके लिए बहुत बहुत धन्यवाद, मैंने वास्तव में मान लिया था कि यह मामला होगा और अपने सर्वर बनाने की कोशिश की। सभी ES5 में हैं, लेकिन यह काम करने के लिए प्रतीत नहीं हुआ, वैसे भी यह समाधान वास्तव में बहुत अच्छा है एक app करने के लिए एप्लिकेशन धक्का। js , और यह पूरी तरह से काम किया। धन्यवाद
svnm

उदाहरण परियोजना जो अब नोड सर्वर के साथ इस फैशन में काम करती है जेएस :) यहां है अगर कोई उदाहरण देखने के लिए इच्छुक है। यह प्रतिक्रिया राउटर, बैबल और ऑल्ट का उपयोग करके एक उदाहरण है, जिसका उपयोग मैं एक वास्तविक साइट के लिए करूंगा।
svnm

4
इस बीच यह आवश्यकता में बदल गया ("बेबल-रजिस्टर"); .. वैसे भी मुझे "अप्रत्याशित टोकन आयात" मिलता है ..
smotru

54

मैंने अभी इस विषय पर एक ब्लॉग पोस्ट लिखी है

Babeljs CLI प्रलेखन निम्नलिखित चेतावनी देता है:

उत्पादन के उपयोग के लिए बेबल-नोड का मतलब नहीं है

आपको उत्पादन में बैबल-नोड का उपयोग नहीं करना चाहिए। यह अनावश्यक रूप से भारी है, मेमोरी में संग्रहित होने के कारण उच्च मेमोरी उपयोग के साथ। आपको हमेशा एक स्टार्टअप परफॉर्मेंस पेनल्टी का भी अनुभव होगा क्योंकि पूरे ऐप को फ्लाई पर संकलित करना होगा।

यह एक उदाहरण है कि आप अपने ऐप को बबल-नोड के बजाय नोड के साथ चलाने के लिए एनपीएम स्क्रिप्ट कैसे सेट कर सकते हैं।

"scripts": {
  "clean": "rm -rf build && mkdir build",
  "build-css": "node-sass scss/app.scss public/css/app.css",
  "build-server": "babel -d ./build ./server -s",
  "build": "npm run clean && npm run build-css && npm run build-server",
  "lint": "eslint source/ --quiet",
  "start": "node ./build/index.js",
  "debug": "node --debug ./build/index.js",
  "test": "for i in $(ls tests/); do babel-node \"./tests/${i}\" | faucet ; done",
  "validate": "npm run lint; npm run test && npm outdated --depth 0"
},

आप ब्लॉग पोस्ट पर अधिक जानकारी पा सकते हैं


3
चूंकि नोड 4.0 ईएस 6 का समर्थन करता है, क्या हमें अभी भी कोड को संकलित करने के लिए बेबल का उपयोग करने की आवश्यकता है?
लवरात्रि

8
@LVarayut हां, सुविधाओं के आधार पर, बेबल को अभी भी सर्वर साइड की आवश्यकता है। नोड v4.0.0 सभी ES6 सुविधाओं (विशेषकर आयात / निर्यात सिंटैक्स के माध्यम से मॉड्यूल) का समर्थन नहीं करता है। विषय पर अधिक जानकारी के लिए, नोड्स। ओएन / डॉक्स / 6 देखें , या नोड --v8- विकल्प टाइप करें अभी तक लागू नहीं ES6 सुविधाओं की एक सूची प्राप्त करने के लिए एक टर्मिनल में grep "प्रगति में"।
jbmusso

@jbmusso आपकी शानदार व्याख्या के लिए धन्यवाद :)
lvarayut

14
बैबेल केवल ES6 के लिए ही नहीं है, बल्कि ESNext के लिए है। इसलिए यह लगातार ES7 से फीचर्स जोड़ता है और जैसे ही वे TC39 युक्ति में व्यवस्थित होते हैं, नवीनतम।
कूद्रमन

15

उत्पादन में बैबल-नोड का उपयोग करने के पेशेवरों और विपक्षों को तौलना महत्वपूर्ण है।

  • babel-nodeकमोडिटी हार्डवेयर पर स्टार्टअप की लागत में आधे से एक सेकंड के बीच जोड़ देता है। लेकिन अगर आपका ऐप एक लंबे समय से चल रहा सर्वर है, तो स्टार्टअप लागत बहुत मायने नहीं रखेगी।
  • अतिरिक्त मेमोरी खपत को मापने की कोशिश करें। उदाहरण के लिए मेरे ऐप के लिए (रीडिंग और प्रोसेसिंग टाइम सीरीज़ डेटा), यह केवल 20 एमबी था। आपकी स्थिति के आधार पर, यह महत्वपूर्ण हो सकता है या नहीं भी हो सकता है।

दूसरी ओर,

  • बैबल-नोड का उपयोग सीधे विकास को सरल करता है - आपको "बिल्ड" स्क्रिप्ट की आवश्यकता नहीं होगी, और आपके पास अलग src/ libऔर नहीं होंगेdist निर्देशिका
  • यदि आप importस्थानीय फ़ाइलों से, क्या आप से src/myutilsया से आयात करेंगे lib/myutils? प्रयोग babel-nodeकरने से वह समस्या दूर हो जाती है।

मैं केवल मॉड्यूल समर्थन के लिए बैबेल का उपयोग करता हूं। अब V8 ने 10 जनवरी, 2017 को मॉड्यूल के लिए समर्थन जारी किया । उम्मीद है कि हम कुछ महीनों में एक झंडे के नीचे नोड में मॉड्यूल का समर्थन देखेंगे, जो कि बेबल मूट का उपयोग करने के लिए मेरे कारण का प्रतिपादन करता है।


8

@ कद्रदान का जवाब @naomik से ज्यादा सटीक है।

अपने प्रश्न का संक्षिप्त उत्तर देने के लिए: नहीं, babel-nodeआपके द्वारा स्पष्ट रूप से आमंत्रित नहीं किया जाना चाहिए। babel-nodeएक निजी पुस्तकालय है जिसका उपभोग किया जाता हैbabel-cli

आधिकारिक ट्यूटोरियल में सब कुछ है जो आपको उठने और नोड पर चलने की आवश्यकता है (ब्राउज़र-साइड नहीं!): Https://github.com/babel/example-node-server । इसे पढ़ें! मुझे बहुत सारे भ्रामक ब्लॉग ट्यूटोरियल मिले जो कि तरीकों के बारे में गोल करते थे, और इस लेख का अनुसरण करना सबसे आसान था।

बोनस: कई लोगों को लगता है कि इसके विपरीत, ट्रांसप्लिंग जादू के सभी को स्थानीय रूप से स्थापित किया जा सकता है (उपयोग करते हुए npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2)। विश्व स्तर पर बैबेल या इसके किसी भी सहायक मॉड्यूल को स्थापित करने की आवश्यकता नहीं है! बहुत सुंदर निफ्टी।

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