执行一些代码,然后进入交互节点

问题描述 投票:0回答:12

有没有办法在进入 Node.js 交互模式之前执行一些代码(在文件中或从字符串中,并不重要)?

例如,如果我创建一个脚本

__preamble__.js
,其中包含:

console.log("preamble executed! poor guy!");

用户输入

node __preamble__.js
,他们会得到以下输出:

preamble executed! poor guy!
> [interactive mode]
javascript node.js
12个回答
126
投票

确实是老问题了,但是...

我相信我一直在寻找类似的东西,并发现了这一点。 您可以打开 REPL(在终端上输入

node
),然后加载文件。 像这样:
.load ./script.js
。 按回车键,文件内容将被执行。现在,在脚本中创建的所有内容(对象、变量、函数)都将可用。

例如:

// script.js
var y = {
    name: 'obj',
    status: true
};

var x = setInterval(function () {
    console.log('As time goes by...');
}, 5000);

关于 REPL:

//REPL
.load ./script.js

现在您输入 REPL 并与“实时代码”交互。 您可以

console.log(y)
clearInterval(x)

这会有点奇怪,因为“随着时间的推移......”每五秒(左右)就会出现一次。 但它会起作用!


32
投票

您可以轻松地在 Node 软件中启动一个新的

repl

var repl = require("repl");
var r = repl.start("node> ");
r.context.pause = pauseHTTP;
r.context.resume = resumeHTTP;

在 REPL 中,您可以调用

pause()
resume()
并直接执行函数
pauseHTTP()
resumeHTTP()
。只需将您想要公开的任何内容分配给 REPL 的
context
成员即可。


24
投票

这可以通过 当前版本的 NodeJS 来实现 (

5.9.1
):

$ node -i -e "console.log('A message')"

-e
标志评估字符串,
-i
标志开始交互模式。

您可以在引用的拉取请求中阅读更多内容


13
投票

node -r
允许您在 REPL 启动时请求模块。
NODE_PATH
设置模块搜索路径。所以你可以在命令行上运行这样的东西:

NODE_PATH=. node -r myscript.js

这应该会让你进入 REPL 并加载脚本。


7
投票

我最近启动了一个项目,为 Node 和 CoffeeScript 等相关语言创建高级交互式 shell。其中一项功能是在启动时在解释器的上下文中加载文件或字符串,这会考虑到加载的语言。

http://danielgtaylor.github.com/nesh/

示例:

# Load a string (Javascript)
nesh -e 'var hello = function (name) { return "Hello, " + name; };'

# Load a string (CoffeeScript)
nesh -c -e 'hello = (name) -> "Hello, #{name}"'

# Load a file (Javascript)
nesh -e hello.js

# Load a file (CoffeeScript)
nesh -c -e hello.coffee

然后在解释器中您可以访问

hello
功能。


6
投票

编辑:忽略这一点。 @jaywalking101 的答案要好得多。而是这样做。

如果您从 Bash shell(Linux、OS X、Cygwin)内部运行,那么

cat __preamble__.js - | node -i

会起作用的。这也会在评估 preamble.js 的每一行时产生大量噪音,但事后你会在你想要的上下文中进入交互式 shell。

('-'到'cat'只是指定“使用标准输入”。)


3
投票

与@slacktracer的答案类似,但如果您可以在脚本中使用

global
,则可以简单地
require
代替(学习和)使用
.load

示例

lib.js

global.x = 123;

示例

node
会话:

$ node
> require('./lib')
{}
> x
123

作为一个很好的副作用,您甚至不必进行

var x = require('x'); 0
舞蹈,因为
module.exports
仍然是一个空对象,因此
require
结果不会用模块的内容填充您的屏幕。


2
投票

Vorpal.js 就是为了做到这一点而构建的。它提供了一个 API,用于在您的应用程序上下文中构建交互式 CLI。

它包含插件,其中之一是Vorpal-REPL。这可以让您输入

repl
,这将使您进入 REPL 在应用程序的上下文中

实施示例:

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal.use(repl).show();

// Now you do your custom code...

// If you want to automatically jump
// into REPl mode, just do this:
vorpal.exec('repl');

仅此而已!

免责声明:我写了 Vorpal。


0
投票

本地没有办法做到这一点。您可以进入节点交互式 shell

node
或运行您拥有的脚本
node myScrpt.js
。 @sarnold 是对的,如果你想要你的应用程序这样做,你需要自己制作,并且使用 repl 工具包对这类事情很有帮助


0
投票

nit-tool 允许您将节点模块加载到 repl 交互中,并可以访问内部模块环境(加入上下文)以进行开发

npm install nit-tool -g

0
投票

我首先尝试过

$ node --interactive foo.js

但它只运行 foo.js,没有 REPL。

如果您在 js 中使用

export
import
,请运行
npm init -y
,然后通过
"type": "module",
行 -

告诉节点您正在使用模块
{
  "name": "neomem",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "home.js",
  "keywords": [],
  "author": "",
  "license": "ISC"
}

然后您可以运行节点并使用动态导入导入文件 -

$ node
Welcome to Node.js v18.1.0.
Type ".help" for more information.

> home = await import('./home.js')
[Module: null prototype] {
  get: [AsyncFunction: get],
  start: [AsyncFunction: start]
}

> home.get('hello')

一种迂回的方式来做到这一点 - 有一个命令行开关会很好......


0
投票

这是另一种方式

node -i -e "$(cat script.js)"
© www.soinside.com 2019 - 2024. All rights reserved.