REPL
[Stable: 2 - Stable]
Stable: 2 الاستقرار: 2 - مستقر
كود المصدر: lib/repl.js
توفر وحدة node:repl
تطبيق حلقة قراءة-تقييم-طباعة (REPL) وهو متاح كبرنامج مستقل أو يمكن تضمينه في تطبيقات أخرى. يمكن الوصول إليه باستخدام:
import repl from 'node:repl';
const repl = require('node:repl');
التصميم والميزات
تقوم وحدة node:repl
بتصدير الفئة repl.REPLServer
. أثناء التشغيل، ستقبل مثيلات repl.REPLServer
سطورًا فردية من إدخال المستخدم، وتقوم بتقييمها وفقًا لوظيفة تقييم معرفة من قبل المستخدم، ثم تعرض النتيجة. قد يكون الإدخال والإخراج من stdin
و stdout
، على التوالي، أو قد يتم توصيلهما بأي تدفق Node.js.
تدعم مثيلات repl.REPLServer
الإكمال التلقائي للإدخالات، ومعاينة الإكمال، وتحرير الأسطر البسيط على غرار Emacs، والإدخالات متعددة الأسطر، والبحث العكسي الشبيه بـ ZSH، والبحث في السجل المستند إلى السلسلة الفرعية الشبيه بـ ZSH، والإخراج بنمط ANSI، وحفظ واستعادة حالة جلسة REPL الحالية، واستعادة الأخطاء، ووظائف التقييم القابلة للتخصيص. تعود المحطات الطرفية التي لا تدعم أنماط ANSI وتحرير الأسطر على غرار Emacs تلقائيًا إلى مجموعة ميزات محدودة.
الأوامر والمفاتيح الخاصة
الأوامر الخاصة التالية مدعومة من قبل جميع مثيلات REPL:
.break
: عند إدخال تعبير متعدد الأسطر، أدخل الأمر.break
(أو اضغط على +) لإحباط المزيد من الإدخال أو معالجة هذا التعبير..clear
: يعيد تعيينcontext
REPL إلى كائن فارغ ويمسح أي تعبير متعدد الأسطر يتم إدخاله..exit
: أغلق تدفق الإدخال/الإخراج، مما يتسبب في خروج REPL..help
: إظهار هذه القائمة من الأوامر الخاصة..save
: احفظ جلسة REPL الحالية في ملف:\> .save ./file/to/save.js
.load
: قم بتحميل ملف في جلسة REPL الحالية.\> .load ./file/to/load.js
.editor
: أدخل وضع المحرر (+ للإنهاء، + للإلغاء).
> .editor
// Entering editor mode (^D to finish, ^C to cancel)
function welcome(name) {
return `Hello ${name}!`;
}
welcome('Node.js User');
// ^D
'Hello Node.js User!'
>
تركيبات المفاتيح التالية في REPL لها هذه التأثيرات الخاصة:
- +: عند الضغط عليها مرة واحدة، يكون لها نفس تأثير الأمر
.break
. عند الضغط عليها مرتين على سطر فارغ، يكون لها نفس تأثير الأمر.exit
. - +: له نفس تأثير الأمر
.exit
. - : عند الضغط عليها على سطر فارغ، تعرض المتغيرات العالمية والمحلية (النطاق). عند الضغط عليها أثناء إدخال مدخلات أخرى، تعرض خيارات الإكمال التلقائي ذات الصلة.
للحصول على ارتباطات المفاتيح المتعلقة بالبحث العكسي، انظر reverse-i-search
. لجميع ارتباطات المفاتيح الأخرى، انظر ارتباطات مفاتيح TTY.
التقييم الافتراضي
بشكل افتراضي، تستخدم جميع مثيلات repl.REPLServer
دالة تقييم تقوم بتقييم تعبيرات JavaScript وتوفر الوصول إلى وحدات Node.js المضمنة. يمكن تجاوز هذا السلوك الافتراضي عن طريق تمرير دالة تقييم بديلة عند إنشاء مثيل repl.REPLServer
.
تعبيرات JavaScript
يدعم المقيم الافتراضي التقييم المباشر لتعبيرات JavaScript:
> 1 + 1
2
> const m = 2
undefined
> m + 1
3
ما لم يتم تحديد نطاقها ضمن كتل أو وظائف، يتم تعريف المتغيرات المعلنة ضمنيًا أو باستخدام الكلمات الرئيسية const
أو let
أو var
في النطاق العام.
النطاق العام والمحلي
يوفر المقيم الافتراضي الوصول إلى أي متغيرات موجودة في النطاق العام. من الممكن كشف متغير إلى REPL بشكل صريح عن طريق تعيينه إلى كائن context
المرتبط بكل REPLServer
:
import repl from 'node:repl';
const msg = 'message';
repl.start('> ').context.m = msg;
const repl = require('node:repl');
const msg = 'message';
repl.start('> ').context.m = msg;
تظهر الخصائص الموجودة في كائن context
كمحلية داخل REPL:
$ node repl_test.js
> m
'message'
خصائص السياق ليست للقراءة فقط بشكل افتراضي. لتحديد المتغيرات العامة للقراءة فقط، يجب تحديد خصائص السياق باستخدام Object.defineProperty()
:
import repl from 'node:repl';
const msg = 'message';
const r = repl.start('> ');
Object.defineProperty(r.context, 'm', {
configurable: false,
enumerable: true,
value: msg,
});
const repl = require('node:repl');
const msg = 'message';
const r = repl.start('> ');
Object.defineProperty(r.context, 'm', {
configurable: false,
enumerable: true,
value: msg,
});
الوصول إلى وحدات Node.js الأساسية
سيقوم المقيم الافتراضي تلقائيًا بتحميل وحدات Node.js الأساسية في بيئة REPL عند استخدامها. على سبيل المثال، ما لم يتم الإعلان عن خلاف ذلك كمتغير عام أو ذي نطاق، فسيتم تقييم الإدخال fs
عند الطلب كـ global.fs = require('node:fs')
.
> fs.createReadStream('./some/file');
الاستثناءات العامة غير الملتقطة
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 12.3.0 | يتم تشغيل حدث 'uncaughtException' من الآن فصاعدًا إذا تم استخدام REPL كبرنامج مستقل. |
يستخدم REPL الوحدة النمطية domain
لالتقاط جميع الاستثناءات غير الملتقطة لجلسة REPL تلك.
لاستخدام الوحدة النمطية domain
في REPL هذه الآثار الجانبية:
- تطلق الاستثناءات غير الملتقطة فقط حدث
'uncaughtException'
في REPL المستقل. إضافة مستمع لهذا الحدث في REPL داخل برنامج Node.js آخر يؤدي إلىERR_INVALID_REPL_INPUT
. - محاولة استخدام
process.setUncaughtExceptionCaptureCallback()
يطلق خطأERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
.
تعيين المتغير _
(تسطير سفلي)
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 9.8.0 | تمت إضافة دعم _error . |
سيقوم المقيم الافتراضي، بشكل افتراضي، بتعيين نتيجة آخر تعبير تم تقييمه للمتغير الخاص _
(تسطير سفلي). سيؤدي تعيين _
بشكل صريح لقيمة ما إلى تعطيل هذا السلوك.
> [ 'a', 'b', 'c' ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
Expression assignment to _ now disabled.
4
> 1 + 1
2
> _
4
وبالمثل، سيشير _error
إلى آخر خطأ تمت رؤيته، إذا كان هناك أي خطأ. سيؤدي تعيين _error
بشكل صريح لقيمة ما إلى تعطيل هذا السلوك.
> throw new Error('foo');
Uncaught Error: foo
> _error.message
'foo'
الكلمة المفتاحية await
يتم تمكين دعم الكلمة المفتاحية await
في المستوى الأعلى.
> await Promise.resolve(123)
123
> await Promise.reject(new Error('REPL await'))
Uncaught Error: REPL await
at REPL2:1:54
> const timeout = util.promisify(setTimeout);
undefined
> const old = Date.now(); await timeout(1000); console.log(Date.now() - old);
1002
undefined
أحد القيود المعروفة لاستخدام الكلمة المفتاحية await
في REPL هو أنها ستبطل النطاق المعجمي للكلمات المفتاحية const
و let
.
على سبيل المثال:
> const m = await Promise.resolve(123)
undefined
> m
123
> const m = await Promise.resolve(234)
undefined
> m
234
--no-experimental-repl-await
يجب أن يعطل انتظار المستوى الأعلى في REPL.
البحث العكسي التزايدي
تمت الإضافة في: v13.6.0، v12.17.0
يدعم REPL البحث العكسي التزايدي ثنائي الاتجاه على غرار ZSH. يتم تشغيله باستخدام + للبحث للخلف و + للبحث للأمام.
سيتم تخطي إدخالات السجل المكررة.
يتم قبول الإدخالات بمجرد الضغط على أي مفتاح لا يتوافق مع البحث العكسي. الإلغاء ممكن بالضغط على أو +.
يؤدي تغيير الاتجاه على الفور إلى البحث عن الإدخال التالي في الاتجاه المتوقع من الموضع الحالي.
وظائف التقييم المخصصة
عند إنشاء repl.REPLServer
جديد، يمكن توفير وظيفة تقييم مخصصة. يمكن استخدام هذا، على سبيل المثال، لتنفيذ تطبيقات REPL مخصصة بالكامل.
يوضح ما يلي مثالاً على REPL يربع رقمًا معينًا:
import repl from 'node:repl';
function byThePowerOfTwo(number) {
return number * number;
}
function myEval(cmd, context, filename, callback) {
callback(null, byThePowerOfTwo(cmd));
}
repl.start({ prompt: 'أدخل رقمًا: ', eval: myEval });
const repl = require('node:repl');
function byThePowerOfTwo(number) {
return number * number;
}
function myEval(cmd, context, filename, callback) {
callback(null, byThePowerOfTwo(cmd));
}
repl.start({ prompt: 'أدخل رقمًا: ', eval: myEval });
الأخطاء القابلة للاسترداد
في موجه REPL، يرسل الضغط على السطر الحالي من الإدخال إلى وظيفة eval
. لدعم الإدخال متعدد الأسطر، يمكن لوظيفة eval
إرجاع نسخة من repl.Recoverable
إلى وظيفة رد الاتصال المقدمة:
function myEval(cmd, context, filename, callback) {
let result;
try {
result = vm.runInThisContext(cmd);
} catch (e) {
if (isRecoverableError(e)) {
return callback(new repl.Recoverable(e));
}
}
callback(null, result);
}
function isRecoverableError(error) {
if (error.name === 'SyntaxError') {
return /^(Unexpected end of input|Unexpected token)/.test(error.message);
}
return false;
}
تخصيص خرج REPL
بشكل افتراضي، تقوم مثيلات repl.REPLServer
بتنسيق الخرج باستخدام الطريقة util.inspect()
قبل كتابة الخرج إلى دفق Writable
المقدم (process.stdout
افتراضيًا). يتم تعيين خيار الفحص showProxy
على true افتراضيًا ويتم تعيين خيار colors
على true اعتمادًا على خيار useColors
الخاص بـ REPL.
يمكن تحديد الخيار المنطقي useColors
عند الإنشاء لتوجيه الكاتب الافتراضي لاستخدام رموز نمط ANSI لتلوين الخرج من الطريقة util.inspect()
.
إذا تم تشغيل REPL كبرنامج مستقل، فمن الممكن أيضًا تغيير الإعدادات الافتراضية لفحص REPL من داخل REPL باستخدام الخاصية inspect.replDefaults
التي تعكس defaultOptions
من util.inspect()
.
> util.inspect.replDefaults.compact = false;
false
> [1]
[
1
]
>
لتخصيص خرج مثيل repl.REPLServer
بالكامل، مرر دالة جديدة للخيار writer
عند الإنشاء. على سبيل المثال، المثال التالي يحول ببساطة أي نص إدخال إلى حالة الأحرف الكبيرة:
import repl from 'node:repl';
const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter });
function myEval(cmd, context, filename, callback) {
callback(null, cmd);
}
function myWriter(output) {
return output.toUpperCase();
}
const repl = require('node:repl');
const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter });
function myEval(cmd, context, filename, callback) {
callback(null, cmd);
}
function myWriter(output) {
return output.toUpperCase();
}
الفئة: REPLServer
تمت إضافتها في: v0.1.91
options
<Object> | <string> انظرrepl.start()
- يمتد: <readline.Interface>
يتم إنشاء مثيلات repl.REPLServer
باستخدام الطريقة repl.start()
أو مباشرة باستخدام الكلمة الأساسية JavaScript new
.
import repl from 'node:repl';
const options = { useColors: true };
const firstInstance = repl.start(options);
const secondInstance = new repl.REPLServer(options);
const repl = require('node:repl');
const options = { useColors: true };
const firstInstance = repl.start(options);
const secondInstance = new repl.REPLServer(options);
الحدث: 'exit'
أضيف في: الإصدار v0.7.7
يتم إطلاق الحدث 'exit'
عند الخروج من REPL إما عن طريق تلقي الأمر .exit
كمدخل، أو ضغط المستخدم على + مرتين للإشارة إلى SIGINT
، أو عن طريق الضغط على + للإشارة إلى 'end'
على دفق الإدخال. يتم استدعاء دالة رد الاتصال للمستمع بدون أي وسيطات.
replServer.on('exit', () => {
console.log('تم تلقي حدث "exit" من repl!');
process.exit();
});
الحدث: 'reset'
أضيف في: الإصدار v0.11.0
يتم إطلاق الحدث 'reset'
عند إعادة تعيين سياق REPL. يحدث هذا كلما تم تلقي الأمر .clear
كمدخل إلا إذا كانت REPL تستخدم المُقيِّم الافتراضي وتم إنشاء مثيل repl.REPLServer
مع تعيين الخيار useGlobal
على true
. سيتم استدعاء دالة رد الاتصال للمستمع مع مرجع إلى كائن context
كوسيطة وحيدة.
يمكن استخدام هذا بشكل أساسي لإعادة تهيئة سياق REPL إلى حالة محددة مسبقًا:
import repl from 'node:repl';
function initializeContext(context) {
context.m = 'test';
}
const r = repl.start({ prompt: '> ' });
initializeContext(r.context);
r.on('reset', initializeContext);
const repl = require('node:repl');
function initializeContext(context) {
context.m = 'test';
}
const r = repl.start({ prompt: '> ' });
initializeContext(r.context);
r.on('reset', initializeContext);
عند تنفيذ هذا الكود، يمكن تعديل المتغير العام 'm'
ثم إعادة تعيينه إلى قيمته الأولية باستخدام الأمر .clear
:
$ ./node example.js
> m
'test'
> m = 1
1
> m
1
> .clear
Clearing context...
> m
'test'
>
replServer.defineCommand(keyword, cmd)
أضيف في: الإصدار v0.3.0
keyword
<string> الكلمة المفتاحية للأمر ( بدون بادئة.
).cmd
<Object> | <Function> الدالة المراد استدعاؤها عند معالجة الأمر.
تستخدم الطريقة replServer.defineCommand()
لإضافة أوامر جديدة ذات بادئة .
إلى مثيل REPL. يتم استدعاء هذه الأوامر بكتابة .
متبوعة بـ keyword
. cmd
إما Function
أو Object
مع الخصائص التالية:
help
<string> نص التعليمات المراد عرضه عند إدخال.help
(اختياري).action
<Function> الدالة المراد تنفيذها، وتقبل اختياريًا وسيطة سلسلة واحدة.
يوضح المثال التالي أمرين جديدين تمت إضافتهما إلى مثيل REPL:
import repl from 'node:repl';
const replServer = repl.start({ prompt: '> ' });
replServer.defineCommand('sayhello', {
help: 'Say hello',
action(name) {
this.clearBufferedCommand();
console.log(`Hello, ${name}!`);
this.displayPrompt();
},
});
replServer.defineCommand('saybye', function saybye() {
console.log('Goodbye!');
this.close();
});
const repl = require('node:repl');
const replServer = repl.start({ prompt: '> ' });
replServer.defineCommand('sayhello', {
help: 'Say hello',
action(name) {
this.clearBufferedCommand();
console.log(`Hello, ${name}!`);
this.displayPrompt();
},
});
replServer.defineCommand('saybye', function saybye() {
console.log('Goodbye!');
this.close();
});
يمكن بعد ذلك استخدام الأوامر الجديدة من داخل مثيل REPL:
> .sayhello Node.js User
Hello, Node.js User!
> .saybye
Goodbye!
replServer.displayPrompt([preserveCursor])
تمت الإضافة في: v0.1.91
preserveCursor
<boolean>
تقوم الطريقة replServer.displayPrompt()
بإعداد مثيل REPL لاستقبال الإدخال من المستخدم، حيث تطبع prompt
المكوّن في سطر جديد في output
وتستأنف input
لقبول إدخال جديد.
عند إدخال إدخال متعدد الأسطر، يتم طباعة علامة حذف بدلاً من 'prompt'.
عندما تكون preserveCursor
هي true
، لن يتم إعادة تعيين موضع المؤشر إلى 0
.
تهدف طريقة replServer.displayPrompt
بشكل أساسي إلى استدعائها من داخل وظيفة الإجراء للأوامر المسجلة باستخدام طريقة replServer.defineCommand()
.
replServer.clearBufferedCommand()
تمت الإضافة في: v9.0.0
تقوم الطريقة replServer.clearBufferedCommand()
بمسح أي أمر تم تخزينه مؤقتًا ولكن لم يتم تنفيذه بعد. تهدف هذه الطريقة بشكل أساسي إلى استدعائها من داخل وظيفة الإجراء للأوامر المسجلة باستخدام طريقة replServer.defineCommand()
.
replServer.setupHistory(historyPath, callback)
تمت الإضافة في: v11.10.0
historyPath
<string> مسار ملف السجل التاريخيcallback
<Function> يتم استدعاؤها عندما تكون كتابات السجل التاريخي جاهزة أو عند حدوث خطأerr
<Error>repl
<repl.REPLServer>
يقوم بتهيئة ملف سجل تاريخي لمثيل REPL. عند تنفيذ Node.js binary واستخدام REPL الخاص بسطر الأوامر، يتم تهيئة ملف سجل تاريخي افتراضيًا. ومع ذلك، هذا ليس هو الحال عند إنشاء REPL برمجيًا. استخدم هذه الطريقة لتهيئة ملف سجل تاريخي عند العمل مع مثيلات REPL برمجيًا.
repl.builtinModules
تمت الإضافة في: v14.5.0
قائمة بأسماء جميع وحدات Node.js، على سبيل المثال، 'http'
.
repl.start([options])
[السجل]
الإصدار | التغييرات |
---|---|
v13.4.0, v12.17.0 | خيار preview متاح الآن. |
v12.0.0 | يتبع خيار terminal الآن الوصف الافتراضي في جميع الحالات، ويتحقق useColors من hasColors() إذا كان متاحًا. |
v10.0.0 | تمت إزالة replMode الخاصة بـ REPL_MAGIC_MODE . |
v6.3.0 | خيار breakEvalOnSigint مدعوم الآن. |
v5.8.0 | معامل options اختياري الآن. |
v0.1.91 | تمت الإضافة في: v0.1.91 |
prompt
<string> مطالبة الإدخال التي سيتم عرضها. الافتراضي:'\> '
(مع مسافة لاحقة).input
<stream.Readable> دفقReadable
الذي سيتم قراءة إدخال REPL منه. الافتراضي:process.stdin
.output
<stream.Writable> دفقWritable
الذي سيتم كتابة إخراج REPL إليه. الافتراضي:process.stdout
.terminal
<boolean> إذا كانتtrue
، تحدد أنه يجب التعامل معoutput
كمحطة TTY. الافتراضي: التحقق من قيمة الخاصيةisTTY
على دفقoutput
عند الإنشاء.eval
<Function> الدالة التي سيتم استخدامها عند تقييم كل سطر إدخال معين. الافتراضي: برنامج تضمين غير متزامن لدالة JavaScripteval()
. يمكن لدالةeval
أن تخطئ معrepl.Recoverable
للإشارة إلى أن الإدخال غير مكتمل والمطالبة بأسطر إضافية.useColors
<boolean> إذا كانتtrue
، تحدد أن الدالةwriter
الافتراضية يجب أن تتضمن تصميم ألوان ANSI لإخراج REPL. إذا تم توفير دالةwriter
مخصصة، فلن يكون لهذا أي تأثير. الافتراضي: التحقق من دعم الألوان في دفقoutput
إذا كانت قيمةterminal
لمثيل REPL هيtrue
.useGlobal
<boolean> إذا كانتtrue
، تحدد أن دالة التقييم الافتراضية ستستخدم JavaScriptglobal
كسياق بدلاً من إنشاء سياق منفصل جديد لمثيل REPL. يعيّن REPL الخاص بـ node CLI هذه القيمة علىtrue
. الافتراضي:false
.ignoreUndefined
<boolean> إذا كانتtrue
، تحدد أن الكاتب الافتراضي لن يُخرج القيمة المرجعة لأمر ما إذا تم تقييمها إلىundefined
. الافتراضي:false
.writer
<Function> الدالة التي سيتم استدعاؤها لتنسيق إخراج كل أمر قبل الكتابة إلىoutput
. الافتراضي:util.inspect()
.completer
<Function> دالة اختيارية تستخدم لإكمال علامة التبويب التلقائي المخصص. راجعreadline.InterfaceCompleter
للحصول على مثال.replMode
<symbol> علامة تحدد ما إذا كان المُقيّم الافتراضي يقوم بتنفيذ جميع أوامر JavaScript في الوضع الصارم أو الوضع الافتراضي (المتراخي). القيم المقبولة هي:repl.REPL_MODE_SLOPPY
لتقييم التعبيرات في الوضع المتراخي.repl.REPL_MODE_STRICT
لتقييم التعبيرات في الوضع الصارم. هذا يعادل تقديم كل بيان repl بـ'use strict'
.breakEvalOnSigint
<boolean> توقف عن تقييم جزء التعليمات البرمجية الحالي عند استقبالSIGINT
، كما هو الحال عند الضغط على +. لا يمكن استخدام هذا مع دالةeval
مخصصة. الافتراضي:false
.preview
<boolean> يحدد ما إذا كان repl يطبع الإكمال التلقائي ومعاينات الإخراج أم لا. الافتراضي:true
مع دالة eval الافتراضية وfalse
في حالة استخدام دالة eval مخصصة. إذا كانتterminal
غير صحيحة، فلن تكون هناك معاينات ولن يكون لقيمةpreview
أي تأثير.
الإرجاع: <repl.REPLServer>
تقوم الطريقة repl.start()
بإنشاء وبدء مثيل repl.REPLServer
.
إذا كانت options
سلسلة، فستحدد مطالبة الإدخال:
import repl from 'node:repl';
// مطالبة بنمط Unix
repl.start('$ ');
const repl = require('node:repl');
// مطالبة بنمط Unix
repl.start('$ ');
وحدة REPL الخاصة بـ Node.js
تستخدم Node.js نفسها وحدة node:repl
لتوفير واجهتها التفاعلية الخاصة لتنفيذ JavaScript. يمكن استخدام هذا عن طريق تنفيذ ملف Node.js الثنائي دون تمرير أي وسيطات (أو عن طريق تمرير الوسيطة -i
):
$ node
> const a = [1, 2, 3];
undefined
> a
[ 1, 2, 3 ]
> a.forEach((v) => {
... console.log(v);
... });
1
2
3
خيارات متغيرات البيئة
يمكن تخصيص سلوكيات مختلفة لوحدة REPL الخاصة بـ Node.js باستخدام متغيرات البيئة التالية:
NODE_REPL_HISTORY
: عند إعطاء مسار صالح، سيتم حفظ سجل REPL الدائم في الملف المحدد بدلاً من.node_repl_history
في الدليل الرئيسي للمستخدم. سيؤدي تعيين هذه القيمة إلى''
(سلسلة فارغة) إلى تعطيل سجل REPL الدائم. سيتم اقتطاع المسافات البيضاء من القيمة. في أنظمة Windows الأساسية، تكون متغيرات البيئة ذات القيم الفارغة غير صالحة، لذا قم بتعيين هذا المتغير إلى مسافة واحدة أو أكثر لتعطيل سجل REPL الدائم.NODE_REPL_HISTORY_SIZE
: يتحكم في عدد أسطر السجل التي سيتم الاحتفاظ بها إذا كان السجل متاحًا. يجب أن يكون رقمًا موجبًا. الافتراضي:1000
.NODE_REPL_MODE
: قد يكون'sloppy'
أو'strict'
. الافتراضي:'sloppy'
، والذي سيسمح بتشغيل التعليمات البرمجية غير الصارمة.
سجل دائم
بشكل افتراضي، سيحتفظ Node.js REPL بالسجل بين جلسات node
REPL عن طريق حفظ المدخلات في ملف .node_repl_history
الموجود في الدليل الرئيسي للمستخدم. يمكن تعطيل هذا عن طريق تعيين متغير البيئة NODE_REPL_HISTORY='''
.
استخدام Node.js REPL مع محرر الأسطر المتقدم
بالنسبة لمحرري الأسطر المتقدمة، ابدأ Node.js بمتغير البيئة NODE_NO_READLINE=1
. سيؤدي هذا إلى بدء تشغيل REPL الرئيسي والمصحح في إعدادات طرفية أساسية، مما سيسمح بالاستخدام مع rlwrap
.
على سبيل المثال، يمكن إضافة ما يلي إلى ملف .bashrc
:
alias node="env NODE_NO_READLINE=1 rlwrap node"
بدء تشغيل مثيلات REPL متعددة مقابل مثيل تشغيل واحد
من الممكن إنشاء وتشغيل مثيلات REPL متعددة مقابل مثيل تشغيل واحد لـ Node.js يشترك في كائن global
واحد ولكن لديه واجهات إدخال/إخراج منفصلة.
يوفر المثال التالي، على سبيل المثال، REPLs منفصلة على stdin
، ومقبس Unix، ومقبس TCP:
import net from 'node:net';
import repl from 'node:repl';
import process from 'node:process';
let connections = 0;
repl.start({
prompt: 'Node.js via stdin> ',
input: process.stdin,
output: process.stdout,
});
net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via Unix socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen('/tmp/node-repl-sock');
net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via TCP socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen(5001);
const net = require('node:net');
const repl = require('node:repl');
let connections = 0;
repl.start({
prompt: 'Node.js via stdin> ',
input: process.stdin,
output: process.stdout,
});
net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via Unix socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen('/tmp/node-repl-sock');
net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via TCP socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen(5001);
سيؤدي تشغيل هذا التطبيق من سطر الأوامر إلى بدء تشغيل REPL على stdin. قد يتصل عملاء REPL الآخرون عبر مقبس Unix أو مقبس TCP. telnet
، على سبيل المثال، مفيد للاتصال بمقابس TCP، بينما يمكن استخدام socat
للاتصال بمقابس Unix و TCP.
عن طريق بدء تشغيل REPL من خادم قائم على مقبس Unix بدلاً من stdin، من الممكن الاتصال بعملية Node.js طويلة الأمد دون إعادة تشغيلها.
للحصول على مثال لتشغيل REPL "كامل الميزات" (طرفي) عبر مثيل net.Server
و net.Socket
، انظر: https://gist.github.com/TooTallNate/2209310.
للحصول على مثال لتشغيل مثيل REPL عبر curl(1)
، انظر: https://gist.github.com/TooTallNate/2053342.
هذا المثال مخصص للأغراض التعليمية البحتة لإظهار كيفية بدء تشغيل Node.js REPLs باستخدام تدفقات إدخال/إخراج مختلفة. يجب عدم استخدامه في بيئات الإنتاج أو أي سياق تكون فيه السلامة مصدر قلق دون اتخاذ تدابير حماية إضافية. إذا كنت بحاجة إلى تنفيذ REPLs في تطبيق واقعي، ففكر في طرق بديلة تخفف هذه المخاطر، مثل استخدام آليات إدخال آمنة وتجنب واجهات الشبكة المفتوحة.