Beklenmedik Simge Aktarımı Alma


221

Projemde bazı ES6 kodunu çalıştırmaya çalışıyorum ama beklenmeyen bir jeton dışa aktarma hatası alıyorum.

export class MyClass {
  constructor() {
    console.log("es6");
  }
}

5
ortamınız veya yapılandırmanız hakkında yardım sağlamak için yeterli bilgi yoktur. Bu hata, exportyalnızca ES6'da olduğu gibi web paketinin veya babil'in düzgün çalışmadığını ve ES6 desteği sağlayan modüllerin bu olduğunu gösteriyor.
Claies

24
Kullanmamalısınız module.exports = MyClass, değilexport class MyClass
onmyway133

Yanıtlar:


249

ES6 Modülü sözdizimini kullanıyorsunuz.

Bu, ortamınızın (örn. Node.js) ES6 Modülü sözdizimini desteklemesi gerektiği anlamına gelir.

NodeJS, ES6 module.exportsmodülü sözdizimini ( exportanahtar kelime) değil CommonJS Modülü sözdizimini ( ) kullanır .

Çözüm:

  • babelES6'nızı bir commonjshedefe aktarmak için npm paketini kullanın

veya

  • CommonJS sözdizimi ile refactor.

CommonJS sözdiziminin örnekleri şunlardır ( flaviocopes.com/commonjs/ adresinden ):

  • exports.uppercase = str => str.toUpperCase()
  • exports.a = 1

15
Düğümler importyerel olarak ne zaman desteklenir ? Ben v10.0.0 olurdu ama görünüşe göre değil düşündüm.
chovy

4
@chovy deneysel desteği "- deneysel modülleri" bayrağı ile kullanılabilir. Dosyaların .mjs uzantısına sahip olması gerekir
Giovanni P.

1
Modüller için yerel destekli Chrome 66'yı kullanarak bu hatayı alıyorum.
Tom Russell


2
Birisi için CommonJs Sözdizimi hakkında hala net değil. lütfen bu bağlantıyı kontrol edin, biraz yardımcı olabilir. flaviocopes.com/commonjs
LT

142

Bu hatayı alırsanız, javascript dosyasını html sayfanıza nasıl eklediğinizle de ilgili olabilir. Modülleri yüklerken, bu dosyaları açıkça bildirmeniz gerekir. İşte bir örnek:

//module.js:
function foo(){
   return "foo";
}

var bar = "bar";

export { foo, bar };

Komut dosyasını şu şekilde eklediğinizde:

<script src="module.js"></script>

Hatayı alacaksınız:

Yakalanmayan Sözdizimi Hatası: Beklenmeyen simge dışa aktarma

"Module" olarak ayarlanmış bir type özniteliğine sahip dosyayı eklemeniz gerekir:

<script type="module" src="module.js"></script>

Ve sonra beklendiği gibi çalışacak ve modülünüzü başka bir modüle almaya hazırsınız:

import { foo, bar } from  "./module.js";

console.log( foo() );
console.log( bar );

37
"en çok oylanan" yanıtın aksine, bu aslında sorunu çözer ve tek seçeneğin bir CommonJS yönteminden, APM yönteminden yararlanmak veya kodumuzu aktarmak olduğunu neden olmadan neden olduğunu açıklar ... Bu da bir istisna olacaktır typegeçerli bir mime türü (aka. ortam türü) olması beklenen w3c standardına göre , bu beklenmedik bir sonuçtu. Teşekkürler!
Shaun Wilson

4
Bu hatayı düzeltir, ancak daha sonra satır içi örneğin <script> import ... </script> ile
PandaWood

1
@PandaWood Modülden <script type="module">import ...</script>içe aktarırken kullanmanız gerekir . Chromium'un son sürümünde test ettim.
Vladimir

Bu sorunumu düzeltti :)
user3651476

Pure JS (ES6) içe aktarmayı destekledi ve bu tam olarak neden bununla tanıştığımı açıklıyor
Eric

17

Benim görüşüm

İhracat

ES6

myClass.js

export class MyClass1 {
}
export class MyClass2 {
}

other.js

import { MyClass1, MyClass2 } from './myClass';

CommonJS Alternatifi

myClass.js

class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };

other.js

