JavaScript HyperText Preprocessor- PHP에서 JavaScript에서 영감을 얻었습니다.
Demo 프로젝트를 보려면 JSHP-App을 방문하십시오.
기여에 기여할 수있는 방법에 대한 간단한 요약을 신중하게 읽으십시오.
>= 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 구문 강조 표시를 사용하며 모든 텍스트 편집기에서 지원됩니다. 유일한 경고는 긴 태그 선언입니다.
변경 실행 파일 확장자를 원한다면 execextensions에서 지정해야합니다.
<!-- 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 파일에 지정되어야합니다. 그렇지 않으면 서버가 충돌 할 수 있습니다.
/config.json , /server.log 및 /.builds 디렉토리를 노출시키지 않으려면 이렇게해서는 안됩니다.
서버, 서버 코드 등에 대한 정보가 포함되어 있으며이를 노출시키고 싶지 않습니다.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] 서버는 다음 속성 만 이해할 수 있습니다.
서버가 이해하지 못하는 속성을 선언하면 오류가 발생하지 않습니다. JSHP 코드의 $_CONFIG 객체에서 해당 속성에 액세스 할 수 있습니다.
여기에 지정된 헤더는 모든 응답에 기록됩니다.
기본값 : "defaultHeaders": {} 즉, 빈 객체입니다.
서버 로그 파일로가는 경로. 속성 값을 빈 문자열로 설정하여 로깅을 꺼질 수 있습니다.
[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"
요청 된 경로가 디렉토리 인 경우 인덱스 파일의 경로.
디렉토리는 / 요청으로 끝나야합니다. 그렇지 않으면 후행 슬래시가 비활성화되지 않는 한 파일로 간주됩니다.
"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" ]
거짓으로 설정된 경우 디렉토리 후 후행 슬래시가 필요하지 않습니다. 이 특성은 신장을위한 구문 설탕입니다.
기본값 : "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 파일을 제공합니다.
이는 '/' 도 확장으로 취급되지만 경로는 디렉토리이기 때문입니다. 작동하려면 디렉토리의 인덱스 파일을 IndexFile에 지정해야합니다.
기본값 : "noExtension": [ ".jshp.html" ]
이 속성은 구성 파일의 regexes가 처리되는 방법을 지정합니다. 모든 구성 속성이 Regexes를 지원하는 것은 아닙니다. 속성이 Regex를 지원하면 설명 섹션에 REGEXSUP 단어가 있습니다.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} 기본값이 Regex를 지원하는 속성에 대해 기본값을 유지하면 matchFromStart Regex의 시작 부분에 ^ 추가하고 matchTillEnd $ 를 추가합니다.
구성 인 경우
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] 그런 다음, /chat.* 는 Regex /^/chat.*/$/ 로 바뀝니다. 이것은 /chat 으로 시작하는 모든 경로가 src 로 다시 작성되었음을 의미합니다.
다시 쓰기 섹션에서 다시 쓰기 경로에 대해 자세히 알아보십시오.
matchTillEnd 비활성화되면 /chat.* Regex /^/chat.*// 로 바뀝니다.
컴파일 된 코드가 유지되는 자원 루트 아래 디렉토리로가는 경로.
클라이언트가 코드를 읽지 못하도록 빌드 디렉토리가 Forbidden에 나열되어 있는지 확인하십시오.
그렇지 않으면, 당연히, 소스 코드가 유출됩니다.
기본값 : "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": [] 즉, 빈 배열입니다.
참고 : 이 속성의 속성 req Regexes ( REGEXSUP )를 지원합니다.
참고 : 리디렉션은 외부 도메인에도 작동합니다. 그러나 리디렉션은 클라이언트에게 열려 있지 않습니다. 서버는 config.json 에 지정하는 경우에만 리디렉션됩니다.
참고 : rewrites 및 redirects 에 경로가있는 경우 서버가 다시 작성됩니다.
요청이 먼저 다시 작성 한 다음 리디렉션을 확인하기 때문입니다.
지정된 HTTP 오류의 경우 지정된 파일이 응답으로 전송됩니다.
구성 인 경우
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} 그런 다음 404 오류의 경우 서버는 /404.jshp.html 파일을 제공합니다.
지정된 파일이 존재하지 않으면 빈 응답이 전송됩니다.
기본값 : "errFiles": {} 즉, 빈 객체입니다.
true 경우 서버는 response.write 사용하여 응답을 보냅니다. 모든 echo 에 대해 서버는 다음 2 가지 속성에 따라이를 수행합니다.
기본적으로 꺼져 있습니다. 결과적으로 서버는 전체 페이지가 서버 측면을 생성 할 때까지 기다린 다음 response.end 사용하여 페이지를 제공합니다.
setStatusCode() , setHeader() 및 setCookie() 사용해야합니다. 기본값 : "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 실행 파일의 디렉토리와 관련하여 모듈을로드하려고 시도합니다. 서버 리소스 루트에 대한 모듈을로드하려면 특수 기능 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 > 전편 경로 ( js: , jshp: 및 / )로 시작하는 경로는 $_RES_ROOT 에 대해 평가됩니다.
js: Prefix는 JavaScript 파일을로드하기위한 선택 사항입니다.
그러나 다른 jshp 파일을로드하려면 jshp: Prefix가 절대적으로 필요합니다.
그렇지 않으면 서버는 해당 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 확인합니다.