TypeScript erhält Fehler TS2304: Name 'require' kann nicht gefunden werden


463

Ich versuche, meine erste TypeScript- und DefinitelyTyped Node.js-Anwendung zum Laufen zu bringen und einige Fehler zu finden.

Ich erhalte die Fehlermeldung "TS2304: Name 'require' kann nicht gefunden werden", wenn ich versuche, eine einfache TypeScript Node.js-Seite zu transpilieren. Ich habe mehrere andere Vorkommen dieses Fehlers beim Stapelüberlauf gelesen und glaube nicht, dass ich ähnliche Probleme habe. Ich führe an der Shell die Eingabeaufforderung aus:

tsc movie.server.model.ts.

Der Inhalt dieser Datei ist:

'use strict';

/// <reference path="typings/tsd.d.ts" />

/*    movie.server.model.ts - definition of movie schema */

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var foo = 'test';

Der Fehler wird in die var mongoose=require('mongoose')Zeile geworfen .

Der Inhalt der Datei typings / tsd.d.ts lautet:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

Die .d.ts-Dateiverweise wurden in den entsprechenden Ordnern abgelegt und mit den folgenden Befehlen zu typings / tsd.d.ts hinzugefügt:

tsd install node --save
tsd install require --save

Die erzeugte .js-Datei scheint gut zu funktionieren, daher könnte ich den Fehler ignorieren. Aber ich würde gerne wissen, warum dieser Fehler auftritt und was ich falsch mache.


1
when I attempt to transpile a simple ts node page<Wie
transpilieren

1
Ich führe nur die Befehlszeile aus, indem ich den folgenden Befehl eingebe: tsc movie.server.model.ts. FWIW das ist auf einem Mac.
JerryKur

1
Das gleiche Problem trat auch in der IDE auf, in der ich Visual Studio Code verwendet habe. Ich werde es mit meiner anderen IDE, IntelliJ, versuchen. Ich nahm an, dass das Ablegen in der Befehlszeile der sauberste Weg war, um dieses Problem zu testen.
JerryKur


Wie wäre es import { mongoose } from 'mongoose'?
FisNaN

Antworten:


744

Schnell und dreckig

Wenn Sie nur eine Datei mit require haben oder dies für Demozwecke tun, können Sie require oben in Ihrer TypeScript-Datei definieren.

declare var require: any

TypeScript 2.x.

Wenn Sie TypeScript 2.x verwenden, muss Typings oder Definitely Typed nicht mehr installiert sein. Installieren Sie einfach das folgende Paket.

npm install @types/node --save-dev

Die Zukunft der Deklarationsdateien (15.06.2016)

Tools wie Typings und tsd werden weiterhin funktionieren, und wir werden mit diesen Communitys zusammenarbeiten, um einen reibungslosen Übergang zu gewährleisten.

Überprüfen oder bearbeiten Sie Ihre src /tsconfig.app.json so, dass sie Folgendes enthält:

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...

Stellen Sie sicher, dass sich die Datei im Ordner src und nicht im Ordner der Root-App befindet.

Standardmäßig ist jedes Paket unter @types bereits in Ihrem Build enthalten, es sei denn, Sie haben eine dieser Optionen angegeben. Weiterlesen

TypeScript 1.x.

Mithilfe von Typisierungen (DefinitelyTypeds Ersatz) können Sie eine Definition direkt aus einem GitHub-Repository angeben.

Installieren Sie die Eingaben

npm install typings -g --save-dev

Installieren Sie die requireJS-Typdefinition aus dem Repo von DefinitelyType

typings install dt~node --save --global

Webpack

Wenn Sie Webpack als Build-Tool verwenden, können Sie die Webpack-Typen einschließen.

npm install --save-dev @ types / webpack-env

Aktualisieren Sie Ihre tsconfig.jsonmit den folgenden unter compilerOptions:

"types": [
      "webpack-env"
    ]

Auf diese Weise können Sie require.ensureandere Webpack-spezifische Funktionen ausführen.

Angular CLI

Mit CLI können Sie dem obigen Webpack-Schritt folgen und den Block "types" zu Ihrem hinzufügen tsconfig.app.json.

Alternativ können Sie die vorinstallierten nodeTypen verwenden. Beachten Sie, dass dies zusätzliche Typen zu Ihrem clientseitigen Code enthält, die nicht wirklich verfügbar sind.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }

4
warum nicht einfach "typings install --save --ambient require"?
Kutomer

