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的請求。