Typecript ReferenceError: ekspor tidak ditentukan

105

Mencoba menerapkan modul mengikuti buku pegangan resmi , saya mendapatkan pesan kesalahan ini:

ReferenceError Tidak Tertangkap: ekspor tidak ditentukan

di app.js: 2

Tapi tidak ada dalam kode saya yang pernah menggunakan nama itu exports.

Bagaimana cara memperbaikinya?


File

app.ts

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

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

modul-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"
    ]
}
George C.
sumber
Harap salin dan tempel teks kesalahan ke dalam pertanyaan alih-alih menggunakan tangkapan layar.
Igor
Yakin tidak mengetik exportsdengan s di akhir, bukan export? Itu akan menjelaskan pesan kesalahan karena dengan s salah.
Igor
saya ketik ekspor bukan ekspor
George C.
setiap contoh dari repositori yang gona bekerja 10000%
George C.
Dimana ini dijalankan? Di halaman web? Di server node.js? Anda akan membutuhkan modul loader di lingkungan run-time yang akhirnya dijalankan oleh javascript. Dari flag compiler Anda menggunakan commonjs. Saya tidak begitu paham dengan commonjs, tetapi Anda perlu mengatur commonjs sebelum modul Typecript berfungsi atau Anda perlu beralih ke modul loader lain (seperti require.js) dan menyiapkannya.
Mike Wodarczyk

Jawaban:

41

EDIT:

Jawaban ini mungkin tidak berfungsi tergantung jika Anda tidak menargetkan es5lagi, saya akan mencoba membuat jawaban lebih lengkap.

Jawaban Asli

Jika CommonJS tidak diinstal ( yang mendefinisikanexports ), Anda harus menghapus baris ini dari tsconfig.json:

 "module": "commonjs",

Sesuai dengan komentar, ini saja mungkin tidak berfungsi dengan versi yang lebih baru tsc. Jika demikian, Anda dapat menginstal modul loader seperti CommonJS, SystemJS atau RequireJS dan kemudian menentukannya.

catatan:

Lihat main.jsfile Anda yang tscdihasilkan. Anda akan menemukan ini di bagian paling atas:

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

Ini adalah akar dari pesan kesalahan, dan setelah dihapus "module": "commonjs",, pesan itu akan hilang.

