সিনট্যাক্স এরির: একটি মডিউলের বাইরে আমদানি বিবৃতি ব্যবহার করতে পারে না


52

আমি একটি অ্যাপোলো সার্ভার প্রকল্প পেয়েছি যা আমাকে সমস্যায় ফেলেছে, তাই আমি ভেবেছিলাম যে আমি এটি আপডেট করতে পারি এবং সর্বশেষতম ব্যাবেল ব্যবহার করার সময় সমস্যাগুলির মধ্যে চলে আসব। আমার "index.js" হ'ল:

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

এবং আমি এটি চালানোর সময় আমি ত্রুটিটি পেয়েছি "সিনট্যাক্স এরির: কোনও মডিউলের বাইরে আমদানি বিবৃতি ব্যবহার করতে পারি না"। প্রথমে আমি টিপিটিবি * কে বোঝানোর জন্য কিছু করার চেষ্টা করেছি যে এটি একটি মডিউল (কোনও সাফল্য ছাড়াই) ছিল। সুতরাং আমি "আমদানি" কে "প্রয়োজনীয়" হিসাবে পরিবর্তন করেছি এবং এটি কার্যকর হয়েছে।

তবে এখন অন্য ফাইলে আমার প্রায় দুই ডজন "আমদানি" রয়েছে যা আমাকে একই ত্রুটি দেয়।

* আমি নিশ্চিত যে আমার সমস্যার মূলে আমি সমস্যা সম্পর্কে কী অভিযোগ করছে তা এমনকি আমি নিশ্চিত নই। আমি বাছাই করেছি বাবেল 7 (যেহেতু আমি বাবেল 6 থেকে আসছি এবং আমাকে প্রিসেটগুলি পরিবর্তন করতে হয়েছিল) তবে আমি 100% নিশ্চিত নই।

সমাধানগুলির জন্য আমি যা পেয়েছি তার বেশিরভাগটি সরাসরি নোডের সাথে প্রযোজ্য বলে মনে হয় না। এখানে এটি পছন্দ করুন:

ES6 মডিউল আমদানি করে "আনকচড সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত শনাক্তকারী"

বলে যে এটি "টাইপ = মডিউল" যোগ করে সমাধান করা হয়েছিল তবে এটি সাধারণত এইচটিএমএল এ চলে যায় যার মধ্যে আমার কিছুই নেই। আমি আমার প্রকল্পের পুরানো প্রিসেটগুলি ব্যবহার করার চেষ্টা করেছি:

"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
হাই, এখনই একই সমস্যা হচ্ছে। আপনি কি আপনার নির্ভরতা ভাগ করতে পারেন? এমনকি আপনার আপডেটের আগে এবং পরে আলাদা হতে পারে। আমি যদি আমাদের অনুরূপ প্যাকেজগুলি পেতে পারি যা সমস্যার কারণ হতে পারে তা দেখতে আমার বিরুদ্ধে পরীক্ষা করতে পারি।
লিংস

আমি সমস্ত "আমদানি" "প্রয়োজনীয়" দিয়ে প্রতিস্থাপন করেছি এবং এখন সব ঠিক আছে। বোবা তবে এই মুহূর্তে এটি বের করার চেষ্টা করার মতো ছিল না। যদিও নির্ভরতা সহ আমি মূলটি আপডেট করব। যদি আপনি কোনও লিড পান তবে আমি তাদের আমার আসল কোডের বাইরে পরীক্ষা করব।
ব্যবহারকারী 3810626

1
কমনজেএস সিনট্যাক্স (প্রয়োজনীয় এবং মডিউল.এক্সপোর্টস) নোডের মূল ফর্ম্যাট ছিল এবং ওয়েবপ্যাকটিও এটি সমর্থন করে তবে ইএস 6 মডিউল সিনট্যাক্স (রফতানি, আমদানি) আরও নতুন উপায় এবং এখন নোড এবং ওয়েবপ্যাক এটি সমর্থন করে। আমি পড়েছি নোড এখন আমদানি সমর্থন করে তবে অনেক টিউটোরিয়াল খাঁটি নোড স্টাফের জন্য প্রয়োজন যা নোডের জন্য সিনট্যাক্স ব্যবহার করা ভাল।
টেড ফিটজপ্যাট্রিক

1
অবশেষে, আমার কাছে যাওয়ার পথটি মনে হয়েছিল: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 এ প্রিসেট সেট jest.config.jsকরা 'ts-jest/presets/js-with-ts'- এখনও কিছু অন্যান্য সমস্যা রয়েছে তবে এটি বড় সমাধান করেছে। ..... হ্যাঁ, আমার সমস্যা সম্পর্কিত পরীক্ষা করছিল ... সাধারণ বিল্ডগুলি ভাল ছিল
লিংক

লিংক, আকর্ষণীয়। জাস্ট ব্যবহার করছি না, নিজেই। টেড, আকর্ষণীয়। ঠিক আছে, আমি এটি ঘামব না।
ব্যবহারকারী 3810626

উত্তর:


50

2020 আপডেট (নোড 13.2.0+)

