如何使用 jQuery、RequireJS 和 KnockoutJS 创建基本的 TypeScript 项目 [英] How to create basic TypeScript project using jQuery, RequireJS, and KnockoutJS
问题描述
我一直在寻找一个简单的操作方法,以使用 RequireJS、jQuery 和 KnockoutJS 创建 Visual Studio 2012 TypeScript 项目的最基本示例.有几个可用的例子,但对我来说有些比我想要的更复杂,所以我着手创建一个操作方法,并在此处发布以供公众审查.我已经回答了我自己的问题,作为问答式的知识共享练习.
对于那些不熟悉的人,这里是包含组件的快速细分...
TypeScript - 一种允许编写脚本的 Visual Studio 扩展通过作为 JavaScript 超集的语言创建 .TS 文件.这提供了定义与方法和变量相关联的数据类型的能力——否则 JavaScript 会缺少这些数据类型.通过这样做,编译时检查可以确保正确使用以尝试减少运行时冲突.在构建 Visual Studio 项目时,Visual Studio 扩展会将脚本编译为实际的 JavaScript.因此,这个扩展带有它自己的编译器 - tsc.exe.预计生成的 JavaScript 文件将部署到生产环境,而不是源代码 .ts 文件.
jQuery - 用于 HTML 文档遍历和操作、事件处理、动画和 Ajax 交互的 JavaScript 框架.>
RequireJS - 依赖加载器.有时 JavaScript 引用会变得疯狂.这试图帮助解决这些问题.我的示例表明,即使使用了许多 JavaScript 文件,HTML 也仅引用其中一个文件 - 加载其他文件的根 JavaScript 文件.
KnockoutJS - UI 绑定,使用 MVVM 模式.HTML 视图是指视图模型中的变量和方法.视图模型是一个 JavaScript 对象(JavaScript 文件可能是编译 .ts 文件的结果 - 请参阅上面的 TypeScript).
DefinitelyTyped - 还包括两个绝对类型的 NuGet 包.因为 TypeScript 试图验证数据类型的使用,所以它正在执行检查以确保它知道所有引用.JavaScript 比这更宽松一些.为了满足 TypeScript(在引用外部 JavaScript 对象时),我们需要一种方法来描述(向 TypeScript)我们期望使用的对象.这些DefinitelyTyped 脚本提供了这个定义.它们不提供任何功能,只是让 TypeScript 编译器清晰起来,以便它可以执行这些检查.
在下面的例子中,你会看到
///
这就是 TypeScript 编译器将如何包含 requirejs absoluteTyped 定义文件的方式.创建这些绝对类型脚本的组织已经创建了一个庞大的集合.这里我们只提到两个——KnockoutJS 和 RequireJS(嗯,因为这是本教程的范围)
免责声明
本指南将展示使用 TypeScript、jQuery、KnockoutJS 和 RequireJS 构建基本网站的a" 方法.还有很多其他方法可以做到这一点.
入门
安装 Visual Studio 扩展
安装 Visual Studio 2012 扩展 - TypeScript for Microsoft Visual Studio 2012 PowerTool 1.0.1.0http://visualstudiogallery.msdn.microsoft.com/ac357f1e-9847-46ac-a4cf-5203
<小时>创建新的 Visual Studio 项目
- 启动 Visual Studio 2012.
- 选择菜单项文件"->新建"->项目..."
- 导航到模板"->其他语言"->TypeScript"(这实际上创建了一个扩展名为 .csproj 的项目文件 - 很奇怪)
- 选择项目类型带有 TypeScript 的 HTML 应用程序"
清理
从项目中删除文件 app.css、app.ts
<小时>添加组件
使用 NuGet,添加...
- RequireJS (我为本教程选择了 2.1.15 版)
- KnockoutJS (我为本教程选择了 3.2.0 版)
- jQuery (我为本教程选择了 2.1.1 版)
- requirejs.TypeScript.DefinitelyTyped (我选择了 0.2.0 版
本教程的 Jason Jarrett.它安装了一个打字稿 def 文件作者:Josh Baldwin - 版本 2.1.8 ) - knockout.TypeScript.DefinitelyTyped (我选择了 0.5.7 版
本教程的 Jason Jarrett)
设置项目文件夹
在项目根目录创建项目文件夹
- 申请
- 模型
- 视图模型
创建一个基本的 TypeScript 模型
将 TypeScript 文件添加到项目文件夹Models"
- 在解决方案资源管理器中右键单击文件夹模型"
- 选择上下文菜单项添加"->新建项目..."
- 在左侧窗格中,突出显示Visual C#"
- 在右侧窗格中,突出显示TypeScript 文件"
- 在文件名文本框中输入myTestModel.ts"点击添加"按钮
修改文件myTestModel.ts"
class myTestModel {公共字段Z:字符串;公共字段Y:字符串;公共字段X:数字;}出口=我的测试模型;
<小时>
创建一个 TypeScript 视图模型
将 TypeScript 文件添加到项目文件夹ViewModels"
- 在解决方案资源管理器中右键单击文件夹ViewModels"
- 选择上下文菜单项添加"->新建项目..."
- 在左侧窗格中,突出显示Visual C#"
- 在右侧窗格中,突出显示TypeScript 文件"
- 在文件名文本框中,输入myViewModel.ts"
- 点击添加"按钮
修改文件 myViewModel.ts...
/// import myTestModel = require("Models/myTestModel");import ko = require("淘汰赛");类 myViewModel {public myString: KnockoutObservable;public myNumber: KnockoutObservable;public myComplexObject: KnockoutObservable;构造函数(){this.myString = ko.observable("一些测试数据");this.myNumber = ko.observable(987);var tempComplexObject = new myTestModel;tempComplexObject.fieldZ = "一些虚假的测试数据";tempComplexObject.fieldY = "另一个伪造的测试数据";tempComplexObject.fieldX = 123;this.myComplexObject = ko.observable(tempComplexObject);}myButton_Click() {alert("我被点击了");}}出口=我的视图模型;
<小时>
添加配置
添加RequireJS配置文件
- 在解决方案资源管理器中右键单击项目文件夹应用程序"
- 选择上下文菜单项添加"->新建项目..."
- 在左侧窗格中,突出显示Visual C#"
- 在右侧窗格中,突出显示TypeScript 文件"
- 在文件名文本框中,输入require-config.ts"
- 点击添加"按钮
修改文件require-config.ts"
/// 需要.配置({baseUrl: "",路径:{"jQuery": "脚本/jquery-2.1.1","knockout": "脚本/knockout-3.2.0.debug","myViewModel": "ViewModels/myViewModel"},垫片:{jQuery":{出口:$"}},});需要([jQuery"],函数($){$(document).ready(function () {require(["knockout", "myViewModel"], (knockout, myViewModel) => {var viewModel = new myViewModel;淘汰赛.applyBindings(viewModel);});});});
<小时>
修改现有文件 index.html
需要将视图与视图模型对齐.
<html lang="zh-cn"><头><meta charset="utf-8"/><title>TypeScript HTML 应用</title><script data-main="Application/require-config" src="Scripts/require.js"></script>头部><身体><h1>TypeScript HTML 应用程序</h1><div id="myStringTest" data-bind="text: myString"></div><input id="myStringTest2" data-bind="value: myString"/><input id="myNumberTest" data-bind="value: myNumber"/><input id="myComplexObjectTest" data-bind="value: myComplexObject().fieldZ"/><button id="myMethodTest" data-bind="click: myButton_Click" >点击我</button>