Answers:
仍然没有内置功能可以提供您描述的确切功能。但是,也可以使用require
它来在REPL中使用.load
命令,例如:
.load foo.js
它会逐行加载文件,就像您在REPL中键入文件一样。与require
此不同,这会使用您加载的命令污染REPL历史记录。但是,它具有可重复的优势,因为它没有像一样被缓存require
。
哪种对您更好,将取决于您的用例。
编辑:它的适用性有限,因为它不能在严格模式下工作,但是三年后,我了解到,如果您的脚本没有'use strict'
,您可以使用它eval
来加载脚本而不会污染REPL历史记录:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
我总是用这个命令
node -i -e "$(< yourScript.js)"
完全像Python中一样,没有任何包。
另一种方法是将这些功能定义为全局功能。
global.helloWorld = function() { console.log("Hello World"); }
然后以以下方式将文件预加载到REPL中:
node -r ./file.js
然后helloWorld
可以在REPL中直接访问该功能。
我创建replpad是因为我厌倦了重复加载脚本。
只需通过以下方式安装: npm install -g replpad
然后通过运行使用它: replpad
如果希望它监视当前目录和所有子目录中的所有文件,并在它们更改时将它们通过管道传递给repl,请执行以下操作: replpad .
观看网站上的视频,以更好地了解其工作原理,并了解其其他一些不错的功能,例如:
dox()
添加到每个核心功能的功能来访问repl中的核心模块文档,即fs.readdir.dox()
dox()
添加到通过npm安装的每个模块中的功能访问repl中的用户模块自述文件,即marked.dox()
src
,即express.logger.src
.talk
命令).append
命令将在repl中输入的代码附加回文件CXX=clang++ npm install replpad
解决该错误g++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
为什么不将文件加载到交互式节点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 -r "./build/main/index.js"
?
当前,您不能直接执行此操作,但是可以mylib = require('./foo.js')
在REPL中执行。请记住,方法是导出的,而不是声明为全局变量。
.load my_work.js
尽管需要一些额外的exports.working_var = ...
声明,但我发现这对它更可取,因为REPL在某些完全有效的javascript上使用barfs,例如多行注释(至少在我的readline
配置中)。
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
语句中添加要在调试时独立运行的任何代码。
这是乔治回答的bash函数版本 :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
如果将其放在自己~/.bash_profile
的文件夹中,则可以像别名一样使用它,即:
noderepl foo.js
旧答案
type test.js|node -i
将打开节点REPL并在test.js的所有行中键入REPL,但是由于某种原因,节点将在文件结束后退出
另一个问题是,功能不会被提升。
node -e require('repl').start({useGlobal:true}); -r ./test2.js
然后在test2.js中声明为无var的所有全局变量将在REPL中可用
不确定为什么全局范围内的var a将不可用