Typescript ReferenceError: dışa aktarmalar tanımlanmadı


111

Resmi el kitabına göre bir modül uygulamaya çalışırken şu hata mesajını alıyorum:

Yakalanmamış ReferenceError: dışa aktarmalar tanımlanmadı

app.js'de: 2

Ama kodumun hiçbir yerinde adı hiç kullanmıyorum exports.

Bunu nasıl düzeltebilirim?


Dosyalar

app.ts

let a = 2;
let b:number = 3;

import Person = require ('./mods/module-1');

modül-1.t

 export class Person {
  constructor(){
    console.log('Person Class');
  }
}
export default Person;

tsconfig.json

{
   "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": true,
        "outDir": "scripts/"
    },
    "exclude": [
        "node_modules"
    ]
}

Lütfen ekran görüntülerini kullanmak yerine hata metnini kopyalayıp soruya yapıştırın.
Igor

Yazarken olmadığından emin misin exportsbir ile s yerine sonunda export? Bu, hata mesajının s ile yanlış olduğunu açıklar .
Igor

i tip ihracat değil ihracat
George C.

depodan% 10000 çalışacak herhangi bir örnek
George C.

Bu nerede çalıştırılıyor? Bir web sayfasında mı? Bir node.js sunucusunda mı? Javascript'in sonunda çalıştığı çalışma zamanı ortamında bir modül yükleyiciye ihtiyacınız olacak. Derleyici bayraklarından commonjs kullanıyorsunuz. Commonj'lere o kadar aşina değilim, ancak Typescript modülleri çalışmadan önce commonj'leri ayarlamanız gerekecek veya başka bir modül yükleyiciye (required.js gibi) geçmeniz ve bu kurulumu almanız gerekecek.
Mike Wodarczyk

Yanıtlar:


43

DÜZENLE:

es5Artık hedeflemiyor olmanıza bağlı olarak bu cevap işe yaramayabilir , cevabı daha eksiksiz hale getirmeye çalışacağım.

Orijinal Cevap

CommonJS kurulu değilse ( tanımlayanexports ), bu satırı şunlardan kaldırmanız gerekir tsconfig.json:

 "module": "commonjs",

Yorumlara göre, bu tek başına uygulamasının sonraki sürümlerinde çalışmayabilir tsc. Durum buysa, CommonJS, SystemJS veya RequireJS gibi bir modül yükleyici kurabilir ve ardından bunu belirtebilirsiniz.

Not:

Oluşturulan main.jsdosyanıza bakın tsc. Bunu en üstte bulacaksınız:

Object.defineProperty(exports, "__esModule", { value: true });

Hata mesajının köküdür ve kaldırıldıktan sonra "module": "commonjs",kaybolur.


6
Evet .ts dosyamı yeniden "module": "commonJs",
derledim ve

2
CommonJS'yi yüklemek bu hatayı ortadan kaldıracaksa, o zaman CommonJS nasıl kurulur? Bir saatin büyük kısmını Google'da geçirdim ve bunun nasıl yapılacağına dair herhangi bir talimat bulamıyorum . Lütfen birisi açıklayabilir mi?
Sturm

1
@Sturm Cevabım kafa karıştırıcı bir şekilde ifade edilmiş olabilir. CommonJS yalnızca bir özelliktir. Uygulamaların (kapsamlı olması gerekmeyen) bir listesini burada bulabilirsiniz: en.wikipedia.org/wiki/CommonJS
iFreilicht

2
Module: amd var, module: commonjs yok ve bu satır aktarılan .js dosyamda var.
pabrams

3
Tsconfig.json dosyanızda ES3 veya ES5 olarak hedefiniz varsa, typcript modülünüzü tanımlanmamışsa otomatik olarak CommonJS'ye ayarlayacaktır. Modülü kaldırmak yeterli değildir, bunun yerine başka bir şey ayarlamanız gerekir - bkz. Typescriptlang.org/docs/handbook/compiler-options.html
Jake

55

Bu sorun için birkaç başka Çözüm

  • Javascript'e yapılan diğer referanslardan önce aşağıdaki satırı ekleyin. Bu güzel küçük bir hile.
   <script>var exports = {};</script>
  • Bu sorun TypeScript'in en son sürümünde ortaya çıkar, bu hata typcript sürüm 2.1.6'ya başvurarak giderilebilir.


5
Bunun işe yaramasından nefret ediyorum! Ve kesinlikle işe yarıyor. TypeScript'i Node'un beklediği bir şeye aktarmanın bir yolu yok mu? Şikayet eden Node bile mi? Yoksa tarayıcı mı? Sorunun gerçekte ne olduğunu anlamamaya dayanamıyorum.
skillit zimberg

14

"type": "module"Alanı alanından kaldırarak sorunu çözdüm package.json.


