JavaScript超文本预处理器 - 受PHP的启发,在JavaScript中。
访问JSHP-APP查看演示项目。
仔细阅读您如何在贡献中贡献的简要摘要。md
>= 11.7.0>= 6.5.0worker_threads用于执行JSHP代码。要以CLI的可执行操作运行,请运行npm i -g @aviruk/jshp 。然后从CLI运行jshp 。
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
使用带有compile或server --debug标志查看执行过程中发生的崩溃的堆栈痕迹。
请注意,调试标志是用于调试此软件包的。它不是用于调试JSHP代码。
jshp serve :8080 ~ /Public用作依赖项运行npm i @aviruk/jshp 。
完成此操作后,您可以使用JavaScript文件使用模块中的函数来旋转服务器,如图所示。
可以通过另一个脚本导入此功能。它基本上围绕着实际的CLI函数,从而发送参数。
结果,此功能的行为与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文件。use strict模式下执行。jshp serve目录。使用标准的HTML/CSS/JS语法突出显示,并在所有文本编辑器中支持。唯一的警告是冗长的标签声明。
如果您希望更改可执行文件扩展名,则需要在执行中指定它。
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->或者,您可以使用以下
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->或者,您可以使用以下
<!-- 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 >范围内的代码块中的代码返回值将显示在页面中。
在解析过程中,将评估<?( )?>中的代码。代码的值将显示在页面上。
这些标签应仅用于显示变量的值。
< 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 >在上面的代码中, NAME和UID.toUpperCase()在模板标签中使用。
名为config.json放置在服务器资源根部的文件将包含服务器的配置。
config.json中指定的任何属性完全覆盖默认配置值。因此,如果要指定的属性是数组(或像MatchConfig之类的对象),则必须在Config.json文件中指定其所有属性。否则,服务器可能会崩溃。
如果您不想each /config.json , /server.log和/.builds目录,则不应该这样做。
它们包含有关您的服务器,服务器代码等的信息,并且您不想曝光它们。
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] 服务器只能了解以下属性。
如果您声明了服务器不了解的属性,则不会引起任何错误。您将能够从JSHP代码中的$_CONFIG对象访问这些属性。
此处指定的标头写给每个响应。
默认值: "defaultHeaders": {} ie一个空对象。
服务器日志文件的路径。可以通过将属性值设置为空字符串来关闭记录。
[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
默认值: "logPath": "/server.log" 。
传递的字符串中可以通过Logger函数在1行中打印的字符数量(请参阅Functions -> Logger.info(any) )。
除了此长度之外,该消息还在下面打印出来。
默认值: "inlineLogLength": "96"
索引文件的路径(如果需要的路径)是目录。
目录必须以a / get请求结尾。否则,除非禁用TrailingsLashes,否则它们被视为文件。
如果"indexFile": "main.jshp.html" ,则为请求
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
该服务器为文件/msg/main.jshp.html服务。但是由于文件具有.jshp.html扩展名,因此将执行。
默认值: "indexFile": "index.jshp.html" 。
指定秒数后,请求时间为500 。此超时决定允许解析JSHP代码多长时间。如果JSHP代码包含一个无限循环(或类似的循环),则在指定几秒钟后将其杀死。
默认值: "timeoutSec": 10
要执行JSHP代码,需要解析文件的扩展。
如果"execExtensions": [ ".jshp.html" ] ,则仅以这些扩展为结尾的文件将被解析。
解析时,如果解析器找到任何可执行的JavaScript,则将被执行,并且任何不可执行的零件都将被复制。
默认值: "execExtensions": [ ".jshp.html" ]
如果设置为false,则不需要在目录后拖曳斜线。该特性是一种幻想的句法糖。
默认值: "trailingSlashes": true
如果请求的路径是文件,并且没有扩展名,则服务器将寻找已请求的名称和这些扩展名之一的文件。
如果"noExtension": [ ".jshp.html" ]则为请求
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
该服务器为文件/msg/main.jshp.html服务。这是因为main.jshp.html是一个文件,其名称main ,并以noExtension指定并指定的扩展名。但是由于文件具有.jshp.html扩展名,因此将执行。
如果指定的扩展名为'/' ,则对于目录/msg/ ,将不需要拖曳斜线。
如果"noExtension": [ "/", ".jshp.html" ]和"indexFile": "main.jshp.html" ,则用于请求
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
该服务器为文件/msg/main.jshp.html服务。
这是因为A '/'也被视为扩展名,但路径是目录。为了使其工作,必须在IndexFile中指定目录的索引文件。
默认值: "noExtension": [ ".jshp.html" ]
此属性指定如何处理配置文件中的Regexes。并非所有配置属性都支持REGEXES。如果属性支持Regex,则其描述部分将具有REGEXSUP一词。
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
}如果保留了默认值,则对于支持正则表达式的属性, matchFromStart将^添加到Regex的开头, matchTillEnd将$添加到其结尾。
如果是配置
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
]然后, /chat.*将其变成Regex /^/chat.*/$/ .* /jum/。这意味着以/chat开头的任何路径都会重写为src 。
在重写部分中了解有关重写路径的更多信息。
如果禁用了matchTillEnd , /chat.*将变成Regex /^/chat.*// Chat.** //。
在保留编译代码的资源根下到达目录的路径。
确保禁止列出您的构建目录,以防止客户读取您的代码。
否则,可以理解的是,您的源代码将被泄漏。
默认值: "buildDir": "/.builds/",
如果为true ,则每次请求该文件时都会编译JSHP文件。适用于测试和调试。
默认值: "hotCompile": false
如果为true ,JSHP代码将在服务器启动期间编译为可执行的JS。
默认值: "compileOnStart": false
如果请求这些文件中的任何一个,则响应为403 。
注意:此属性支持REGEXES( REGEXSUP )。
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]对于指定的路径,服务器从另一个指定的路径发送响应。
如果是配置
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]然后出于要求
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
该服务器为文件/messaging/chat/index.jshp.html服务。
这不是一个重定向,因此如果/messaging/chat/index.jshp.html是有效的请求路径,则会导致200 。
注意:此属性的属性req支持REGEXES( REGEXSUP )。
默认值: "rewrites": []即一个空数组。
对于指定的路径,服务器将带有Location标头的响应3xx 。
如果是配置
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]然后出于要求
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
服务器响应
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
此请求是一个重定向,因此将导致3xx 。
默认值: "redirects": [] ie一个空数组。
注意:此属性的属性req支持REGEXES( REGEXSUP )。
注意:重定向也适用于外部域。但是重定向不向客户开放。仅当您在config.json中指定它时,服务器重定向。
注意:如果rewrites和redirects都存在路径,则服务器将进行重写。
这是因为首先检查请求是否重写,然后检查重定向。
对于指定的HTTP错误,将指定的文件作为响应发送。
如果是配置
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
}然后,对于404错误,服务器服务文件/404.jshp.html 。
如果不存在指定的文件,则发送空响应。
默认值: "errFiles": {} ie一个空对象。
如果为true ,服务器将使用response.write写入发送响应。对于每个echo ,服务器都会根据接下来的2个属性来执行此操作。
默认情况下,它已远离。结果,服务器等待整个页面生成服务器端,然后使用response.end 。
setStatusCode() , setHeader()和setCookie()然后再写任何HTML或回声。默认值: "respondInChunks": false
角色 /字节限制超出其回声分为零件。
默认值: "chunkLimit": 200
要分配回声数据的块数量。
默认值: "chunksPerEcho": 2
这些配置属性是由服务器在启动期间和呼叫Server.reloadConfig()自动生成的。
在config.json中指定这些属性没有效果,因为服务器只会覆盖这些属性中的任何一个。
服务器主机,从host:port参数。
服务器端口,从host:port参数。
从path参数收集的包含服务器资源路径的字符串。
这是所有要重写的路径的数组。
这是所有要重定向的路径的数组。
这是对其各自的JavaScript编译文件的对象映射源(JSHP文件)。汇编JSHP代码时会生成。
$_ENV对象,存储系统环境变量$_CONFIG对象,存储服务器配置数据$_RES_ROOT字符串,存储服务器资源的路径$_REQUEST对象,一些请求数据$_HEADERS对象,存储请求的标题$_COOKIES对象,尚未实现$_GET对象,存储URL参数$_POST对象,尚未实现$_SERVER对象,存储一些服务器变量,正在进行中$_SESSION对象,尚未实施response.end() ;jshp文件的模块。nodejsinfo相同。x-response-hash的响应进行响应,默认情况下为md5 。 对于jshp文件, require无法正常工作。 require将尝试与可执行文件的目录相对加载模块。要与服务器资源root加载模块,提供了专门的功能prequire 。
句法
< 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 >请注意,相对于$_RES_ROOT ,评估了前进路径(从js: , jshp:和/ )进行评估。
请注意, js:前缀是加载JavaScript文件的可选。
但是,如果要加载另一个jshp文件, jshp:前缀是绝对必要的。
否则,服务器将尝试将该jshp文件作为JavaScript运行,并崩溃并燃烧。
请注意,某些功能返回承诺。他们是
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile()如果没有适当的承诺处理,您可能会遇到错误。建议您使用await关键字进行清洁的代码。
< 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 >如果您想知道为什么可以在不创建另一个异步函数的情况下使用它,那是因为幕后,整个JSHP代码都在异步函数中运行。
HTTP -nodejs http模块URL -NODEJS url模块PATH -Nodejs path模块FS -Nodejs fs模块请参阅GHSA-8R4G-CG4M-X23C。
node-static V <= 0.7.11受到影响。node-static PR #227中固定的。%00的请求。