受到這篇文章的啟發。
這是一個使用經典 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 的函式庫才能運作。