JavaScript HyperText Preprocessor- JavaScriptのPHPに触発されました。
JSHP-Appにアクセスして、デモプロジェクトを表示してください。
Convributing.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で指定されたプロパティは、デフォルトのconfig値を完全に上書きします。したがって、指定するプロパティが配列(または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" 。
1行でLogger関数で印刷できる渡された文字列からの最大文字数( Functions -> Logger.info(any)を参照)。
この長さを超えて、メッセージを以下に印刷します。
デフォルト: "inlineLogLength": "96"
要求されたパスがディレクトリである場合、インデックスファイルへのパス。
ディレクトリは、getリクエストでA /で終了する必要があります。それ以外の場合は、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
要求されたパスがファイルであり、拡張機能がない場合、サーバーは要求された名前とこれらの拡張機能の1つを持つファイルを探します。
"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" ]
このプロパティは、構成ファイルの正規表現の処理方法を指定します。すべての構成プロパティが正規表現をサポートするわけではありません。プロパティがRegexをサポートする場合、説明のセクションにREGEXSUP言葉があります。
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Regexをサポートするプロパティに対してデフォルトが保持されている場合、 matchFromStart Regexの先頭に^を追加し、 matchTillEnd $を追加します。
configの場合
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
]次に、 /chat.*はregex /^/chat.*/$/に変わります。これは/chatから始まるパスがsrcに書き換えられることを意味します。
書き換えセクションの書き換えパスの詳細をご覧ください。
matchTillEndが無効になっている場合、 /chat.*はRegex /^/chat.*//に変わります。
コンパイルされたコードが保持されるリソースルートの下のディレクトリへのパス。
クライアントがコードを読み取らないようにするために、ビルドディレクトリが禁止されていることを確認してください。
それ以外の場合、非常に当然のことながら、ソースコードが漏れます。
デフォルト: "buildDir": "/.builds/",
true場合、JSHPファイルは、そのファイルが要求されるたびにコンパイルされます。テストとデバッグに適しています。
デフォルト: "hotCompile": false
true場合、JSHPコードはサーバーの起動中に実行可能なJSにコンパイルされます。
デフォルト: "compileOnStart": false
これらのファイルのいずれかが要求された場合、応答は403です。
注:このプロパティは、Regexes( REGEXSUP )をサポートしています。
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]指定されたパスの場合、サーバーは別の指定されたパスから応答を送信します。
configの場合
"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 index.jshp.htmlが有効なリクエストパスである場合、 200になります。
注:このプロパティのプロパティreq 、Regexes( REGEXSUP )をサポートしています。
デフォルト: "rewrites": []つまり、空の配列。
指定されたパスの場合、サーバーはLocationヘッダーで応答3xx送信します。
configの場合
"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エラーの場合、指定されたファイルが応答として送信されます。
configの場合
"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:プレフィックスは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をチェックします。