typescript编译器标志requirejs shim定义为错误。如何解决?

时间:2016-11-17 01:59:26

标签: typescript requirejs amd

我正在尝试专门用于ASP.Net MVC应用程序前端的typescript。这在没有模块的情况下正在运行,依赖性跟踪变得越来越繁重。因此,现在是时候引入RequireJS并使用Typescript对AMD的支持。

我已经阅读了很多关于此的内容,我认为我非常接近。但是,我遇到了typescript的import语句的问题,说它无法找到requireJS配置中定义的填充程序模块。因此,如果typescript只是将模块的名称传递给JS代码中的require函数,那么一切都会很好。但事实并非如此,只会引发错误。所以问题是我应该如何编写这些JS垫片的import语句?

这是一个例子: app.ts

import g = require("Api/greeter");
import $ = require("jquery");
import respond = require("respond");

var greeter = new g.Greeter("#content");
greeter.start();

让我们假设这是页面的主要TS,而greeter是该页面的视图模型。但我知道我需要在页面上使用jquery和bootstrap。我有我的requireJS配置的设置:

///

requirejs.config({
    baseUrl: 'Scripts',
    paths: {
        "jquery": "libs/jquery-3.1.1",
        "bootstrap": "libs/bootstrap.min",
        "respond" : "libs/respond"
    },
    shim: {
        "bootstrap": { deps: ["jquery"] },
        "respond": { deps: ["bootstrap"] }
    }
});

require(['App/app']);

注意我已经回应了需要jst的bootstrap和bootstrap。所以有app.ts需要响应应该(并且确实)拉入响应,引导和jQuery。

我知道我在app.ts中有一个冗余需求(“jQuery”)。这仅用于说明目的。即,该行正常工作 - TS将jQuery识别为有效的模块名称,并将其放入生成的编译JS文件中。但TS不承认“响应”作为模块名称,我收到编译错误:

Cannot find module 'respond'.

我的文件安排如下:

Scripts
->Api
    --> Greeter.ts
-> App
    --> App.ts
-> libs
    --> jQuery-3.1.1.js
    --> bootstrap.js
    --> respond.js

我认为当jQuery工作时我做得很好但是我如何获得响应或者我必须接受其他任何纯JS库工作?从我在TS文档中可以看出,require()的参数应该是JS文件的有效路径,因为这是编译器获取类型信息的方式。但如果是这样的话,为什么jQuery按照我定义的方式工作?它与respond.js没什么不同。

由于 格雷格

1 个答案:

答案 0 :(得分:0)

我跑过这个part of the typescript documentation处理使用requireJS来加载淘汰赛。

在其中,他们简要地告诉您加载敲除的类型定义文件:

  

我们还将获取Knockout的声明文件来描述   TypeScript的库形状。

     

npm install --save @ types / knockout

这结果证明了打字稿编译器停止抱怨未知包所需的魔力。

在上面列出的示例中,我安装了jQuery的类型定义文件,因此编译器并没有抱怨jQuery。但我没有为respond.js提供类型定义文件。由于没有用于respond.js的类型定义文件,编译器然后去寻找respond.js,并且它假定require语句的参数是它可以遵循的路径来查找要导入的文件。我相信require假定该文件是一个打字稿文件并查找.ts,因为我无法获取require语句来查找respond.js文件。

最重要的是,当配置为使用AMD时,导入以两种方式工作(我还不能与其他配置对话)。

  1. 它使用模块的名称来匹配它知道的类型定义文件。如果它与类型定义文件匹配,则它假定模块的名称只是该参数名称,并将其传递给生成的javascript中的require命令。此时,您有责任构建基础架构以加载该模块(即,您的html页面直接加载文件,或者更有可能的是,您的requireJS配置知道如何加载该模块)

    即。 import $ = require(" jQuery"); //通过requireJS config

  2. 加载
  3. 它使用名称在项目中查找源文件。指定的参数是源文件的相对路径。

    即。 import g = require(" Components / greeter"); //从项目的Components目录中加载greeter.ts模块。这应该设置为通过requireJS加载。

  4. 我希望将来可以帮助别人。