ama bu neden yardımcı oluyor?
DauleDK

@DauleDK, uygulamayı paketlemek için Webpack kullandığımız için, bu alanın node.js motorunda kullanımı vardır. webpack yapılandırmasında ortak modül sistemi kullanıyoruz
Masih Jahangiri

10

npm install @babel/plugin-transform-modules-commonjs

ve .babelrc eklentilerine ekle sorumu çözdü.


7

benim çözümüm, eklediğim küçük numaralarla yukarıdaki her şeyin bir özetidir, temelde bunu html koduma ekledim

<script>var exports = {"__esModule": true};</script>
<script src="js/file.js"></script>

bu bile elektron veya başka bir şey kullanıyorsanız kullanmak importyerine kullanmanıza izin verir requireve typcript 3.5.1, target: es3 -> esnext ile sorunsuz çalışır.


4
burada biraz ilerleme var, hata şu şekilde değiştirildiapp.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa

bu, pencere yaratılırken nodeIntegration false olarak ayarlanmışsa olur, hata elektronJS'nizi güncellediğiniz için veya güncel olmayan bir kaynağı takip ettiğiniz için oluşur. nodeIntegration varsayılan olarak doğruydu, şimdi yanlış, bu nedenle oluşturucu işleminde nodeJS'ye erişmek istiyorsanız bunu manuel olarak etkinleştirmeniz gerekir. Bkz. [Electron required () tanımlı değil] [1] [1]: stackoverflow.com/questions/44391448/…
Hocine Abdellatif

Elektron kullanmıyorum, neyse, paket şeyler yapmak için paket ekleyerek ve diğer zor yolları kaldırarak durumumu çözdüm
Muhammed Moussa

6

Bu, modulederleyici seçeneğini şu şekilde ayarlayarak giderilir es6:

{
  "compilerOptions": {     
    "module": "es6",
    "target": "es5",    
  }
}

5

Aynı sorunu yaşadım ve tsconfig.json'a " es5 " kitaplığını ekleyerek şu şekilde çözdüm :

{
    "compilerOptions": {
        "target": "es5", //defines what sort of code ts generates, es5 because it's what most browsers currently UNDERSTANDS.
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true, //for angular to be able to use metadata we specify in our components.
        "experimentalDecorators": true, //angular needs decorators like @Component, @Injectable, etc.
        "removeComments": false,
        "noImplicitAny": false,
        "lib": [
            "es2016",
            "dom",
            "es5"
        ]
    }
}

5

Hala bu sorunu yaşayan kişiler için, derleyici hedefiniz ES6 olarak ayarlanmışsa babel'e modül dönüşümünü atlamasını söylemeniz gerekir. Bunu yapmak için bunu .babelrcdosyanıza ekleyin

{
  "presets": [ ["env", {"modules": false} ]]
}

1
Teşekkürler dostum! Tümü global olana dökülen eski kod tabanıyla çalışmaya çalışıyorum ve komut dosyaları, <script>etiketiyle birlikte tarayıcıya dahil edildi . Modülü eski kodla birlikte kullanmayı umuyordum ve bu mümkün değil gibi görünüyor. Bu en azından ES6 kullanmama izin veriyor ve ihracatla daha sonra ilgilenmeme izin veriyor.
huggie

2
bunu yaparken şu hatayı aldım: Kaldırılan Babel 5 seçeneğini kullanarak: .modules - Seçeneğe karşılık gelen modül dönüştürme eklentisini pluginskullanın. Babeljs.io/docs/plugins/#modules'e
chharvey

3

Ben de aynı hatayı aldım. Benim durumumda bunun nedeni, TypeScript AngularJS projemizde şu şekilde eski moda bir import ifadesine sahip olmamızdı:

import { IAttributes, IScope } from "angular";

JavaScript'e şu şekilde derlendi:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

Bu eski günlerde gerekliydi çünkü o zaman IAttributeskodu kullandık ve TypeScript onunla ne yapacağımızı bilemezdi. Ama ithalat beyanı kaldırma ve dönüştürme sonrasında IAttributesüzere ng.IAttributesbu iki JavaScript hatları kayboldu - ve böylece hata mesajı yaptık.


1
Bir Typescript türü için bu nasıl çalışır? İçeri aktarmalıyım, bu yüzden Typescript derlesin.
BluE

"Typcript type" ile neyi kastediyorsunuz? TypeScript tarafından bilinen (sayı veya dize gibi) bir tamsayı türüyse, bunu hemen kullanabilirsiniz. Bir modülde kendi türlerinizi tanımlarsanız, şunu kontrol edin: typescriptlang.org/docs/handbook/modules.html
MatX

