প্রকারের উল্লেখ রেফারেন্স: রফতানি সংজ্ঞায়িত হয় না


111

অফিসিয়াল হ্যান্ডবুক অনুসরণ করে একটি মডিউল বাস্তবায়নের চেষ্টা করছি , আমি এই ত্রুটি বার্তাটি পেয়েছি:

আনকড রেফারেন্স এরিয়ার: রফতানি সংজ্ঞায়িত হয় না

at. apps.js: 2

তবে আমার কোডে কোথাও আমি নামটি ব্যবহার করি না exports

আমি এটা কিভাবে ঠিক করবো?


নথি পত্র

app.ts

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

import Person = require ('./mods/module-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"
    ]
}

স্ক্রিন শট ব্যবহার না করে প্রশ্নটিতে ত্রুটি পাঠ্যটি অনুলিপি করুন এবং আটকান।
ইগোর 10

আপনি কি নিশ্চিত যে আপনি এর পরিবর্তে শেষের দিকে এসexports দিয়ে টাইপ করেননি ? যে ত্রুটির বার্তা ব্যাখ্যা করবে মত গুলি ভুল। export
ইগোর

আমি রফতানি রফতানি না টাইপ করি
জর্জ সি।

রিপোসিটিরির কোনও উদাহরণ যা গোনা 10000% কাজ করে
জর্জ সি।

এটা কোথায় চালানো হচ্ছে? একটি ওয়েব পৃষ্ঠায়? একটি নোড.জেএস সার্ভারে? জাভাস্ক্রিপ্ট অবশেষে চালিত হয় এমন রান-টাইম পরিবেশে আপনার একটি মডিউল লোডার প্রয়োজন। আমি কমনজগুলির সাথে তেমন পরিচিত নই, তবে টাইপস্ক্রিপ্ট মডিউলগুলি কাজ করার আগে আপনাকে জেনেজ স্থাপন করতে হবে বা আপনাকে অন্য একটি মডিউল লোডার (যেমন। ডাব্লু.এসএস) তে পরিবর্তন করতে হবে এবং সেটিকে একটি সেট আপ করতে হবে।
মাইক ওডারসাকেক

উত্তর:


44

সম্পাদনা:

আপনি যদি es5আর টার্গেট না করে থাকেন তবে এই উত্তরটি কার্যকর নাও হতে পারে , আমি উত্তরটি আরও সম্পূর্ণ করার চেষ্টা করব।

আসল উত্তর

যদি কমনজেএস ইনস্টল না করা থাকে ( যা সংজ্ঞায়িত করেexports ) তবে আপনাকে এই লাইনটি আপনার থেকে সরাতে হবে tsconfig.json:

 "module": "commonjs",

মতামত অনুসারে, এটি একা পরবর্তী সংস্করণগুলির সাথে কাজ করতে পারে না tsc। যদি এটি হয় তবে আপনি কমনজেএস, সিস্টেমজেএস বা প্রয়োজনীয় জেএসের মতো একটি মডিউল লোডার ইনস্টল করতে পারেন এবং তারপরে এটি নির্দিষ্ট করতে পারেন।

বিঃদ্রঃ:

আপনার main.jsফাইলটি দেখুন যা tscউত্পন্ন হয়েছে। আপনি এটি একেবারে শীর্ষে পাবেন:

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

এটি ত্রুটি বার্তার মূল, এবং অপসারণের পরে "module": "commonjs",এটি বিলুপ্ত হবে।


