NodeAsp
عبارة عن مجموعة من أطر عمل ASP الكلاسيكية، والتي تعتمد على فكرة NodeJS المعيارية، مما يسمح لك بكتابة برامج ASP بسعادة باستخدام مفاهيم جديدة.
تتطلب استخدامات NodeAsp
اتباع مواصفات CommonJS ومتوافقة تمامًا مع طريقة تحميل وحدة NodeJS، مما يسمح لك باستخدام أكثر من 50% من وحدات NodeJS مباشرة. يمكن استخدام جميع الوحدات التي لا علاقة لها ببيئة تشغيل NodeJS والكائنات المحددة ES5-ES6 مباشرة. لم تكن مكتبة موارد الوحدة الضخمة هذه متاحة في أي إطار عمل ASP في الماضي.
يعد NodeAsp
إطارًا فريدًا ومبتكرًا في مجال ASP، وقد أدى ظهوره إلى تغيير نموذج كتابة ASP التقليدي، مما يسمح لك بإكمال تطوير الواجهة الأمامية والخلفية في نفس الوقت فقط من خلال معرفة js، والقضاء على عملية النشر الشاقة. خوادم NodeJS.
NodeAsp
موجود هنا كفاصل في حقل ASP.
نود أسب: http://nodeasp.com
تنزيل الوحدة: http://nap.webkits.cn
يعمل إطار العمل هذا فقط على منصة WIN IIS. عادةً ما يتمكن مضيف افتراضي ASP عادي من تشغيل إطار العمل هذا.
default.asp
<!-- #include file="NodeAsp.asp" -->
<%
require( ' ./index.js');
%>
Index.js
var http = require ( 'http' ) ;
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . end ( 'Hello Worldn' ) ;
} ) ;
الخطوة 1: تنزيل NodeAsp.
الخطوة 2: مرجع NodeAsp.
<!--#include file="NodeAsp.min.asp" -->
الخطوة 3: استخدم NodeAsp.
< %
var version = process.version;
Response.Write(version);
% >
هذه الكائنات متوفرة في كافة الوحدات. بعض الكائنات ليست في الواقع في النطاق العالمي، ولكن فقط في نطاق الوحدة النمطية - تتم الإشارة إلى هذا الموقف بشكل خاص في الوثائق التالية.
في المتصفحات، نطاق المستوى الأعلى هو النطاق العام. هذا يعني أنه في المتصفح، سيُعلن var Something عن متغير عام إذا كان موجودًا حاليًا في النطاق العام. الأمر مختلف في NodeAsp. نطاق المستوى الأعلى ليس النطاق العام، var شيء ما في وحدة NodeAsp ينتمي فقط إلى تلك الوحدة.
إخراج بعض المعلومات حول بيئة التشغيل.
في NodeAsp، الغرض الرئيسي من وجود العملية هو التوافق مع وحدات NodeJS معينة، والتي لا يتم استخدامها عادةً.
يستخدم لطباعة الإخراج القياسي والخطأ القياسي.
راجع قسم控制台
أدناه للحصول على التفاصيل.
لقد قدمنا وحدة المخزن المؤقت لتكون متوافقة مع المخزن المؤقت لـ NodeJS. يرجى ملاحظة أنه يجب تضمين وحدة المخزن المؤقت ضمن وحدات العقدة لاستخدام Buffer.
إذا نسيت وضع وحدة المخزن المؤقت ضمن وحدات العقدة، فلن يؤثر ذلك على التشغيل العادي للبرنامج، وسيتم ظهور خطأ فقط عند استخدام Buffer.
وحدات الاستيراد. يختلف قليلًا عن NodeJS وهو أنه نظرًا لأن IIS يمكنه فقط تنفيذ ملفات ASP مباشرةً بدلاً من ملفات JS، فيمكن أيضًا استخدام require لطلب وحدة نمطية في تعليمات ASP البرمجية. يشبه تنفيذ العقدة test.js في سطر الأوامر.
إذا كنت تريد معرفة مسار الملف الحقيقي عند استدعاء التابع require() لتحميل الوحدة، فيمكنك استخدام التابع require.resolve() للحصول عليه.
راجع قسم模块
أدناه للحصول على التفاصيل.
مسار الملف لملف التعليمات البرمجية الذي يتم تنفيذه حاليًا. هذا هو المسار المطلق الذي تم تحليله لملف التعليمات البرمجية.
على سبيل المثال: قم بتنفيذ C:websitesnodeaspindex.asp
// module.js
Response . Write ( __filename ) ;
// C:websitesnodeaspmodule.js
// index.asp
require ( './module' ) ;
Response . Write ( __filename ) ;
// C:websitesnodeaspindex.asp
اسم الدليل للدليل الذي يتم فيه تنفيذ البرنامج النصي حاليًا.
إشارة إلى الوحدة الحالية. على وجه الخصوص، تشير الوحدة النمطية والصادرات إلى نفس الكائن. الوحدة في الواقع ليست عالمية ولكنها محلية لكل وحدة.
راجع قسم模块
أدناه للحصول على التفاصيل.
مرجع إلى كائن Module.exports، والذي تتم مشاركته بواسطة كافة مثيلات الوحدة الحالية ويمكن الوصول إليه من خلال require(). يمكن العثور على تفاصيل حول متى يتم استخدام الصادرات ومتى يتم استخدام Module.exports في وثائق نظام الوحدة. الصادرات في الواقع ليست عالمية ولكنها محلية لكل وحدة.
راجع قسم模块
أدناه للحصول على التفاصيل.
تتضمن وظيفة المؤقت الوظائف الأربع التالية. نظرًا لأن ASP أحادي الترابط، فإن الوظائف التالية غير متوافقة فعليًا.
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
من أجل تصحيح أخطاء برامج ASP بشكل أفضل، قمنا بتطبيق أداة تصحيح أخطاء سطر الأوامر المشابهة لمتصفح NodeJS/Chrome. عنوان التنزيل: https://github.com/Spikef/NodeAsp-Console
ملاحظة: يلزم تشغيل IIS7.5 و.NET4، ولم يتم اختبار البيئات الأخرى.
افتح CMD بحقوق المسؤول واستخدم أمر REGASM لتسجيل المكونTerminal.dll، حيث يوجد REGASM في C:WindowsMicrosoft.NETFrameworkv4.0.30319 (الموقع المحدد مرتبط برقم الإصدار).
C:WindowsMicrosoft.NETFrameworkv4.0.30319REGASM D:componentTerminal.dll /codebase
بالنسبة لأنظمة 32 بت، ابحث عن موقع التسجيل التالي:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
بالنسبة لأنظمة 64 بت، ابحث عن موقع التسجيل التالي:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
حدد أو أنشئ عنصرًا جديدًا FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701
، ثم قم بإنشاء قيمة DWORD جديدة:
الاسم: w3wp.exe القيمة: 1
انقر نقرًا مزدوجًا فوق Console.exe لفتح سطر أوامر NodeAsp لتصحيح الأخطاء.
أدخل التعليمة البرمجية التالية في default.asp، ثم قم بالوصول إلى default.asp من خلال المستعرض. بعد ذلك، يمكنك رؤية النتائج في Console.exe
.
var a = { name : "nodeasp" , value : true }
// 在console中将输出
//{
// name: "nodeasp",
// value: true
//}
الإخراج إلى وحدة التحكم، باستخدام الألوان الافتراضية.
var a = { name : "NodeAsp" , version : "0.0.1" } ;
console . log ( a ) ;
للإخراج إلى وحدة التحكم، استخدم اللون الأخضر.
للإخراج إلى وحدة التحكم، استخدم اللون الأحمر. على وجه الخصوص، إذا كان الإخراج عبارة عن كائن خطأ، فسيتم عرض رسالة الخطأ الكاملة.
للإخراج إلى وحدة التحكم، استخدم اللون الأصفر.
استخدم التسمية لتحديد الاسم وبدء تشغيل مؤقت لحساب الوقت اللازم للعملية.
إخراج الوقت اللازم لعملية ما.
مثال:
console . time ( '100-elements' ) ;
for ( var i = 0 ; i < 100 ; i ++ ) {
;
}
console . timeEnd ( '100-elements' ) ;
// prints 100-elements: 262ms
يمكنك إدخال الأوامر التالية في وحدة التحكم.
cls/clear: مسح معلومات التصحيح ولا يمكن استعادتها.
حول: عرض حول المعلومات.
Copylast: انسخ رسالة الإخراج السابقة.
Copyall: نسخ جميع معلومات الإخراج.
يحتوي NodeAsp على نظام تحميل وحدة مطابق تقريبًا لنظام NodeJS، مما يضمن أن NodeAsp يمكنه استخدام عدد كبير من وحدات NodeJS مباشرة.
لا يحتوي جوهر NodeAsp تقريبًا على أي وظائف مطلوبة لتطوير موقع الويب، ويتم توسيع جميع الوظائف من خلال الوحدات النمطية. يمكنك العثور على الوحدات الوظيفية التي تحتاجها من خلال مركز وحدات NodeAsp أو NPM.
في NodeAsp، تحتوي الملفات والوحدات النمطية على مراسلات فردية. فيما يلي مثال على تحميل foo.js Circle.js في نفس الدليل.
محتويات foo.js
var circle = require ( './circle.js' ) ;
console . log ( 'The area of a circle of radius 4 is '
+ circle . area ( 4 ) ) ;
محتويات Circle.js:
var PI = Math . PI ;
exports . area = function ( r ) {
return PI * r * r ;
} ;
exports . circumference = function ( r ) {
return 2 * PI * r ;
} ;
تقوم الوحدة Circle.js بإخراج وظيفتين، Area() وcircuit(). لتصدير كائن، ما عليك سوى إضافته إلى صادرات الكائنات الخاصة.
لاحظ أن Exports هي إشارة إلى Module.exports، فقط من أجل التيسير. عندما تريد تصدير عنصر واحد مثل المُنشئ، فأنت بحاجة إلى استخدام Module.exports.
// 正确输出构造函数
module . exports = MyConstructor ;
المتغيرات المحلية داخل الوحدة تكون خاصة. في هذا المثال، يكون المتغير PI خاصًا بالدائرة.js.
خذ بعين الاعتبار هذا الموقف:
a.js
console . log ( 'a starting' ) ;
exports . done = false ;
var b = require ( './b.js' ) ;
console . log ( 'in a, b.done = %j' , b . done ) ;
exports . done = true ;
console . log ( 'a done' ) ;
b.js
console . log ( 'b starting' ) ;
exports . done = false ;
var a = require ( './a.js' ) ;
console . log ( 'in b, a.done = %j' , a . done ) ;
exports . done = true ;
console . log ( 'b done' ) ;
main.js
console . log ( 'main starting' ) ;
var a = require ( './a.js' ) ;
var b = require ( './b.js' ) ;
console . log ( 'in main, a.done=%j, b.done=%j' , a . done , b . done ) ;
أولاً، يقوم main.js بتحميل a.js، ثم يقوم a.js بتحميل b.js. في هذا الوقت، سيحاول b.js تحميل a.js. من أجل منع الحلقات اللانهائية، سيعيد a.js نسخة غير مكتملة إلى b.js. ثم سيتوقف b.js عن التحميل ويعيد كائن التصدير الخاص به إلى الوحدة a.js.
بهذه الطريقة، قام main.js بتحميل كلتا الوحدتين. مخرجات هذا البرنامج هي كما يلي:
main starting
a starting
b starting
in b , a . done = false
b done
in a , b . done = true
a done
in main , a . done = true , b . done = true
مثل NodeJS، عادةً لن تؤدي الوحدات النمطية التابعة بشكل دوري إلى حلقة لا نهائية، ومع ذلك، إذا قمت بتنفيذ أساليب الوحدات الأخرى مباشرة عند تحميل الوحدة، فستتم مطالبتك بأنه لا يمكن العثور على الطريقة المقابلة، لذا يجب عليك تجنب هذا الموقف. .
// a.js
var b = require ( './b.js' ) ;
exports . add = function ( m , n ) {
console . info ( m + n ) ;
} ;
// b.js
var a = require ( './a' ) ;
var m = 101 , n = 102 ;
exports . result = function ( ) {
a . add ( m , n ) ; // 此处没有问题
} ;
a . add ( m , n ) ; // 此处会报错,找不到a.add方法
إذا لم يتم العثور على اسم الملف، فسيضيف NodeAsp لاحقات .js
و .json
ويحاول التحميل مرة أخرى.
سيتم تحليل .js
كملف نص عادي Javascript، وسيتم تحليل .json
كملف نص عادي بتنسيق JSON.
إذا كانت الوحدة مسبوقة بـ "/"، فإنها تمثل مسارًا مطلقًا. على سبيل المثال، يقوم require('/home/marco/foo.js') بتحميل الملف /home/marco/foo.js.
إذا كانت الوحدة مسبوقة بـ './'، فإن المسار يكون مرتبطًا بالملف الذي يستدعي require(). بمعنى آخر، يجب أن يكون Circle.js موجودًا في نفس الدليل مثل foo.js حتى تتمكن من العثور عليه require('./circle').
عندما لا تتم الإشارة إلى الملف بـ "/" أو "./"، يتم تحميل الوحدة من المجلدNode_modules.
إذا كان المسار المحدد غير موجود، فسيقوم التابع require() بإلقاء خطأ.
ملاحظة: مع الأخذ في الاعتبار أنه على مضيف IIS، يمكن الوصول إلى ملفات
.js
مباشرة من خلال المتصفح، لذلك إذا كنت لا ترغب في تسريب الكود المصدري، فيمكنك أيضًا استخدام أي لاحقة للملف.
إذا كان اسم الوحدة في require() ليس وحدة محلية ولا يبدأ بـ '/' أو '../' أو './'، فستبدأ العقدة من الدليل الأصلي للوحدة الحالية وتحاول إضافتها من أجل / تحميل الوحدة المقابلة في المجلدNode_modules.
إذا لم يتم العثور عليه، فانتقل إلى الدليل الأصلي حتى تصل إلى موقع الدليل العلوي.
على سبيل المثال، إذا كان الملف الموجود في استدعاءات '/home/ry/projects/foo.js' يتطلب ('bar.js')، فإن عقدة المواقع التي تبحث عنها هي:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
يمكنك وضع البرامج والمكتبات في مجلد منفصل وتوفير نقطة دخول واحدة إليه. هناك ثلاث طرق لتمكين تحميل المجلد كمعلمة للمتطلبات ().
الخطوة الأولى هي إنشاء ملف يسمى package.json في الدليل الجذر للمجلد، والذي يحتاج إلى تحديد وحدة رئيسية. فيما يلي مثال لملف package.json.
{
"name" : "some-library" ,
"main" : "./lib/some-library.js"
}
إذا تم وضع هذا الملف في المثال ضمن دليل ./some-library، فسيتم تحميل require('./some-library') ./some-library/lib/some-library.js.
إذا لم يكن هناك ملف package.json في الدليل، فستحاول العقدة تحميل ملف Index.js في هذا المسار.
يتم تخزين الوحدات مؤقتًا بعد تحميلها لأول مرة. هذا يعني أنه (مثل ذاكرات التخزين المؤقت الأخرى) سيتم إرجاع نفس الكائن في كل مرة يتم فيها استدعاء require('foo') وبالطبع، يجب تحليل نفس الملف في كل مرة.
لا يؤدي استدعاء require(foo) عدة مرات بالضرورة إلى تنفيذ التعليمات البرمجية الموجودة في الوحدة عدة مرات. وهذه ميزة مهمة، ومن خلال هذه الميزة، من الممكن إرجاع كائنات مكتملة جزئيًا بهذه الطريقة، ويمكن أيضًا تحميل التبعيات المتعدية ، حتى لو أنها قد تسبب الاعتماد على الحلقات.
إذا كنت تريد تنفيذ الوحدة عدة مرات، فقم بتصدير دالة ثم استدعاء تلك الوظيفة.
يعتمد التخزين المؤقت للوحدة على أسماء الملفات التي تم تحليلها. نظرًا لأنه قد يتم تحليل ملفات مختلفة اعتمادًا على موقع الاستدعاء (على سبيل المثال، عند التحميل من المجلدNode_modules)، فليس هناك ضمان بأن require('foo') ستعيد دائمًا الملف المحدد إذا تم تحليله إلى ملفات أخرى. نفس الكائن.
في كل وحدة، تعد الوحدة المتغيرة مرجعًا لكائن يمثل الوحدة الحالية. على وجه الخصوص، يمكن الحصول على Module.exports من خلال عمليات تصدير كائنات الوحدة النمطية العامة. الوحدة ليست في الواقع كائنًا عالميًا، ولكنها أكثر داخلية لكل وحدة.
يتم إنشاء كائن Module.exports من خلال نظام الوحدة النمطية. لذلك، ما عليك سوى تعيين الكائن ليتم تصديره إلى module.exports
.exports. على سبيل المثال، يمكننا أيضًا استخدام الطريقة التالية لكتابة Circle.js، وهي مكافئة تمامًا.
// circle.js
var PI = Math . PI ;
var circle = { } ;
circle . area = function ( r ) {
return PI * r * r ;
} ;
circle . circumference = function ( r ) {
return 2 * PI * r ;
} ;
module . exports = circle ;
المعرف المستخدم للتمييز بين الوحدات. عادةً ما يكون اسم الملف الذي تم تحليله بالكامل.
اسم الملف الذي تم حله بالكامل للوحدة.
الوحدة التي تستورد هذه الوحدة.
عند استخدام require() للإشارة إلى وحدة نمطية، يتم اتباع العملية التالية للعثور على الوحدة المستهدفة بناءً على التعبير.
require ( X ) from module at path Y
1. If X begins with './' or '/' or '../'
a . LOAD_AS_FILE ( Y + X )
b . LOAD_AS_DIRECTORY ( Y + X )
2. LOAD_NODE_MODULES ( X , dirname ( Y ) )
3. THROW "not found"
LOAD_AS_FILE ( X )
1. If X is a file , load X as JavaScript text . STOP
2. If X . js is a file , load X . js as JavaScript text . STOP
3. If X . json is a file , parse X . json to a JavaScript Object . STOP
LOAD_AS_DIRECTORY ( X )
1. If X / package . json is a file ,
a . Parse X / package . json , and look for "main" field .
b . let M = X + ( json main field )
c . LOAD_AS_FILE ( M )
2. If X / index . js is a file , load X / index . js as JavaScript text . STOP
3. If X / index . json is a file , parse X / index . json to a JavaScript object . STOP
LOAD_NODE_MODULES ( X , START )
1. let DIRS = NODE_MODULES_PATHS ( START )
2. for each DIR in DIRS :
a . LOAD_AS_FILE ( DIR / X )
b . LOAD_AS_DIRECTORY ( DIR / X )
NODE_MODULES_PATHS ( START )
1. let PARTS = path split ( START )
2. let I = count of PARTS - 1
3. let DIRS = [ ]
4. while I >= 0 ,
a . if PARTS [ I ] = "node_modules" CONTINUE
c . DIR = path join ( PARTS [ 0 . . I ] + "node_modules" )
b . DIRS = DIRS + DIR
c . let I = I - 1
5. return DIRS
يجب أن تكون الوحدات النمطية المضمنة، مثل NodeJS، مطلوبة قبل استخدامها.
تُستخدم هذه الوحدة لكتابة حالات اختبار الوحدة للبرنامج ويتم استدعاؤها من خلال require('assert'). تم نقله مباشرة من NodeJS.
وحدة معالجة الأحداث، المنقولة مباشرةً من NodeJS.
وحدة تشغيل الملفات متوافقة مع أساليب واجهة برمجة التطبيقات (API) للتشغيل المتزامن لمعظم وحدات تشغيل ملفات NodeJS.
طلب HTTP ووحدة المعالجة. تم نقلها وتعديلها من NodeJS، ومعظمها متوافق.
تحتوي هذه الوحدة على مجموعة أدوات لمعالجة وتحويل مسارات الملفات. تقوم جميع الطرق تقريبًا بإجراء تحويل السلسلة فقط ولا تستدعي نظام الملفات للتحقق مما إذا كان المسار صالحًا.
تم نقله وتعديله من NodeJS، وهو متوافق تمامًا تقريبًا.
يقوم بتشفير وفك تشفير عناوين URL، وهو متوافق تمامًا مع NodeJS.
يتعامل مع سلاسل استعلام URL، وهو متوافق تمامًا مع NodeJS.
تحتوي هذه الوحدة على وظائف مساعدة لتحليل عنوان URL. استخدم require('url') لاستدعاء هذه الوحدة.
متوافق تمامًا مع NodeJS.
وحدة الطريقة المساعدة، متوافقة مع إصدارات NodeJS الأقل من 4.0.
يتطلب تجميع كود مصدر NodeAsp تثبيت بيئة العقدة وتثبيت uglifyJS عالميًا.
ما عليك سوى تنفيذ node build
على سطر الأوامر، وتقع الملفات المترجمة في دليل الحزمة.
C:DiskprojectsNodeAsp>node build
-----------------------
# build nodeAsp success
+ build/NodeAsp.min.asp
@ 2016-03-01 13:46:04
-----------------------
معهد ماساتشوستس للتكنولوجيا