Inspiriert durch diesen Beitrag.
Dies ist eine Beispielanwendung, die mit klassischem ASP und Typescript entwickelt wurde.
Manchmal bleiben wir einfach bei alten Anwendungen hängen, die im klassischen ASP ausgeführt werden.
TypeScript fügt nützliche Tools für die Entwicklung hinzu, wie IntelliSense, Refactoring, ein echtes Klassensystem, ein Typsystem, Fehler bei der Kompilierung, automatische Vervollständigung, jsdocs und mehr.
Es kann in vorhandenen Anwendungen verwendet werden und Code und Sitzungsstatus teilen.
Außerdem hat es Spaß gemacht :)
Um die JS- und CSS-Pakete von Nuget abzurufen, führen Sie den Befehl Update-Package -Reinstall
in der Paketmanagerkonsole aus.
Das Paket handlebars.TypeScript.DefinitelyTyped installiert zwei .d.ts-Dateien, diejenige für Version 1.0.0 muss gelöscht werden.
Es läuft auf IIS Express und kann direkt aus Visual Studio ausgeführt werden (ohne Debug).
Skripte werden im klassischen ASP in der folgenden Reihenfolge ausgeführt:
<script runat="server">
-Tags, die nicht mit der Standardsprache übereinstimmen;<% %>
);<script runat="server">
-Tags, die mit der Standardsprache übereinstimmen . Um die Funktion main()
nach den enthaltenen Skripten ausführen zu können, wurde die aktuelle Standardsprache als VBScript mit der Direktive <%@ language="VBScript" %>
beibehalten.
Eine Möglichkeit, TypeScript mit ASP zu verwenden, wäre das Hinzufügen eines Schritts zum Build-Prozess, der den Inhalt in ASP-Tags einschließt und die Erweiterung in .asp ändert.
Quelle
Einige wichtige Konfigurationen für TypeScript bei der Ausrichtung auf klassisches ASP:
{
"compilerOptions" : {
"target" : "es3" ,
"lib" : [ "es5" , "scripthost" ] ,
"module" : "none"
}
}
ASP kann entweder mit VBScript oder JScript, der Javascript-Version von Microsoft, ausgeführt werden und ist mit der ECMAScript 3-Spezifikation kompatibel.
Zu den Standardtypbibliotheken, die TypeScript verwendet, gehören neue Browser-APIs, die ein Request- und ein Response-Objekt definieren. Daher müssen wir die Bibliotheken definieren, die wir verwenden möchten, um diese Objekte mit der ASP-API definieren zu können.
Schließlich unterstützt asp keine der möglichen Modulausgaben.
Der generierte serverseitige Code hat die Erweiterung .js, die IIS normalerweise an den Client sendet. Um die Quellen von ASP auszublenden, können wir die folgende Konfiguration hinzufügen:
<!-- IIS 7+ -->
< system .webServer>
< security >
< requestFiltering >
< hiddenSegments >
< add segment = " src " />
</ hiddenSegments >
</ requestFiltering >
</ security >
</ system .webServer>
Diese Konfiguration funktioniert nicht für IIS 6 oder niedriger.
Für diese Anwendung wurde anstelle der Verwendung verschiedener ASP-Dateien einschließlich der erforderlichen JS-Quellen ein MVC-Workflow mit einem einzigen Einstiegspunkt, Default.asp, und Routing mit QueryString-Parametern verwendet.
Eine andere Möglichkeit wäre, 404-Fehler in eine ASP-Datei umzuleiten, die das Routing übernimmt und den versuchten Pfad liest.
Die Syntax, die Classic ASP zum Festlegen des Sitzungs- oder Anwendungsstatus verwendet, wird von Typescript nicht unterstützt:
<%
Session("user_id") = 1
Application("connectionstring") = "some string"
%>
Die Alternative wäre, eine Funktion zu definieren, um diese festzulegen und die Schnittstelle in Typoskript zu deklarieren. Z.B:
function setSession ( key , val ) {
Session ( key ) = val ;
}
Dann in Maschinenschrift:
declare function setSession ( key : string , val : any ) : void ;
Leider definiert das Error-Objekt von JScript die Stack-Eigenschaft nicht, sodass es keine einfache Möglichkeit gibt, einen Stacktrace zu erstellen, da die Methoden des Objekts als anonyme Funktionen von TypeScript ausgegeben werden.
Diese Anwendung verwendet Handlers für die Vorlagenerstellung und Moment.js für die Datenverarbeitung. Beide haben eine UMD-Struktur (Universal Module Definition), die nicht mit klassischem ASP kompatibel ist, da das globale Objekt nicht existiert.
Im klassischen ASP-JScript wird eine Variable in einem Abschluss in den globalen Bereich „exportiert“, wenn sie ohne Deklaration definiert ist. Z.B:
( function ( ) {
var localFn = function ( ) {
// ...
} ;
// classic asp export
// this makes globalFn available in the global scope
globalFn = localFn ;
} ) ;
Aufgrund dieses Verhaltens ist es notwendig, die UMD-Prüfungen in beiden Bibliotheken durch diese „exportierende“ Syntax zu ersetzen.
Beachten Sie, dass nur Bibliotheken funktionieren, die nicht vom DOM abhängig sind.