iFreilicht
sumber
3
Ya saya mengkompilasi ulang file .ts saya dan kesalahan masih ada setelah berkomentar "module": "commonJs",:(
Acidic9
2
Jika menginstal CommonJS akan membuat kesalahan ini hilang, lalu bagaimana sebenarnya cara menginstal CommonJS? Saya telah menghabiskan sebagian besar waktu di Googling, dan saya tidak dapat menemukan petunjuk apa pun tentang cara melakukannya. Dapatkah seseorang tolong jelaskan?
Kokoh
1
@ Sturm Jawaban saya mungkin kata-katanya membingungkan. CommonJS hanyalah sebuah spesifikasi. Anda dapat menemukan daftar penerapan (belum tentu lengkap) di sini: en.wikipedia.org/wiki/CommonJS
iFreilicht
1
Saya memiliki module: amd, bukan module: commonjs, dan saya memiliki baris ini di file .js transparan saya.
pabrams
2
Jika Anda memiliki target sebagai ES3 atau ES5 di tsconfig.json Anda, skrip ketikan akan secara otomatis menyetel modul Anda ke CommonJS jika tidak ditentukan. Menghapus modul tidak cukup, Anda perlu mengatur sesuatu yang lain - lihat typescriptlang.org/docs/handbook/compiler-options.html
Jake
51

Beberapa Solusi lain untuk masalah ini

  • Tambahkan baris berikut sebelum referensi lain ke Javascript. Ini adalah retasan kecil yang bagus.
   <script>var exports = {};</script>
  • Masalah ini terjadi dengan TypeScript versi terbaru, kesalahan ini dapat diatasi dengan merujuk ke skrip jenis versi 2.1.6
Venkatesh Muniyandi
sumber
3
@ChuckLeButt Semoga ini bisa membantu stackoverflow.com/questions/19059580/…
Venkatesh Muniyandi
3
Aku benci ini berhasil! Dan itu pasti berhasil. Apakah tidak ada cara untuk membuat TypeScript menjadi transparan menjadi sesuatu yang diharapkan Node? Apakah bahkan Node yang mengeluh? Atau apakah itu browser? Saya tidak tahan tidak mengerti apa masalahnya sebenarnya.
skillit zimberg
7

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

dan tambahkan ke plugin .babelrc menyelesaikan pertanyaan saya.

Yi Zhang
sumber
7

solusi saya adalah ringkasan dari semua di atas dengan sedikit trik yang saya tambahkan, pada dasarnya saya menambahkan ini ke kode html saya

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

ini bahkan memungkinkan Anda untuk menggunakan importalih-alih requirejika Anda menggunakan electron atau sesuatu, dan itu bekerja dengan baik dengan skrip 3.5.1, target: es3 -> esnext.

Hocine Abdellatif
sumber
3
beberapa kemajuan di sini, kesalahan baru saja berubah menjadiapp.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa
ini terjadi jika nodeIntegration disetel ke false saat membuat jendela, kesalahan terjadi karena Anda memperbarui electronJS atau Anda mengikuti sumber yang sudah ketinggalan zaman. nodeIntegration tadinya benar secara default, sekarang salah, jadi Anda harus mengaktifkannya secara manual jika Anda ingin mengakses nodeJS dalam proses perender. Lihat [Kebutuhan elektron () tidak ditentukan] [1] [1]: stackoverflow.com/questions/44391448/…
Hocine Abdellatif
Saya tidak menggunakan elektron, lagipula saya menyelesaikan kasus saya dengan menambahkan paket untuk membuat barang bundel dan menghapus cara rumit lainnya
Muhammed Moussa
6

Saya memecahkan masalah dengan menghapus "type": "module"bidang dari package.json.

Masih Jahangiri
sumber
5

Saya memiliki masalah yang sama dan menyelesaikannya dengan menambahkan pustaka " es5 " ke tsconfig.json seperti ini:

{
    "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"
        ]
    }
}
rubensa
sumber
5

Bagi orang-orang yang masih mengalami masalah ini, jika target kompilator Anda disetel ke ES6, Anda perlu memberi tahu babel untuk melewati transformasi modul. Untuk melakukannya, tambahkan ini ke .babelrcfile Anda

{
  "presets": [ ["env", {"modules": false} ]]
}
Cezar Augusto
sumber
1
Terima kasih sobat! Saya telah mencoba untuk bekerja dengan basis kode lama yang membuang semua ke global dan skrip disertakan dalam browser dengan <script>tag. Saya berharap untuk menggunakan modul bersama dengan kode yang lebih lama dan sepertinya itu tidak mungkin. Ini setidaknya memungkinkan saya untuk menggunakan ES6 dan biarkan saya menangani ekspor nanti.
huggie
2
melakukan ini saya mendapat kesalahan berikut: Menggunakan opsi Babel 5 yang dihapus: .modules - Gunakan plugin transform modul yang sesuai dalam pluginsopsi. Lihat babeljs.io/docs/plugins/#modules
chharvey
5

Ini diperbaiki dengan mengatur moduleopsi kompiler ke es6:

{
  "compilerOptions": {     
    "module": "es6",
    "target": "es5",    
  }
}
Code Whisperer
sumber
3

Saya mengalami kesalahan yang sama juga. Dalam kasus saya, itu karena kami memiliki pernyataan impor kuno dalam proyek TypeScript AngularJS seperti ini:

import { IAttributes, IScope } from "angular";

yang dikompilasi ke JavaScript seperti ini:

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

Ini diperlukan kembali di masa lalu karena kami kemudian menggunakan IAttributeskode dan TypeScript tidak akan tahu apa yang harus dilakukan dengannya. Tetapi setelah menghapus pernyataan import, dan mengonversinya IAttributeske ng.IAttributesdua baris JavaScript tersebut menghilang - dan begitu pula pesan kesalahannya.

