Sözdizimi Hatası: İçe aktarma ifadesi modül dışında kullanılamaz


53

Bana sorun veren bir ApolloServer projem var, bu yüzden onu güncelleyebileceğimi ve en son Babel'i kullanırken sorunlarla karşılaşabileceğimi düşündüm. Benim "index.js":

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

Ve çalıştırdığımda "SyntaxError: import ifadesi modül dışında kullanılamıyor" hatası alıyorum. İlk olarak TPTB * 'yi bu modülün (başarılı olmayan) olduğuna ikna etmek için bir şeyler yapmaya çalıştım. Bu yüzden "içe aktarma" yı bir "zorunlu" olarak değiştirdim ve bu işe yaradı.

Ama şimdi bana aynı hatayı veren diğer dosyalarda yaklaşık iki düzine "ithalat" var.

* Eminim sorunumun kökeni, bu konuda neyin şikayet ettiğinden bile emin olmam. Babil 7 olduğunu varsaydım (Babel 6'dan geliyorum ve ön ayarları değiştirmek zorunda kaldım çünkü)% 100 emin değilim.

Çözümler için bulduğum şeylerin çoğu düz Düğüm için geçerli görünmüyor. Buradaki gibi:

"Yakalanmamış Sözdizimi Hatası: Beklenmeyen tanımlayıcı" veren ES6 modülü içe aktarma

"Type = module" eklenerek çözüldüğünü söylüyor, ancak bu genellikle HTML'de yok, ki hiçbiri yok. Ayrıca projemin eski hazır ayarlarını kullanmayı denedim:

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

Ancak bu bana başka bir hata veriyor: "Hata: Eklenti / Hazır Ayar dosyalarının nesneleri dışa aktarmasına izin verilmiyor, sadece işlevler."

GÜNCELLEME: İşte başladığım bağımlılıklar:

"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
Merhaba, şu anda aynı problemi yaşıyorum. Bağımlılıklarınızı da paylaşır mısınız? Belki güncellemeden önce ve sonra bir fark bile. Soruna neden olabilecek benzer paketler bulabilir miyiz diye benimkini kontrol edebilirim.
lynx

Ben sadece tüm "ithalat" yerine "gerektirir" ve her şey yolunda. Aptal ama şu anda bunu çözmek için çaba göstermeye değmezdi. Yine de orijinali bağımlılıklarla güncelleyeceğim. Herhangi bir ipucu alırsanız, onları orijinal koduma göre kontrol edeceğim.
user3810626

1
CommonJS sözdizimi (gereksinim ve module.exports), düğüm için orijinal biçimdi ve web paketi de bunu destekliyor, ancak ES6 modülü sözdizimi (dışa aktarma, içe aktarma) daha yeni bir yol ve şimdi düğüm ve web paketi destekliyor. Düğümün şimdi içe aktarmayı desteklediğini okudum, ancak bu kadar çok öğretici saf düğüm şeyler için gerekli olduğunu gösteriyor.
Ted Fitzpatrick

1
Son olarak, benim için gitmenin yolu şöyle görünüyordu: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Ön ayarı jest.config.jsyapmak 'ts-jest/presets/js-with-ts'- hala başka sorunlar var, ancak bu büyük sorunu çözdü. ..... ah evet, benim sorunum ilgili test edildi ... normal yapıları iyiydi
lynx

Lynx, İlginç. Jest'i kullanmıyorum, kendim. Ted, ilginç. Tamam, terlemeyeceğim.
user3810626

Yanıtlar:


50

2020 Güncellemesi (Düğüm 13.2.0+)

Düğümün en son sürümünün yüklü olduğunu doğrulayın. --experimental-modulesBayrak artık gerekli değildir. Basitçe yapmak aşağıdakilerden biri :

  • "type": "module"En yakın ebeveyne ekleyin package.json. Bu, tüm .jsve .mjsdosyalar ES modül olarak yorumlanır. Uzantıyı kullanarak tek tek dosyaları CommonJS olarak yorumlayabilirsiniz .cjs.

VEYA

  • Uzantıya sahip dosyaları açıkça adlandırın .mjs. Gibi diğer tüm dosyalar, tanımlanmamışsa .jsvarsayılan olan CommonJS olarak yorumlanacaktır .typepackage.json

Bunu kullanırsam, gerekli dosyayı "js" içerecek şekilde değiştirin, ardından gerekli dosyadaki dışa aktarma deyimlerinin biçimini değiştirin ve sonra "import" dan değiştirdiğim tüm "zorunlu" ifadeleri alın; şimdi "zorunlu" bilinmiyor - bu işe yarayacak, bu yüzden bu cevabı kabul edeceğim.
user3810626

2
Sorun node_modules / right altındaysa bu gerçekten bir seçenek değil mi? Bu durumda nasıl düzeltilir?
Trent Bing


6

Ben aynı sorunu vardı ve aşağıdaki (12.13.1 düğümü kullanarak) düzeltti:

  • .Js dosya uzantısını .mjs olarak değiştirin
  • Uygulamanızı çalıştırdıktan sonra - deneysel modüller bayrağı ekleyin.
  • İsteğe bağlı: paketinize "type": "module" ekleyin .json

daha fazla bilgi: https://nodejs.org/api/esm.html


0

Bu sorun, yeni başlayan bir Express API projesinde yaşadım.

Sorunlu sunucu kodu 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...'));

İşte bağımlılıklarım:

{
  "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"
  }
}

