【发布时间】:2016-11-09 00:55:19
【问题描述】:
在我了解一点 TypeScript 模块的工作原理之前,如果我想使用 jQuery 之类的 js 库,我会简单地添加一个引用该库的 script 标签,但现在我使用的是 TypeScript,我经常会找到类似的示例这个:
import * as $ from 'jquery'
但是 jQuery 不是 TypeScript 模块,那么它是如何工作的呢?我应该如何向我的模块添加外部非打字稿库?
编辑 #1
tsconfig.json
明确告诉 typescript 使用 AMD 格式(我选择了这个而不是 commonjs,因为我读到由于 AMD 异步加载模块,它更适合 Web 应用程序)
{
"compilerOptions": {
"sourceMap": false,
"target": "es5",
"module": "amd",
"outDir": "Scripts"
},
"exclude": [
"node_modules",
"wwwroot"
]
}
要安装类型定义,我使用 typings
typings install dt~jquery --global --save
提到了我实际使用的内容,但我不明白的是,当我仅在 @987654331 之后指定要加载的文件(在本例中为 app.js)时,RequireJs 是如何找到第三方库的@加载
<script data-main="Scripts/app/app" src="Scripts/require.js"></script>
我尝试在require.js 的脚本标签前后添加jquery.js 文件的脚本标签,但没有成功。那么我应该如何告诉require.js“看我需要这个x 文件,去为我加载它”?
我问这个是因为如果我正确理解类型定义的目的,它们的存在只是为了给我们类型检查,仅此而已,我们仍然需要添加我们想要使用的实际库。
编辑#2
所以最后这就是我最终要做的:
I) 根据此页面http://requirejs.org/docs/api.html#data-main,data-main 仅适用于页面只有一个主入口点并且当您需要其他 js 文件时会失败,因此应使用以下配置:
<script src="~/Scripts/require.js"></script>
<script>
require.config({
paths: {
"lodash": "Scripts/lodash"
}
});
require(["Scripts/app/js/app"]);
</script>
这里我明确告诉 require.js 在哪里可以找到我想要使用的库的源代码,在本例中为 lodash.js。只有完成所有路径映射后,我才指示 require 加载 app.js
II) app.ts
/// <reference path="../../typings/index.d.ts" />
import * as _ from "lodash";
console.log('Using Lodash: ' + _.snakeCase("For Whom the Bells Toll");
要使类型定义正常工作,您必须包含 reference 标记
就是这样。
要测试一切是否正常,我所要做的就是检查控制台并查看一切是否按预期工作:
还有一点我还不是很清楚,所有的魔法在幕后是如何运作的,但是看看为 app.js 生成的 js 代码,我猜第三个依赖 "lodash " 在require.config指定的所有路径中查找
define(["require", "exports", "lodash"], function (require, exports, _) {
"use strict";
console.log('Using Lodash: ' + _.snakeCase("For Whom the Bells Toll"));
});
哦,最后一件事,如果您不想在需要使用 d.ts 文件时在 ts 文件中包含 reference 标记,则可以将路径添加到 index.d.ts在tsconfig.json 文件中是这样的:
{
"compilerOptions": {
"sourceMap": false,
"target": "es5",
"module": "amd",
"outDir": "js"
},
"include": [
"src/**/*.ts",
"../typings/index.d.ts"
]
}
【问题讨论】: