关于node.js:typescript获取错误TS2304:找不到名称’require’

typescript getting error TS2304: cannot find name ' require'

我正在尝试运行我的第一个typescript和definitelytyped节点应用程序,并遇到一些错误。

当我试图打开一个简单的TS节点页面时,我得到了错误"ts2304:cannot find name'require'"。我已经阅读了关于so的其他几个错误,我认为我没有类似的问题。我正在shell提示符下运行命令:tsc movie.server.model.ts。此文件的内容为:

1
2
3
4
5
6
7
8
9
10
'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';

在var mongoose=require("mongoose")行上引发错误。

typings/ts d.d.ts文件的内容如下:

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

.d.ts文件引用放在适当的文件夹中,并通过以下命令添加到typings/tsd.d.ts中:

1
2
tsd install node --save
tsd install require --save

生成的.js文件似乎工作正常,所以我可以忽略错误。但我很高兴知道为什么会发生这种错误,以及我做错了什么。


又快又脏

如果您只有一个使用REQUEST的文件,或者您是为了演示而这样做的,那么您可以在typescript文件的顶部定义REQUEST。

1
declare var require: any

打字稿2

如果您使用的是typescript 2.x,则不再需要安装打字或明确键入。只需安装以下软件包。

1
npm install @types/node --save-dev

申报文件的未来(6/15/2016)

Tools like Typings and tsd will continue to work, and we’ll be working
alongside those communities to ensure a smooth transition.

可选的:如果您在您的tsconfig.json中指定typerootstypes。您可能需要更新tsconfig.json以将节点作为一种类型包括进来。默认情况下,@types下的任何包都已经包含在您的构建中,除非您已经指定了这些选项中的任何一个。多读

下面是每个选项的正确配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
   "compilerOptions": {
        // types option has been previously configured
        "types": [
            // add node as an option
           "node"
         ],
         // typeRoots option has been previously configured
        "typeRoots": [
            // add path to @types
           "node_modules/@types"
         ]
    }
}

打字稿1

使用类型(definitelytyped的替换)可以直接从Github存储库中指定定义。

安装类型

1
npm install typings -g --save-dev

从DefinitelyType的repo安装RequireJS类型定义

1
typings install dt~node --save --global

WebPACK

如果使用Webpack作为构建工具,则可以包括Webpack类型。

NPM安装--save dev@types/webpack env

compilerOptions下用以下内容更新您的tsconfig.json

1
2
3
"types": [
     "webpack-env"
    ]

这允许您执行require.ensure和其他特定于Webpack的功能。

角CLI

使用cli,您可以按照上面的webpack步骤,将"types"块添加到您的tsconfig.app.json中。

或者,您可以使用预先安装的node类型。请记住,这将包括客户端代码中不真正可用的其他类型。

16