MatX
sumber
1
Bagaimana cara kerjanya untuk tipe Kriptografi? Saya harus mengimpornya, jadi Typecript mengkompilasinya.
BluE
Apa yang Anda maksud dengan "tipe skrip"? Jika itu adalah tipe integeral yang dikenal dengan TypeScript - seperti angka atau string - maka Anda dapat langsung menggunakannya. Jika Anda menentukan tipe Anda sendiri dalam sebuah modul, periksa ini: typescriptlang.org/docs/handbook/modules.html
MatX
Yang saya maksud adalah definisi tipe pustaka eksternal seperti @ types / jquery dari npmjs.com/package/@types/jquery . Untuk membuat $ variabel dapat digunakan dari dalam kode Ketikan saya, saya memasukkan ini ke dalam kode saya: import * as $ from "jquery";
BluE
Saya menargetkan es5, apakah saya memerlukan pustaka lain seperti requirejs agar ini berfungsi?
BluE
1

Cukup tambahkan libraryTarget: 'umd', seperti itu

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

module.exports = webpackConfig; // Export all custom Webpack configs.
Daniel Danielecki
sumber
1

bagi saya, menghapus "esModuleInterop": truedari tsconfig.json melakukan triknya.

pengguna3033599
sumber
0

Untuk beberapa proyek ASP.NET importdan exportmungkin tidak digunakan sama sekali di Skrip Ketik Anda.

Kesalahan pertanyaan muncul ketika saya mencoba melakukannya dan saya baru menemukan kemudian bahwa saya hanya perlu menambahkan skrip JS yang dihasilkan ke Tampilan seperti:

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

Coba saran @iFreilicht di atas. Jika itu tidak berhasil setelah Anda menginstal webpack dan sebagainya, Anda mungkin baru saja menyalin konfigurasi webpack dari suatu tempat secara online dan mengonfigurasi di sana sehingga Anda ingin output mendukung CommonJS secara tidak sengaja. Pastikan ini tidak terjadi di 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"
  }
};
duliba
sumber
0

Memiliki masalah yang sama dan memperbaikinya dengan mengubah urutan pemuatan paket JS.

Periksa urutan pemanggilan paket yang Anda butuhkan dan muat dalam urutan yang sesuai.

Dalam kasus tertentu (tidak menggunakan modul bundler) yang saya butuhkan untuk beban Redux, kemudian Redux Thunk, kemudian React Redux. Memuat React Reduxsebelumnya Redux Thunkakan memberi saya exports is not defined.

Menepuk
sumber
0

Catatan: Ini mungkin tidak berlaku untuk jawaban OP, tetapi saya mendapatkan kesalahan ini, dan ini cara saya mengatasinya.

Jadi masalah yang saya hadapi adalah bahwa saya mendapatkan kesalahan ini ketika saya mengambil pustaka 'js' dari CDN tertentu.

Satu-satunya hal yang salah yang saya lakukan adalah mengimpor dari cjsdirektori CDN seperti ini: https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/cjs/popper.min.js

Perhatikan dist/cjsbagiannya? Di situlah masalahnya.

Saya kembali ke CDN (jsdelivr) dalam kasus saya dan menavigasi untuk menemukan umdfolder tersebut. Dan aku bisa menemukan satu set popper.min.jsyang merupakan file yang benar untuk impor: https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js.

Arpan Srivastava
sumber
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"]
    }
  }
Carlos Alves
sumber
5
Selamat datang di StackOverflow. Harap tambahkan beberapa konteks pada jawaban Anda atau penjelasan sehingga pengguna dapat memahami apa yang telah dilakukan. Hanya memposting JSON mungkin tidak begitu membantu ...
Bruno Monteiro
0

Saya memiliki masalah yang sama, tetapi penyiapan saya membutuhkan solusi yang berbeda.

Saya menggunakan create-react-app-rewiredpaket dengan config-overrides.jsfile. Sebelumnya, saya menggunakan addBabelPresetsimport (dalam override()metode) dari customize-cradan memutuskan untuk mengabstraksi preset tersebut ke file terpisah. Secara kebetulan, ini memecahkan masalah saya.

Saya menambahkan useBabelRc()ke override()metode config-overrides.jsdan membuat babel.config.jsfile dengan yang berikut ini:

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