JavaScript Hypertext Preprocessor - Terinspirasi oleh PHP, dalam JavaScript.
Kunjungi JSHP-APP untuk melihat proyek demo.
Bacalah ringkasan singkat tentang bagaimana Anda dapat berkontribusi di Contributing.md
>= 11.7.0>= 6.5.0worker_threads digunakan untuk menjalankan kode JSHP . Untuk menjalankan sebagai CLI yang dapat dieksekusi, jalankan npm i -g @aviruk/jshp . Kemudian jalankan jshp dari 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
Gunakan bendera --debug dengan compile atau server untuk melihat jejak tumpukan crash yang terjadi selama eksekusi.
Perhatikan bahwa bendera debug dimaksudkan untuk men -debug paket ini. Itu tidak dimaksudkan untuk men -debug kode JSHP Anda.
jshp serve :8080 ~ /Public Untuk digunakan sebagai ketergantungan menjalankan npm i @aviruk/jshp .
Setelah selesai, Anda dapat menggunakan file JavaScript untuk memutar server menggunakan fungsi dari modul seperti yang ditunjukkan.
Fungsi ini dapat diimpor dengan skrip lain. Ini pada dasarnya membungkus fungsi CLI yang sebenarnya, memungkinkan argumen untuk dikirim.
Akibatnya, fungsi ini berperilaku persis seperti 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 di direktori server Anda.use strict .jshp untuk serve direktori.Menggunakan highlight sintaks HTML/CSS/JS standar dan didukung di semua editor teks. Satu -satunya peringatan adalah deklarasi tag yang panjang.
Jika Anda ingin ekstensi file yang dapat dieksekusi dapat dieksekusi, Anda harus menentukannya di Execextensions.
<!-- html code -->
< script jshp >
// JS code
</ script >
<!-- more html code -->Atau, Anda dapat menggunakan yang berikut ini
<!-- html code -->
< ?jshp
// JS code
? >
<!-- more html code -->Atau, Anda dapat menggunakan yang berikut ini
<!-- 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 >Nilai yang dikembalikan dari kode di dalam blok kode jangkauan akan muncul di halaman.
Selama penguraian, kode di dalam <?( )?> Akan dievaluasi. Nilai kode akan ditampilkan pada halaman.
Tag ini harus lebih disukai hanya untuk menampilkan nilai dari variabel.
< 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 > Dalam kode di atas, NAME dan UID.toUpperCase() digunakan di dalam tag template.
File bernama config.json ditempatkan di root sumber daya server akan berisi konfigurasi untuk server.
Properti apa pun yang ditentukan dalam config.json sepenuhnya menimpa nilai konfigurasi default. Oleh karena itu, jika properti yang akan ditentukan adalah array (atau objek seperti MatchConfig), maka semua propertinya harus ditentukan dalam file config.json. Kalau tidak, server mungkin macet.
Jika Anda tidak ingin mengekspos /config.json , /server.log dan /.builds direktori, Anda tidak boleh melakukan ini.
Mereka berisi informasi tentang server Anda, kode server Anda, dll, dan Anda tidak ingin mengeksposnya.
"forbidden" : [
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] "forbidden" : [
"/config\.json" , // default
"/server\.log" , // default
"/\.builds/.*" , // default
"/private/.*" ,
"/data/.*" ,
"/assets/.*"
] Server hanya dapat memahami properti berikut.
Jika Anda mendeklarasikan properti, server tidak mengerti, itu tidak akan menyebabkan kesalahan. Anda akan dapat mengakses properti tersebut dari objek $_CONFIG dalam kode JSHP Anda.
Header yang ditentukan di sini ditulis untuk setiap tanggapan.
Default: "defaultHeaders": {} yaitu objek kosong.
Path to Server Log File. Pencatatan dapat dimatikan dengan mengatur nilai properti ke string kosong.
[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
Default: "logPath": "/server.log" .
Jumlah maksimum karakter dari string yang diteruskan yang dapat dicetak oleh fungsi Logger dalam 1 baris (lihat Functions -> Logger.info(any) ).
Di luar panjang ini, pesan dicetak di bawah ini.
Default: "inlineLogLength": "96"
Jalur ke file indeks jika jalur yang diminta adalah direktori.
Direktori harus diakhiri dengan A / dalam permintaan GET. Kalau tidak, mereka dianggap sebagai file, kecuali trailingslash dinonaktifkan.
Jika "indexFile": "main.jshp.html" lalu untuk permintaan
GET /msg/ HTTP/1.1
Host: xyz.net
Connection: close
Server melayani file /msg/main.jshp.html . Tetapi karena file tersebut memiliki ekstensi .jshp.html , ia dieksekusi.
Default: "indexFile": "index.jshp.html" .
Meminta waktu dengan 500 setelah jumlah detik yang ditentukan. Timeout ini menentukan berapa lama kode JSHP diizinkan untuk diuraikan. Jika kode JSHP berisi loop tak terbatas (atau serupa), itu akan dibunuh setelah detik yang ditentukan.
Default: "timeoutSec": 10
Perpanjangan file yang perlu diuraikan untuk menjalankan kode JSHP.
Jika "execExtensions": [ ".jshp.html" ] maka hanya file yang diakhiri dengan ekstensi yang akan diuraikan.
Secara parsing, jika parser menemukan JavaScript yang dapat dieksekusi, itu akan dieksekusi, dan setiap bagian yang tidak dapat dieksekusi akan disalin.
Default: "execExtensions": [ ".jshp.html" ]
Slash trailing setelah direktori tidak diperlukan jika diatur ke false. Properti ini adalah gula sintaksis untuk noextension.
Default: "trailingSlashes": true
Jika jalur yang diminta adalah file dan tidak memiliki ekstensi, server akan mencari file yang memiliki nama yang diminta dan salah satu ekstensi ini.
Jika "noExtension": [ ".jshp.html" ] maka untuk permintaan
GET /msg/main HTTP/1.1
Host: xyz.net
Connection: close
Server melayani file /msg/main.jshp.html . Itu karena main.jshp.html adalah file yang memiliki nama main dan berakhir dengan dan ekstensi yang ditentukan dalam noExtension . Tetapi karena file tersebut memiliki ekstensi .jshp.html , ia dieksekusi.
Jika ekstensi yang ditentukan adalah '/' , maka untuk direktori /msg/ , slash trailing tidak akan diperlukan.
Jika "noExtension": [ "/", ".jshp.html" ] dan "indexFile": "main.jshp.html" lalu untuk permintaan
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
Server melayani file /msg/main.jshp.html .
Ini karena A '/' juga diperlakukan sebagai ekstensi, tetapi jalannya adalah direktori. Agar berfungsi, file indeks direktori harus ditentukan dalam indexFile.
Default: "noExtension": [ ".jshp.html" ]
Properti ini menentukan bagaimana regex dalam file konfigurasi ditangani. Tidak semua properti konfigurasi mendukung regexes. Jika sebuah properti mendukung Regex, ia akan memiliki kata REGEXSUP di bagian deskripsi.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Jika default disimpan maka untuk properti yang mendukung regex, matchFromStart menambahkan ^ ke awal regex dan matchTillEnd menambahkan $ ke akhir.
Jika konfigurasi
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Kemudian, /chat.* diubah menjadi regex /^/chat.*/$/ . Ini berarti jalan apa pun yang dimulai dengan /chat ditulis ulang ke src .
Pelajari lebih lanjut tentang Jalur Menulis Ulang di Bagian penulisan ulang.
Jika matchTillEnd dinonaktifkan, /chat.* akan diubah menjadi regex /^/chat.*// .
Jalur ke direktori di bawah root sumber daya di mana kode yang dikompilasi disimpan.
Pastikan direktori build Anda terdaftar di Forbidden untuk mencegah klien membaca kode Anda.
Kalau tidak, cukup dimengerti, kode sumber Anda akan bocor.
Default: "buildDir": "/.builds/",
Jika true , file JSHP akan dikompilasi setiap kali file itu diminta. Cocok untuk pengujian dan debugging.
Default: "hotCompile": false
Jika true , kode JSHP akan dikompilasi ke JS yang dapat dieksekusi selama startup server.
Default: "compileOnStart": false
Jika salah satu dari file ini diminta, respons adalah 403 .
CATATAN: Properti ini mendukung regex ( REGEXSUP ).
"forbidden" : [
"/config\.json" ,
"/server\.log" ,
"/\.builds/.*"
]Untuk jalur yang ditentukan, server mengirimkan respons dari jalur lain yang ditentukan.
Jika konfigurasi
"rewrites" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html"
}
]lalu untuk permintaan
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
Server melayani file /messaging/chat/index.jshp.html .
Ini bukan pengalihan, jadi itu akan menghasilkan 200 if /messaging/chat/index.jshp.html adalah jalur permintaan yang valid.
CATATAN: Properti req dari properti ini mendukung regexes ( REGEXSUP ).
Default: "rewrites": [] yaitu array kosong.
Untuk jalur yang ditentukan, server mengirimkan respons 3xx dengan header Location .
Jika konfigurasi
"redirects" : [
{
"req" : "/chat" ,
"src" : "/messaging/chat/index.jshp.html" ,
"status" : 301
}
]lalu untuk permintaan
GET /chat HTTP/1.1
Host: xyz.net
Connection: close
server merespons dengan
HTTP/1.1 301 Moved Parmanently
Location: /messaging/chat/index.jshp.html
.
.
.
Permintaan ini adalah pengalihan, jadi itu akan menghasilkan 3xx .
Default: "redirects": [] yaitu array kosong.
CATATAN: Properti req dari properti ini mendukung regexes ( REGEXSUP ).
CATATAN: Mengalihkan pekerjaan untuk domain eksternal juga. Tetapi pengalihan tidak terbuka untuk klien. Server mengarahkan kembali hanya jika Anda menentukannya di config.json .
CATATAN: Jika ada jalur yang ada di kedua rewrites dan redirects , server akan melakukan penulisan ulang.
Ini karena permintaan pertama kali diperiksa untuk penulisan ulang dan kemudian untuk pengalihan.
Untuk kesalahan HTTP yang ditentukan, file yang ditentukan dikirim sebagai respons.
Jika konfigurasi
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Kemudian untuk kesalahan 404 , server melayani file /404.jshp.html .
Jika file yang ditentukan tidak ada, respons kosong dikirim.
Default: "errFiles": {} yaitu objek kosong.
Jika true , server akan menggunakan response.write untuk mengirim respons. Untuk setiap echo , server melakukan ini tergantung pada 2 properti berikutnya.
Secara default, itu kabur. Akibatnya, server menunggu seluruh halaman dihasilkan sisi server, dan kemudian menggunakan response.end untuk melayani halaman.
setStatusCode() , setHeader() dan setCookie() sebelum Anda menulis HTML atau menggemakan sesuatu. Default: "respondInChunks": false
Batas karakter / byte di luar yang digemakan data pecah menjadi berkeping -keping.
Default: "chunkLimit": 200
Jumlah potongan di mana data bergema akan dibagi.
Default: "chunksPerEcho": 2
Properti konfigurasi ini dihasilkan secara otomatis oleh server selama startup dan pada panggilan Server.reloadConfig() .
Menentukan properti ini di config.json tidak berpengaruh karena server hanya akan menimpa salah satu dari properti ini.
Host server, dikumpulkan dari host:port .
Port server, dikumpulkan dari host:port .
String yang berisi jalur ke sumber daya server, dikumpulkan dari argumen path .
Ini adalah berbagai jalan yang harus ditulis ulang.
Ini adalah berbagai jalan yang akan dialihkan.
Ini adalah sumber pemetaan objek (file JSHP) untuk masing -masing file yang dikompilasi JavaScript. Ini dihasilkan ketika kode JSHP dikompilasi.
$_ENV - Objek, Menyimpan Variabel Lingkungan Sistem$_CONFIG - Objek, Menyimpan Data Konfigurasi Server$_RES_ROOT - String, menyimpan jalur ke sumber daya server$_REQUEST - Objek, beberapa data permintaan$_HEADERS - objek, menyimpan header permintaan$_COOKIES - objek, belum diterapkan$_GET - Objek, Menyimpan Parameter URL$_POST - objek, belum diterapkan$_SERVER - Objek, menyimpan beberapa variabel server, sedang dalam proses$_SESSION - objek, belum diimplementasikan response.end() ;jshp .nodejsinfo .x-response-hash , algoritma adalah md5 secara default. Untuk file jshp , require tidak akan berfungsi. require akan mencoba memuat modul relatif terhadap direktori yang dapat dieksekusi. Untuk memuat modul relatif terhadap root sumber daya server, fungsi khusus yang prequire .
Sintaksis
< 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 > Perhatikan bahwa jalur ke prequire (dimulai dengan js: , jshp: dan / ) dievaluasi relatif terhadap $_RES_ROOT .
Perhatikan bahwa awalan js: adalah opsional untuk memuat file JavaScript.
Tetapi awalan jshp: benar -benar diperlukan jika file jshp lain harus dimuat.
Kalau tidak, server akan mencoba menjalankan file jshp itu sebagai JavaScript, dan crash and burn.
Perhatikan bahwa fungsi -fungsi tertentu mengembalikan janji. Mereka
getStatusCode()Server.reloadConfig()Server.fileCompile(path)Server.recompile() Tanpa penanganan janji yang tepat, Anda mungkin mendapatkan kesalahan. Disarankan agar Anda menggunakan kata kunci await kode yang terlihat bersih.
< 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 >Jika Anda bertanya -tanya mengapa Anda dapat menggunakan menunggu tanpa membuat fungsi async lain untuk menahannya, itu karena di balik layar, seluruh kode JSHP berjalan dalam fungsi async.
HTTP - modul http nodejsURL - Modul url NODEJSPATH - Nodejs pathFS - Modul NodeJS fs Lihat GHSA-8R4G-CG4M-X23C.
node-static V <= 0,7,11 terpengaruh.node-static PR #227 .%00 .