JavaScript Preprocesador de hipertexto: inspirado en PHP, en JavaScript.
Visite JSHP-APP para ver el proyecto de demostración.
Lea cuidadosamente el breve resumen de cómo puede contribuir a contribuir.md
>= 11.7.0>= 6.5.0worker_threads se usa para ejecutar códigos JSHP . Para ejecutarse como ejecutable de CLI, ejecute npm i -g @aviruk/jshp . Luego ejecute jshp desde el 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
Use el indicador --debug con compile o server para ver las trazas de la pila de bloqueos que ocurrieron durante la ejecución.
Tenga en cuenta que la bandera de depuración está destinada a depurar este paquete. No está destinado a depurar su código JSHP.
jshp serve :8080 ~ /Public Para usar como dependencia de la ejecución npm i @aviruk/jshp .
Una vez hecho esto, puede usar un archivo JavaScript para girar el servidor usando una función del módulo como se muestra.
Esta función puede ser importada por otro script. Básicamente envuelve la función CLI real, lo que permite enviar argumentos.
Como resultado, esta función se comporta exactamente como 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 en su directorio de servidor.use strict .jshp para serve al directorio.Utiliza resaltar la sintaxis HTML/CSS/JS estándar y es compatible con todos los editores de texto. La única advertencia es una larga declaración de etiqueta.
Si desea su extensión de archivo ejecutable de cambio, deberá especificarla en ExecExtensions.
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->Alternativamente, puede usar lo siguiente
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->O puede usar lo siguiente
<!-- 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 >El valor devuelto del código dentro de un bloque de código alcanzado aparecerá en la página.
Durante el análisis, se evaluará el código dentro de <?( )?> . El valor del código se mostrará en la página.
Estas etiquetas deben preferirse solo para mostrar valores de 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 > En el código anterior, NAME y UID.toUpperCase() se usan dentro de las etiquetas de plantilla.
Un archivo llamado config.json colocado en la raíz de los recursos del servidor contendrá configuraciones para el servidor.
Cualquier propiedad especificada en config.json sobrescribe completamente los valores de configuración predeterminados. Por lo tanto, si la propiedad a especificar es una matriz (u objeto como MatchConfig), entonces todas sus propiedades deben especificarse en el archivo config.json. De lo contrario, el servidor podría bloquearse.
Si no desea exponer /config.json , /server.log y /.builds directorios, no debería hacerlo.
Contienen información sobre su servidor, su código de servidor, etc., y no desea exponerlos.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] El servidor solo puede comprender las siguientes propiedades.
Si declara una propiedad que el servidor no comprende, no causará ningún error. Podrá acceder a esas propiedades desde el objeto $_CONFIG en su código JSHP.
Los encabezados especificados aquí se escriben en cada respuesta.
Valor predeterminado: "defaultHeaders": {} es decir, un objeto vacío.
Ruta al archivo de registro del servidor. El registro se puede apagar configurando el valor de la propiedad en cadena vacía.
[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
Predeterminado: "logPath": "/server.log" .
El número máximo de caracteres de una cadena pasada que se puede imprimir mediante funciones Logger en 1 línea (ver Functions -> Logger.info(any) ).
Más allá de esta longitud, el mensaje se imprime a continuación.
Valor predeterminado: "inlineLogLength": "96"
Ruta al archivo de índice si se solicita ruta es un directorio.
Los directorios deben terminar con A / en la solicitud GET. De lo contrario, se consideran archivos, a menos que las cajas de trailings estén deshabilitadas.
Si "indexFile": "main.jshp.html" entonces para solicitar
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
El servidor sirve el archivo /msg/main.jshp.html . Pero como el archivo tiene una extensión .jshp.html , se ejecuta.
Predeterminado: "indexFile": "index.jshp.html" .
Solicite los tiempos con 500 después de un número específico de segundos. Este tiempo de espera dicta cuánto tiempo se permite analizar un código JSHP. Si el código JSHP contiene un bucle infinito (o similar), se matará después de segundos especificados.
Valor predeterminado: "timeoutSec": 10
Extensiones de archivos que deben analizarse para ejecutar códigos JSHP.
Si "execExtensions": [ ".jshp.html" ] , solo los archivos que terminan con esas extensiones se analizarán.
Al analizar, si el analizador encuentra algún JavaScript ejecutable, se ejecutará y cualquier parte no ejecutable se copiará.
Valor predeterminado: "execExtensions": [ ".jshp.html" ]
Se requieren cortes de arrastre después de un directorio si se establece en falso. Esta propiedad es un azúcar sintáctico para No Textension.
Valor predeterminado: "trailingSlashes": true
Si la ruta solicitada es un archivo y no tiene extensión, el servidor buscará un archivo que haya solicitado el nombre y una de estas extensiones.
Si "noExtension": [ ".jshp.html" ] entonces para solicitar
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
El servidor sirve el archivo /msg/main.jshp.html . Esto se debe a que main.jshp.html es un archivo que tiene nombre main y finalización y extensión especificada en noExtension . Pero como el archivo tiene una extensión .jshp.html , se ejecuta.
Si la extensión especificada es un '/' , entonces para el directorio /msg/ , no se requerirá la barra de arrastre.
Si "noExtension": [ "/", ".jshp.html" ] y "indexFile": "main.jshp.html" y luego para solicitar
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
El servidor sirve el archivo /msg/main.jshp.html .
Esto se debe a que un '/' también se trata como una extensión, pero la ruta es un directorio. Para que funcione, el archivo de índice del directorio debe especificarse en IndexFile.
Valor predeterminado: "noExtension": [ ".jshp.html" ]
Esta propiedad especifica cómo se manejan las reglas en el archivo de configuración. No todas las propiedades de configuración admiten regexas. Si una propiedad admite Regex, tendrá la palabra REGEXSUP en su sección de descripción.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Si el valor predeterminado se mantiene, entonces para las propiedades que admiten Regex, matchFromStart agrega ^ al comienzo de RegEx y matchTillEnd agrega $ a su final.
Si la configuración es
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Entonces, /chat.* se convierte en Regex /^/chat.*/$/ . Esto significa que cualquier ruta que comienza con /chat se reescribe al src .
Obtenga más información sobre cómo reescribir rutas en la sección de reescrituras.
Si matchTillEnd está deshabilitado, /chat.* se convertiría en el regex /^/chat.*// .
Ruta al directorio en raíz de recursos donde se mantienen códigos compilados.
Asegúrese de que su directorio de compilación esté en la lista de que los clientes lean su código.
De lo contrario, comprensiblemente, su código fuente se filtrará.
Predeterminado: "buildDir": "/.builds/",
Si es true , los archivos JSHP se compilarán cada vez que se solicite ese archivo. Adecuado para pruebas y depuración.
Valor predeterminado: "hotCompile": false
Si es true , el código JSHP se compilará con JS ejecutable durante el inicio del servidor.
Valor predeterminado: "compileOnStart": false
Si se solicita alguno de estos archivos, la respuesta es 403 .
Nota: Esta propiedad admite regexas ( REGEXSUP ).
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]Para una ruta especificada, el servidor envía respuesta desde otra ruta especificada.
Si la configuración es
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]luego para la solicitud
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
El servidor sirve el archivo /messaging/chat/index.jshp.html .
No es una redirección, por lo que dará como resultado 200 si /messaging/chat/index.jshp.html es una ruta de solicitud válida.
Nota: La propiedad req de esta propiedad admite Regexes ( REGEXSUP ).
Valor predeterminado: "rewrites": [] es decir, una matriz vacía.
Para una ruta especificada, el servidor envía la respuesta 3xx con un encabezado Location .
Si la configuración es
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]luego para la solicitud
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
el servidor responde con
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
Esta solicitud es una redirección, por lo que dará como resultado 3xx .
Valor predeterminado: "redirects": [] es decir, una matriz vacía.
Nota: La propiedad req de esta propiedad admite Regexes ( REGEXSUP ).
Nota: Las redireccionamientos también funcionan para dominios externos. Pero las redirecciones no están abiertas al cliente. El servidor redirige solo si lo especifica en config.json .
Nota: Si hay una ruta presente tanto en rewrites como en redirects , el servidor hará una reescritura.
Esto se debe a que una solicitud se verifica primero para reescrituras y luego para redireccionamientos.
Para un error HTTP especificado, se envía un archivo especificado como respuesta.
Si la configuración es
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Luego, para un error 404 , el servidor sirve el archivo /404.jshp.html .
Si el archivo especificado no existe, se envía una respuesta vacía.
Predeterminado: "errFiles": {} es decir, un objeto vacío.
Si true , el servidor usará response.write . Write para enviar respuestas. Para cada echo , el servidor hace esto dependiendo de las siguientes 2 propiedades.
Por defecto, se mantiene apagado. Como resultado, el servidor espera a que la página completa se genere el lado del servidor, y luego usa response.end .
setStatusCode() , setHeader() y setCookie() antes de que haya escrito html o se hiciera eco de algo. Predeterminado: "respondInChunks": false
Límite de carácter / byte más allá del cual los datos resonados se rompen en piezas.
Valor predeterminado: "chunkLimit": 200
Número de fragmentos en los que se dividirán los datos de eco.
Valor predeterminado: "chunksPerEcho": 2
Estas propiedades de configuración son generadas automáticamente por el servidor durante el inicio y en llamar Server.reloadConfig() .
La especificación de estas propiedades en config.json no tiene ningún efecto, ya que el servidor solo sobrescribirá cualquiera de estas propiedades.
Host del servidor, recopilado del host:port .
Puerto del servidor, recopilado del argumento host:port .
Una cadena que contiene la ruta a los recursos del servidor, recopilada del argumento path .
Es una variedad de todos esos caminos que deben reescribirse.
Es una serie de todos esos caminos que deben ser redirigidos.
Es una fuentes de mapeo de objetos (archivos JSHP) a sus respectivos archivos compilados JavaScript. Se genera cuando se compila el código JSHP.
$_ENV - objeto, almacena variables de entorno del sistema$_CONFIG - objeto, almacena datos de configuración del servidor$_RES_ROOT : cadena, almacena la ruta a los recursos del servidor$_REQUEST - objeto, algunos datos de solicitud$_HEADERS - Objeto, almacena encabezados de solicitud$_COOKIES - objeto, aún no implementado$_GET - objeto, almacena parámetros de URL$_POST - objeto, aún no implementado$_SERVER - Objeto, almacena algunas variables del servidor, funcione en progreso$_SESSION - objeto, aún no implementado response.end() ;jshp .nodejsinfo .x-response-hash , el algoritmo es md5 de forma predeterminada. Para los archivos jshp , require no funcionará. require intentar cargar módulos en relación con el directorio del ejecutable. Para cargar módulos en relación con la raíz de los recursos del servidor, se proporciona una prequire de función especializada.
Sintaxis
< 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 > Tenga en cuenta que las rutas para prevenir (comenzando con js: , jshp: y / ) se evalúan en relación con $_RES_ROOT .
Tenga en cuenta que el prefijo js: es opcional para cargar archivos JavaScript.
Pero el prefijo jshp: es absolutamente necesario si se va a cargar otro archivo jshp .
De lo contrario, el servidor intentará ejecutar ese archivo jshp como JavaScript, y bloquear y grabar.
Tenga en cuenta que ciertas funciones devuelven promesas. Ellos son
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile() Sin un manejo de promesa adecuado, puede obtener errores. Se recomienda que use la palabra clave await para un código de aspecto limpio.
< 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 se pregunta por qué puede usar esperar sin crear otra función de Async para contenerla, eso es porque detrás de escena, todo el código JSHP se ejecuta en una función de Async.
HTTP - Módulo http NodeJSURL - Módulo url de NodeJsPATH - módulo path de nodejsFS - Módulo NODEJS fs Consulte GHSA-8R4G-CG4M-X23C.
node-static V <= 0.7.11 se ve afectado.node-static PR #227 .%00 .