1
Ich bekomme einen Fehler damit Unable to find "require" ("npm") in the registry. Ist ein Teil eines größeren Satzes von NodeJS-Typisierungen erforderlich?
dcsan

7
Ich denke, dies ist FALSCH, da es sich auf Typisierungen für requireJS bezieht, nicht auf eingebaute Knoten require. Vielleicht die richtige Antwort für eine Variation des ES5-Ausgabeziels, aber nicht für den allgemeinen Fall.
dcsan

1
Bitte beziehen Sie sich auf Jordan Awnser. In meinem Fall hatte ich die folgenden @types installiert, also habe ich -> "types" hinzugefügt: ["node", "es6-versprechen", "core-js", "jasmine"] <- zu compilerOptions in tsconfig.json
Lothre1

1
@Seagull @types/nodesind die TypeScript-Definitionen. Der Knoten enthält diese nicht und sollte sie auch nicht enthalten.
Cgatian

103

Für TypeScript 2.x gibt es jetzt zwei Schritte:

  1. Installieren Sie ein Paket, das definiert require. Zum Beispiel:

    npm install @types/node --save-dev
  2. Weisen Sie TypeScript an, es global aufzunehmen in tsconfig.json:

    {
        "compilerOptions": {
            "types": ["node"]
        }
    }

Der zweite Schritt ist nur wichtig, wenn Sie Zugriff auf global verfügbare Funktionen wie benötigen require. Für die meisten Pakete sollten Sie nur das import package from 'package'Muster verwenden. Es ist nicht erforderlich, jedes Paket in das obige Array tsconfig.json-Typen aufzunehmen.


1
Sie können lib entweder für einige es5 verwenden github.com/Microsoft/TypeScript/wiki/… Gl.: "Lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro

Nach der Zugabe von "types": ["jasmine", "hammerjs"]bis tsconfig.jsich hade hinzuzufügen nodeals auch. Danke Jordan.
Mikeumus

Wenn ich diesen Rat befolge, werden alle meine Importe unterbrochen. Zum Beispiel import express from "express";sagt mir jetzt, dass ich versuchen muss, @ types / express zu installieren oder eine .d.ts-Datei dafür hinzuzufügen.
austinthemassive

4
Wenn Sie mehr haben @types/...als nur @types/nodeOrdner hinzufügen , nicht "types": ["node"]in , tsconfig.jsonweil Typoskript compiller andere nicht genannte Pakete auslassen wird. Dadurch werden Ihre IDEs-Typen aufgelöst. Es steht geschrieben , hier typescriptlang.org/docs/handbook/...
Marecky

Diese Lösung funktioniert für mich in einem ionischen Projekt ohne Probleme, danke :)
Fran Sandi

71

Du kannst

declare var require: any

Oder verwenden Sie für eine umfassendere Unterstützung die Anforderungen von DefinitelyTyped

Anstelle von var mongoose = require('mongoose')können Sie auch Folgendes versuchen

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')

1
Nur für die Verwendung use strictin TypeScript: Basarat-Antwort und "Use Strict" in einer TypeScript-Datei? . Es ist notwendig, use strictin TypeScript zu verwenden.
Eugene Bichel

Hm, laut dieser Antwort ist es nicht notwendig, aber es könnte nützlich sein, es zu verwenden "use strict". Ich werde meine Antwort bearbeiten
ᆼ ᆺ ᆼ

Die Verwendung von declare var require behebt das eigentliche Problem nicht. verstecke es einfach.
Mein Stapel läuft

@Ant richtig, denken Sie daran, dies ist aus dem Jahr 2015, und ich würde auch argumentieren, dass es kein "Problem" zu beheben gibt. TypeScript 2.0 löst dies jetzt natürlich elegant
ᆼ ᆺ ᆼ

12

Diese Antwort bezieht sich auf moderne Setups (TypeScript 2.x, Webpack > 2.x)

Sie müssen nicht @ types / node installieren (dies sind alle Node.js-Typen und für den Front-End-Code irrelevant), was Dinge wie setTimout, verschiedene Rückgabewerte usw. kompliziert.

Sie tun müssen @ Typen installieren / webpack-env

npm i -D @types/webpack-env

wodurch man die Laufzeit Signaturen dass Webpack hat (einschließlich require, require.ensureetc.)

