JavaScript Hypertext Preprozessor - inspiriert von PHP, in JavaScript.
Besuchen Sie JSHP-App, um das Demo-Projekt anzusehen.
Lesen Sie sorgfältig die kurze Zusammenfassung, wie Sie zum Beitrag zum Beitrag leisten können.md
>= 11.7.0>= 6.5.0worker_threads verwendet wird, um JSHP -Codes auszuführen. Um als CLI -ausführbare Datei auszuführen, führen Sie npm i -g @aviruk/jshp aus. Dann führen Sie jshp aus der CLI aus.
USAGE: jshp [option] [args]
help Display this message
compile [path] Parse JSHP codes to JS from [path]
compile --verbose [path] List source files
serve [host:port] [path] Serve files from [path]
serve [:port] [path] [host] defauts to 0.0.0.0
version Display version information
Verwenden Sie das Flag --debug mit compile oder server , um Stapelspuren von Abstürze anzuzeigen, die während der Ausführung aufgetreten sind.
Beachten Sie, dass das Debug -Flag zum Debuggen dieses Pakets gedacht ist. Es ist nicht dazu gedacht, Ihren JSHP -Code zu debuggen.
jshp serve :8080 ~ /Public Als Abhängigkeits npm i @aviruk/jshp verwenden.
Sobald dies erledigt ist, können Sie eine JavaScript -Datei verwenden, um den Server mithilfe einer Funktion aus dem Modul wie gezeigt zu erfassen.
Diese Funktion kann von einem anderen Skript importiert werden. Grundsätzlich wickelt es um die tatsächliche CLI -Funktion und ermöglicht es, Argumente zu senden.
Infolgedessen verhält sich diese Funktion genau wie die CLI.
const jshp = require ( '@aviruk/jshp' ) . jshp ;
/**
* @param {string} option The corresponding CLI option, used 'serve' in this example
* @param {string} hostname Use format 'host:port' or ':port'. Example: localhost:8080.
* @param {string} path The path to server resources
*/
jshp ( 'serve' , ':8080' , '~/Public' ) ; index.jshp.html -Datei in Ihrem Serververzeichnis.use strict wird.jshp , um das Verzeichnis zu serve .Verwendet Standard -HTML/CSS/JS -Syntax -Hervorhebung und wird in allen Texteditoren unterstützt. Die einzige Einschränkung ist eine lange Tag -Deklaration.
Wenn Sie Ihre Erweiterung der ausführbaren Datei ändern möchten, müssen Sie diese in Execenextensionen angeben.
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->Alternativ können Sie Folgendes verwenden
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->Oder Sie können Folgendes verwenden
<!-- html code -->
< ?
// JS code
? >
<!-- more html code -->case-sensitive . < body >
< script jshp >
const number = Number ( $_GET [ 'num' ] ) ;
</ script >
< p >
< b > Series: </ b >
< ?
const arr = [];
for (let i = 0; i < number ; i++) {
arr.push(i);
}
echo(String(arr));
? >
</ p >
</ body >Der zurückgegebene Wert des Codes in einem Scoped -Code -Block wird auf der Seite angezeigt.
Während der Parsen wird der Code innerhalb von <?( )?> Bewertet. Der Wert des Code wird auf der Seite angezeigt.
Diese Tags sollten nur für die Anzeige von Werten aus Variablen bevorzugt werden.
< body >
< script jshp >
const NAME = $_GET [ 'name' ] ;
const UID = $_GET [ 'id' ] ;
</ script >
< p > < b > Names: </ b > < ?( NAME )? > </ p >
< p > < b > UID: </ b > < ?( UID.toUpperCase() )? > </ p >
</ body > Im obigen Code werden in den Vorlagen -Tags NAME und UID.toUpperCase() verwendet.
Eine Datei namens config.json , die am Stamm der Serverressourcen platziert ist, enthält Konfigurationen für den Server.
Jede in config.json angegebene Eigenschaft überschreibt die Standardkonfigurationswerte vollständig. Wenn die zu angegebene Eigenschaft ein Array (oder Objekt wie MatchConfig) ist, müssen alle ihre Eigenschaften in der Datei config.json angegeben werden. Andernfalls kann der Server abstürzen.
Wenn Sie /config.json , /server.log und /.builds -Verzeichnisse nicht aufdecken möchten, sollten Sie dies nicht tun.
Sie enthalten Informationen über Ihren Server, Ihren Servercode usw., und Sie möchten diese nicht freilegen.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] Der Server kann nur die folgenden Eigenschaften verstehen.
Wenn Sie eine Eigenschaft deklarieren, die der Server nicht versteht, wird dies keine Fehler verursachen. Sie können auf diese Eigenschaften aus dem $_CONFIG -Objekt in Ihrem JSHP -Code zugreifen.
Die hier angegebenen Header werden zu jeder Antwort geschrieben.
Standard: "defaultHeaders": {} dh ein leeres Objekt.
Pfad zur Serverprotokolldatei. Die Protokollierung kann ausgeschaltet werden, indem der Eigenschaftswert auf leere Zeichenfolge festgelegt wird.
[date time] <type> <client-address> <method/response-code> <path>
[2021-12-30@11:26:26] INFO ::1 GET /favicon.ico
[2021-12-30@11:26:26] INFO ::1 200 /favicon.ico
[2021-12-30@11:26:46] INFO ::1 GET /config/
[2021-12-30@11:26:46] INFO ::1 200 /config/index.jshp.html
[2021-12-30@11:27:10] INFO ::1 GET /favicon.ico
[2021-12-30@11:27:10] INFO ::1 200 /favicon.ico
[2021-12-30@11:27:35] INFO ::1 GET /config.json
[2021-12-30@11:27:35] ERROR ::1 403 /config.json
Standard: "logPath": "/server.log" .
Die maximale Anzahl von Zeichen einer übergebenen Zeichenfolge, die von Logger -Funktionen in 1 Zeile gedruckt werden kann (siehe Functions -> Logger.info(any) ).
Über diese Länge hinaus wird die Nachricht unten gedruckt.
Standard: "inlineLogLength": "96"
Pfad zur Indexdatei Wenn angefordert ein Verzeichnis ist.
Die Verzeichnisse müssen mit einer A / in der GET -Anfrage enden. Andernfalls werden sie als Dateien betrachtet, es sei denn, Ablaufschläge sind deaktiviert.
Wenn "indexFile": "main.jshp.html" dann für Anfrage
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
Der Server bedient die Datei /msg/main.jshp.html . Da die Datei jedoch eine .jshp.html -Erweiterung hat, wird sie ausgeführt.
Standard: "indexFile": "index.jshp.html" .
Fordern Sie die Zeiten mit 500 nach einer bestimmten Anzahl von Sekunden an. Dieses Timeout schreibt vor, wie lange ein JSHP -Code analysiert werden darf. Wenn JSHP -Code eine unendliche Schleife (oder ähnliches) enthält, wird er nach angegebenen Sekunden getötet.
Standard: "timeoutSec": 10
Erweiterungen von Dateien, die für die Ausführung von JSHP -Codes analysiert werden müssen.
Wenn "execExtensions": [ ".jshp.html" ] werden nur Dateien, die mit diesen Erweiterungen enden, analysiert.
Wenn der Parser ein ausführbares JavaScript findet, wird er ausgeführt, und ein nicht ausschließbarer Teil wird kopiert.
Standard: "execExtensions": [ ".jshp.html" ]
Nachfolger nach einem Verzeichnis ist nicht erforderlich, wenn ein Verzeichnis auf False festgelegt wird. Diese Eigenschaft ist ein syntaktischer Zucker für Nowextsion.
Standard: "trailingSlashes": true
Wenn der angeforderte Pfad eine Datei ist und keine Erweiterung hat, sucht der Server nach einer Datei, die den Namen und eine dieser Erweiterungen angefordert hat.
Wenn "noExtension": [ ".jshp.html" ] dann für Anfrage
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
Der Server bedient die Datei /msg/main.jshp.html . Das liegt daran, dass main.jshp.html eine Datei mit dem Namen main und der enden mit und erweiterung in noExtension angegeben ist. Da die Datei jedoch eine .jshp.html -Erweiterung hat, wird sie ausgeführt.
Wenn die angegebene Erweiterung ein '/' ist, ist für das Verzeichnis /msg/ nach dem nachfolgenden Schrägstrich nicht erforderlich.
Wenn "noExtension": [ "/", ".jshp.html" ] und "indexFile": "main.jshp.html" dann zur Anfrage
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
Der Server bedient die Datei /msg/main.jshp.html .
Dies liegt daran, dass A '/' auch als Erweiterung behandelt wird, der Pfad ist jedoch ein Verzeichnis. Damit es funktioniert, muss die Indexdatei des Verzeichnisses in Indexfile angegeben werden.
Standard: "noExtension": [ ".jshp.html" ]
Diese Eigenschaft gibt an, wie Regexes in der Konfigurationsdatei behandelt werden. Nicht alle Konfigurationseigenschaften unterstützen Regexes. Wenn eine Eigenschaft Regex unterstützt, wird das Wort REGEXSUP in ihrem Beschreibungabschnitt enthält.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Wenn die Standardeinstellung aufbewahrt wird, ^ matchFromStart für Eigenschaften, die Regex unterstützen, zu Beginn des Regex und matchTillEnd $ .
Wenn die Konfiguration ist
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Dann wird /chat.* in die regex /^/chat.*/$/ verwandelt. Dies bedeutet, dass jeder Weg, der mit /chat beginnt, in die src umgeschrieben wird.
Erfahren Sie mehr über die Umschreiben von Pfaden im Abschnitt "Umschreiben".
Wenn matchTillEnd deaktiviert wird, wird /chat.* in die Regex /^/chat.*// verwandelt.
Pfad zum Verzeichnis unter Ressourcenwurzel, wo kompilierte Codes aufbewahrt werden.
Stellen Sie sicher, dass Ihr Build -Verzeichnis in Verboten aufgeführt ist, um Kunden daran zu hindern, Ihren Code zu lesen.
Ansonsten wird Ihr Quellcode ganz verständlicherweise durchgesickert.
Standard: "buildDir": "/.builds/",
Wenn JSHP -Dateien jedes true zusammengestellt werden, wenn diese Datei angefordert wird. Geeignet zum Testen und Debuggen.
Standard: "hotCompile": false
Wenn true JSHP -Code während des Serverstarts mit ausführbarem JS zusammengestellt wird.
Standard: "compileOnStart": false
Wenn eine dieser Dateien angefordert wird, beträgt die Antwort 403 .
Hinweis: Diese Eigenschaft unterstützt Regexes ( REGEXSUP ).
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]Für einen bestimmten Pfad sendet der Server die Antwort von einem anderen angegebenen Pfad.
Wenn die Konfiguration ist
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]dann auf Anfrage
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
Der Server bedient die Datei /messaging/chat/index.jshp.html .
Es ist keine Umleitung, daher führt es zu 200 , wenn /messaging/chat/index.jshp.html ein gültiger Anforderungsweg ist.
HINWEIS: Die req dieser Eigenschaft unterstützt Regexes ( REGEXSUP ).
Standard: "rewrites": [] dh ein leeres Array.
Für einen bestimmten Pfad sendet der Server die Antwort 3xx mit einem Location -Header.
Wenn die Konfiguration ist
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]dann auf Anfrage
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
Der Server reagiert mit
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
Diese Anfrage ist eine Umleitung, daher führt sie zu 3xx .
Standard: "redirects": [] dh ein leeres Array.
HINWEIS: Die req dieser Eigenschaft unterstützt Regexes ( REGEXSUP ).
HINWEIS: Umleitete die Arbeit auch für externe Domänen. Weiterleitungen sind jedoch nicht offen für den Kunden. Der Server leitet nur dann weiter, wenn Sie ihn in config.json angeben.
Hinweis: Wenn ein Pfad sowohl in rewrites als auch redirects vorhanden ist, wird der Server eine Umschreibung durchführen.
Dies liegt daran, dass zuerst eine Anfrage nach Umschreiben und dann auf Weiterleitungen überprüft wird.
Für einen angegebenen HTTP -Fehler wird eine angegebene Datei als Antwort gesendet.
Wenn die Konfiguration ist
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Für einen 404 -Fehler serviert Server die Datei /404.jshp.html .
Wenn die angegebene Datei nicht vorhanden ist, wird eine leere Antwort gesendet.
Standard: "errFiles": {} dh ein leeres Objekt.
Wenn true , verwendet der Server response.write , um Antworten zu senden. Für jedes echo tut der Server dies abhängig von den nächsten 2 Eigenschaften.
Standardmäßig wird es ferngehalten. Infolgedessen wartet der Server darauf, dass die gesamte Seite Server -Seite generiert wird, und verwendet dann response.end .
setStatusCode() , setHeader() und setCookie() verwenden, bevor Sie HTML geschrieben oder etwas wiederholt haben. Standard: "respondInChunks": false
Charakter / Byte -Grenze, über die wiederholte Daten in Stücke unterteilt werden.
Standard: "chunkLimit": 200
Anzahl der Teile, in denen wiederholte Daten geteilt werden sollen.
Standard: "chunksPerEcho": 2
Diese Konfigurationseigenschaften werden vom Server während des Starts und auf dem Anruf Server.reloadConfig() .
Das Angeben dieser Eigenschaften in config.json hat keinen Einfluss, da der Server eine dieser Eigenschaften nur überschreibt.
Server Host, vom host:port -Argument gesammelt.
Serverport, gesammelt vom host:port .
Eine Zeichenfolge, die den Pfad zu Serverressourcen enthält, der aus dem path gesammelt wurde.
Es ist eine Reihe all dieser Pfade, die neu geschrieben werden sollen.
Es ist eine Reihe all dieser Pfade, die umgeleitet werden sollen.
Es handelt sich um eine Objektzuordnungsquellen (JSHP -Dateien) zu ihren jeweiligen JavaScript -kompilierten Dateien. Es wird generiert, wenn JSHP -Code zusammengestellt wird.
$_ENV - Objekt, speichert Systemumgebungsvariablen$_CONFIG - Objekt, speichert Serverkonfigurationsdaten$_RES_ROOT - String, speichert den Pfad zu Serverressourcen$_REQUEST - Objekt, einige Anforderungsdaten$_HEADERS - Objekt, speichert Header der Anfrage$_COOKIES - Objekt, noch nicht implementiert$_GET - Objekt, speichert URL -Parameter$_POST - Objekt, noch nicht implementiert$_SERVER - Objekt, speichert einige Servervariablen, arbeiten in Arbeit$_SESSION - Objekt, noch nicht implementiert response.end() ;jshp -Datei.nodejsinfo .x-response-hash , Algorithmus ist standardmäßig md5 . Für jshp -Dateien funktioniert require nicht. require wird versuchen, Module relativ zum Verzeichnis der ausführbaren Datei zu laden. Um Module relativ zum Server -Ressourcen -Root zu laden, wird eine spezielle Funktion prequire bereitgestellt.
Syntax
< script jshp >
const mod = prequire ( 'prebuilt-node-module' ) ;
const mod1 = prequire ( 'js:my-dir/my-module' ) ;
const mod2 = prequire ( '/my-dir/my-module.js' ) ;
const mod3 = prequire ( 'jshp:my-dir/my-jshp-file.jshp.html' ) ;
m1 . foo ( ) ;
m2 . foo ( ) ;
m3 . loadMyContents ( ) ;
</ script > Beachten Sie, dass Wege zu Prequire (beginnend mit js: jshp: und / ) im Vergleich zu $_RES_ROOT bewertet werden.
Beachten Sie, dass das js: Präfix zum Laden von JavaScript -Dateien optional ist.
Das jshp: Das Präfix ist jedoch unbedingt erforderlich, wenn eine andere jshp -Datei geladen werden soll.
Andernfalls versucht der Server, diese jshp -Datei als JavaScript auszuführen und zu abstürzen und zu brennen.
Beachten Sie, dass bestimmte Funktionen Versprechen zurückgeben. Sie sind
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile() Ohne ordnungsgemäßes Versprechen können Sie Fehler bekommen. Es wird empfohlen, dass Sie await Keyword für einen sauber aussehenden Code verwenden.
< script jshp >
echo ( await getStatusCode ( ) ) ; // echoes status code
Message . echo ( JSON . stringify ( // Message.echo doesn't accept Objects
await Server . recompile ( ) , null , 4 ) // echoes the source map data (used by server)
) ;
</ script >Wenn Sie sich fragen, warum Sie Warten verwenden können, ohne eine andere asynchronisierte Funktion zu erstellen, um sie zu enthalten, ist dies daran, dass der gesamte JSHP -Code hinter den Kulissen in einer asynchronen Funktion ausgeführt wird.
HTTP - NodeJS http -ModulURL - NodeJS url -ModulPATH - NodeJS pathFS - NodeJS fs -Modul Siehe GHSA-8R4G-CG4M-X23C.
node-static V <= 0,7,11 ist betroffen.node-static PR #227 behoben.%00 überprüft.