جاوااسکریپت - چگونه اسکریپتم را در محیط REPL نود.جیاس بارگذاری کنم؟
من یک اسکریپت foo.js دارم که شامل چند تابع است و میخواهم با آنها در REPL بازی کنم.
آیا راهی وجود دارد که نود اسکریپت من را اجرا کند و سپس وارد یک REPL شود با تمام متغیرهای سراسری اعلامشده، مانند کاری که با python -i foo.py یا ghci foo.hs میتوانم انجام دهم؟
پاسخ شماره ۱
هنوز هیچ قابلیت داخلی برای ارائه عملکرد دقیقی که شما توصیف میکنید وجود ندارد. با این حال، جایگزینی برای استفاده از require، استفاده از دستور .load درون REPL است، مانند این:
.load foo.js
این فایل را به صورت خط به خط بارگذاری میکند درست همانطور که اگر آن را در REPL تایپ کرده بودید. بر خلاف require این، تاریخچه REPL را با دستوراتی که بارگذاری کردهاید، آلوده میکند. با این حال، این مزیت را دارد که تکرارپذیر است زیرا مانند require کش نمیشود.
اینکه کدام یک برای شما بهتر است بستگی به مورد استفاده شما دارد.
ویرایش: کاربرد آن محدود است زیرا در حالت strict کار نمیکند، اما سه سال بعد فهمیدم که اگر اسکریپت شما 'use strict' نداشته باشد، میتوانید از eval برای بارگذاری اسکریپت خود بدون آلوده کردن تاریخچه REPL استفاده کنید:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
پاسخ شماره ۲
من همیشه از این فرمان استفاده میکنم
node -i -e "$(< yourScript.js)"
دقیقاً همانطور که در پایتون بدون هیچ پکیجی کار میکند.
پاسخ شماره ۳
من Vorpal.js را ساختهام، که این مشکل را با تبدیل افزودن نود شما به یک رابط خط فرمان تعاملی حل میکند. این از یک افزونه REPL پشتیبانی میکند، که شما را در داخل یک REPL در زمینه برنامه در حال اجرای شما میاندازد.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
سپس میتوانید برنامه را اجرا کنید و وارد یک محیط REPL خواهد شد.
node myapp.js repl
myapp> repl:
پاسخ شماره ۴
راه دیگر این است که آن توابع را به عنوان جهانی تعریف کنیم.
global.helloWorld = function() { console.log("Hello World"); }
سپس فایل را در REPL به صورت زیر پیشبارگذاری کنید:
node -r ./file.js
سپس تابع helloWorld میتواند مستقیماً در REPL دسترسی پیدا کند.
پاسخ شماره ۵
در اینجا نسخهای از پاسخ جورج به صورت یک تابع بش آورده شده است:
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
اگر این را در ~/.bash_profile خود قرار دهید، میتوانید آن را مانند یک نام مستعار استفاده کنید، به عنوان مثال:
noderepl foo.js