6
হ্যাঁ আমি আমার .ts ফাইলটি আবার সংকলিত করেছি এবং মন্তব্য করার পরে ত্রুটিটি এখনও রয়েছে "module": "commonJs",:(
এসিডিক 9

4
যদি কমনজেএস ইনস্টল করার ফলে এই ত্রুটিটি দূর হয়ে যায়, তবে আসলে কীভাবে একজন কমনজেএস ইনস্টল করবেন? আমি গুগলিংয়ের এক ঘন্টার ভাল সময় ব্যয় করেছি এবং কীভাবে এটি করা যায় সে সম্পর্কে কোনও নির্দেশিকা খুঁজে পাচ্ছি না । কেউ দয়া করে ব্যাখ্যা করতে পারেন ?
ঝড়

4
@ স্টর্ম আমার উত্তরটি বিভ্রান্তিকরভাবে বর্ণিত হতে পারে। কমনজেএস কেবল একটি স্পেসিফিকেশন। : আপনি এখানে একটি (অগত্যা সম্পূর্ণ নয়) বাস্তবায়নের একটি তালিকা খুঁজে পেতে পারেন en.wikipedia.org/wiki/CommonJS
iFreilicht

4
আমার কাছে মডিউল আছে: amd, মডিউল নয়: কমনজ এবং আমার ট্রান্সপ্লেরড .js ফাইলে এই লাইনটি রয়েছে।
পাব্রাম 16

4
আপনার tsconfig.json এ যদি আপনার ES3 বা ES5 হিসাবে টার্গেট থাকে তবে টাইপসক্রিপ্টটি স্বয়ংক্রিয়ভাবে আপনার মডিউলটি কমনজেএস-এ সেট করবে যদি এটি সংজ্ঞায়িত না হয়। মডিউল অপসারণ করা যথেষ্ট নয়, পরিবর্তে আপনাকে অন্য কিছু সেট করতে হবে - टाइप করুন স্ক্রিপ্টএল.আর.গ্রাফিকেশন
জ্যাক

55

এই সমস্যাটির জন্য কয়েকটি অন্যান্য সমাধান

  • জাভাস্ক্রিপ্টে অন্যান্য উল্লেখের আগে নিম্নলিখিত লাইনটি যুক্ত করুন। এটি একটি দুর্দান্ত সামান্য হ্যাক।
   <script>var exports = {};</script>
  • এই সমস্যাটি টাইপস্ক্রিপ্টের সর্বশেষ সংস্করণ সহ ঘটে, টাইপস্ক্রিপ্ট সংস্করণ ২.১..6 উল্লেখ করে এই ত্রুটিটি দূর করা যায়

4
@ChuckLeButt এই সাহায্য আশা stackoverflow.com/questions/19059580/...
ভেঙ্কটেশ Muniyandi

5
আমি ঘৃণা করি যে এটি কাজ করে! এবং এটি অবশ্যই কাজ করে। নোড প্রত্যাশা করে এমন কোনও ক্ষেত্রে ট্রান্সপ্লিট করার জন্য টাইপস্ক্রিপ্ট পাওয়ার কোনও উপায় নেই? এমনকি নোডও যে অভিযোগ করছে? নাকি এটি ব্রাউজার? সমস্যাটি আসলে কী তা বুঝতে পেরে আমি দাঁড়াতে পারছি না।
দক্ষতা জিমবার্গ

14

আমি "type": "module"ক্ষেত্রটি থেকে সরিয়ে সমস্যার সমাধান করেছি package.json


কিন্তু কেন এই সাহায্য করে?
দোলডিকে

@ ডডলডিকে কারণ আমরা অ্যাপ্লিকেশন বান্ডিল করতে ওয়েবপ্যাক ব্যবহার করি, এই ক্ষেত্রটির নোড.জে ইঞ্জিনে ব্যবহার রয়েছে। ওয়েবপ্যাক কনফিগারেশনে আমরা সাধারণ মডিউল সিস্টেমটি করি
মসিহ জাহাঙ্গিরি

10

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

এবং .babrcrc এ যুক্ত করুন প্লাগইনগুলি আমার প্রশ্নের সমাধান করে।


7

আমার সমাধানটি আমি যুক্ত করা ছোট্ট কৌশলগুলি দিয়ে উপরের সমস্ত কিছুর যোগফল bas

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

এমনকি আপনি যদি ইলেকট্রন বা কিছু ব্যবহার করছেন তবে importপরিবর্তে এটি ব্যবহারের অনুমতি দেয় requireএবং এটি টাইপস্ক্রিপ্ট 3.5.1.1, টার্গেট: এস 3 -> এসেনেক্সট সহ দুর্দান্ত কাজ করে।


4
এখানে কিছু অগ্রগতি হয়েছে, ত্রুটিটি সবেমাত্র পরিবর্তিত হয়েছেapp.js:3 Uncaught ReferenceError: require is not defined
মুহাম্মদ মোছা

উইন্ডোটি তৈরি করার সময় নোডইন্টিগ্রেশন মিথ্যাতে সেট করা থাকলে এটি ঘটে, ত্রুটি ঘটে কারণ আপনি আপনার ইলেক্ট্রনজেএস আপডেট করেছেন বা আপনি কোনও পুরানো উত্স অনুসরণ করছেন। নোডইন্টিগ্রেশন ডিফল্টরূপে সত্য ছিল, এখন এটি মিথ্যা, সুতরাং আপনি যদি রেন্ডারকারী প্রক্রিয়াতে নোডজেএস অ্যাক্সেস করতে চান তবে আপনাকে এটি ম্যানুয়ালি সক্ষম করতে হবে। দেখুন [ইলেক্ট্রন প্রয়োজনীয় () সংজ্ঞায়িত করা হয়নি] [1] [1]: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

আমি ইলেক্ট্রন ব্যবহার করছি না, যাইহোক আমি আমার ক্ষেত্রে সমাধান করেছিলাম বান্ডিল স্টাফ তৈরির জন্য পার্সেল যুক্ত করে এবং অন্যান্য কৌশলগুলি মুছে ফেলেছি
মুহম্মদ মুছা


5

আমার একই সমস্যা ছিল এবং এটি সমাধান করা হয়েছে এটির মতো " এস 5 " লাইব্রেরিটিকে 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 তে সেট করা থাকে তবে আপনাকে মডিউল রূপান্তর এড়াতে বাবেলকে বলতে হবে। এটি করতে আপনার .babelrcফাইলটিতে এটি যুক্ত করুন

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

4
ধন্যবাদ মানুষ! আমি পুরানো কোড বেসের সাথে কাজ করার চেষ্টা করছি যা সমস্ত গ্লোবালগুলিতে ফেলে দেয় এবং স্ক্রিপ্টগুলি <script>ট্যাগ সহ ব্রাউজারে অন্তর্ভুক্ত থাকে । আমি পুরানো কোড সহ মডিউলটি ব্যবহার করার আশা করছিলাম এবং মনে হয় এটি সম্ভব নয়। এটি অন্ততপক্ষে আমাকে ES6 ব্যবহার করার অনুমতি দেয় এবং আমাকে পরে রফতানি করতে ডিল করতে দেয়।
হুগি

4
এটি করার ফলে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: সরানো বাবেল 5 বিকল্পটি ব্যবহার করে: .মডিউলসমূহ - বিকল্পটিতে সংশ্লিষ্ট মডিউল ট্রান্সফর্ম প্লাগইনটি ব্যবহার করুন plugins। পরীক্ষা করে দেখুন babeljs.io/docs/plugins/#modules
chharvey

3

আমারও এই একই ত্রুটি ছিল। আমার ক্ষেত্রে এটি ছিল কারণ আমাদের টাইপস্ক্রিপ্ট অ্যাঙ্গুলারজেএস প্রকল্পে আমাদের পুরানো ধরণের আমদানির বিবৃতি ছিল:

import { IAttributes, IScope } from "angular";

যা জাভাস্ক্রিপ্টে এভাবে সংকলিত হয়েছিল:

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

পুরানো দিনগুলিতে এটির দরকার ছিল কারণ আমরা তখন IAttributesকোড এবং টাইপস্ক্রিপ্ট ব্যবহার করতাম তবে অন্যথায় এটি কী করা উচিত তা আমরা জানতাম না। তবে আমদানি বিবৃতিটি সরিয়ে, এবং সেই দুটি জাভাস্ক্রিপ্ট লাইনে রূপান্তর IAttributesকরার পরে ng.IAttributesঅদৃশ্য হয়ে গেল - এবং ত্রুটি বার্তাটিও তাই ঘটল।


4
কিভাবে এটি একটি টাইপস্ক্রিপ্ট টাইপ জন্য কাজ করবে? আমাকে এটি আমদানি করতে হবে, তাই টাইপস্ক্রিপ্ট এটি সংকলন করে।
ব্লু

"টাইপস্ক্রিপ্ট টাইপ" বলতে কী বোঝ? যদি এটি টাইপস্ক্রিপ্ট দ্বারা পরিচিত কোনও ইন্টিজারাল টাইপ - যেমন নম্বর বা স্ট্রিং - তবে আপনি এখনই এটি ব্যবহার করতে পারেন। : আপনি একটি মডিউল আপনার নিজের ধরনের সংজ্ঞায়িত হলে, এই পরীক্ষা typescriptlang.org/docs/handbook/modules.html
MatX

আমি npmjs.com/package/@tyype/jquery থেকে @ টাইপ / jquery যেমন একটি বাহ্যিক গ্রন্থাগারের টাইপ সংজ্ঞা বোঝাতে চেয়েছি । আমার টাইপসক্রিপ্ট কোডের মধ্যে থেকে $ ভেরিয়েবলকে ব্যবহারযোগ্য করে তোলার জন্য, আমি এটি আমার কোডটিতে রেখেছি: "jquery" থেকে import হিসাবে * আমদানি করুন;
ব্লু

আমি এস 5 কে টার্গেট করছি, এই কাজটি করার জন্য আমার কি অন্য লাইব্রেরির প্রয়োজন হবে?
ব্লু ই

1

কিছু এএসপি.এনইটি প্রকল্পের জন্য importএবংexport আপনার টাইপ স্ক্রিপ্টগুলিতে মোটেই ব্যবহার করা যাবে না।

আমি যখন এটি করার চেষ্টা করেছি তখন প্রশ্নের ত্রুটিটি প্রকাশ পেয়েছিল এবং আমি কেবল পরে আবিষ্কার করেছি যে জেনারেটেড জেএস স্ক্রিপ্টটি আমাকে ভিউতে যুক্ত করার দরকার ছিল :

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



1

দ্রষ্টব্য: এটি ওপি-র উত্তরের জন্য প্রযোজ্য নাও হতে পারে তবে আমি এই ত্রুটিটি পেয়েছিলাম এবং এটি কীভাবে সমাধান করেছি।

সুতরাং আমি যে সমস্যার মুখোমুখি হয়েছি তা হ'ল আমি যখন একটি নির্দিষ্ট সিডিএন থেকে 'জেএস' লাইব্রেরিটি পেয়েছি তখন আমি এই ত্রুটিটি পেয়েছিলাম getting

আমি কেবল যে ভুল কাজটি করছিলাম তা হ'ল সিডিএন এর cjsডিরেক্টরি থেকে আমদানি করা : https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

dist/cjsঅংশটি লক্ষ্য করুন ? সমস্যাটি সেখানেই ছিল।

আমি আমার ক্ষেত্রে সিডিএন (jsdelivr) এ ফিরে গিয়ে umdফোল্ডারটি সন্ধান করতে নেভিগেট করেছি । পরে আমি আর একজন সেটের খুঁজে পাইনি popper.min.jsযা আমদানি সঠিক ফাইল ছিল: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/umd/popper.min.js


0

উপরে ক্লিক করুন @ iFreilicht। আপনি ওয়েবপ্যাক এবং সমস্ত ইনস্টল করার পরে যদি এটি কাজ না করে তবে আপনি হয়ত অনলাইনে কোথাও একটি ওয়েবপ্যাক কনফিগারেশন অনুলিপি করে সেখানে কনফিগার করেছেন যে আপনি আউটপুটটি ভুল করে কমনজেএস সমর্থন করতে চান। নিশ্চিত করুন যে এটি তেমন নয় 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

একই সমস্যা ছিল এবং জেএস প্যাকেজ লোডিং ক্রম পরিবর্তন করে এটি ঠিক করেছে।

আপনার প্রয়োজনীয় প্যাকেজগুলি যে ক্রমে কল করা হচ্ছে সেটিকে পরীক্ষা করুন এবং সেগুলি একটি উপযুক্ত ক্রমে লোড করুন।

আমার নির্দিষ্ট যদি (মডিউল bundler ব্যবহার করছেন না) আমি লোড করতে প্রয়োজনীয় Redux, তারপর Redux Thunk, তারপর React ReduxReact Reduxআগে লোড করা Redux Thunkআমাকে দিতে হবে exports is not defined


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

এই সমস্যাটি সমাধান করতে, আপনার সূচিপত্রের html পৃষ্ঠাতে এই দুটি লাইন রাখুন ।

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

আপনার main.js ফাইলের পাথটি পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত করুন ।


require()আপনার কোডটিতে কোনও বিবৃতি না থাকলে এটি কেবলমাত্র কাজ করে ।
ড্যানিয়েল টনন

0

আপনি যদি প্রকারের জন্য কেবল ইন্টারফেস ব্যবহার করে থাকেন তবে exportকীওয়ার্ডটি ছেড়ে দিন এবং টিএস আমদানির প্রয়োজন ছাড়াই প্রকারগুলি বেছে নিতে পারে। তারা কী আপনি import/ exportকোথাও ব্যবহার করতে পারবেন না ।

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

মধ্যে

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

-1
  {
    "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
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। দয়া করে আপনার উত্তর বা কিছু ব্যাখ্যাতে কিছু প্রসঙ্গ যুক্ত করুন যাতে ব্যবহারকারী বুঝতে পারে যে কী হয়েছে। কেবল একটি জেএসএন পোস্ট করা তেমন সহায়ক হতে পারে না ...
ব্রুনো মন্টিরিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.