受到这篇文章的启发。
这是一个使用经典 asp 和 typescript 开发的示例应用程序。
有时我们只是被困在经典 asp 中运行的旧应用程序中。
TypeScript 添加了有用的开发工具,如 IntelliSense、重构、真正的类系统、类型系统、编译时错误、自动完成、jsdocs 等。
它可以在现有应用程序中使用,共享代码和会话状态。
而且,这很有趣:)
要从 nuget 获取 js 和 css 包,请从包管理器控制台运行命令Update-Package -Reinstall
。
handlebars.TypeScript.DefinitelyTyped 包安装了两个 .d.ts 文件,1.0.0 版本需要删除其中一个。
它运行在 IIS Express 上,可以直接从 Visual Studio 执行(无需调试)。
脚本在经典 asp 中按以下顺序运行:
<script runat="server">
标签;<% %>
内);<script runat="server">
标签。为了能够在包含的脚本之后执行main()
函数,当前的默认语言保留为 VBScript,并带有指令<%@ language="VBScript" %>
。
将 typescript 与 asp 一起使用的一种选择是在构建过程中添加一个步骤,将内容封装在 asp 标记中并将扩展名更改为 .asp。
来源
针对经典 asp 时 typescript 的一些重要配置:
{
"compilerOptions" : {
"target" : "es3" ,
"lib" : [ "es5" , "scripthost" ] ,
"module" : "none"
}
}
ASP 可以使用 VBScript 或 JScript 运行,JScript 是 Microsoft 的 JavaScript 版本,并且符合 ECMAScript 3 规范。
Typescript 使用的默认类型库包括定义请求和响应对象的新浏览器 api,因此我们必须定义我们想要使用的库,以便能够使用 ASP 的 api 定义这些对象。
最后,asp 不支持任何可能的模块输出。
生成的服务器端代码将具有 .js 扩展名,IIS 通常将其发送到客户端。要隐藏asp的源,我们可以添加以下配置:
<!-- IIS 7+ -->
< system .webServer>
< security >
< requestFiltering >
< hiddenSegments >
< add segment = " src " />
</ hiddenSegments >
</ requestFiltering >
</ security >
</ system .webServer>
此配置不适用于 IIS 6 或更低版本。
对于此应用程序,没有使用包含必要的 js 源的不同 .asp 文件,而是使用了带有单个入口点 Default.asp 的 mvc 工作流,并使用 QueryString 参数进行路由。
另一种选择是将 404 错误重定向到 asp 文件,该文件执行路由读取尝试的路径。
Typescript 不支持经典 asp 用于设置会话或应用程序状态的语法:
<%
Session("user_id") = 1
Application("connectionstring") = "some string"
%>
另一种方法是定义一个函数来设置这些并在打字稿中声明接口。例如:
function setSession ( key , val ) {
Session ( key ) = val ;
}
然后在打字稿中:
declare function setSession ( key : string , val : any ) : void ;
不幸的是,JScript 的 Error 对象没有定义 stack 属性,因此没有简单的方法来构建堆栈跟踪,因为对象的方法由打字稿作为匿名函数发出。
该应用程序使用 Handlebars 进行模板化,使用 Moment.js 处理日期。两者都有UMD(通用模块定义)结构,与经典的asp不兼容,因为全局对象不存在。
在经典的 asp JScript 中,如果在未声明的情况下定义了闭包中的变量,则该变量将被“导出”到全局作用域。例如:
( function ( ) {
var localFn = function ( ) {
// ...
} ;
// classic asp export
// this makes globalFn available in the global scope
globalFn = localFn ;
} ) ;
由于这种行为,有必要用这种“导出”语法替换两个库中的 UMD 检查。
请注意,只有不依赖于 DOM 的库才能工作。