SyntaxError: किसी मॉड्यूल के बाहर आयात विवरण का उपयोग नहीं कर सकता


52

मुझे एक अपोलोस्वर परियोजना मिली है जो मुझे परेशानी दे रही है, इसलिए मैंने सोचा कि मैं इसे अपडेट कर सकता हूं और नवीनतम बैबेल का उपयोग करते समय मुद्दों में भाग सकता हूं। मेरा "index.js" है:

require('dotenv').config()
import {startServer} from './server'
startServer()

और जब मैं इसे चलाता हूं तो मुझे त्रुटि मिलती है "SyntaxError: किसी मॉड्यूल के बाहर आयात विवरण का उपयोग नहीं कर सकता"। पहले मैंने टीपीटीबी को समझाने की कोशिश की * कि यह एक मॉड्यूल था (बिना किसी सफलता के)। इसलिए मैंने "आयात" को "आवश्यकता" में बदल दिया और यह काम किया।

लेकिन अब मेरे पास अन्य फाइलों में लगभग दो दर्जन "आयात" हैं जो मुझे एक ही त्रुटि दे रहे हैं।

* मुझे यकीन है कि मेरी समस्या की जड़ यह है कि मुझे यह भी निश्चित नहीं है कि समस्या के बारे में क्या शिकायत है। मैंने मान लिया कि यह बैबेल 7 था (चूंकि मैं बैबेल 6 से आ रहा हूं और मुझे प्रीसेट बदलना था) लेकिन मुझे यकीन नहीं है।

समाधान के लिए मैंने जो पाया है, उसमें से अधिकांश सीधे नोड पर लागू नहीं होते हैं। यहाँ इस तरह एक:

ES6 मॉड्यूल आयात "बिना सिंटैक्स ई-मेल: अनपेक्षित पहचानकर्ता"

कहते हैं, यह "प्रकार = मॉड्यूल" जोड़कर हल किया गया था, लेकिन यह आमतौर पर HTML में जाता है, जिनमें से मेरे पास कोई नहीं है। मैंने अपने प्रोजेक्ट के पुराने प्रीसेट का उपयोग करने की भी कोशिश की है:

"presets": ["es2015", "stage-2"],
"plugins": []

लेकिन इससे मुझे एक और त्रुटि मिलती है: "त्रुटि: प्लगिन / प्रीसेट फ़ाइलों को ऑब्जेक्ट्स को निर्यात करने की अनुमति नहीं है, केवल फ़ंक्शन।"

अद्यतन: यहाँ पर निर्भरताएँ हैं:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",

1
नमस्ते, अभी वही समस्या है। क्या आप अपनी निर्भरता भी साझा कर सकते हैं? शायद आपके अपडेट से पहले और बाद में भी अंतर हो। मैं खदान के खिलाफ जांच कर सकता हूं कि क्या हम समान पैकेज पा सकते हैं जो परेशानी का कारण हो सकता है।
lynx

मैंने बस "आवश्यकता" के साथ सभी "आयात" को बदल दिया और अब सब ठीक है। गूंगा लेकिन अभी इसे पता लगाने के प्रयास के लायक नहीं था। हालांकि, मैं निर्भरता के साथ मूल को अपडेट करूंगा। यदि आपको कोई सुराग मिलता है, तो मैं अपने मूल कोड के खिलाफ उनकी जांच करूंगा।
user3810626

1
कॉमनजेएस सिंटैक्स (आवश्यकता और मॉड्यूल.एक्सपोर्ट्स) नोड के लिए मूल प्रारूप था और वेबपैक भी इसका समर्थन करता है, लेकिन ईएस 6 मॉड्यूल सिंटैक्स (निर्यात, आयात) नया तरीका है और अब नोड और वेबपैक इसका समर्थन करते हैं। मैंने पढ़ा कि नोड अब आयात का समर्थन करता है, लेकिन इतने सारे ट्यूटोरियल को शुद्ध नोड सामान की आवश्यकता होती है जो नोड के लिए उस सिंटैक्स का उपयोग करना बेहतर होता है।
टेड फिट्ज़पैट्रिक

1
अंत में, मेरे लिए जाने का रास्ता ऐसा प्रतीत हो रहा था: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 प्रीसेट को इन jest.config.jsपर सेट करना 'ts-jest/presets/js-with-ts'- अभी भी कुछ अन्य हैं लेकिन इससे बड़ा हल हो गया। ..... उह, मेरी समस्या संबंधित परीक्षण कर रही थी ... सामान्य बिल्ड ठीक थे
lynx

लिंक्स, दिलचस्प। जेस्ट का उपयोग नहीं, खुद। टेड, दिलचस्प है। ठीक है, मैं इसे पसीना नहीं करूँगा।
user3810626

जवाबों:


50

2020 अपडेट (नोड 13.2.0+)

सत्यापित करें कि आपके पास Node का नवीनतम संस्करण स्थापित है। --experimental-modulesझंडा आवश्यक नहीं रह गया है। बस निम्न में से एक करें :

  • "type": "module"निकटतम माता-पिता में जोड़ें package.json। इसके साथ, सभी .jsऔर .mjsफ़ाइलों को ईएस मॉड्यूल के रूप में व्याख्या की जाती है। आप .cjsएक्सटेंशन का उपयोग करके व्यक्तिगत फ़ाइलों को कॉमन जेएसएस के रूप में व्याख्या कर सकते हैं ।

