JavaScript Hypertext Preocessor - Inspirado pelo PHP, em JavaScript.
Visite JSHP-App para visualizar o projeto de demonstração.
Leia cuidadosamente o breve resumo de como você pode contribuir em contribuir.md
>= 11.7.0>= 6.5.0worker_threads é usado para executar códigos JSHP . Para executar como executável da CLI, execute npm i -g @aviruk/jshp . Em seguida, execute jshp da 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 o sinalizador --debug com compile ou server para visualizar traços de pilha de falhas que ocorreram durante a execução.
Observe que o sinalizador de depuração é destinado a depurar este pacote. Não é para depurar seu código JSHP.
jshp serve :8080 ~ /Public Para usar como uma dependência, execute npm i @aviruk/jshp .
Uma vez feito isso, você pode usar um arquivo JavaScript para aumentar o servidor usando uma função do módulo, como mostrado.
Esta função pode ser importada por outro script. Basicamente, envolve a função real da CLI, permitindo que os argumentos sejam enviados.
Como resultado, essa função se comporta exatamente como a 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 no diretório do servidor.use strict .jshp para serve o diretório.Usa a sintaxe HTML/CSS/JS padrão e é suportada em todos os editores de texto. A única ressalva é uma longa declaração de tag.
Se você deseja sua extensão de arquivo executável, precisará especificá -lo no ExecExtensions.
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->Como alternativa, você pode usar o seguinte
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->Ou, você pode usar o seguinte
<!-- 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 >O valor retornado do código dentro de um bloco de código escopo será exibido na página.
Durante a análise, o código dentro de <?( )?> Será avaliado. O valor do código será exibido na página.
Essas tags devem ser preferidas apenas para exibir valores de variáveis.
< 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 > No código acima, NAME e UID.toUpperCase() são usados dentro das tags de modelo.
Um arquivo chamado config.json colocado na raiz dos recursos do servidor conterá configurações para o servidor.
Qualquer propriedade especificada no config.json substitui totalmente os valores de configuração padrão. Portanto, se a propriedade a ser especificada for uma matriz (ou objeto como o MatchConfig), todas as suas propriedades devem ser especificadas no arquivo config.json. Caso contrário, o servidor pode travar.
Se você não deseja expor /config.json , /server.log e /.builds Diretórios, você não deve fazer isso.
Eles contêm informações sobre seu servidor, código do servidor, etc. e você não deseja expô -los.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] O servidor pode entender apenas as seguintes propriedades.
Se você declarar uma propriedade que o servidor não entende, não causará erros. Você poderá acessar essas propriedades do objeto $_CONFIG no seu código JSHP.
Os cabeçalhos especificados aqui são escritos para todas as respostas.
Padrão: "defaultHeaders": {} ou seja, um objeto vazio.
Caminho para o arquivo de log do servidor. O log pode ser desligado definindo o valor da propriedade para esvaziar a string.
[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
Padrão: "logPath": "/server.log" .
O número máximo de caracteres de uma string passada que pode ser impressa pelas funções Logger em 1 linha (consulte Functions -> Logger.info(any) ).
Além desse comprimento, a mensagem é impressa abaixo.
Padrão: "inlineLogLength": "96"
O caminho para o arquivo de índice se o caminho solicitado for um diretório.
Os diretórios devem terminar com A / na solicitação GET. Caso contrário, eles são considerados arquivos, a menos que o TrailingSlashes seja desativado.
Se "indexFile": "main.jshp.html" , então para solicitação
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
O servidor serve o arquivo /msg/main.jshp.html . Mas como o arquivo possui uma extensão .jshp.html , ele é executado.
Padrão: "indexFile": "index.jshp.html" .
Solicite os tempos com 500 após um número especificado de segundos. Esse tempo limite determina quanto tempo um código JSHP pode ser analisado. Se o código JSHP contiver um loop infinito (ou similar), ele será morto após segundos especificados.
Padrão: "timeoutSec": 10
Extensões de arquivos que precisam ser analisados para a execução de códigos JSHP.
Se "execExtensions": [ ".jshp.html" ] , apenas os arquivos que terminam com essas extensões serão analisados.
Na análise, se o analisador encontrar qualquer JavaScript executável, ele será executado e qualquer peça não executável será copiada.
Padrão: "execExtensions": [ ".jshp.html" ]
Stravings slashes depois que um diretório não é necessário se definido como false. Esta propriedade é um açúcar sintático para nenhuma extensão.
Padrão: "trailingSlashes": true
Se o caminho solicitado for um arquivo e não tiver extensão, o servidor procurará um arquivo solicitado o nome e uma dessas extensões.
Se "noExtension": [ ".jshp.html" ] então para solicitação
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
O servidor serve o arquivo /msg/main.jshp.html . Isso ocorre porque main.jshp.html é um arquivo com o nome main e terminando com e extensão especificada em noExtension . Mas como o arquivo possui uma extensão .jshp.html , ele é executado.
Se a extensão especificada for um '/' , para o diretório /msg/ , a barra de arrastar não será necessária.
Se "noExtension": [ "/", ".jshp.html" ] "indexFile": "main.jshp.html"
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
O servidor serve o arquivo /msg/main.jshp.html .
Isso ocorre porque A '/' também é tratado como uma extensão, mas o caminho é um diretório. Para que funcione, o arquivo de índice do diretório deve ser especificado no IndexFile.
Padrão: "noExtension": [ ".jshp.html" ]
Esta propriedade especifica como as regexes no arquivo de configuração são tratadas. Nem todas as propriedades de configuração suportam regexes. Se uma propriedade suportar o REGEX, terá a palavra REGEXSUP em sua seção da descrição.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Se o padrão for mantido, para propriedades que suportam o regex, matchFromStart adicionará ^ ao início do Regex e matchTillEnd adicionará $ ao seu fim.
Se a configuração for
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Então, /chat.* é transformado no regex /^/chat.*/$/ . Isso significa que qualquer caminho que inicia /chat é reescrito para o src .
Saiba mais sobre a seção de reescrita na seção de reescritas.
Se matchTillEnd estiver desativado, /chat.* seria transformado no regex /^/chat.*// .
Caminho para o diretório em Raiz de Recursos onde os códigos compilados são mantidos.
Verifique se o seu diretório de construção está listado em proibido para impedir que os clientes leiam seu código.
Caso contrário, compreensivelmente, seu código -fonte será vazado.
Padrão: "buildDir": "/.builds/",
Se true , os arquivos jshp serão compilados sempre que o arquivo for solicitado. Adequado para testes e depuração.
Padrão: "hotCompile": false
Se true , o código JSHP será compilado para JS executável durante a inicialização do servidor.
Padrão: "compileOnStart": false
Se algum desses arquivos for solicitado, a resposta será 403 .
Nota: Esta propriedade suporta regexes ( REGEXSUP ).
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]Para um caminho especificado, o servidor envia a resposta de outro caminho especificado.
Se a configuração for
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]então para solicitação
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
O servidor serve o arquivo /messaging/chat/index.jshp.html .
Não é um redirecionamento, portanto, resultará em 200 se /messaging/chat/index.jshp.html é um caminho de solicitação válido.
NOTA: A propriedade req desta propriedade suporta regexes ( REGEXSUP ).
Padrão: "rewrites": [] ou seja, uma matriz vazia.
Para um caminho especificado, o servidor envia a resposta 3xx com um cabeçalho Location .
Se a configuração for
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]então para solicitação
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
o servidor responde com
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
Esta solicitação é um redirecionamento, portanto resultará em 3xx .
Padrão: "redirects": [] ou seja, uma matriz vazia.
NOTA: A propriedade req desta propriedade suporta regexes ( REGEXSUP ).
Nota: Os redirecionamentos também funcionam para domínios externos. Mas os redirecionamentos não estão abertos ao cliente. O servidor redireciona apenas se você especificar no config.json .
Nota: Se um caminho estiver presente em rewrites e redirects , o servidor fará uma reescrita.
Isso ocorre porque uma solicitação é verificada pela primeira vez quanto a reescritas e depois para redirecionamentos.
Para um erro HTTP especificado, um arquivo especificado é enviado como uma resposta.
Se a configuração for
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Então, para um erro 404 , o servidor serve o arquivo /404.jshp.html .
Se o arquivo especificado não existir, uma resposta vazia será enviada.
Padrão: "errFiles": {} ou seja, um objeto vazio.
Se true , o servidor usará response.write para enviar respostas. Para cada echo , o servidor faz isso, dependendo das próximas 2 propriedades.
Por padrão, ele é mantido fora. Como resultado, o servidor aguarda que a página inteira seja gerada pelo lado do servidor e, em seguida, usa response.end para servir a página.
setStatusCode() , setHeader() e setCookie() antes de escrever algum html ou ecoar alguma coisa. Padrão: "respondInChunks": false
Limite de caracteres / bytes além do qual os dados ecoados são quebrados em pedaços.
Padrão: "chunkLimit": 200
Número de pedaços nos quais os dados ecoados devem ser divididos.
Padrão: "chunksPerEcho": 2
Essas propriedades de configuração são geradas automaticamente pelo servidor durante a inicialização e no Server.reloadConfig() .
Especificar essas propriedades no config.json não tem efeito, pois o servidor apenas substituirá qualquer uma dessas propriedades.
Host do servidor, coletado no host:port .
Porta do servidor, coletada no host:port .
Uma string que contém o caminho para os recursos do servidor, coletada no argumento path .
É uma variedade de todos os caminhos que devem ser reescritos.
É uma variedade de todos os caminhos que devem ser redirecionados.
É uma fontes de mapeamento de objetos (arquivos JSHP) para seus respectivos arquivos compilados JavaScript. É gerado quando o código JSHP é compilado.
$_ENV - objeto, armazena variáveis de ambiente do sistema$_CONFIG - Objeto, armazenamento de dados de configuração do servidor$_RES_ROOT - String, armazena o caminho para os recursos do servidor$_REQUEST - Objeto, alguns dados de solicitação$_HEADERS - objeto, armazena cabeçalhos de solicitação$_COOKIES - objeto, ainda não implementado$_GET - Objeto, armazena parâmetros de URL$_POST - objeto, ainda não implementado$_SERVER - objeto, armazena algumas variáveis de servidor, trabalho em andamento$_SESSION - objeto, ainda não implementado response.end() ;jshp .nodejsinfo .x-response-hash , o algoritmo é md5 por padrão. Para arquivos jshp , require não funcionará. require tentará carregar módulos em relação ao diretório do executável. Para carregar os módulos em relação à raiz dos recursos do servidor, é fornecido um prequire de função especializado.
Sintaxe
< 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 > Observe que os caminhos para o pré -quadro (começando com js: , jshp: e / ) são avaliados em relação a $_RES_ROOT .
Observe que o prefixo js: é opcional para carregar arquivos JavaScript.
Mas o prefixo jshp: é absolutamente necessário se outro arquivo jshp for carregado.
Caso contrário, o servidor tentará executar esse arquivo jshp como JavaScript e falhar e queimar.
Observe que certas funções retornam promessas. Eles são
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile() Sem o manuseio de promessa adequada, você pode obter erros. Recomenda -se que você use a palavra -chave await para um código de aparência limpa.
< 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 >Se você está se perguntando por que você pode usar, sem criar outra função assíncrona para contê -la, porque nos bastidores, todo o código JSHP é executado em uma função assíncrona.
HTTP - módulo http NodeJSURL - módulo url NodeJSPATH - NodeJS path ModuleFS - nodejs fs Consulte GHSA-8R4G-CG4M-X23C.
node-static V <= 0,7.11 é afetado.node-static PR #227 .%00 .