Stellen Sie außerdem sicher, dass in Ihrer Datei tsconfig.json kein Array 'types' festgelegt ist ->, wodurch alle Typdefinitionen in Ihrem Ordner node_modules / @ types abgerufen werden.

Wenn Sie die Suche nach Typen einschränken möchten, können Sie die Eigenschaft typeRoot auf node_modules / @ types setzen.


1
Dies ist eine wichtige Bemerkung. Stellen Sie außerdem sicher, dass in Ihrer Datei tsconfig.json kein Array 'types' festgelegt ist -> wodurch alle Typdefinitionen in Ihrem Ordner node_modules / @ types
abgerufen werden

Sind beim Webpack-Ansatz weitere Schritte erforderlich? Ich erhalte einen Kompilierungsfehler "Fehler TS2580: Name" Erforderlich "kann nicht gefunden werden.
Jaycer

10

Anstatt:

'use strict';

/// <reference path="typings/tsd.d.ts" />

Versuchen:

/// <reference path="typings/tsd.d.ts" />

'use strict';

dh Referenzpfad zuerst.


Funktioniert, aber irgendwie schmutzig IMO - es verbirgt im Grunde den Fehler, anstatt ihn zu korrigieren. Perfekt für Demos und schnelle Skripte, aber nicht für die Produktion
Nino Filiu

8

In meinem Fall war es ein super dummes Problem, bei dem src/tsconfig.app.jsondas übersteuert wurdetsconfig.json Einstellung Kraft gesetzt wurde.

Also hatte ich das in tsconfig.json:

    "types": [
      "node"
    ]

Und dieser in src/tsconfig.app.json:

    "types": []

Ich hoffe, jemand findet das hilfreich, da dieser Fehler mir graue Haare verursachte.


8

Nur als Referenz verwende ich Angular 7.1.4 , TypeScript 3.1.6 und das einzige, was ich tun muss, ist diese Zeile hinzuzufügen in tsconfig.json:

    "types": ["node"], // within compilerOptions

Tat dies. Immer noch dieser Fehler: Der Name 'require' wurde nicht gefunden. Müssen Sie Typdefinitionen für Knoten installieren? Versuchen Sie es npm i @types/nodeund fügen Sie nodees dem Typenfeld in Ihrer tsconfig hinzu. - hat npm installiert.
Suisse

7

Ich fand die Lösung darin, den TSD-Befehl zu verwenden:

tsd install node --save

Dadurch wird die typings/tsd.d.tsDatei hinzugefügt / aktualisiert , und diese Datei enthält alle Typdefinitionen, die für eine Knotenanwendung erforderlich sind.

Am Anfang meiner Datei habe ich einen Verweis auf tsd.d.tsFolgendes eingefügt:

/// <reference path="../typings/tsd.d.ts" />

Die Anforderung ist ab Januar 2016 wie folgt definiert:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}

Ich habe 404 nicht gefunden
Bormat

5

Ich habe die Antwort von Peter Varga zum Hinzufügen genommen declare var require: any;und daraus eine generische Lösung gemacht, die mit dem Preprocess-Loader generisch für alle .ts-Dateien funktioniert :

  1. Präprozessor-Loader installieren:

    npm install preprocessor-loader
  2. Fügen Sie den Loader zu Ihrer webpack.config.js hinzu (ich verwende ts-loader zum Verarbeiten von TypeScript-Quellen):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Fügen Sie die Konfiguration hinzu, mit der die Problemumgehung zu jeder Quelle hinzugefügt wird:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Sie können die robustere require.d.ts auf die gleiche Weise hinzufügen , war aber declare var require: any;in meiner Situation ausreichend.

Beachten Sie, dass es in Präprozessor 1.0.5 einen Fehler gibt , der die letzte Zeile abschneidet. Stellen Sie also sicher, dass Sie am Ende einen zusätzlichen Zeilenabstand haben und alles in Ordnung ist.


1
Warum wurde das abgelehnt? Es beantwortet die Frage und bringt etwas Neues und Bedeutendes auf den Tisch. Jetzt müssen Sie nicht jede Datei einzeln zerlegen, um den Transpiler und das Webpack zufrieden zu stellen.
Benny Bottema

Können Sie Schritt 3 näher erläutern? Ich bin ein Neuling und weiß nicht, wo ich diesen Konfigurationscode ablegen soll.
user441058

@ user441058, checkout the GitHub page , Schritt 3 befasst sich mit der Hauptkonfiguration für den Preprocess-Loader.
Benny Bottema

2

