Відповіді:
Все ще немає нічого вбудованого, щоб забезпечити точну функціональність, яку ви описуєте. Однак альтернатива його використанню require
для використання .load
команди в межах REPL, наприклад:
.load foo.js
Він завантажує файл по рядку так само, як якщо б ви ввели його у відповідь. На відміну від require
цього, забруднює історію REPL командами, які ви завантажили. Однак, вона має перевагу в тому, що вона повторюється, тому що вона не є кешованою require
.
Що краще для вас, буде залежати від вашого випадку використання.
Редагувати: Це обмежене застосування, оскільки воно не працює в суворому режимі, але через три роки я дізнався, що якщо у вас немає сценарію 'use strict'
, ви можете використовувати eval
для завантаження сценарію, не забруднюючи історію REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
Я завжди використовую цю команду
node -i -e "$(< yourScript.js)"
працює точно так само, як у Python без будь-яких пакетів.
Я створив Vorpal.js , який вирішує цю проблему, перетворивши ваш вузол, додати в інтерактивний CLI. Він підтримує розширення 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"); }
Потім попередньо завантажте файл у відповідь як:
node -r ./file.js
Тоді до цієї функції helloWorld
можна отримати доступ безпосередньо в REPL.
Я створив replpad, оскільки втомився повторно завантажувати сценарій.
Просто встановіть його за допомогою: npm install -g replpad
Потім використовуйте його, запустивши: replpad
Якщо ви хочете, щоб він переглядав усі файли у поточному та всіх підкаталогах та передав їх у відповідь, коли вони змінюються: replpad .
Перегляньте відео на сайті, щоб краще зрозуміти, як воно працює, та дізнайтеся про деякі інші приємні функції, які він має:
dox()
функцію, яка додається до кожної основної функції, тобтоfs.readdir.dox()
dox()
функцію, яка додається до кожного модуля, встановленого через npm, тобтоmarked.dox()
src
властивість, яка додається до кожної функції, тобтоexpress.logger.src
.talk
команда).append
командиДивіться: https://github.com/thlorenz/replpad
CXX=clang++ npm install replpad
обійти помилкуg++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
Чому б не завантажити файл в інтерактивну версію вузла?
node -h
-e, --eval script evaluate script
-i, --interactive always enter the REPL even if stdin
node -e 'var client = require("./build/main/index.js"); console.log("Use `client` in repl")' -i
Потім ви можете додати до script.json сценарії
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
перевірено за допомогою вузла v8.1.2
node -i -r "./build/main/index.js"
?
В даний час ви не можете це зробити безпосередньо, але ви можете mylib = require('./foo.js')
в REPL. Пам'ятайте, методи експортуються, а не декларуються як глобальні.
.load my_work.js
, незважаючи на те , що вимагає деяких додаткових exports.working_var = ...
декларацій, оскільки REPL обробляє деякі види ідеально правильного javascript, як багаторядкові коментарі (принаймні, з моєю readline
конфігурацією).
replpad
це здорово, але для швидкого та простого завантаження файлу у вузол, імпортування його змінних та запуску repl ви можете додати наступний код у кінець файлу .js
if (require.main === module){
(function() {
var _context = require('repl').start({prompt: '$> '}).context;
var scope = require('lexical-scope')(require('fs').readFileSync(__filename));
for (var name in scope.locals[''] )
_context[scope.locals[''][name]] = eval(scope.locals[''][name]);
for (name in scope.globals.exported)
_context[scope.globals.exported[name]] = eval(scope.globals.exported[name]);
})();
}
Тепер, якщо ваш файл src.js
запущений, node src.js
буде запущений вузол, завантажте файл, запустіть REPL і скопіюйте всі об'єкти, оголошені як var
на верхньому рівні, так і будь-які експортовані глобалі. У if (require.main === module)
гарантує , що цей код не буде виконуватися , якщо src.js
включений через require
заяву. Насправді, ви можете додати будь-який код, який ви бажаєте виправдати, коли ви працюєте src.js
окремо для цілей налагодження всередині if
оператора.
Ось баш-версія функції відповіді Джорджа :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Якщо ви помістите це у свій, ~/.bash_profile
ви можете використовувати його як псевдонім, тобто:
noderepl foo.js
Ще одна пропозиція, яку я тут не бачу: спробуйте цей маленький код
#!/usr/bin/env node
'use strict';
const repl = require('repl');
const cli = repl.start({ replMode: repl.REPL_MODE_STRICT });
cli.context.foo = require('./foo'); // injects it into the repl
Тоді ви можете просто запустити цей скрипт, і він буде включати foo
в себе змінну
Стара відповідь
type test.js|node -i
Відкриє вузол REPL і набере всі рядки з test.js в REPL, але чомусь вузол вийде після закінчення файлу
Ще одна проблема полягає в тому, що функції не будуть підніматися.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Тоді всі глобалі, оголошені без var у межах test2.js, будуть доступні в REPL
не впевнений, чому var a в глобальному масштабі не буде доступним