Як завантажити свій скрипт у відповідь node.js?


137

У мене є сценарій, foo.jsякий містить деякі функції, з якими я хочу грати в REPL.

Чи є спосіб змусити вузол виконати мій скрипт, а потім перейти в REPL з усіма заявленими глобалами, як я можу з python -i foo.pyабо ghci foo.hs?

Відповіді:


179

Все ще немає нічого вбудованого, щоб забезпечити точну функціональність, яку ви описуєте. Однак альтернатива його використанню requireдля використання .loadкоманди в межах REPL, наприклад:

.load foo.js

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

Що краще для вас, буде залежати від вашого випадку використання.


Редагувати: Це обмежене застосування, оскільки воно не працює в суворому режимі, але через три роки я дізнався, що якщо у вас немає сценарію 'use strict', ви можете використовувати evalдля завантаження сценарію, не забруднюючи історію REPL:

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

Що робити, якщо я хочу потрапити в repl всередині зворотного виклику async?
Чет

2
@Chet Ви пишете нове питання StackOverflow, якщо ваше питання не відповідає існуючому :-)
vossad01

@Chet ви можете. Завантажити інший файл за допомогою (async () => {більше код}) (); і він буде ділитися тими ж глобалами.
Нуреттін

Порада, якщо ви користуєтеся macOS (можливо, і іншими). Ви можете ввести ".load" (відзначте пробіл) у REPL та перетягніть / впустіть файл у термінал із Finder, щоб додати правильний шлях до вашої команди. Це зручно, якщо файли, з якими ви працюєте, на кілька рівнів нижче.
jamesnotjim

35

Я завжди використовую цю команду

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

працює точно так само, як у Python без будь-яких пакетів.


1
Хто-небудь знає, як зробити це працює у Windows cmd? У мене це працює в bash, але не в windows.
Шарпіро

@Sharpiro: Якщо ви встановите Git, у вас є можливість встановити mini-UNIX на свій ПК з Windows. Я маю на увазі звичайний розподіл Git для Windows.
Хуан Ланус

Єдине, що дратує це - Node.js надрукує запит на відповідь, а потім запустить ваш сценарій, так що будь-який вихід застрягне після підказки. stackoverflow.com/a/45893494/3538165 не має цієї проблеми, але для цього функції рішення повинні бути призначені явно змінним, щоб вони опинилися в просторі імен repl, тому не дуже добре.
Радон Росборо

10

Я створив 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: 

8

Інший спосіб - визначити ці функції як глобальні.

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

Потім попередньо завантажте файл у відповідь як:

node -r ./file.js

Тоді до цієї функції helloWorldможна отримати доступ безпосередньо в REPL.


8

Я створив replpad, оскільки втомився повторно завантажувати сценарій.

Просто встановіть його за допомогою: npm install -g replpad

Потім використовуйте його, запустивши: replpad

Якщо ви хочете, щоб він переглядав усі файли у поточному та всіх підкаталогах та передав їх у відповідь, коли вони змінюються: replpad .

Перегляньте відео на сайті, щоб краще зрозуміти, як воно працює, та дізнайтеся про деякі інші приємні функції, які він має:

  • отримати доступ до основних елементів документа в repl через dox()функцію, яка додається до кожної основної функції, тобтоfs.readdir.dox()
  • доступ до модуля readme користувача у відповіді через dox()функцію, яка додається до кожного модуля, встановленого через npm, тобтоmarked.dox()
  • виділений вихідний код функції доступу , інформація про те, де була визначена функція (файл, число ліній) та коментарі до функції та / або jsdocs, де це можливо, через srcвластивість, яка додається до кожної функції, тобтоexpress.logger.src
  • scriptie рація підтримки (див.talkкоманда)
  • додає команди та комбінації клавіш
  • прив'язки ключів vim
  • підтримка ключових карт
  • паролі, що відповідають плагіну токена відповідності
  • додає код, введений у відповідь назад, до файлу за допомогою комбінації клавіш або .appendкоманди

Дивіться: https://github.com/thlorenz/replpad


Мені довелося CXX=clang++ npm install replpadобійти помилкуg++: error: unrecognized command line option '-stdlib=libc++'
ShadSterling

Але тоді, коли я запускаю його, це не вдається# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
ShadSterling

5

Чому б не завантажити файл в інтерактивну версію вузла?

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


2
чому не просто node -i -r "./build/main/index.js"?
З. Хулла

4

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


Я вважаю це кращим .load my_work.js, незважаючи на те , що вимагає деяких додаткових exports.working_var = ...декларацій, оскільки REPL обробляє деякі види ідеально правильного javascript, як багаторядкові коментарі (принаймні, з моєю readlineконфігурацією).
chbrown

4

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

Ось баш-версія функції відповіді Джорджа :

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

Якщо ви помістите це у свій, ~/.bash_profileви можете використовувати його як псевдонім, тобто:

noderepl foo.js

2
Я використовую це вже місяцями, і при переході на нове середовище оболонки я втратив частину своїх налаштувань і мені довелося знову відстежувати це. Тому, оскільки я тут, я думав, що буду вдячний вам за цю дійсно корисну функцію.
Xaekai

3

Ще одна пропозиція, яку я тут не бачу: спробуйте цей маленький код

#!/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в себе змінну


1

Стара відповідь

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 в глобальному масштабі не буде доступним


8
Будь ласка , додайте трохи explanaton в свою відповідь
mechnicov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.