typescript ReferenceError: ไม่ได้กำหนดการส่งออก


111

พยายามติดตั้งโมดูลตามคู่มืออย่างเป็นทางการฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

Uncaught ReferenceError: ไม่ได้กำหนดการส่งออก

ที่ app.js: 2

แต่ไม่มีที่ไหนในรหัสของฉันฉันไม่เคยใช้ชื่อexportsนี้

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


ไฟล์

app.ts

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

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

โมดูล -1t

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

โปรดคัดลอกและวางข้อความแสดงข้อผิดพลาดลงในคำถามแทนการใช้ภาพหน้าจอ
Igor

แน่ใจหรือว่าคุณไม่ได้พิมพ์exportsโดยมีsต่อท้ายแทนexport? นั่นจะเป็นการอธิบายข้อความแสดงข้อผิดพลาดเช่นเดียวกับsผิด
Igor

ฉันพิมพ์export not export
George C.

ตัวอย่างใด ๆ จาก repositorie ที่ gona ทำงานได้ 10,000%
George C.

สิ่งนี้กำลังดำเนินการอยู่ที่ไหน? บนหน้าเว็บ? บนเซิร์ฟเวอร์ node.js? คุณจะต้องมีตัวโหลดโมดูลในสภาพแวดล้อมรันไทม์ซึ่งในที่สุดจาวาสคริปต์จะทำงานจากแฟล็กคอมไพเลอร์ที่คุณใช้ commonj ฉันไม่ค่อยคุ้นเคยกับ commonjs แต่คุณจะต้องตั้งค่า commonjs ก่อนที่โมดูล typescript จะทำงานหรือคุณจะต้องเปลี่ยนเป็นตัวโหลดโมดูลอื่น (เช่น require.js) และทำการตั้งค่านั้น
Mike Wodarczyk

คำตอบ:


43

แก้ไข:

คำตอบนี้อาจใช้ไม่ได้หากคุณไม่ได้กำหนดเป้าหมายes5อีกต่อไปฉันจะพยายามทำให้คำตอบสมบูรณ์ยิ่งขึ้น

คำตอบเดิม

หากไม่ได้ติดตั้ง CommonJS ( ซึ่งกำหนดexports ) คุณต้องลบบรรทัดนี้ออกจากtsconfig.json:

 "module": "commonjs",

ตามความคิดเห็นสิ่งนี้เพียงอย่างเดียวอาจใช้ไม่ได้กับtsc. หากเป็นเช่นนั้นคุณสามารถติดตั้งตัวโหลดโมดูลเช่น CommonJS, SystemJS หรือ RequireJS จากนั้นระบุสิ่งนั้น

บันทึก:

ดูmain.jsไฟล์ของคุณที่tscสร้างขึ้น คุณจะพบสิ่งนี้ที่ด้านบนสุด:

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

มันคือต้นตอของข้อความแสดงข้อผิดพลาดและหลังจากลบ"module": "commonjs",แล้วข้อความนั้นจะหายไป