আপনার কাছে নোডের সর্বশেষতম সংস্করণ ইনস্টল রয়েছে তা যাচাই করুন। --experimental-modulesপতাকা প্রয়োজনীয় এখন আর নেই। কেবল নিম্নলিখিতগুলির মধ্যে একটি করুন :

  • যোগ "type": "module"নিকটতম ঊর্ধ্বতন package.json। এটির সাহায্যে সমস্ত .jsএবং .mjsফাইল ইএস মডিউল হিসাবে ব্যাখ্যা করা হয়। আপনি .cjsএক্সটেনশনটি ব্যবহার করে স্বতন্ত্র ফাইলগুলিকে কমনজেএস হিসাবে ব্যাখ্যা করতে পারেন ।

অথবা

  • .mjsএক্সটেনশন সহ স্পষ্টতই ফাইলগুলির নাম দিন । অন্যান্য সমস্ত ফাইল .jsযেমন কমনজেএস হিসাবে ব্যাখ্যা করা হবে, যা typeসংজ্ঞায়িত না হলে ডিফল্ট package.json

যদি আমি এটি ব্যবহার করি, তবে প্রয়োজনীয় ফাইলের জন্য "জেএস" অন্তর্ভুক্ত করার পথটি পরিবর্তন করুন, তারপরে প্রয়োজনীয় ফাইলটিতে রফতানি বিবৃতিগুলির ফর্ম্যাটটি পরিবর্তন করুন এবং তারপরে "আমদানি" থেকে পরিবর্তিত সমস্ত "প্রয়োজনীয়" বিবৃতি গ্রহণ করুন - কারণ এখন "প্রয়োজনীয়" অজানা - এটি কাজ করবে, তাই আমি এই উত্তরটি গ্রহণ করব।
ব্যবহারকারীর 3810626

2
সমস্যাটি যদি নোড_মডিউলগুলির অধীনে থাকে / ডান? কোন ধারনা কিভাবে এই ক্ষেত্রে ঠিক করবেন?
ট্রেন্ট বিং

18

অফিসিয়াল ডক ( https://nodejs.org/api/esm.html#esm_code_import_code_statements ) অনুসারে:

আমদানি বিবৃতি কেবল ES মডিউলগুলিতে অনুমোদিত। কমনজেএসে অনুরূপ কার্যকারিতার জন্য, আমদানি দেখুন ()।

নোডকে আপনার ফাইলকে ইএস মডিউল হিসাবে বিবেচনা করতে আপনার প্রয়োজন ( https://nodejs.org/api/esm.html#esm_enabling ):

  • "টাইপ": "মডিউল" প্যাকেজ.জসনে যোগ করুন
  • নোড কলটিতে "- এক্সপেরিমেন্টাল-মডিউল" পতাকা যুক্ত করুন

6

আমার একই সমস্যা ছিল এবং নিম্নলিখিতগুলি এটি স্থির করেছে (নোড 12.13.1 ব্যবহার করে):

  • .Js ফাইলের এক্সটেনশনটিকে .mjs এ পরিবর্তন করুন
  • আপনার অ্যাপ্লিকেশন চালানোর পরে - এক্সপেরিমেন্টাল-মডিউলগুলি পতাকা যুক্ত করুন।
  • Alচ্ছিক: আপনার প্যাকেজ.জসনে "টাইপ": "মডিউল" যুক্ত করুন

আরও তথ্য: 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. আমি যখন ব্যাবেল ব্যবহার শুরু করি তখন আমারও একই সমস্যা ছিল ... তবে পরে, আমার একটি সমাধান হয়েছিল ... এখন পর্যন্ত আমার আর সমস্যা হয়নি ... বর্তমানে, নোড ভি 12.14.1, "@ বাবেল / নোড" : "^ 7.8.4", আমি কার্যকর করার জন্য ব্যাবেল-নোড এবং নোডমন ব্যবহার করি (নোডটিও ঠিক আছে ..)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" বাবেল-নোড ডিবাগ সার্ভার.js "!! নোট: সার্ভার.জেএস আমার প্রবেশ ফাইল, আপনি নিজের ব্যবহার করতে পারেন।
  3. launch.json আপনি ডিবাগ করার সময় আপনার লঞ্চ.জসন ফাইলটি "রানটাইমএক্সেকিউটেবল": "$ {ওয়ার্কস্পেসরুট} / নোড_মডিউলস / বিবি / ব্যাবেল -নোড" কনফিগার করতে হবে! দ্রষ্টব্য: প্লাস রানটাইমঅনুসরণযোগ্য কনফিগারেশনে।
  4. অবশ্যই, বাবেল নোডের সাথে আপনার সাধারণত অন্য ফাইলটি প্রয়োজন এবং সম্পাদনা করতে হবে, যেমন বাবেলকনফিগ.জেএস /।

-2

আমার সমাধানটি নোডমন চলমান অবস্থায় ব্যাবেল-নোডের পথটি অন্তর্ভুক্ত করা ছিল:

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

আপনি আপনার প্যাকেজ.জসন স্ক্রিপ্টে এটি যুক্ত করতে পারেন:

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

দ্রষ্টব্য: আমার এন্ট্রি ফাইলটি index.js এটিকে আপনার এন্ট্রি ফাইলের সাথে প্রতিস্থাপন করে (অনেকের app.js / server.js রয়েছে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.