Mencoba untuk menerapkan modul berikut official handbook, saya mendapatkan pesan kesalahan ini:
exception ReferenceError: ekspor tidak didefinisikan
di app.js:2
Tapi tak di kode saya apakah saya pernah menggunakan nama ekspor
.
Bagaimana saya bisa memperbaiki ini?
let a = 2;
let b:number = 3;
import Person = require ('./mods/module-1');
export class Person {
constructor(){
console.log('Person Class');
}
}
export default Person;
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"noImplicitAny": false,
"sourceMap": true,
"outDir": "scripts/"
},
"exclude": [
"node_modules"
]
}
Beberapa Solusi lain untuk masalah ini
<script>var exports = {};</script>
Jawaban ini mungkin tidak bekerja tergantung jika anda're tidak menargetkan es5
lagi, aku'll mencoba untuk membuat jawaban yang lebih lengkap.
Jika CommonJS isn't diinstal (yang mendefinisikan ekspor
), anda harus menghapus baris ini dari tsconfig.json
:
"module": "commonjs",
Sesuai komentar-komentar, ini saja mungkin tidak bekerja dengan versi tsc
. Jika itu terjadi, anda dapat menginstal sebuah modul loader seperti CommonJS, SystemJS atau RequireJS dan kemudian menentukan bahwa.
Melihat anda main.js
file tsc
yang dihasilkan. Anda akan menemukan ini di bagian paling atas:
Object.defineProperty(exports, "__esModule", { value: true });
Ini adalah akar dari pesan kesalahan, dan setelah mengeluarkan "modul": "commonjs",
, itu akan lenyap.
Untuk orang-orang yang masih mengalami masalah ini, jika anda compiler target yang ditetapkan untuk ES6 anda perlu untuk memberitahu babel untuk melewati modul transformasi. Untuk melakukannya, tambahkan ini untuk anda .babelrc
file
{
"presets": [ ["env", {"modules": false} ]]
}
Aku punya masalah yang sama dan dipecahkan itu menambahkan "es5" perpustakaan untuk 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"
]
}
}
solusi saya adalah jumlah dari semua yang di atas dengan sedikit trik saya menambahkan, pada dasarnya saya menambahkan ini saya html ``html
<script>var ekspor = {"__esModule": true};</script> <script src="js/file.js"></script> `` ini bahkan memungkinkan anda untuk menggunakan `impor` bukan `memerlukan` jika anda're menggunakan elektron atau sesuatu, dan itu bekerja dengan baik dengan ketangkasan 3.5.1, target: es3 -> esnext.Saya memiliki kesalahan yang sama juga. Dalam kasus saya itu adalah karena kami sudah kuno impor pernyataan dalam Naskah AngularJS proyek seperti ini:
import { IAttributes, IScope } from "angular";
yang disusun JavaScript seperti ini:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Ini dibutuhkan kembali di hari tua karena kita kemudian digunakan IAttributes
dalam kode dan Ketangkasan tidak't tahu apa yang harus dilakukan dengan hal sebaliknya.
Tapi setelah mengeluarkan pernyataan impor, dan mengkonversi IAttributes
untuk ng.IAttributes
dua JavaScript garis menghilang - dan begitu pula pesan kesalahan.
Cukup tambahkan libraryTarget: 'umd'
, suka jadi
`` const webpackConfig = { output: { libraryTarget: 'umd' // Fix: "exception ReferenceError: ekspor tidak didefinisikan". } };
modul.ekspor = webpackConfig; // Ekspor semua custom Webpack konfigurasi. ``
bagi saya, menghapus "esModuleInterop": true
dari tsconfig.json melakukan trik.
Untuk beberapa ASP.NET proyek impor
dan ekspor
tidak dapat digunakan sama sekali dalam Typescripts.
Pertanyaan's kesalahan muncul ketika saya mencoba untuk melakukannya dan saya hanya menemukan kemudian bahwa saya hanya perlu untuk menambahkan dihasilkan JS script untuk View seperti:
<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>
Mencoba apa yang @iFreilicht yang disarankan di atas. Jika itu tidak't bekerja setelah anda've dipasang webpack dan semua, anda mungkin memiliki hanya menyalin webpack konfigurasi dari suatu tempat secara online dan dikonfigurasi ada yang anda ingin output untuk mendukung CommonJS oleh kesalahan. Pastikan ini isn't kasus dalam webpack.config.js
:
modul.ekspor = { mode: proses.env.NODE_ENV || "pengembangan", catatan: { indeks: "./src/js/index.ts" }, ... ... output: { libraryTarget: 'commonjs', <==== HAPUS BARIS INI path: path.bergabung(__dirname, 'membangun'), filename: "[nama].bundel.js" } };
Memiliki masalah yang sama dan tetap dengan mengubah JS paket loading order.
Memeriksa urutan di mana paket-paket yang anda butuhkan dipanggil dan beban mereka dalam urutan yang tepat.
Dalam kasus tertentu (tidak menggunakan modul bundler) yang saya butuhkan untuk memuat Redux
, kemudian Redux Dunk
, kemudian Bereaksi Redux
. Loading Bereaksi Redux
sebelum Redux Dunk
akan memberi saya ekspor tidak didefinisikan
.