Как мне загрузить мой скрипт в REPL узла.js? - PullRequest
116 голосов
/ 08 декабря 2011

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

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

Ответы [ 11 ]

155 голосов
/ 02 апреля 2014

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

.load foo.js

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

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


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

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
21 голосов
/ 20 августа 2017

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

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

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

8 голосов
/ 01 октября 2015

Я сделал 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: 
7 голосов
/ 26 августа 2017

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

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

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

node -r ./file.js

Тогда функция helloWorld может быть доступна непосредственно в REPL.

7 голосов
/ 24 мая 2014

Я создал replpad , так как устал от повторной загрузки сценария.

Просто установите его с помощью: npm install -g replpad

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

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

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

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

Почему бы не загрузить файл в интерактивный узел 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",

протестировано с использованием узла v8.1.2

4 голосов
/ 18 декабря 2014

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.

4 голосов
/ 08 декабря 2011

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

3 голосов
/ 07 июня 2018

Вот версия функции bash Ответ Джорджа :

noderepl() {
    FILE_CONTENTS="$(< $1 )"
    node -i -e "$FILE_CONTENTS"
}

Если вы вставите это в свой ~/.bash_profile, вы можете использовать его как псевдоним, то есть:

noderepl foo.js
3 голосов
/ 08 февраля 2016

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

#!/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 в качестве переменной

...