const { MyClass1, MyClass2 } = require('./myClass');

Varsayılanı Dışa Aktar

ES6

myClass.js

export default class MyClass {
}

other.js

import MyClass from './myClass';

CommonJS Alternatifi

myClass.js

module.exports = class MyClass1 {
}

other.js

const MyClass = require('./myClass');

Bu yardımcı olur umarım


ES6 Varsayılan Dışa Aktarma örneği için "varsayılan dışa aktarma" yazdınız, ancak "varsayılan dışa aktarma" olmalıdır.
IAM_AL_X

@IAM_AL_X Yakalamak için teşekkürler :-)
Barnstokkr

10

ES6'yı kullanmak için babel-preset-env

ve sizin .babelrc:

{
  "presets": ["@babel/preset-env"]
}

@ Babbari 7 numaralı babel uygulaması için cevap güncellendi.


8
sorusu babeli açıklamakla ilgili değil. Öyleyse neden diğerlerinin kafasını karıştırabilecek bir şeye cevap verilmemesi gerekiyor?
Celal

7
@monsto bu soru zaten babelyazar tarafından etiketlendi . Phil Ricketts'ın yanıtı sorunu açıklığa kavuştururken, bu iyi, bu cevap yazarın sorununa doğrudan bir çözümdür.
boycy

"@ babel / preset-env"
ghanbari

6

Varsayılan JavaScript modülü dışa aktarmalarını kullanabildiğinizde şu anda Babel'i kullanmaya gerek yoktur (JS çok güçlü hale gelmiştir). Eğiticinin tamamını kontrol et

Message.js

module.exports = 'Hello world';

app.js

var msg = require('./Messages.js');

console.log(msg); // Hello World

2
Peki o zaman bir sınıfı nasıl ihraç edersiniz?
Sherwin Ablaña Dapito

1
Soru aslında NodeJS tarafından kullanılan CommonJS değil, ES6 için olduğu gibi cevabımı siliyorum. Lütfen cevap için yukarıya bakın.
Alvin Konda

@ SherwinAblañaDapito module.exports = sınıf MyClass {} çalışıyor
Marian Klühspies

3

Babel paketlerini yükleyin @babel/coreve @babel/presethangi doğrudan ES6 hedeflerini anlamıyor düğüm js gibi commonjs hedefe ES6 dönüştürür

npm install --save-dev @babel/core @babel/preset-env

Ardından .babelrc, projenizin kök dizininde adıyla bir yapılandırma dosyası oluşturmanız ve bu kodu buraya eklemeniz gerekir

{ "presets": ["@babel/preset-env"] }


Ayrıca @ babel / register yüklemem gerekiyordu, aksi halde yine de "SyntaxError: Bir modül dışında içe aktarma ifadesi kullanılamıyor"
moleküler

3

Bunu gibi bir giriş noktası dosyası yaparak düzeltildi.

// index.js
require = require('esm')(module)
module.exports = require('./app.js')

ve içine aktardığım herhangi bir dosya app.js ve dışına aktardığımimports/exports şimdi çalıştı gibinode index.js

Not: app.jskullanırsa export default, require('./app.js').defaultgiriş noktası dosyası kullanılırken bu olur .


1
Babil, webpack, parsel vb. İhtiyaç duymayan basit projeler için en iyi cevap ... Proje için basit / sunucu ekspresiyle monorepo projesinde kullandım. Bir cazibe gibi çalıştı ...
mattdlockyer

-3

ES6 sözdizimini kullanmak düğümde çalışmaz, maalesef, derleyicinin dışa aktarma veya içe aktarma gibi sözdizimini anlamasını sağlamak için babil'e sahip olmanız gerekir.

npm install babel-cli --save

Şimdi bir .babelrc dosyası oluşturmamız gerekiyor, babelrc dosyasında, babil'i ES5'i derlerken önceden ayarlanmış olarak yüklediğimiz es2015 ön ayarını kullanacak şekilde ayarlayacağız.

Uygulamamızın kökünde bir .babelrc dosyası oluşturacağız. $ npm kurulum babel-preset-es2015 - kaydetme

Uygulamamızın kökünde bir .babelrc dosyası oluşturacağız.

{  "presets": ["es2015"] }

Umarım çalışır ... :)

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.