या

  • .mjsविस्तार के साथ स्पष्ट रूप से नाम फ़ाइलों । अन्य सभी फाइलें, जैसे कि .jsकॉमनजेएस के रूप में व्याख्या की जाएंगी, जो कि डिफॉल्ट है यदि typeइसमें परिभाषित नहीं किया गया है package.json

यदि मैं इसका उपयोग करता हूं, तो आवश्यक फ़ाइल के लिए "js" को शामिल करने के लिए पथ बदलें, फिर आवश्यक फ़ाइल में निर्यात विवरणों के प्रारूप को बदलें, और फिर "आयात" से सभी "आवश्यक" बयानों को ले लें -खोज अब "आवश्यकता" अज्ञात है - यह काम करेगा, इसलिए मैं इस उत्तर को स्वीकार करूंगा।
user3810626

2
यह वास्तव में एक विकल्प नहीं है यदि समस्या नोड_मॉड्यूल्स / अधिकार के तहत है? किसी भी विचार कैसे उस मामले में तय करने के लिए?
ट्रेंट बिंग

18

आधिकारिक दस्तावेज के अनुसार ( https://nodejs.org/api/esm.html#esm_code_import_code_statements ):

केवल ईएस मॉड्यूल में आयात विवरण की अनुमति है। CommonJS में समान कार्यक्षमता के लिए, आयात () देखें।

नोड को अपनी फ़ाइल को ES मॉड्यूल के रूप में मानने के लिए आवश्यक है ( https://nodejs.org/api/esm.html#esm_en enable ):

  • "प्रकार" जोड़ें: "मॉड्यूल" को package.json में जोड़ें
  • नोड कॉल में "--experimental-मॉड्यूल" ध्वज जोड़ें

6

मेरे पास एक ही मुद्दा था और निम्नलिखित ने इसे ठीक कर दिया (नोड 12.13.1 का उपयोग करके):

  • .Js फ़ाइलों को .mjs में बदलें
  • अपने ऐप को चलाने पर --experimental-मॉड्यूल ध्वज जोड़ें।
  • वैकल्पिक: अपने पैकेज में "प्रकार" जोड़ें: "मॉड्यूल"। json

अधिक जानकारी: https://nodejs.org/api/esm.html


0

मुझे एक एक्सप्रेस एक्सप्रेस एपीआई परियोजना में यह समस्या थी।

आपत्तिजनक सर्वर कोड src/server/server.js:

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

यहाँ मेरे आश्रित थे:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

और यहाँ धावक था जिसने त्रुटि को फेंक दिया:

nodemon --exec babel-node src/server/server.js --ignore dist

यह निराशाजनक था, क्योंकि मेरे पास एक समान एक्सप्रेस परियोजना थी जो ठीक काम करती थी।

समाधान सबसे पहले इस निर्भरता को जोड़ने के लिए किया गया था:

npm install @babel/preset-env

और फिर babel.config.jsपरियोजना रूट में ए का उपयोग करके इसे तार करने के लिए :

module.exports = {
  presets: ['@babel/preset-env'],
};

मैं पूरी तरह से नहीं करता कि यह क्यों काम करता है, लेकिन मैंने इसे एक आधिकारिक स्रोत से कॉपी किया है , इसलिए मैं इसके साथ रहना चाहता हूं।


-2
  1. मुझे वही समस्या थी जब मैंने बाबेल का उपयोग करना शुरू किया था ... लेकिन बाद में, मेरे पास एक समाधान था ... मुझे अब तक कोई समस्या नहीं हुई है ... वर्तमान में, नोड v12.14.1, "@ बेबल / नोड" : "^ 7.8.4", मैं निष्पादित करने के लिए बैबल-नोड और नोडमॉन का उपयोग करता हूं (नोड ठीक है ..)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!! नोट: server.js मेरी प्रविष्टि फ़ाइल है, आप आपका उपयोग कर सकते हैं।
  3. launch.json जब आप डीबग करते हैं, तो आपको अपनी लॉन्च .json फ़ाइल "runtimeExecutable" को भी कॉन्फ़िगर करने की आवश्यकता होती है: "$ {workspaceRoot} /node_modules/.bin/babel-node" !! नोट: प्लस runtimeExecutable कॉन्फ़िगरेशन में।
  4. बेशक, बैबल-नोड के साथ, आपको आमतौर पर एक और फ़ाइल की आवश्यकता होती है, जैसे कि babel.config.js / .babelrc फ़ाइल।

-2

मेरा समाधान बोडेल-नोड पथ को शामिल करने के लिए किया गया था, जबकि निम्नानुसार चल रहा था:

nodemon node_modules/.bin/babel-node index.js

आप अपने package.json स्क्रिप्ट में इस प्रकार जोड़ सकते हैं:

debug: nodemon node_modules/.bin/babel-node index.js

नोट: मेरी प्रविष्टि फ़ाइल index.js है इसे आपकी प्रविष्टि फ़ाइल के साथ बदलें (कई में app.js / server.js है)।

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