对于typescript 2.x,现在有两个步骤:

  • 安装一个定义require的包。例如:

    1
    npm install @types/node --save-dev
  • 告诉typescript在tsconfig.json中全局包含它:

    1
    2
    3
    4
    5
    {
       "compilerOptions": {
           "types": ["node"]
        }
    }
  • 第二步仅在需要访问全局可用功能(如require)时才很重要。对于大多数软件包,您应该只使用import package from 'package'模式。不需要在上面的tsconfig.json类型数组中包含每个包。


    你可以

    1
    declare var require: any

    或者,要获得更全面的支持,请使用definitelytyped's require.d.ts

    另外,您可以尝试以下方法,而不是使用var mongoose = require('mongoose')

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


    而不是:

    1
    2
    3
    'use strict';

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

    尝试:

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

    'use strict';

    即先参考路径。


    我发现解决方案是使用tsd命令:

    1
    tsd install node --save

    它添加/更新typings/tsd.d.ts文件,该文件包含节点应用程序所需的所有类型定义。

    在我的文件顶部,我这样引用了tsd.d.ts

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

    截至2016年1月,要求的定义如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare var require: NodeRequire;

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


    这个答案与现代设置有关(typescript 2.x,webpack>2.x)

    您不需要安装@types/node(这是所有node.js类型,对于前端代码来说是不可替代的,实际上会使设置不同的返回值等事情变得复杂化。

    您需要安装@types/webpack env

    npm i -D @types/webpack-env

    它提供Webpack具有的运行时签名(包括Require和Require.Secure等)。

    还要确保tsconfig.json没有设置"types"数组->这将使它在node_modules/@types文件夹中拾取所有类型定义。如果要限制类型搜索,可以将typeroot属性设置为node_modules/@types


    我将Peter Varga的答案添加到declare var require: any;中,并使其成为一个通用解决方案,通过使用预处理加载器通用地适用于所有.ts文件:

  • 安装预处理器加载程序:

    1
    npm install preprocessor-loader
  • 将加载程序添加到webpack.config.js(我正在使用TS加载程序处理typescript源):

  • 1
    2
    3
    4
    5
    6
        module: {
            loaders: [{
                test: /\.tsx?$/,
                loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
            }]
        }
  • 添加将解决方案添加到每个源的配置:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    {
       "line": false,
       "file": true,
       "callbacks": [{
           "fileName":"all",
           "scope":"source",
           "callback":"(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
        }]
    }

    你也可以用同样的方法增加更强大的需求,但在我的情况下,declare var require: any;已经足够了。

    注意,预处理器1.0.5中有一个bug,它切断了最后一行,所以只要确保在末尾有一个额外的行空间返回,就可以了。


    仅供参考,我使用的是Angular 7.1.4,typescript 3.1.6,我唯一需要做的就是在tsconfig.json中添加这一行。

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

    希望能有所帮助。


    确保已安装npm i @types/node


    电子+角2/4加成:除了将"node"类型添加到ts.config各种文件之外,最终对我有效的是将下一个添加到typings.d.ts文件:

    1
    2
    3
    4
    5
    declare var window: Window;
    interface Window {
      process: any;
      require: any;
    }

    注意,我的例子是电子+角2/4。我需要window global的要求。


    有时tsconfig.json中缺少"jasmine"可能会导致此错误。(手写体2.x)

    所以添加

    1
    2
    3
    4
    "types": [
     "node",
     "jasmine"
    ]

    到tsconfig.json


    从"mongoose"导入*作为mongoose


    我也一直在努力解决这个问题。我相信这适用于所有的发布候选人,也就是RC,但我没有测试。对于@angular rc.2,它工作得很好。

  • package.json中添加core-js作为NPM依赖项。
  • 运行typings install core-js --save
  • 删除你的package.json中所有的"es6-shim"事件。你不再需要它了。
  • 干杯!


    如果您可以编译代码,但Visual Studio 2015将"require"标记为"errors with error text cannot find name"require",或者无法将符号"require"将Visual Studio 2015的typescript更新为最新版本(目前为2.1.5),并将resharper(如果使用)更新为至少版本2016.3.2。

    我有一段时间遇到了这个烦人的问题,找不到解决办法,但最终还是用这种方式解决了。希望这对某人有帮助。


  • 您是否指定了要使用哪个模块来生成代码?tsc --target es5 --module commonjs script.ts您必须这样做才能让蒸腾者知道您正在编译nodejs代码。博士学位。

  • 您还必须安装Mongoose定义tsd install mongoose --save

  • 不要使用var来声明变量(除非必要,这是非常罕见的情况),而是使用let。了解更多信息


  • 除了cgatian的答案,对于typescript 1.x

    如果仍然看到错误,请在编译器选项中特别提供index.d.ts。

    1
    2
    3
    "files": [
       "typings/index.d.ts"
    ]

    tsconfig.json中增加以下内容:

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


    我还有另外一个答案,它建立在之前描述npm install @types/node的所有答案之上,包括tsconfig.json / compilerOptions / types中的node

    在我的例子中,我有一个基础tsconfig.json和一个单独的在角度应用程序中扩展这个:

    1
    2
    3
    4
    5
    6
    {
    "extends":"../../tsconfig.json",
    "compilerOptions": {
      "outDir":"../out-tsc/app",
      "types": []
     },

    我的问题是这个tsconfi.app.json中的空types,它会破坏基本配置中的那个。


    使用上面的任何技巧,我都无法消除"需要"错误。

    但我发现问题是我的Visual Studio排版脚本工具,旧版本(1.8.6.0)和最新版本(2.0.6.0)

    您可以从以下位置下载最新版本的工具:

    https://www.microsoft.com/en-us/download/details.aspx?ID=48593


    如果您在一个TS文件中遇到这个问题,该文件只提供一些常量值,那么您可以

    rename your .ts file to .js file

    错误不会再出现了。