【发布时间】:2016-11-17 01:59:25
【问题描述】:
我正在尝试专门在 ASP.Net MVC 应用程序前端的 typescript 中工作。这在没有模块的情况下现在可以工作,并且依赖项跟踪变得越来越繁重。所以是时候引入 RequireJS 并使用 Typescript 对 AMD 的支持了。
我已经阅读了很多关于此的内容,并且我认为我非常接近。但是,我遇到了 typescript 的 import 语句的问题,说它找不到在 requireJS 配置中定义的 shim 模块。因此,如果 typescript 只是将模块的名称传递给 JS 代码中的 require 函数,那么一切都会很好。但它没有,它只是抛出一个错误。所以问题是我应该如何为这些 JS 垫片编写导入语句?
这是一个例子: 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']);
请注意,我已响应需要引导程序和需要 jQuery 的引导程序。因此,让 app.ts 需要响应应该(并且确实)引入响应、引导程序和 jQuery。
我知道我在 app.ts 中有一个多余的 require("jQuery")。这仅用于说明目的。即,该行工作正常 - TS 将 jQuery 识别为有效的模块名称并将其放入生成的编译 JS 文件中。但是 TS 无法将“respond”识别为模块名称,并且出现编译错误:
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没有什么不同。
谢谢 格雷格
【问题讨论】:
-
我可能刚刚回答了我自己的问题。我认为这里的重要信息是我安装了 jQuery.d.ts 和 require.d.ts 但我没有得到一个 .d.ts 文件来响应。当我试图推进包括淘汰赛时,我想通了这一点。 VS 在击倒时给了我与响应时相同的错误。然后我安装了 knockout.d.ts,突然我的错误消失了。
标签: typescript requirejs amd