有没有办法在进入 Node.js 交互模式之前执行一些代码(在文件中或从字符串中,并不重要)?
例如,如果我创建一个脚本
__preamble__.js
,其中包含:
console.log("preamble executed! poor guy!");
用户输入
node __preamble__.js
,他们会得到以下输出:
preamble executed! poor guy!
> [interactive mode]
确实是老问题了,但是...
我相信我一直在寻找类似的东西,并发现了这一点。 您可以打开 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)
;
这会有点奇怪,因为“随着时间的推移......”每五秒(左右)就会出现一次。 但它会起作用!
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
成员即可。
这可以通过 当前版本的 NodeJS 来实现 (
5.9.1
):
$ node -i -e "console.log('A message')"
-e
标志评估字符串,-i
标志开始交互模式。
您可以在引用的拉取请求中阅读更多内容
node -r
允许您在 REPL 启动时请求模块。 NODE_PATH
设置模块搜索路径。所以你可以在命令行上运行这样的东西:
NODE_PATH=. node -r myscript.js
这应该会让你进入 REPL 并加载脚本。
我最近启动了一个项目,为 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
功能。
编辑:忽略这一点。 @jaywalking101 的答案要好得多。而是这样做。
如果您从 Bash shell(Linux、OS X、Cygwin)内部运行,那么
cat __preamble__.js - | node -i
会起作用的。这也会在评估 preamble.js 的每一行时产生大量噪音,但事后你会在你想要的上下文中进入交互式 shell。
('-'到'cat'只是指定“使用标准输入”。)
与@slacktracer的答案类似,但如果您可以在脚本中使用
global
,则可以简单地require
代替(学习和)使用.load
。
示例
lib.js
:
global.x = 123;
示例
node
会话:
$ node
> require('./lib')
{}
> x
123
作为一个很好的副作用,您甚至不必进行
var x = require('x'); 0
舞蹈,因为 module.exports
仍然是一个空对象,因此 require
结果不会用模块的内容填充您的屏幕。
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。
本地没有办法做到这一点。您可以进入节点交互式 shell
node
或运行您拥有的脚本 node myScrpt.js
。 @sarnold 是对的,如果你想要你的应用程序这样做,你需要自己制作,并且使用 repl 工具包对这类事情很有帮助
nit-tool 允许您将节点模块加载到 repl 交互中,并可以访问内部模块环境(加入上下文)以进行开发
npm install nit-tool -g
我首先尝试过
$ 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')
一种迂回的方式来做到这一点 - 有一个命令行开关会很好......
这是另一种方式
node -i -e "$(cat script.js)"