NodeAsp
ist eine Reihe klassischer ASP-Frameworks, die auf der modularen Idee von NodeJS basieren und es Ihnen ermöglichen, problemlos ASP-Programme mit neuen Konzepten zu schreiben.
NodeAsp
verwendet eine Anforderung, die der CommonJS-Spezifikation folgt und vollständig mit der NodeJS-Modullademethode kompatibel ist, sodass Sie mehr als 50 % der NodeJS-Module direkt verwenden können. Alle Module, die nichts mit der NodeJS-Laufumgebung und ES5-ES6-spezifischen Objekten zu tun haben, können direkt verwendet werden. Eine derart große Modulressourcenbibliothek war bisher in keinem ASP-Framework verfügbar.
NodeAsp
ist ein einzigartiges und innovatives Framework im ASP-Bereich, das das traditionelle ASP-Schreibmodell verändert hat und es Ihnen ermöglicht, die Front-End- und Back-End-Entwicklung gleichzeitig abzuschließen, indem Sie nur js kennen und den langwierigen Bereitstellungsprozess eliminieren NodeJS-Server.
NodeAsp
steht hier als Terminator im ASP-Feld.
NodeAsp: http://nodeasp.com
Modul-Download: http://nap.webkits.cn
Dieses Framework läuft nur auf der WIN-Plattform IIS. Normalerweise kann dieses Framework auf einem gewöhnlichen virtuellen ASP-Host ausgeführt werden.
default.asp
<!-- #include file="NodeAsp.asp" -->
<%
require( ' ./index.js');
%>
index.js
var http = require ( 'http' ) ;
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Hello Worldn' ) ;
} ) ;
Schritt 1: NodeAsp herunterladen.
Schritt 2: NodeAsp referenzieren.
<!--#include file="NodeAsp.min.asp" -->
Schritt 3: Verwenden Sie NodeAsp.
< %
var version = process.version;
Response.Write(version);
% >
Diese Objekte sind in allen Modulen verfügbar. Einige Objekte befinden sich tatsächlich nicht im globalen Gültigkeitsbereich, sondern nur im Modulbereich. Auf diese Situation wird in der folgenden Dokumentation ausdrücklich hingewiesen.
In Browsern ist der Bereich der obersten Ebene der globale Bereich. Das bedeutet, dass var etwas im Browser eine globale Variable deklariert, wenn sie sich derzeit im globalen Bereich befindet. Bei NodeAsp ist das anders. Der Bereich der obersten Ebene ist nicht der globale Bereich, sondern etwas im NodeAsp-Modul gehört nur zu diesem Modul.
Gibt einige Informationen über die laufende Umgebung aus.
In NodeAsp besteht der Hauptzweck der Prozessexistenz darin, mit bestimmten NodeJS-Modulen kompatibel zu sein, die normalerweise nicht verwendet werden.
Wird zum Drucken von Standardausgabe und Standardfehler verwendet.
Weitere Informationen finden Sie im控制台
unten.
Wir haben das Puffermodul eingeführt, um mit dem Puffer von NodeJS kompatibel zu sein. Bitte beachten Sie, dass das Puffermodul unter node_modules enthalten sein muss, um Buffer verwenden zu können.
Wenn Sie vergessen, das Puffermodul unter node_modules abzulegen, hat dies keine Auswirkungen auf den normalen Betrieb des Programms. Ein Fehler wird nur ausgegeben, wenn Sie Buffer verwenden.
Module importieren. Ein kleiner Unterschied zu NodeJS besteht darin, dass „require“ auch verwendet werden kann, um ein Modul im ASP-Code anzufordern, da IIS nur ASP-Dateien anstelle von JS-Dateien direkt ausführen kann. Ähnlich wie beim Ausführen von node test.js in der Befehlszeile.
Wenn Sie beim Aufrufen der Methode require() zum Laden des Moduls den tatsächlichen Dateipfad wissen möchten, können Sie ihn mit der Methode require.resolve() abrufen.
Weitere Informationen finden Sie im Abschnitt模块
weiter unten.
Der Dateipfad der aktuell ausgeführten Codedatei. Dies ist der analysierte absolute Pfad zur Codedatei.
Beispiel: Führen Sie C:websitesnodeaspindex.asp aus
// module.js
Response . Write ( __filename ) ;
// C:websitesnodeaspmodule.js
// index.asp
require ( './module' ) ;
Response . Write ( __filename ) ;
// C:websitesnodeaspindex.asp
Der Verzeichnisname des Verzeichnisses, in dem das Skript aktuell ausgeführt wird.
Ein Verweis auf das aktuelle Modul. Insbesondere verweisen module.exports und exports auf dasselbe Objekt. Das Modul ist eigentlich nicht global, sondern lokal für jedes Modul.
Weitere Informationen finden Sie im Abschnitt模块
weiter unten.
Ein Verweis auf das module.exports-Objekt, das von allen Instanzen des aktuellen Moduls gemeinsam genutzt wird und auf das über require() zugegriffen werden kann. Einzelheiten zur Verwendung von Exporten und wann module.exports finden Sie in der Modulsystemdokumentation. Exporte sind eigentlich nicht global, sondern lokal für jedes Modul.
Weitere Informationen finden Sie im Abschnitt模块
weiter unten.
Die Timerfunktion umfasst die folgenden vier Funktionen. Da ASP Single-Threaded ist, sind die folgenden Funktionen tatsächlich nicht kompatibel.
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
Um ASP-Programme besser debuggen zu können, haben wir ein Befehlszeilen-Debugging-Tool implementiert, das dem NodeJS/Chrome-Browser ähnelt. Download-Adresse: https://github.com/Spikef/NodeAsp-Console
HINWEIS: Für die Ausführung sind IIS7.5 und .NET4 erforderlich, andere Umgebungen wurden nicht getestet.
Öffnen Sie CMD mit Administratorrechten und verwenden Sie den Befehl REGASM, um die KomponenteTerminal.dll zu registrieren, wobei sich REGASM unter C:WindowsMicrosoft.NETFrameworkv4.0.30319 befindet (der spezifische Speicherort hängt von der Versionsnummer ab).
C:WindowsMicrosoft.NETFrameworkv4.0.30319REGASM D:componentTerminal.dll /codebase
Suchen Sie bei 32-Bit-Systemen den folgenden Registrierungsspeicherort:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Suchen Sie bei 64-Bit-Systemen den folgenden Registrierungsspeicherort:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
Wählen Sie ein neues Element aus oder erstellen Sie es FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
und erstellen Sie dann einen neuen DWORD-Wert:
Name: w3wp.exe Wert: 1
Doppelklicken Sie auf Console.exe, um die NodeAsp-Debugging-Befehlszeile zu öffnen.
Geben Sie den folgenden Code in default.asp ein und greifen Sie dann über den Browser auf default.asp zu. Als nächstes können Sie die Ergebnisse in Console.exe
sehen.
var a = { name : "nodeasp" , value : true }
// 在console中将输出
//{
// name: "nodeasp",
// value: true
//}
Ausgabe an die Konsole mit Standardfarben.
var a = { name : "NodeAsp" , version : "0.0.1" } ;
console . log ( a ) ;
Für die Ausgabe an die Konsole verwenden Sie grün.
Für die Ausgabe an die Konsole verwenden Sie rot. Insbesondere wenn es sich bei der Ausgabe um ein Fehlerobjekt handelt, wird die vollständige Fehlermeldung angezeigt.
Für die Ausgabe an die Konsole verwenden Sie Gelb.
Geben Sie mit label den Namen an und starten Sie einen Timer, um die für den Vorgang erforderliche Zeit zu berechnen.
Geben Sie die für einen Vorgang benötigte Zeit aus.
Beispiel:
console . time ( '100-elements' ) ;
for ( var i = 0 ; i < 100 ; i ++ ) {
;
}
console . timeEnd ( '100-elements' ) ;
// prints 100-elements: 262ms
Sie können die folgenden Befehle in der Konsole eingeben.
cls/clear: Debug-Informationen löschen und können nicht wiederhergestellt werden.
about: Anzeige von Informationen.
copylast: Kopieren Sie die vorherige Ausgabenachricht.
copyall: Alle Ausgabeinformationen kopieren.
NodeAsp verfügt über ein Modulladesystem, das nahezu identisch mit NodeJS ist, wodurch sichergestellt wird, dass NodeAsp eine große Anzahl von NodeJS-Modulen direkt verwenden kann.
Der Kern von NodeAsp enthält nahezu keine für die Website-Entwicklung erforderlichen Funktionen und alle Funktionen werden durch Module erweitert. Die benötigten Funktionsmodule finden Sie im Modulcenter oder NPM von NodeAsp.
In NodeAsp haben Dateien und Module eine Eins-zu-Eins-Entsprechung. Unten finden Sie ein Beispiel dafür, wie foo.js Circle.js in dasselbe Verzeichnis lädt.
Der Inhalt von foo.js
var circle = require ( './circle.js' ) ;
console . log ( 'The area of a circle of radius 4 is '
+ circle . area ( 4 ) ) ;
Inhalt von Circle.js:
var PI = Math . PI ;
exports . area = function ( r ) {
return PI * r * r ;
} ;
exports . circumference = function ( r ) {
return 2 * PI * r ;
} ;
Das Modul „circle.js“ gibt zwei Funktionen aus: „area()“ und „circumME()“. Um ein Objekt zu exportieren, fügen Sie es einfach zu den speziellen Objektexporten hinzu.
Beachten Sie, dass exports der Einfachheit halber eine Referenz auf module.exports ist. Wenn Sie ein einzelnes Element, beispielsweise einen Konstruktor, exportieren möchten, müssen Sie module.exports verwenden.
// 正确输出构造函数
module . exports = MyConstructor ;
Lokale Variablen innerhalb eines Moduls sind privat. In diesem Beispiel ist die Variable PI privat für Circle.js.
Betrachten Sie diese Situation:
a.js
console . log ( 'a starting' ) ;
exports . done = false ;
var b = require ( './b.js' ) ;
console . log ( 'in a, b.done = %j' , b . done ) ;
exports . done = true ;
console . log ( 'a done' ) ;
b.js
console . log ( 'b starting' ) ;
exports . done = false ;
var a = require ( './a.js' ) ;
console . log ( 'in b, a.done = %j' , a . done ) ;
exports . done = true ;
console . log ( 'b done' ) ;
main.js
console . log ( 'main starting' ) ;
var a = require ( './a.js' ) ;
var b = require ( './b.js' ) ;
console . log ( 'in main, a.done=%j, b.done=%j' , a . done , b . done ) ;
Zuerst lädt main.js a.js und dann lädt a.js b.js. Zu diesem Zeitpunkt versucht b.js, a.js zu laden. Um Endlosschleifen zu verhindern, gibt a.js eine unvollendete Kopie an b.js zurück. Dann stoppt b.js den Ladevorgang und gibt sein Exportobjekt an das a.js-Modul zurück.
Auf diese Weise hat main.js beide Module geladen. Die Ausgabe dieses Programms ist wie folgt:
main starting
a starting
b starting
in b , a . done = false
b done
in a , b . done = true
a done
in main , a . done = true , b . done = true
Wie bei NodeJS führen normalerweise zyklisch abhängige Module nicht zu einer Endlosschleife. Wenn Sie jedoch beim Laden des Moduls die Methoden anderer Module direkt ausführen, werden Sie aufgefordert, die entsprechende Methode nicht zu finden, daher sollten Sie diese Situation vermeiden .
// a.js
var b = require ( './b.js' ) ;
exports . add = function ( m , n ) {
console . info ( m + n ) ;
} ;
// b.js
var a = require ( './a' ) ;
var m = 101 , n = 102 ;
exports . result = function ( ) {
a . add ( m , n ) ; // 此处没有问题
} ;
a . add ( m , n ) ; // 此处会报错,找不到a.add方法
Wenn der Dateiname nicht gefunden wird, fügt NodeAsp die Suffixe .js
und .json
hinzu und versucht erneut zu laden.
.js
wird als reine Javascript-Textdatei geparst und .json
wird als reine Textdatei im JSON-Format geparst.
Wenn dem Modul ein „/“ vorangestellt ist, stellt es einen absoluten Pfad dar. Beispielsweise lädt require('/home/marco/foo.js') die Datei /home/marco/foo.js.
Wenn dem Modul „./“ vorangestellt ist, ist der Pfad relativ zur Datei, die require() aufruft. Mit anderen Worten: Circle.js muss sich im selben Verzeichnis wie foo.js befinden, damit require('./circle') es finden kann.
Wenn auf eine Datei nicht mit „/“ oder „./“ verwiesen wird, wird das Modul aus dem Ordner „node_modules“ geladen.
Wenn der angegebene Pfad nicht existiert, gibt require() einen Fehler aus.
HINWEIS: Da auf dem IIS-Host auf
.js
Dateien direkt über den Browser zugegriffen werden kann, können Sie auch ein beliebiges Dateisuffix verwenden, wenn Sie den Quellcode nicht preisgeben möchten.
Wenn der Modulname in require() kein lokales Modul ist und nicht mit „/“, „../“ oder „./“ beginnt, beginnt der Knoten im übergeordneten Verzeichnis des aktuellen Moduls und versucht, etwas hinzuzufügen es zu / Laden Sie das entsprechende Modul im Ordner node_modules.
Wenn es nicht gefunden wird, wechseln Sie zum übergeordneten Verzeichnis, bis Sie den Speicherort des obersten Verzeichnisses erreichen.
Wenn beispielsweise die Datei unter „/home/ry/projects/foo.js“ „require(“bar.js“) aufruft, sind die Speicherorte, nach denen der Knoten sucht:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
Sie können Programme und Bibliotheken in einem separaten Ordner ablegen und einen einzigen Einstiegspunkt dafür bereitstellen. Es gibt drei Möglichkeiten, das Laden eines Ordners als Parameter für require() zu aktivieren.
Der erste Schritt besteht darin, eine Datei namens package.json im Stammverzeichnis des Ordners zu erstellen, in der ein Hauptmodul angegeben werden muss. Unten finden Sie ein Beispiel für eine package.json-Datei.
{
"name" : "some-library" ,
"main" : "./lib/some-library.js"
}
Wenn diese Datei im Beispiel im Verzeichnis ./some-library abgelegt wird, dann lädt require('./some-library') ./some-library/lib/some-library.js.
Wenn im Verzeichnis keine package.json-Datei vorhanden ist, versucht der Knoten, index.js in diesen Pfad zu laden.
Module werden nach dem ersten Laden zwischengespeichert. Dies bedeutet, dass (wie bei anderen Caches) bei jedem Aufruf von require('foo') dasselbe Objekt zurückgegeben wird und natürlich jedes Mal dieselbe Datei analysiert werden muss.
Der mehrmalige Aufruf von require(foo) führt nicht unbedingt dazu, dass der Code im Modul mehrmals ausgeführt wird. Mit dieser Funktion ist es möglich, teilweise abgeschlossene Objekte zurückzugeben , auch wenn sie möglicherweise Schleifen verursachen.
Wenn Sie möchten, dass ein Modul mehrmals ausgeführt wird, exportieren Sie eine Funktion und rufen Sie diese Funktion dann auf.
Das Modul-Caching basiert auf geparsten Dateinamen. Da je nach Speicherort des Aufrufs unterschiedliche Dateien analysiert werden können (z. B. beim Laden aus dem Ordner „node_modules“), gibt es keine Garantie dafür, dass require('foo') immer die genaue Datei zurückgibt, wenn sie in andere Dateien analysiert wird. dasselbe Objekt.
In jedem Modul ist die Variable module ein Verweis auf ein Objekt, das das aktuelle Modul darstellt. Insbesondere können module.exports über die globalen Modulobjektexporte abgerufen werden. Das Modul ist eigentlich kein globales Objekt, sondern eher ein internes Objekt für jedes Modul.
Das module.exports-Objekt wird über das Modulsystem generiert. Daher müssen Sie nur das zu exportierende Objekt module.exports
zuweisen. Zum Beispiel können wir auch die folgende Methode verwenden, um Circle.js zu schreiben, was völlig gleichwertig ist.
// circle.js
var PI = Math . PI ;
var circle = { } ;
circle . area = function ( r ) {
return PI * r * r ;
} ;
circle . circumference = function ( r ) {
return 2 * PI * r ;
} ;
module . exports = circle ;
Bezeichner zur Unterscheidung von Modulen. Normalerweise der vollständig analysierte Dateiname.
Der vollständig aufgelöste Dateiname des Moduls.
Das Modul, das dieses Modul importiert.
Wenn Sie require() verwenden, um auf ein Modul zu verweisen, wird der folgende Prozess befolgt, um das Zielmodul basierend auf dem Ausdruck zu finden.
require ( X ) from module at path Y
1. If X begins with './' or '/' or '../'
a . LOAD_AS_FILE ( Y + X )
b . LOAD_AS_DIRECTORY ( Y + X )
2. LOAD_NODE_MODULES ( X , dirname ( Y ) )
3. THROW "not found"
LOAD_AS_FILE ( X )
1. If X is a file , load X as JavaScript text . STOP
2. If X . js is a file , load X . js as JavaScript text . STOP
3. If X . json is a file , parse X . json to a JavaScript Object . STOP
LOAD_AS_DIRECTORY ( X )
1. If X / package . json is a file ,
a . Parse X / package . json , and look for "main" field .
b . let M = X + ( json main field )
c . LOAD_AS_FILE ( M )
2. If X / index . js is a file , load X / index . js as JavaScript text . STOP
3. If X / index . json is a file , parse X / index . json to a JavaScript object . STOP
LOAD_NODE_MODULES ( X , START )
1. let DIRS = NODE_MODULES_PATHS ( START )
2. for each DIR in DIRS :
a . LOAD_AS_FILE ( DIR / X )
b . LOAD_AS_DIRECTORY ( DIR / X )
NODE_MODULES_PATHS ( START )
1. let PARTS = path split ( START )
2. let I = count of PARTS - 1
3. let DIRS = [ ]
4. while I >= 0 ,
a . if PARTS [ I ] = "node_modules" CONTINUE
c . DIR = path join ( PARTS [ 0 . . I ] + "node_modules" )
b . DIRS = DIRS + DIR
c . let I = I - 1
5. return DIRS
Integrierte Module wie NodeJS müssen erforderlich sein, bevor sie verwendet werden können.
Dieses Modul wird zum Schreiben von Unit-Testfällen für das Programm verwendet und wird über require('assert') aufgerufen. Direkt von NodeJS portiert.
Ereignisverarbeitungsmodul, direkt von NodeJS übertragen.
Das Dateioperationsmodul ist mit den synchronen Operations-API-Methoden der meisten NodeJS-Dateioperationsmodule kompatibel.
HTTP-Anfrage- und Verarbeitungsmodul. Von NodeJS portiert und modifiziert, sind die meisten davon kompatibel.
Dieses Modul enthält ein Toolset zur Verarbeitung und Konvertierung von Dateipfaden. Fast alle Methoden führen nur eine String-Transformation durch und rufen nicht das Dateisystem auf, um zu prüfen, ob der Pfad gültig ist.
Von NodeJS portiert und modifiziert, nahezu vollständig kompatibel.
Kodiert und dekodiert URLs, vollständig kompatibel mit NodeJS.
Verarbeitet URL-Abfragezeichenfolgen, vollständig kompatibel mit NodeJS.
Dieses Modul enthält Hilfsfunktionen für das URL-Parsing. Verwenden Sie require('url'), um dieses Modul aufzurufen.
Vollständig kompatibel mit NodeJS.
Hilfsmethodenmodul, kompatibel mit NodeJS-Versionen unter 4.0.
Das Kompilieren des NodeAsp-Quellcodes erfordert die Installation der Knotenumgebung und die globale Installation von uglifyJS.
Führen Sie einfach node build
auf der Befehlszeile aus. Die kompilierten Dateien befinden sich im Bundle-Verzeichnis.
C:DiskprojectsNodeAsp>node build
-----------------------
# build nodeAsp success
+ build/NodeAsp.min.asp
@ 2016-03-01 13:46:04
-----------------------
MIT