我正在尝试专门用于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没什么不同。
由于 格雷格
答案 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时,导入以两种方式工作(我还不能与其他配置对话)。
它使用模块的名称来匹配它知道的类型定义文件。如果它与类型定义文件匹配,则它假定模块的名称只是该参数名称,并将其传递给生成的javascript中的require命令。此时,您有责任构建基础架构以加载该模块(即,您的html页面直接加载文件,或者更有可能的是,您的requireJS配置知道如何加载该模块)
即。 import $ = require(" jQuery"); //通过requireJS config
它使用名称在项目中查找源文件。指定的参数是源文件的相对路径。
即。 import g = require(" Components / greeter"); //从项目的Components目录中加载greeter.ts模块。这应该设置为通过requireJS加载。
我希望将来可以帮助别人。