تخطيط تطبيق منظم ومتين لبناء واجهات برمجة التطبيقات وتطبيقات الويب في Node.js.
الهدف من slay
هو توفير الحد الأدنى المطلق من الاتساق في تطبيق Node.js دون فرض قدر هائل من التقاليد على المستخدمين. يتمحور هدف الاتساق أيضًا حول تشجيع النمطية في التعليمات البرمجية على مستوى التطبيق لتحقيق أقصى قدر من إعادة الاستخدام. ويتم تحقيق ذلك من خلال ثلاث ميزات بسيطة: تخطيط التطبيق، و"التمهيد المسبق"، وبدء تشغيل التطبيق بشكل متسق.
من خلال التقليد، يبحث slay
عن الوحدات النمطية المعرفة من قبل المستخدم في المواقع التالية:
lib/preboots
lib/middlewares
lib/routes
ويتم ذلك باستخدام تحميل وحدة Node.js القياسية والمدمجة، مما يعني أن كل ملف من هذه الملفات يمكن أن يكون ملفات فردية بنفس الاسم بدلاً من المجلدات. لا تتردد في المزج والمطابقة مع تزايد تعقيد تطبيقك. على سبيل المثال:
lib/preboots/index.js
lib/middlewares.js
lib/routes/index.js
"التمهيد المسبق هو برنامج وسيط لقابلية توسيع التطبيق"
أي أنه بدلاً من function (req, res, next)
فإن التمهيد المسبق هو function (app, options, done)
. من خلال فرض توقيع دالة متسق على قابلية توسيع التطبيق، تصبح جميع مشكلات الطلب تافهة. على سبيل المثال:
lib/preboots/index.js
module . exports = function ( app , options , done ) {
//
// **SCHEDULE** the attachment and initialization of
// connections to our models.
//
app . preboot ( require ( './models' ) ) ;
done ( ) ;
} ;
ليب/التمهيد/models.js
module . exports = function ( app , options , next ) {
//
// Attach all of the models for our API / microservices
// to the app itself and connect to them
// (e.g. initialize TCP sockets, etc).
//
app . models = require ( '../models' ) ;
app . models . connect ( next ) ;
} ;
على الرغم من أن هذا قد يبدو واضحًا جدًا، إلا أنه يفعل عدة أشياء:
lib/preboots/index.js
. const slay = require ( 'slay' ) ;
const app = new slay . App ( __dirname ) ;
app . start ( options , function ( err ) {
if ( err ) { throw err ; }
app . log . info ( `Listening on ${ app . config . get ( 'http' ) ` ) ;
} ) ;
سيؤدي استدعاء app.start
أعلاه إلى تشغيل اعتراضين رئيسيين:
"setup"
./preboots
في app.before('setup')
routers
app.perform('routers')
في app.before('setup')
app.router
متاحًا بواسطة app.after('routers')
أو app.perform('setup')
"start"
lib/routes
في app.before('start')
lib/routes/index.js
app.perform('actions')
مرة واحدة للتأكد من تحميل جميع المسارات من app.router
في التطبيق.lib/middlewares
before('start')
لمزيد من المعلومات، انظر إلى
App.Bootstrap
يحتوي App
الذي تم الكشف عنه بواسطة slay
على جميع الوظائف التي يعرضها app
الذي تم إنشاؤه بواسطة Express بالإضافة إلى:
طريقة | وصف | ورثت من |
---|---|---|
App.bootstrap | تدفق slay الأساسي | slay.App |
app.hookable | يحدد عملاً قابلاً للربط | slay.App |
app.stack | يحدد مكدس البرمجيات الوسيطة | slay.App |
app.config | تحميل التكوين من خلال nconf | config المسبق |
app.log | المسجل المحدد من خلال winston | التمهيد المسبق logger |
app.routes | جهاز express عالي المستوى | التمهيد المسبق routers |
app.preboot | جدولة التمهيد المسبق | broadway |
app.mixin | إضافة وظيفة إلى التطبيق | broadway |
app.start | ابدأ التطبيق | broadway |
app.close | اغلاق التطبيق | broadway |
app.perform | تنفيذ اعتراض مسمى | understudy |
app.before | التنفيذ قبل اعتراض مسمى | understudy |
app.after | التنفيذ بعد اعتراض مسمى | understudy |
اسم | وصف | تم استدعاؤه بواسطة |
---|---|---|
setup | الإعداد المسبق لـ bootstrap | slay |
start | بدء تشغيل التطبيق الرئيسي | slay |
routers | تعريف app.routes | slay |
actions | وظيفة تطبيق المسار الحرج | مستخدم |
Stack
عبارة عن حاوية خفيفة الوزن لمجموعة من البرامج الوسيطة before
after
. يصبح هذا مفيدًا جدًا عندما يكون لديك أجهزة توجيه متعددة في تطبيقك. يمكن تعريف Stack
باستخدام app.stack
كما يلي:
middlewares.js
module . exports = function ( app , options , next ) {
//
// An authorization middleware for different roles
// returns an HTTP middleware function when invoked.
//
var authorize = require ( './authorize' ) ;
//
// Stack middlewares can be declared and used inline
//
app . use (
app . stack ( {
name : 'admin-only' ,
before : [ authorize ( 'admin' ) ]
} ) . middleware ( function ( req , res , next ) {
// Dispatch (req, res) to a router.
} )
) ;
//
// Or extended from a previous declaration and used inline
//
app . use (
app . stacks [ 'designer-only' ]
. before ( authorize ( 'designer' ) )
. middleware ( function ( req , res , next ) {
// Dispatch (req, res) to a router.
} )
) ;
} ;
سيتم عرض جميع مثيلات Stack
التي تم إنشاؤها عن طريق استدعاء app.stack
على كائن app.stacks
.
app.start([options], callback);
يتم استدعاؤه.app.perform('setup')
before
اعتراضات "الإعداد" (راجع: اعتراضات الطالب). يؤدي هذا إلى تنفيذ عمليات التمهيد المسبقة slay
والتي:app.config
(مثيل لـ nconf.Provider
).app.log
(مثال لـ winston.Logger
).lib/preboots[.js]?
). يتيح ذلك عمليات تمهيد مسبقة عشوائية محددة من قبل المستخدم لقابلية التوسعة بطريقة متزامنة أو غير متزامنة.lib/middlewares[.js]?
).lib/routes[.js]?
).after
"الإعداد" . (انظر: المعترضون البديلون). slay
لا يعمل بشكل افتراضي هنا.app.perform('start')
before
المعترضات "البدء" (انظر: المعترضات البديلة). يؤدي هذا إلى تنفيذ عمليات التمهيد المسبقة slay
والتي:app.perform('routers')
الذي ينفذ before
اعتراضات "أجهزة التوجيه"، ويضيف app.routes
، وينفذ after
اعتراضات "أجهزة التوجيه".lib/preboots[.js]?
). المقرر في (٢) أعلاه.lib/middlewares[.js]?
) المقرر في (2) أعلاه.lib/routes[.js]?
) المقرر في (2) أعلاه.app.routes
.App.prototype._listen
لإنشاء أي خوادم http
و/أو https
.after
"البدء" . (انظر: المعترضون البديلون). slay
لا يعمل بشكل افتراضي هنا.callback
من app.start([options], callback);
يتم استدعاؤه. بدأ app
الآن وهو جاهز للاستخدام. npm test
معهد ماساتشوستس للتكنولوجيا