Ich habe auch mit diesem Problem zu kämpfen. Ich glaube, dass dies für alle Release-Kandidaten alias rc funktioniert, aber ich habe es nicht getestet. Für @angular rc.2 funktioniert es gut.

  1. Fügen Sie core-jsals npm Abhängigkeit inpackage.json
  2. Lauf typings install core-js --save
  3. Entfernen Sie alle "es6-shim"Vorkommen in Ihrem package.json. Du brauchst es nicht mehr.

Prost!


Wofür sind die Core-Js-Typisierungen? knotenspezifisch?
dcsan



2

Das Fehlen von "Jasmin" in tsconfig.json kann diesen Fehler verursachen. (TypeScript 2.X)

Also hinzufügen

"types": [
  "node",
  "jasmine"
]

zu Ihrer tsconfig.jsonDatei.


2

Elektron + Winkel 2/4 Addition:

Zusätzlich zum Hinzufügen des Typs 'node' zu verschiedenen Dateien von ts.config funktionierte das, was für mich schließlich funktionierte, das Hinzufügen des nächsten zur typings.d.tsDatei:

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

Beachten Sie, dass sich mein Fall mit Electron + Angular 2/4 entwickelt. Ich brauchte die Anforderung auf dem Fenster global.


2

Für mich wird es durch Hinzufügen von Typen zu den Winkel-Compiler-Optionen gelöst .

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}

Es ist in tsconfig.json für alle, die es wissen wollen.
Stephen Zeng

1
Dies ist für Winkel 9.
Arun

1
  1. Haben Sie angegeben, mit welchem ​​Modul der Code transpiliert werden soll?
    tsc --target es5 --module commonjs script.ts
    Sie müssen dies tun, um den Transpiler darüber zu informieren, dass Sie NodeJS-Code kompilieren. Docs .

  2. Sie müssen auch Mungo-Definitionen installieren
    tsd install mongoose --save

  3. varVerwenden Sie letstattdessen nicht, um Variablen zu deklarieren (es sei denn, dies ist ein sehr seltener Fall) . Erfahren Sie mehr darüber


1

Nur zusätzlich zu cgatians Antwort für TypeScript 1.x.

Wenn weiterhin Fehler auftreten, geben Sie in Ihren Compileroptionen speziell index.d.ts an.

"files": [
    "typings/index.d.ts"
]

1

Ich konnte den 'Require'-Fehler nicht mit einem der oben genannten Tricks beseitigen.

Ich fand jedoch heraus, dass das Problem darin bestand, dass meine TypeScript-Tools für Visual Studio eine alte Version (1.8.6.0) und die neueste Version von heute (2.0.6.0) enthielten.

Sie können die neueste Version der Tools herunterladen von:

TypeScript für Visual Studio 2015


1

Wenn Sie Code kompilieren können, Visual Studio 2015 jedoch die Markierungsfunktionen "erforderlich" aktiviert, da Fehler mit Fehlertext den Namen "erforderlich" nicht finden oder das Symbol "erforderlich" nicht auflösen können. , aktualisieren Sie TypeScript für Visual Studio 2015 auf die neueste Version (derzeit 2.1). 5) und aktualisieren Sie ReSharper (falls Sie es verwenden) auf mindestens Version 2016.3.2.

Ich hatte dieses nervige Problem für eine Weile und konnte keine Lösung finden, aber ich habe es schließlich auf diese Weise gelöst.


1

Fügen Sie Folgendes hinzu tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]

2
Dies wird bereits in der Antwort von @ cgatian erwähnt .
Tuomastik

@cgatian hat "node_modules / @ types" erwähnt, während ich "../node_modules/@types" erwähnt habe.
Darshan Ballal

1

Ich habe noch eine andere Antwort , die auf allen früheren Builds , die beschreiben , npm install @types/nodeeinschließlich nodein tsconfig.json / compilerOptions / types.

In meinem Fall habe ich eine Basis tsConfig.jsonund eine separate in der Angular-Anwendung, die diese erweitert:

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": []
 },

Mein Problem war das leere typesin diesem tsconfi.app.json- es verstopft das in der Basiskonfiguration.


-2

Wenn Sie dieses Problem in einer .ts-Datei haben, die nur dazu dient, Ihnen einige konstante Werte bereitzustellen, können Sie dies einfach tun

Benennen Sie Ihre .ts-Datei in .js-Datei um

und der Fehler wird nicht wiederkommen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.