2014-06-08 49 views
8

在Python中有一個很好的功能,python -i。例如,python -i myprogram.py將運行該程序,然後進入交互模式,就好像我已將整個程序粘貼到交互式shell中一樣。什麼是python -i的node.js模擬:運行並進入交互模式?

node.js中是否有類似的命令?

+1

節點命令行實用程序還具有用於進入交互模式(即REPL)的'-i'修飾符,但如果您傳遞其他參數(如要執行的文件),則它不起作用。 –

+4

[執行一些代碼然後進入交互式節點]的可能的重複(https://stackoverflow.com/questions/8549145/execute-some-code-and-then-go-into-interactive-node) – jpaugh

回答

3

我認爲節點可執行文件不允許您將-i與任何其他文件參數結合使用。

這可能不是您想要閱讀的解決方案。但是,這對我有效。有一個叫做REPL的模塊,基本上可以讓你手動執行。所以,我意識到,我可以創建一個圍繞任何文件的包裝,如下所示:

#!/bin/bash 

COMMAND=$(cat <<EOF 
(function(){ 
    var repl = require('repl'); 

    process.stdin.push('.load ${1}\n'); 

    repl.start({ 
     useGlobal:true, 
     ignoreUndefined:true, 
     prompt:'> ' 
    }); 
})(); 
EOF 
) 

node -e "${COMMAND}" 

假如你把這個腳本nodejs,那麼我可以把這個腳本做這樣的事情

nodejs ./demo.js 

它啓動以編程方式REPL並將腳本加載到其中。這相當於手動打開REPL會話,然後運行命令.load <file>

+0

此方法有我發現有一些缺點。腳本中的局部變量不可用於檢查,但全局是。 – osa

+0

@SergeyOrshanskiy我已經編寫了一個新版本的程序,將您的腳本加載到當前會話中,而不是僅僅需要該模塊。這應該工作。 –

2

文檔在https://nodejs.org/api/cli.html

-r, --require module

預壓在啓動時指定的模塊。

遵循require()的模塊解析規則。模塊可以是文件的路徑,也可以是節點模塊名稱的 路徑。

node -i -r ./myprogram.js

-e, --eval "script"

評估以下參數,如JavaScript。在REPL中預定義的模塊 也可以在腳本中使用。

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

這些功能,因爲在2014年之前的響應與下面的拉請求已被添加。

+0

有沒有辦法從REPL訪問所需的模塊? – Antimony

1

不幸的是,節點具有用於此沒有內建溶液。正如這裏所提到的,您可以使用-r選項預加載模塊,但是您仍然無法從REPL訪問它們,因此有點無用。

到目前爲止,我已經找到了最好的解決方法是做

cat ./test.js - | node -i 

哪裏test.js是要運行該文件。這通過stdin發送它,就好像你自己輸入了文件,然後等待額外的輸入。一個缺點是它會在命令提示符下將文件和每行結果回顯給您。