JavaScript Hypertext Preprocessor - Вдохновлен PHP, в JavaScript.
Посетите JSHP-APP, чтобы просмотреть демонстрационный проект.
Тщательно прочитайте краткое изложение того, как вы можете внести свой вклад в Anplocing.md
>= 11.7.0>= 6.5.0worker_threads используется для выполнения кодов JSHP . Чтобы запустить как исполняемый файл CLI, запустите npm i -g @aviruk/jshp . Затем запустите jshp от 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
Используйте флаг --debug с compile или server , чтобы просмотреть следы стека сбоев, которые произошли во время выполнения.
Обратите внимание, что флаг отладки предназначен для отладки этого пакета. Это не предназначено для отладки вашего кода 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 >Возвращенное значение кода в блоке кода Scoped будет отображаться на странице.
Во время анализа код в <?( )?> Будет оценен. Значение кода будет отображаться на странице.
Эти теги должны быть предпочтительны только для отображения значений из переменных.
< 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/.*"
] Сервер может понять только следующие свойства.
Если вы объявите свойство, сервер не понимает, это не вызовет ошибок. Вы сможете получить доступ к этим свойствам из объекта $_CONFIG в вашем коде JSHP.
Заголовок, указанные здесь, записаны на каждый ответ.
По умолчанию: "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"
Путь к файлу индекса, если запрошенный путь - это каталог.
Каталоги должны заканчиваться A / в запросе GET. В противном случае они считаются файлами, если только TrailingLashes не отключена.
Если "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" ]
Тледные удары после того, как каталог не требуется, если установить на ложь. Это свойство является синтаксическим сахаром для NoExtension.
По умолчанию: "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/ /Trailing Slash не потребуется.
Если "noExtension": [ "/", ".jshp.html" ] и "indexFile": "main.jshp.html" , тогда для запроса
GET /msg HTTP/1.1
Host: xyz.net
Connection: close
Сервер обслуживает файл /msg/main.jshp.html .
Это связано с тем, что '/' также рассматривается как расширение, но путь - это каталог. Для того, чтобы работать, индексный файл каталога должен быть указан в индексном файле.
По умолчанию: "noExtension": [ ".jshp.html" ]
Это свойство определяет, как обрабатываются режимы в файле конфигурации. Не все свойства конфигурации поддерживают регуляторы. Если свойство поддерживает корпорацию, у него будет слово REGEXSUP в разделе описания.
"matchConfig" : {
"matchFromStart" : true ,
"matchTillEnd" : true
} Если по умолчанию сохраняется, тогда для свойств, которые поддерживают регулярное выражение, matchFromStart добавляет ^ к началу резервуара, а matchTillEnd добавляет $ к своему концу.
Если конфигурация
"rewrites" : [
{
"req" : "/chat.*" ,
"src" : "/messaging/chat/index.jshp.html"
}
] Затем /chat.* превращается в regex /^/chat.*/$/ . Это означает, что любой путь, начиная с /chat , переписан в src .
Узнайте больше о переписывании путей в разделе «Переписать».
Если matchTillEnd отключена, /chat.* будет превращена в повторную экспозицию /^/chat.*// .
Путь к каталогу в рамках корня ресурса, где хранятся скомпилированные коды.
Убедитесь, что ваш каталог сборки указан в запрещении, чтобы не дать клиентам читать ваш код.
В противном случае, вполне понятно, ваш исходный код будет просочиться.
По умолчанию: "buildDir": "/.builds/",
Если true , файлы JSHP будут скомпилироваться каждый раз, когда этот файл запрашивается. Подходит для тестирования и отладки.
По умолчанию: "hotCompile": false
Если true , код JSHP будет составлен в исполняемый JS во время запуска сервера.
По умолчанию: "compileOnStart": false
Если какой -либо из этих файлов запрашивается, ответ составляет 403 .
Примечание. Это свойство поддерживает регуляторы ( 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 .
Это не перенаправление, поэтому оно приведет к 200 , если /messaging/chat/index.jshp.html является действительным путем запроса.
ПРИМЕЧАНИЕ req REGEXSUP
По умолчанию: "rewrites": [] т.е. пустой массив.
Для указанного пути сервер отправляет ответ 3xx с заголовком Location .
Если конфигурация
"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 REGEXSUP
Примечание: перенаправление также работает и для внешних доменов. Но перенаправления не открыты для клиента. Сервер перенаправляет только в том случае, если вы указываете его в config.json .
Примечание. Если путь присутствует как в rewrites , так и redirects , сервер будет переписать.
Это связано с тем, что запрос сначала проверяется на переписывание, а затем для перенаправлений.
Для указанной ошибки HTTP указанный файл отправляется в качестве ответа.
Если конфигурация
"errFiles" : {
"404" : "/404.jshp.html" ,
"403" : "/403.jshp.html"
} Затем для ошибки 404 сервер обслуживает файл /404.jshp.html .
Если указанный файл не существует, отправляется пустой ответ.
По умолчанию: "errFiles": {} т.е. пустой объект.
Если true , Server будет использовать 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 .
Это множество всех тех путей, которые должны быть переписаны.
Это массив всех тех путей, которые должны быть перенаправлены.
Это источники отображения объектов (файлы JSHP) для их соответствующих файлов JavaScript. Это генерируется при составлении кода JSHP.
$_ENV - объект, хранит переменные системы системной среды$_CONFIG - объект, хранит данные конфигурации сервера$_RES_ROOT - String, хранит путь к ресурсам сервера$_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 moduleURL - url -модуль NodejsPATH - модуль path NodejsFS - модуль Nodejs fs См. GHSA-8R4G-CG4M-X23C.
node-static V <= 0,7,11 затронут.node-static PR #227 .%00 .