JavaScript Hypertext Preprocesseur - Inspiré par PHP, en JavaScript.
Visitez JSHP-App pour voir le projet de démonstration.
Lisez soigneusement le bref résumé de la façon dont vous pouvez contribuer à contribuer.md
>= 11.7.0>= 6.5.0worker_threads est utilisé pour exécuter les codes JSHP . Pour exécuter en tant qu'exécutable CLI, exécutez npm i -g @aviruk/jshp . Ensuite, exécutez jshp à partir de la CLI.
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
Utilisez l'indicateur --debug avec compile ou server pour afficher des traces de pile de plantages qui se sont produits lors de l'exécution.
Notez que le drapeau de débogage est destiné à déboguer ce package. Il n'est pas destiné à déboguer votre code JSHP.
jshp serve :8080 ~ /Public Pour utiliser comme dépendance, exécutez npm i @aviruk/jshp .
Une fois cela fait, vous pouvez utiliser un fichier JavaScript pour faire tourner le serveur à l'aide d'une fonction du module comme indiqué.
Cette fonction peut être importée par un autre script. Il s'enroule essentiellement autour de la fonction CLI réelle, permettant d'envoyer des arguments.
En conséquence, cette fonction se comporte exactement comme la 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 dans votre répertoire de serveur.use strict .jshp pour serve le répertoire.Utilise la mise en évidence standard de la syntaxe HTML / CSS / JS et est prise en charge dans tous les éditeurs de texte. La seule mise en garde est une longue déclaration de balise.
Si vous souhaitez l'extension de fichier exécutable de modification, vous devrez le spécifier dans ExecExtensions.
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->Alternativement, vous pouvez utiliser ce qui suit
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->Ou, vous pouvez utiliser ce qui suit
<!-- 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 >La valeur renvoyée du code dans un bloc de code portée apparaîtra dans la page.
Pendant l'analyse, le code dans <?( )?> Sera évalué. La valeur du code sera affichée sur la page.
Ces balises doivent être préférées uniquement pour afficher les valeurs des variables.
< 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 > Dans le code ci-dessus, NAME et UID.toUpperCase() sont utilisés à l'intérieur des balises de modèle.
Un fichier nommé config.json placé à la racine des ressources du serveur contiendra des configurations pour le serveur.
Toute propriété spécifiée dans config.json entièrement écraser les valeurs de configuration par défaut. Par conséquent, si la propriété à spécifier est un tableau (ou un objet comme MatchConfig), toutes ses propriétés doivent être spécifiées dans le fichier config.json. Sinon, le serveur pourrait s'écraser.
Si vous ne souhaitez pas exposer /config.json , /server.log et /.builds répertoires, vous ne devriez pas le faire.
Ils contiennent des informations sur votre serveur, votre code de serveur, etc., et vous ne voulez pas les exposer.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] Le serveur ne peut comprendre que les propriétés suivantes.
Si vous déclarez une propriété que le serveur ne comprend pas, elle ne provoque aucune erreur. Vous pourrez accéder à ces propriétés à partir de l'objet $_CONFIG dans votre code JSHP.
Les en-têtes spécifiés ici sont écrits à chaque réponse.
Par défaut: "defaultHeaders": {} c'est-à-dire un objet vide.
Chemin vers le fichier journal du serveur. La journalisation peut être désactivée en définissant la valeur de la propriété en chaîne vide.
[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
Par défaut: "logPath": "/server.log" .
Le nombre maximum de caractères d'une chaîne passée qui peut être imprimée par les fonctions Logger en 1 ligne (voir Functions -> Logger.info(any) ).
Au-delà de cette longueur, le message est imprimé ci-dessous.
Par défaut: "inlineLogLength": "96"
Chemin vers le fichier d'index si le chemin demandé est un répertoire.
Les répertoires doivent se terminer avec A / dans la demande de GET. Sinon, ils sont considérés comme des fichiers, sauf si les repris sont désactivés.
Si "indexFile": "main.jshp.html" puis pour la demande
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
Le serveur sert le fichier /msg/main.jshp.html . Mais comme le fichier a une extension .jshp.html , elle est exécutée.
Par défaut: "indexFile": "index.jshp.html" .
Les temps de demande sont sortis avec 500 après un nombre spécifié de secondes. Ce délai d'expiration dicte combien de temps un code JSHP est autorisé à être analysé. Si le code JSHP contient une boucle infinie (ou similaire), elle sera tuée après des secondes spécifiées.
Par défaut: "timeoutSec": 10
Extensions des fichiers qui doivent être analysés pour exécuter les codes JSHP.
Si "execExtensions": [ ".jshp.html" ] alors seuls les fichiers se terminant par ces extensions seront analysés.
En analyse, si l'analyseur trouve un JavaScript exécutable, il sera exécuté et que toute pièce non exécutable sera copie-copie.
Default: "execExtensions": [ ".jshp.html" ]
Les barres de traîne après un répertoire ne sont pas nécessaires si elles sont définies sur False. Cette propriété est un sucre syntaxique pour la noextension.
Par défaut: "trailingSlashes": true
Si le chemin demandé est un fichier et n'a pas d'extension, le serveur recherchera un fichier ayant demandé le nom et l'une de ces extensions.
Si "noExtension": [ ".jshp.html" ] alors pour la demande
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
Le serveur sert le fichier /msg/main.jshp.html . En effet, main.jshp.html est un fichier ayant le nom main et se terminant avec et extension spécifiée dans noExtension . Mais comme le fichier a une extension .jshp.html , elle est exécutée.
Si une extension spécifiée est un '/' , alors pour le répertoire /msg/ , la barre de fuite ne sera pas nécessaire.
Si "noExtension": [ "/", ".jshp.html" ] et "indexFile": "main.jshp.html" puis pour la demande
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
Le serveur sert le fichier /msg/main.jshp.html .
En effet, un '/' est également traité comme une extension, mais le chemin est un répertoire. Pour que cela fonctionne, le fichier d'index du répertoire doit être spécifié dans IndexFile.
Par défaut: "noExtension": [ ".jshp.html" ]
Cette propriété spécifie comment l'expansion dans le fichier de configuration est gérée. Toutes les propriétés de configuration ne prennent pas en charge les examens. Si une propriété prend en charge Regex, il aura le mot REGEXSUP dans sa section de description.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Si la valeur par défaut est conservée, alors pour les propriétés qui prennent en charge Regex, matchFromStart ajoute ^ au début du regex et matchTillEnd ajoute $ à sa fin.
Si la configuration est
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Ensuite, /chat.* est transformé en regex /^/chat.*/$/ . Cela signifie que tout chemin commençant par /chat est réécrit au src .
En savoir plus sur la réécriture des chemins dans la section des réécritures.
Si matchTillEnd est désactivé, /chat.* serait transformé en regex /^/chat.*// chat.*//.
Chemin vers le répertoire sous Root Root où les codes compilés sont conservés.
Assurez-vous que votre répertoire de build est répertorié en interdit pour empêcher les clients de lire votre code.
Sinon, tout à fait, votre code source sera divulgué.
Par défaut: "buildDir": "/.builds/",
Si true , les fichiers JSHP seront compilés chaque fois que ce fichier est demandé. Convient pour les tests et le débogage.
Par défaut: "hotCompile": false
Si true , le code JSHP sera compilé sur JS exécutable pendant le démarrage du serveur.
Par défaut: "compileOnStart": false
Si l'un de ces fichiers est demandé, la réponse est 403 .
Remarque: Cette propriété prend en charge Regexes ( REGEXSUP ).
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]Pour un chemin spécifié, le serveur envoie une réponse d'un autre chemin spécifié.
Si la configuration est
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]puis pour la demande
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
Le serveur sert le fichier /messaging/chat/index.jshp.html .
Ce n'est pas une redirection, donc cela en résultera dans 200 si /messaging/chat/index.jshp.html est un chemin de demande valide.
Remarque: req de la propriété de cette propriété prend en charge les regex ( REGEXSUP ).
Par défaut: "rewrites": [] c'est-à-dire un tableau vide.
Pour un chemin spécifié, le serveur envoie la réponse 3xx avec un en-tête Location .
Si la configuration est
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]puis pour la demande
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
Le serveur répond avec
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
Cette demande est une redirection, il en résultera donc 3xx .
Par défaut: "redirects": [] c'est-à-dire un tableau vide.
Remarque: req de la propriété de cette propriété prend en charge les regex ( REGEXSUP ).
Remarque: les redirections fonctionnent également pour les domaines externes. Mais les redirectes ne sont pas ouverts vers le client. Le serveur ne redirige que si vous le spécifiez dans config.json .
Remarque: Si un chemin est présent dans rewrites et redirects , le serveur fera une réécriture.
En effet, une demande est d'abord vérifiée pour les réécritures puis les redirectes.
Pour une erreur HTTP spécifiée, un fichier spécifié est envoyé en réponse.
Si la configuration est
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Ensuite, pour une erreur 404 , le serveur sert le fichier /404.jshp.html .
Si le fichier spécifié n'existe pas, une réponse vide est envoyée.
Par défaut: "errFiles": {} c'est-à-dire un objet vide.
Si true , Server utilisera response.write pour envoyer des réponses. Pour chaque echo , le serveur le fait en fonction des 2 propriétés suivantes.
Par défaut, il est gardé. En conséquence, le serveur attend que la page entière soit générée du côté serveur, puis il utilise response.end pour servir la page.
setStatusCode() , setHeader() et setCookie() avant d'écrire n'importe quel HTML ou de faire écho à quelque chose. Par défaut: "respondInChunks": false
Limite de caractère / octet au-delà desquelles les données en écho sont brisées en morceaux.
Par défaut: "chunkLimit": 200
Nombre de morceaux dans lesquels les données en écho doivent être divisées.
Par défaut: "chunksPerEcho": 2
Ces propriétés de configuration sont générées automatiquement par le serveur pendant le démarrage et sur appelez Server.reloadConfig() .
La spécification de ces propriétés dans config.json n'a aucun effet car le serveur écrasera l'une de ces propriétés.
Hôte de serveur, collecté à partir de l' host:port .
Port de serveur, collecté à partir de l'argument host:port .
Une chaîne contenant le chemin d'accès aux ressources du serveur, collectée à partir de l'argument path .
C'est un tableau de tous ces chemins qui doivent être réécrits.
C'est un tableau de tous ces chemins qui doivent être redirigés.
Ce sont des sources de mappage d'objets (fichiers JSHP) à leurs fichiers compilés JavaScript respectifs. Il est généré lorsque le code JSHP est compilé.
$_ENV - objet, stocke les variables d'environnement du système$_CONFIG - objet, stocke des données de configuration du serveur$_RES_ROOT - String, stocke le chemin d'accès aux ressources du serveur$_REQUEST - objet, certaines données de demande$_HEADERS - Objet, stocke en en-têtes de demande$_COOKIES - objet, pas encore implémenté$_GET - objet, stocke les paramètres d'URL$_POST - objet, pas encore implémenté$_SERVER - Objet, stocke certaines variables de serveur, travaillez en cours$_SESSION - Objet, pas encore implémenté response.end() ;jshp .nodejsinfo .x-response-hash , l'algorithme est md5 par défaut. Pour les fichiers jshp , require ne fonctionnera pas. require tentera de charger des modules par rapport au répertoire de l'exécutable. Pour charger des modules par rapport à la racine des ressources du serveur, une prequire de fonction spécialisée est fournie.
Syntaxe
< 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 > Notez que les chemins pour préquir (à commencer par js: , jshp: et / ) sont évalués par rapport à $_RES_ROOT .
Notez que le préfixe js: est facultatif pour charger des fichiers JavaScript.
Mais le préfixe jshp: est absolument nécessaire si un autre fichier jshp doit être chargé.
Sinon, le serveur tentera d'exécuter ce fichier jshp en tant que JavaScript et de plantage et de brûlure.
Notez que certaines fonctions renvoient les promesses. Ils sont
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile() Sans manipulation de promesses appropriée, vous pourriez obtenir des erreurs. Il est recommandé d'utiliser un mot-clé await pour un code propre.
< 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 >Si vous vous demandez pourquoi vous pouvez utiliser Await sans créer une autre fonction asynchrone pour la contenir, c'est parce que dans les coulisses, l'ensemble du code JSHP s'exécute dans une fonction asynchrone.
HTTP - Module Nodejs httpURL - Module url de NodejsPATH - Module path NodejsFS - Module Nodejs fs Reportez-vous à GHSA-8R4G-CG4M-X23C.
node-static V <= 0,7,11 est affecté.node-static PR #227 .%00 .