6
ใช่ฉันคอมไพล์ไฟล์. ts ของฉันอีกครั้งและข้อผิดพลาดยังคงมีอยู่หลังจากแสดงความคิดเห็น"module": "commonJs",:(
Acidic9

2
หากการติดตั้ง CommonJS จะทำให้ข้อผิดพลาดนี้หายไปแล้วจะติดตั้ง CommonJS ได้อย่างไร? ฉันได้ใช้เวลาส่วนที่ดีของชั่วโมง Googling และฉันไม่สามารถหาใด ๆคำแนะนำเกี่ยวกับวิธีการที่จะทำเช่นนั้น ใครช่วยอธิบายหน่อยได้ไหม
Sturm

1
@Sturm คำตอบของฉันอาจจะสับสน CommonJS เป็นเพียงข้อมูลจำเพาะเท่านั้น คุณสามารถค้นหารายการ (ไม่จำเป็นต้องครบถ้วนสมบูรณ์) ของการใช้งานที่นี่: en.wikipedia.org/wiki/CommonJS
iFreilicht

2
ฉันมีโมดูล: amd ไม่ใช่โมดูล: commonjs และฉันมีบรรทัดนี้ในไฟล์. js ที่แยกออกมา
pabrams

3
หากคุณมีเป้าหมายเป็น ES3 หรือ ES5 ใน tsconfig.json ของคุณ typescript จะตั้งค่าโมดูลของคุณเป็น CommonJS โดยอัตโนมัติหากไม่ได้กำหนดไว้ การถอดโมดูลไม่เพียงพอคุณต้องตั้งค่าอย่างอื่นแทน - ดูtypescriptlang.org/docs/handbook/compiler-options.html
Jake

55

วิธีแก้ปัญหาอื่น ๆ สำหรับปัญหานี้

  • เพิ่มบรรทัดต่อไปนี้ก่อนการอ้างอิงอื่น ๆ ใน Javascript นี่เป็นการแฮ็กเล็กน้อยที่ดี
   <script>var exports = {};</script>
  • ปัญหานี้เกิดขึ้นกับ TypeScript เวอร์ชันล่าสุดข้อผิดพลาดนี้สามารถกำจัดได้โดยอ้างถึง typescript เวอร์ชัน 2.1.6

3
@ChuckLeButt หวังว่านี่จะช่วยให้stackoverflow.com/questions/19059580/…
Venkatesh Muniyandi

5
ฉันเกลียดที่มันได้ผล! และได้ผลแน่นอน ไม่มีวิธีใดที่จะทำให้ TypeScript แปลงเป็นสิ่งที่ Node คาดหวังได้ เป็นโหนดที่บ่นหรือไม่? หรือเป็นเบราว์เซอร์? ฉันทนไม่ได้ที่จะไม่เข้าใจว่าปัญหาคืออะไร
skillit zimberg

14

ฉันแก้ไขปัญหาโดยการลบ"type": "module"ฟิลด์จากpackage.json.


แต่ทำไมสิ่งนี้ถึงช่วยได้?
DauleDK

@DauleDK เนื่องจากเราใช้ Webpack เพื่อรวมแอพฟิลด์นี้มีการใช้งานในเอ็นจิ้น node.js ใน webpack config เราใช้ระบบโมดูลทั่วไป
Masih Jahangiri


7

วิธีแก้ปัญหาของฉันคือผลรวมของทุกอย่างข้างต้นพร้อมกับเทคนิคเล็ก ๆ น้อย ๆ ที่ฉันเพิ่มโดยพื้นฐานแล้วฉันได้เพิ่มสิ่งนี้ลงในโค้ด html ของฉัน

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

สิ่งนี้ยังช่วยให้คุณสามารถใช้importแทนได้requireว่าคุณกำลังใช้อิเล็กตรอนหรืออะไรบางอย่างและใช้ได้ดีกับ typescript 3.5.1, target: es3 -> esnext


4
ความคืบหน้าบางอย่างที่นี่ข้อผิดพลาดเพิ่งเปลี่ยนเป็นapp.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa

สิ่งนี้จะเกิดขึ้นหากตั้งค่า nodeIntegration เป็นเท็จเมื่อสร้างหน้าต่างข้อผิดพลาดจะเกิดขึ้นเนื่องจากคุณอัปเดต electronJS ของคุณหรือคุณกำลังติดตามแหล่งข้อมูลที่ล้าสมัย nodeIntegration เป็นจริงตามค่าเริ่มต้นตอนนี้เป็นเท็จดังนั้นคุณต้องเปิดใช้งานด้วยตนเองหากคุณต้องการเข้าถึง nodeJS ในกระบวนการแสดงผล โปรดดูที่ [ไม่ได้กำหนดอิเล็กตรอน ()] [1] [1]: stackoverflow.com/questions/44391448/…
Hocine Abdellatif

ฉันไม่ได้ใช้อิเล็กตรอนอย่างไรก็ตามฉันแก้ไขในกรณีของฉันโดยการเพิ่มพัสดุเพื่อสร้างมัดและกำจัดวิธีที่ยุ่งยากอื่น ๆ
Muhammed Moussa


5

ฉันมีปัญหาเดียวกันและแก้ไขโดยเพิ่มไลบรารี " es5 " ไปที่ tsconfig.json ดังนี้:

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

สำหรับคนที่ยังคงมีปัญหานี้หากเป้าหมายคอมไพเลอร์ของคุณตั้งค่าเป็น ES6 คุณต้องบอกให้ babel ข้ามการแปลงโมดูล โดยเพิ่มสิ่งนี้ลงใน.babelrcไฟล์ของคุณ

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

1
ขอบคุณ! ฉันพยายามทำงานกับฐานรหัสรุ่นเก่าซึ่งถ่ายโอนข้อมูลทั้งหมดลงในส่วนกลางและสคริปต์รวมอยู่ในเบราว์เซอร์พร้อมกับ<script>แท็ก ฉันหวังว่าจะใช้โมดูลร่วมกับโค้ดรุ่นเก่าและดูเหมือนว่าจะเป็นไปไม่ได้ อย่างน้อยก็ช่วยให้ฉันใช้ ES6 และให้ฉันจัดการกับการส่งออกในภายหลัง
huggie

2
การทำเช่นนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: การใช้ตัวเลือก Babel 5 ที่ถูกลบ: .modules - ใช้ปลั๊กอินการแปลงโมดูลที่เกี่ยวข้องในpluginsตัวเลือก ตรวจสอบbabeljs.io/docs/plugins/#modules
chharvey

3

ฉันมีข้อผิดพลาดเดียวกันนี้ด้วย ในกรณีของฉันเป็นเพราะเรามีคำสั่งนำเข้าที่ล้าสมัยในโครงการ TypeScript AngularJS ของเราเช่นนี้:

import { IAttributes, IScope } from "angular";

ซึ่งคอมไพล์เป็น JavaScript ดังนี้:

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

สิ่งนี้จำเป็นในสมัยก่อนเพราะเราใช้IAttributesในโค้ดและ TypeScript ก็ไม่รู้ว่าจะทำอย่างไรกับมันเป็นอย่างอื่น แต่หลังจากลบคำสั่งนำเข้าและการแปลงIAttributesเป็นng.IAttributesJavaScript สองบรรทัดก็หายไป - ข้อความแสดงข้อผิดพลาดก็เช่นกัน


1
มันจะทำงานอย่างไรสำหรับประเภท typescript? ฉันต้องนำเข้าดังนั้น typescript จึงรวบรวมมัน
สีฟ้า

"ประเภท typescript" หมายความว่าอย่างไร หากเป็นประเภทจำนวนเต็มที่ TypeScript รู้จักเช่นตัวเลขหรือสตริงคุณสามารถใช้สิ่งนั้นได้ทันที หากคุณกำหนดประเภทของคุณเองในโมดูลให้ตรวจสอบสิ่งนี้typescriptlang.org/docs/handbook/modules.html
MatX

ฉันหมายถึงคำจำกัดความประเภทของห้องสมุดภายนอกเช่น @ ประเภท / jQuery จากnpmjs.com/package/@types/jquery ในการทำให้ตัวแปร $ สามารถใช้งานได้จากภายในโค้ด typescript ของฉันฉันใส่สิ่งนี้ในรหัสของฉัน: import * เป็น $ จาก "jquery";
สีฟ้า

ฉันกำลังกำหนดเป้าหมาย es5 ฉันต้องการไลบรารีอื่นเช่น requirejs เพื่อให้ทำงานนี้ได้หรือไม่
สีฟ้า

1

สำหรับบางโครงการ ASP.NET importและexportอาจไม่สามารถใช้งานได้เลยใน typescripts ของคุณ

ข้อผิดพลาดของคำถามปรากฏขึ้นเมื่อฉันพยายามทำและฉันเพิ่งค้นพบในภายหลังว่าฉันต้องการเพิ่มสคริปต์ JS ที่สร้างขึ้นในมุมมองดังนี้:

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

1

เพียงแค่เพิ่มlibraryTarget: 'umd'เช่นนั้น

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

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


1

หมายเหตุ: สิ่งนี้อาจใช้ไม่ได้กับคำตอบของ OP แต่ฉันได้รับข้อผิดพลาดนี้และนี่คือวิธีที่ฉันแก้ไข

ดังนั้นปัญหาที่ฉันพบคือฉันได้รับข้อผิดพลาดนี้เมื่อฉันดึงไลบรารี 'js' จาก CDN เฉพาะ

สิ่งเดียวที่ผิดที่ฉันทำคือการนำเข้าจากcjsไดเรกทอรีของ CDN ดังนี้: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

สังเกตเห็นdist/cjsส่วน? นั่นคือจุดที่เป็นปัญหา

ฉันกลับไปที่ CDN (jsdelivr) ในกรณีของฉันและไปที่umdโฟลเดอร์ และฉันพบอีกชุดหนึ่งpopper.min.jsซึ่งเป็นไฟล์ที่ถูกต้องที่จะนำเข้า: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/umd/popper.min.js.


0

ลองสิ่งที่ @iFreilicht แนะนำไว้ข้างต้น หากไม่ได้ผลหลังจากที่คุณติดตั้ง webpack และทั้งหมดคุณอาจเพิ่งคัดลอกการกำหนดค่า webpack จากที่อื่นทางออนไลน์และกำหนดค่าไว้ที่นั่นว่าคุณต้องการให้เอาต์พุตรองรับ CommonJS โดยไม่ได้ตั้งใจ ตรวจสอบให้แน่ใจว่าไม่ใช่กรณีนี้ใน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

มีปัญหาเดียวกันและแก้ไขได้โดยเปลี่ยนลำดับการโหลดแพ็คเกจ JS

ตรวจสอบลำดับที่เรียกใช้แพ็กเกจที่คุณต้องการและโหลดตามลำดับที่เหมาะสม

ในกรณีที่เฉพาะเจาะจงของฉัน (ไม่ได้ใช้ Bundler โมดูล) ฉันต้องการที่จะโหลดReduxแล้วแล้วRedux Thunk React ReduxโหลดReact Reduxก่อนที่จะให้ฉันRedux Thunkexports 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 โปรดเพิ่มบริบทให้กับคำตอบของคุณหรือคำอธิบายเพื่อให้ผู้ใช้เข้าใจสิ่งที่ทำ การโพสต์ JSON เพียงอย่างเดียวอาจไม่เป็นประโยชน์ ...
Bruno Monteiro

0

ฉันมีปัญหาเดียวกัน แต่การตั้งค่าต้องใช้วิธีอื่น

ฉันใช้create-react-app-rewiredแพคเกจกับconfig-overrides.jsไฟล์ ก่อนหน้านี้ฉันใช้addBabelPresetsการนำเข้า (ในoverride()วิธีการ) จากcustomize-craและตัดสินใจที่จะแยกค่าที่ตั้งไว้ล่วงหน้าเหล่านั้นไปยังไฟล์แยกต่างหาก สิ่งนี้ช่วยแก้ปัญหาของฉันได้โดยบังเอิญ

ฉันเพิ่มลงuseBabelRc()ในไฟล์override()วิธีการในconfig-overrides.jsและสร้างbabel.config.jsไฟล์ที่มีดังต่อไปนี้:

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

0

ในการแก้ปัญหานี้ให้ใส่สองบรรทัดนี้ในหน้าindex.htmlของคุณ

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

อย่าลืมตรวจสอบเส้นทางไฟล์main.jsของคุณ


วิธีนี้ใช้ได้เฉพาะในกรณีที่คุณไม่มีrequire()ข้อความในรหัสของคุณ
Daniel Tonon

0

หากคุณแค่ใช้อินเทอร์เฟซสำหรับประเภทให้exportเว้นคีย์เวิร์ดไว้และ ts สามารถเลือกประเภทได้โดยไม่จำเป็นต้องนำเข้า กุญแจสำคัญคือคุณไม่สามารถใช้import/ exportที่ใดก็ได้

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

เป็น

interface Person {
   name: string;
   age: number;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.