Ve işte hatayı atan koşucu:

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

İyi çalışan benzer bir Express projem olduğu için bu sinir bozucuydu.

Çözüm öncelikle bu bağımlılığı eklemekti:

npm install @babel/preset-env

Ve sonra babel.config.jsproje kökünde bir kullanarak tel bağlamak için :

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

Bunun neden işe yaradığını tam olarak bilmiyorum, ancak yetkili bir kaynaktan kopyaladım , bu yüzden ona bağlı kaldığım için mutluyum.


Evet, mesele kodu vardı demet hazır ayarlar ve oldukça G / istemediğim şeylere karşı istediği kırdı şeyler şeylerin dengesi hakkı isabet asla.
user3810626

Ben JS çöküyor bütün gün @ kullanıcı3810626 kafa karıştırıcı iterek - Benim sorunum dil ve ekosistem için oldukça yeni olduğum şüpheli ve şeyler işler almak için şimdilik biraz kenara koymak gerekir. Getting there ...:-)
halfer

1
İyi şanslar! Disarisi Orman! (Yani, kelimenin tam anlamıyla, JS ekosistemi bir orman ...)
user3810626

-2
  1. Babil kullanmaya başladığımda da aynı problemi yaşadım ... Ama sonra bir çözümüm vardı ... Şimdiye kadar problemim olmadı ... Şu anda, Düğüm v12.14.1, "@ babel / düğüm" : "^ 7.8.4", yürütmek için babel-node ve nodemon kullanıyorum (node ​​da iyi ..)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!! not: server.js benim giriş dosyam, sizinkini kullanabilirsiniz.
  3. launch.json Hata ayıkladığınızda, launch.json dosyanızı "runtimeExecutable" olarak da yapılandırmanız gerekir: "$ {workspaceRoot} /node_modules/.bin/babel-node" !! note: plus runtime
  4. Tabii ki, babel-node ile normalde babel.config.js / .babelrc dosyası gibi başka bir dosyayı da düzenlemeniz ve düzenlemeniz gerekir.

-2

Benim çözümüm, nodemon'u aşağıdaki gibi çalıştırırken babil-nod yolunu eklemekti:

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

package.json betiğinize şu şekilde ekleyebilirsiniz:

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

Not: benim giriş dosya index.js yerine giriş dosyanız (birçoğu app.js / server.js var).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.