我正在用 Node 写一个 web 应用程序。如果我有一些 JS 文件db.js和函数 init 在里面,我怎么能从命令行调用该函数?
db.js
init
如果你将db.js转换为一个模块,你可以从db_init.js中需要它,只需:node db_init.js。
db_init.js
node db_init.js
db.js:
module.exports = { method1: function () { ... }, method2: function () { ... } }
db_init.js:
var db = require('./db'); db.method1(); db.method2();
不评论你为什么想这样做,或者什么可能是更标准的做法:这里是你的问题的解决方案....请记住,命令行所需的引号类型可能会有所不同。
在你的db.js中,导出init函数。有很多方法,比如:
module.exports.init = function () { console.log('hi'); };
然后像这样调用它,假设你的db.js和你的命令提示符在同一个目录:
node -e 'require("./db").init()'
如果你的db.js是一个模块db.mjs,使用动态导入来加载这个模块:
db.mjs
node -e 'import("./db.mjs").then( loadedModule => loadedModule.init() )'
对于其他读者来说,OP的init函数可以被称为任何东西,这并不重要,它只是问题中使用的特定名称。
make-runnable试试。
在db.js中,将require('make-runnable');添加到末尾。
require('make-runnable');
现在你可以做:
node db.js init
任何进一步的参数将以列表或键值对的形式传递给init方法。
更新2020 - CLI
正如@mix3d指出的那样,你可以只运行一个命令,其中file.js是你的文件,someFunction是你的函数,后面有空格分隔的参数
file.js
someFunction
npx run-func file.js someFunction "just some parameter"
就是这样。
file.js在上面的例子中调用
const someFunction = (param) => console.log('Welcome, your param is', param) // exporting is crucial module.exports = { someFunction }
更详细的描述
从CLI直接运行(全局)
安装
npm i -g run-func
用法,即运行function "init",它必须被导出,见底部
run-func db.js init
或
从包运行。Json脚本(本地)
npm i -S run-func
设置
"scripts": { "init": "run-func db.js init" }
使用
npm run init
参数个数
以下任何参数都将作为函数参数init(param1, param2)传递
init(param1, param2)
run-func db.js init param1 param2
重要的
函数(在本例中是init)必须在包含它的文件中导出
module.exports = { init };
或ES6导出
export { init };
简单的方法:
假设你在项目结构的helpers目录下有一个db.js文件。
现在进入助手目录,进入节点控制台
helpers $ node
2)需要db.js文件
> var db = require("./db")
3)调用你的函数(在你的情况下是init())
> db.init()
希望这能有所帮助
如果你的文件只包含你的函数,例如:
myFile.js:
function myMethod(someVariable) { console.log(someVariable) }
像这样从命令行调用它什么也不会发生:
node myFile.js
但是如果你改变你的文件:
myMethod("Hello World"); function myMethod(someVariable) { console.log(someVariable) }
现在这将从命令行工作:
根据其他答案,将以下内容添加到someFile.js
someFile.js
module.exports.someFunction = function () { console.log('hi'); };
然后,您可以将以下内容添加到package.json
package.json
"scripts": { "myScript": "node -e 'require(\"./someFile\").someFunction()'" }
然后,您可以从终端进行呼叫
npm run myScript
我发现这是一种更容易记住和使用命令的方法
这个是脏的,但工作:)
:)
我将从脚本中调用main()函数。以前我只是在脚本的末尾调用main。然而,我确实添加了一些其他函数并将它们从脚本中导出(在代码的其他部分使用函数)-但我不想每次在其他脚本中导入其他函数时都执行main()函数。
main()
if (process.argv.includes('main')) { main(); }
因此,当我想在CLI中调用该函数时:node src/myScript.js main
node src/myScript.js main
我做了一个IIFE,就像这样:
(() => init())();
这段代码将立即执行并调用init函数。
有时你想通过CLI运行一个函数,有时你想从另一个模块require它。以下是如何做到这两点。
require
// file to run const runMe = () => {} if (require.main === module) { runMe() } module.exports = runMe
也许这个方法不是你想要的,但谁知道它会有帮助呢
const arg = process.argv.splice(2); function printToCli(text){ console.log(text) } switch(arg[0]){ case "--run": printToCli("how are you") break; default: console.log("use --run flag"); }
,执行命令node . --run
node . --run
probuss-MacBook-Air:fb_v8 probus$ node . --run how are you probuss-MacBook-Air:fb_v8 probus$
你可以添加更多的arg[0], arg[1], arg[2]…和更多的
对于node . --run -myarg1 -myarg2
node . --run -myarg1 -myarg2
灵感来自https://github.com/DVLP/run-func/blob/master/index.js
我创建了https://github.com/JiangWeixian/esrua
如果文件index.ts . if
index.ts
export const welcome = (msg: string) => { console.log(`hello ${msg}`) }
你就跑
esrua ./index.ts welcome -p world
将输出hello world
hello world
如果你想从你的.env文件中包含环境变量,你可以使用env-cmd:
env-cmd
npx env-cmd node -e 'require("./db").init()'
如果你想在文件中运行一个特定的函数,使用run-func:
run-func
npx env-cmd npx run-func db.js init someArg
或者,为已接受的答案提供一个参数,你必须这样做:
npx env-cmd node -e 'require("./db").init(someArg)'
在这里编写/更新表达式比为命令提供不同的参数更不显式(例如,当你回头检查时更容易错过),因此我建议使用env-cmd和run-func。
注意:必要时,我通常也会在后面加上--experimental-modules。
--experimental-modules
2022年更新-如果你已经切换到ES模块,你不能使用require技巧,你需要使用动态导入:
node -e 'import("./db.js").then(dbMod => dbMod.init());'
或者使用——experimental- specification -resolution=节点标志:
node --experimental-specifier-resolution=node -e 'import("./db").then(dbMod => dbMod.init());'
ts-node
app
// app.ts export const app = express(); export async function init(): Promise<void> { // app init logic... }
npx ts-node -e 'require("./src/app").init();' npx ts-node -e 'import("./src/app").then(a => a.init());' // esmodule