Javascript 如何将脚本加载到node.js REPL中?

Javascript 如何将脚本加载到node.js REPL中?,javascript,node.js,read-eval-print-loop,Javascript,Node.js,Read Eval Print Loop,我有一个脚本foo.js,其中包含一些我想在REPL中使用的函数 有没有一种方法可以让节点执行我的脚本,然后跳转到一个包含所有已声明全局变量的REPL中,就像我可以使用python-I foo.py或ghci foo.hs?目前您不能直接这样做,但您可以在REPL中使用mylib=require('./foo.js')。请记住,方法是导出的,而不是声明为全局的。仍然没有任何内置功能提供您所描述的确切功能。但是,使用的替代方法要求it在REPL中使用,例如: .load foo.js 它逐行加载

我有一个脚本
foo.js
,其中包含一些我想在REPL中使用的函数


有没有一种方法可以让节点执行我的脚本,然后跳转到一个包含所有已声明全局变量的REPL中,就像我可以使用
python-I foo.py
ghci foo.hs

目前您不能直接这样做,但您可以在REPL中使用
mylib=require('./foo.js')
。请记住,方法是导出的,而不是声明为全局的。

仍然没有任何内置功能提供您所描述的确切功能。但是,使用
的替代方法要求
it在REPL中使用,例如:

.load foo.js
它逐行加载文件,就像您在REPL中键入它一样。与
require
不同,这会污染您加载的命令的REPL历史记录。但是,它具有可重复的优点,因为它不像
require
那样被缓存

哪个更适合您将取决于您的用例


编辑:它的适用性有限,因为它不能在严格模式下工作,但三年后我了解到,如果您的脚本没有
“使用严格”
,您可以在不污染REPL历史的情况下:

var fs=require('fs');
eval(fs.readFileSync('foo.js').toString())
我创建脚本是因为我厌倦了重复加载脚本

只需通过以下方式进行安装:
npm安装-g replpad

然后通过运行:
replpad

如果您希望它监视当前和所有子目录中的所有文件,并在文件更改时将其导入repl,请执行以下操作:
replpad。

查看网站上的视频,更好地了解它的工作原理,并了解它的其他一些优秀功能,如:

  • 通过添加到每个核心函数的
    dox()
    函数访问repl中的核心模块文档,即
    fs.readdir.dox()
  • 通过添加到通过npm安装的每个模块中的
    dox()
    功能访问repl中的用户模块自述文件, i、 e.
    marked.dox()
  • 访问函数的突出显示的源代码,有关函数定义位置的信息(文件、行号)和函数 注释和/或jsdocs尽可能通过添加到每个函数的
    src
    属性,即
    express.logger.src
  • 支持(请参阅
    .talk
    命令)
  • 添加命令和键盘快捷键
  • vim密钥绑定
  • 关键地图支持
  • 通过匹配令牌插件进行配对
  • 通过键盘快捷键或
    将repl中输入的代码追加回文件。追加
    命令

请参阅:

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
将启动node,加载文件,启动REPL,并复制顶级声明为
var
的所有对象以及任何导出的全局对象。
if(require.main==module)
确保在通过
require
语句包含
src.js
时不会执行此代码。事实上,在运行
src.js
standalone时,您可以在
if
语句中添加任何要执行的代码,以便进行调试。

我制作了一个脚本,它通过将节点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: 

我在这里没有看到的另一个建议是:尝试下面的代码

#!/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
作为变量为什么不将文件加载到交互式节点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测试,我始终使用此命令

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

与Python中没有任何包的情况下完全相同。

另一种方法是将这些函数定义为全局函数

global.helloWorld = function() { console.log("Hello World"); }
然后在REPL中预加载文件,如下所示:

node -r ./file.js

然后可以在REPL中直接访问函数
helloWorld

下面是的bash函数版本 :

noderepl(){
文件内容=“$”(<$1)”
节点-i-e“$FILE\u CONTENTS”
}
如果您将其放入
~/.bash_配置文件中
,则可以将其用作别名,即:

noderepl foo.js
旧答案

type test.js|node -i
将打开节点REPL并将test.js中的所有行键入REPL,但由于某些原因,节点将在文件结束后退出

另一个问题是,功能不会被提升

更好的答案 然后,test2.js中声明的没有var的所有全局变量都将在REPL中可用


不确定为什么全局范围中的var a不可用

有一个官方的Node.js也支持异步方法

console.js

const repl=require('repl'))
const mongoose=require('mongoose')
const run=async()=>{
等待mongoose.connect(process.env.DB_URL{
useNewUrlParser:true,
useUnifiedTopology:正确
})
const r=repl.start(`(${process.env.NODE_EN})⚡️ `)
r、 context.User=require('./src/models/User.model')
r、 context.mongoose=mongoose

console.log(`Ready我觉得这比
.load my_work.js
更可取,尽管需要一些额外的
导出.working_var=…
声明,因为REPL会在一些完全有效的javascript(如多行注释)(至少在我的
readline
配置中).如果我想把车停在里面怎么办
node -e require('repl').start({useGlobal:true}); -r ./test2.js