Как загрузить мой script в node.js REPL?

У меня есть script foo.js, который содержит некоторые функции, с которыми я хочу играть в REPL.

Есть ли способ, чтобы node выполнил мой script, а затем перешел в REPL со всеми объявленными глобальными переменными, например, с помощью python -i foo.py или ghci foo.hs?

Ответ 1

По-прежнему нет встроенных функций для предоставления точной функциональности, которую вы описываете. Однако вместо использования require использовать .load в REPL, например:

.load foo.js

Он загружает файл в строку за строкой так же, как если бы вы ввели его в REPL. В отличие от require, это загрязняет историю REPL командами, которые вы загрузили. Однако оно имеет то преимущество, что оно повторяемо, поскольку оно не кэшируется как require.

Что лучше для вас будет зависеть от вашего варианта использования.


Изменить: Он имеет ограниченную применимость, потому что он не работает в строгом режиме, но через три года я узнал, что если ваш script не имеет 'use strict', вы можете используйте eval для загрузки script, не загрязняя историю REPL:

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())

Ответ 2

Я создал replpad, так как мне надоело повторно перезагружать script.

Просто установите его через: npm install -g replpad

Затем используйте его, запустив: replpad

Если вы хотите, чтобы он просматривал все файлы в текущем и во всех подкаталогах и транслировал их в repl при их изменении: replpad .

Просмотрите видео на сайте, чтобы получить лучшее представление о том, как он работает, и узнайте о других полезных функциях, которые у него есть:

  • доступ к основным модулям docs в repl с помощью функции dox(), которая добавляется к каждой основной функции, т.е. fs.readdir.dox()
  • получить доступ к пользовательским модулям readm в repl с помощью функции dox(), которая добавляется к каждому модулю, установленному через npm, т.е. marked.dox()
  • функция доступа выделенный исходный код, информация о , где была определена функция (файл, linenumber) и функция комментарии и/или jsdocs, где это возможно, через свойство src, которое добавляется к каждой функции, т.е. express.logger.src
  • scriptie-talkie поддержка (см. команду .talk)
  • добавляет команды и сочетания клавиш
  • привязки клавиш vim
  • поддержка ключевых карт
  • сопоставление парсеров через плагин token token
  • добавляет код, введенный в repl обратно в файл с помощью сочетания клавиш или команды .append

Ответ 3

Я сделал Vorpal.js, который обрабатывает эту проблему, превратив ваш node add в интерактивный 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: 

Ответ 4

В настоящее время вы не можете сделать это напрямую, но вы можете mylib = require('./foo.js') в REPL. Помните, что методы экспортируются, а не объявляются как глобальные.

Ответ 5

replpad классно, но для быстрого и простого способа загрузки файла в node, импортируйте его переменные и запустите реплика, вы можете добавить следующий код в конец вашего .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 запустится node, загрузите файл, запустите REPL и скопируйте все объекты, объявленные как var на верхнем уровне, а также любые экспортированные глобальные переменные, if (require.main === module) гарантирует, что этот код не будет выполнен, если src.js включен в оператор require. Фактически, вы можете добавить любой код, который вы хотите исключить, когда вы выполняете автономный src.js для целей отладки внутри оператора if.

Ответ 6

Другое предложение, которое я не вижу здесь: попробуйте этот маленький код

#!/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

Затем вы можете просто запустить этот script и он будет включать foo в качестве переменной

Ответ 7

Я всегда использую эту команду

node -i -e "$(< yourScript.js)"

работает точно так же, как в Python без каких-либо пакетов.

Ответ 8

Почему бы не загрузить файл в интерактивный node repl?

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

Затем вы можете добавить в скрипты package.json

"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",

с использованием node v8.1.2

Ответ 9

Другим способом является определение этих функций как глобальных.

global.helloWorld = function() { console.log("Hello World"); }

Затем предварительно загрузите файл в REPL как:

node -r ./file.js

Тогда функцию helloWorld можно получить непосредственно в REPL.