Npmjs.com/package/@types/jquery'den @ types / jquery gibi harici bir kitaplığın tür tanımlarını kastetmiştim . $ Değişkenini Typescript kodumun içinden kullanılabilir hale getirmek için, bunu koduma koyuyorum: import * as $ "jquery" den;
BluE

Es5'i hedefliyorum, bunun çalışması için requirejs gibi başka bir kitaplığa ihtiyacım var mı?
BluE

1

Bazı ASP.NET projeleri için importve exportTypescript'lerinizde hiç kullanılmayabilir.

Bunu yapmaya çalıştığımda sorunun hatası ortaya çıktı ve ancak daha sonra, oluşturulan JS komut dosyasını Görünüm'e şu şekilde eklemem gerektiğini keşfettim :

<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>

1

Basitçe ekleyin libraryTarget: 'umd', öyle ki

const webpackConfig = {
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  }
};

module.exports = webpackConfig; // Export all custom Webpack configs.


1

Not: Bu, OP'nin cevabı için geçerli olmayabilir, ancak bu hatayı alıyordum ve bu şekilde çözdüm.

Bu yüzden, karşılaştığım sorun, belirli bir CDN'den bir 'js' kitaplığı aldığımda bu hatayı almamdı.

Yaptığım tek yanlış şey, CDN'nin cjsdizininden şu şekilde içe aktarmaktı : https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

Parçayı fark dist/cjsettiniz mi? Sorun oradaydı.

Benim durumumda CDN'ye (jsdelivr) geri döndüm ve umdklasörü bulmaya gittim . Ve ben başka bir set bulabildiğim popper.min.jsithalat doğru dosya olan: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/umd/popper.min.js.


0

@İFreilicht'in yukarıda önerdiği şeyi deneyin. Web paketini kurduktan sonra bu işe yaramadıysa, çevrimiçi bir yerden bir web paketi yapılandırmasını kopyalayıp orada çıktının yanlışlıkla CommonJS'yi desteklemesini istediğinizi yapılandırmış olabilirsiniz. Durumun böyle olmadığından emin olun webpack.config.js:

module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: { 
    index: "./src/js/index.ts"
  },
  ...
  ...
  output: {
    libraryTarget: 'commonjs',         <==== DELETE THIS LINE
    path: path.join(__dirname, 'build'),
    filename: "[name].bundle.js"
  }
};

0

Aynı sorunu yaşadım ve JS paketleri yükleme sırasını değiştirerek düzeltildi.

İhtiyacınız olan paketlerin hangi sırayla çağrıldığını kontrol edin ve bunları uygun bir sırayla yükleyin.

Benim özel durumumda (modül paketleyiciyi kullanmadan) Redux, o zaman Redux Thunk, sonra yüklemem gerekiyordu React Redux. Daha React Reduxönce Redux Thunkyüklemek bana verirdi exports is not defined.


0
  {
    "compileOnSave": false,
    "compilerOptions": {
      "baseUrl": "./",
      "outDir": "./dist",
      "sourceMap": true,
      "declaration": false,
      "module": "esnext",
      "moduleResolution": "node",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "target": "es5",
      "typeRoots": ["node_modules/@types"],
      "lib": ["es2018", "dom"]
    }
  }

7
StackOverflow'a hoş geldiniz. Lütfen cevabınıza biraz bağlam veya açıklama ekleyin, böylece kullanıcı ne yapıldığını anlayabilir. Yalnızca bir JSON yayınlamak o kadar yararlı olmayabilir ...
Bruno Monteiro

0

Aynı sorunu yaşadım, ancak kurulumum farklı bir çözüm gerektirdi.

create-react-app-rewiredPaketi bir config-overrides.jsdosya ile kullanıyorum . Önceden, addBabelPresetsiçe aktarmayı ( override()yöntemde) kullanıyordum customize-crave bu ön ayarları ayrı bir dosyaya soyutlamaya karar verdim. Tesadüfen, bu benim sorunumu çözdü.

Eklediğim useBabelRc()için override()de yöntemin config-overrides.jsve bir yaratılmış babel.config.jsaşağıdaki dosyayı:

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

0

Bu sorunu çözmek için, bu iki satırı index.html sayfanıza koyun .

<script>var exports = {"__esModule": true};</script>
<script type="text/javascript" src="/main.js">

Main.js dosya yolunuzu kontrol ettiğinizden emin olun .


Bu yalnızca require()kodunuzda herhangi bir ifade yoksa işe yarar .
Daniel Tonon

0

Yalnızca türler için arayüz kullanıyorsanız, exportanahtar kelimeyi atlayın ve ts içe aktarmaya gerek kalmadan türleri alabilir. Anahtar, import/ exporthiçbir yerde kullanamayacağınızdır .

export interface Person {
   name: string;
   age: number;
}

içine

interface Person {
   name: string;
   age: number;
}
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.