JavaScript Hypertext Preprocessor - مستوحى من PHP ، في JavaScript.
قم بزيارة JSHP-APP لعرض المشروع التجريبي.
اقرأ بعناية الملخص الموجز لكيفية المساهمة في المساهمة. 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 >ستظهر القيمة التي تم إرجاعها من الكود داخل كتلة الكود المنتهي في الصفحة.
أثناء التحليل ، سيتم تقييم الكود داخل <?( )?> . سيتم عرض قيمة الرمز على الصفحة.
يجب تفضيل هذه العلامات فقط لعرض القيم من المتغيرات.
< 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 في سطر واحد (انظر Functions -> Logger.info(any) ).
وراء هذا الطول ، تتم طباعة الرسالة أدناه.
الافتراضي: "inlineLogLength": "96"
المسار إلى ملف الفهرس إذا كان المسار المطلوب هو دليل.
يجب أن تنتهي الدلائل مع 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" ]
عند التحليل ، إذا وجد المحلل أي جافا سكريبت قابلة للتنفيذ ، فسيتم تنفيذه ، وسيتم نسخ أي جزء غير قابل للتنفيذ.
الافتراضي: "execExtensions": [ ".jshp.html" ]
لا يلزم مطلوب مائلات متأخرة بعد دليل إذا تم ضبطها على FALSE. هذه الخاصية هي السكر النحوي ل 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/ 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" ]
تحدد هذه الخاصية كيفية معالجة إعادة تهيئة في ملف التكوين. ليس كل خصائص التكوين تدعم 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.*// .
مسار إلى الدليل تحت جذر الموارد حيث يتم الاحتفاظ بالرموز المترجمة.
تأكد من إدراج دليل الإنشاء الخاص بك في محظور لمنع العملاء من قراءة الكود الخاص بك.
خلاف ذلك ، من المفهوم تمامًا ، سيتم تسريب رمز المصدر الخاص بك.
الافتراضي: "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 .
إنها ليست إعادة توجيه ، لذلك ستؤدي إلى 200 if /messaging/chat/index.jshp.html مسار طلب صالح.
ملاحظة: يدعم req الخاص بالممتلكات هذه الخاصية regexes ( 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 الخاص بالممتلكات هذه الخاصية 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() قبل أن تكون قد كتبت أي HTML أو ردد شيء ما. الافتراضي: "respondInChunks": false
حد الحرف / البايت الذي يتم بعد ذلك تقسيم البيانات المرددة إلى أجزاء.
الافتراضي: "chunkLimit": 200
عدد القطع التي يتم فيها تقسيم البيانات التي تم صدىها.
الافتراضي: "chunksPerEcho": 2
يتم إنشاء خصائص التكوين هذه تلقائيًا بواسطة الخادم أثناء بدء التشغيل وعلى استدعاء Server.reloadConfig() .
تحديد هذه الخصائص في config.json ليس له أي تأثير لأن الخادم سوف يكتب فقط أي من هذه الخصائص.
مضيف الخادم ، تم جمعه من host:port .
منفذ الخادم ، تم جمعه من host:port .
سلسلة تحتوي على المسار إلى موارد الخادم ، تم جمعها من وسيطة path .
إنها مجموعة من كل تلك المسارات التي سيتم إعادة كتابتها.
إنها مجموعة من كل تلك المسارات التي سيتم إعادة توجيهها.
إنها مصادر رسم خرائط الكائنات (ملفات JSHP) إلى ملفات JavaScript المترجمة. يتم إنشاؤه عند تجميع رمز JSHP.
$_ENV - كائن ، متغيرات بيئة النظام$_CONFIG - كائن ، يخزن بيانات تكوين الخادم$_RES_ROOT - سلسلة ، تخزن المسار إلى موارد الخادم$_REQUEST - كائن ، بعض بيانات الطلب$_HEADERS - كائن ، متاجر الرؤوس للطلب$_COOKIES - كائن ، لم يتم تنفيذه بعد$_GET - كائن ، يخزن معلمات URL$_POST - كائن ، لم يتم تنفيذه بعد$_SERVER - كائن ، يخزن بعض متغيرات الخادم ، العمل قيد التقدم$_SESSION - كائن ، لم يتم تنفيذه بعد response.end() HTTP Module.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 > لاحظ أنه يتم تقييم المسارات إلى prequire (بدءًا من 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 في وظيفة Async.
HTTP - وحدة NodeJS httpURL - وحدة url NodeJSPATH - NODEJS path MODULEFS - Nodejs fs Module ارجع إلى GHSA-8R4G-CG4M-X23C.
node-static V <= 0.7.11.node-static PR #227 .%00 .