繁体   English   中英

以文件夹名称作为参数的 Node.js 命令行

[英]Node.js command line with folder name as parameter

我正在查看https://github.com/mars/heroku-cra-node github repo,我注意到在package.json ,有一个定义为"start": node server的脚本"start": node server (服务器是包含 index.js 文件的文件夹)。

这条线到底有什么作用? 当我们将文件夹名称作为参数传递时,节点会在该文件夹内搜索文件index.js吗?

简短的回答是,是的。

长答案: package.jsonnpm识别。 只要你的机器上安装了 npm,你就可以用它来做很多事情,比如安装 NodeJS 模块,但你也可以用它来运行小脚本/命令。 这些命令必须添加到package.jsonscripts字段下。 要运行这些命令,您可以调用npm run <command> 此功能是为了方便起见,与包管理没有任何关系。 话虽如此,这里有一些钩子可以在将包发布到npmjs.com时被调用(稍后会详细介绍)。

NodeJS 将在导入任何文件夹时搜索并导入index.js (此处 Node 可能正在使用 CommonJS,但我 100% 不确定)。 因此,在您的示例中,通过调用npm start ,您正在调用 npm,它正在调用运行server/index.js node server 你可以在这里调用任何你想要的东西,例如,你可以通过创建一个脚本"my-script": "my-script.sh"来启动一个 shell 脚本,然后通过 npm 使用npm run my-script调用它。 这是一个简单的例子,但不是一个非常有用的例子——当你有复杂的命令需要定期运行时,npm-scripts 就派上用场了。

例如,您可以使用不同的命令来运行具有不同上下文的程序:

{
  "scripts": {
    "start": "set NODE_ENV=development&& webpack --watch",
    "clean": "rimraf dist",
    "build-production": "set NODE_ENV=production&& npm run clean && webpack",
    "deploy": "sam deploy"
  }
}
  • npm start进行开发
  • npm run build-production打包生产构建
  • npm run deploy将代码部署到服务器

请注意,在上一段中,我只是使用了npm start ,而不是之前描述的npm run start - 保留的脚本名称具有额外的功能,请参阅npm-scripts页面以获取完整详细信息。

当无法找到确切的文件时,Node 将进行有限的搜索。

在提供server作为node的“脚本”参数的情况下:

第一个node将尝试打开名为server的文件。
如果没有找到,那么它将寻找server.jsserver.json然后server.node
如果这些不存在并且参数是一个目录, node将尝试打开server/index.jsserver/index.json然后server/index.node

第一场比赛获胜。

$ strace -e stat node server
syscall_332(0xffffff9c, 0x7ffeca72d028, 0, 0xfff, 0x7ffeca72cc10, 0x7ffeca72cd20) = -1 (errno 38)
stat("/server", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/server.js", 0x7ffeca72cc90)      = -1 ENOENT (No such file or directory)
stat("/server.json", 0x7ffeca72cc90)    = -1 ENOENT (No such file or directory)
stat("/server.node", 0x7ffeca72cc90)    = -1 ENOENT (No such file or directory)
stat("/server/index.js", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server/index.json", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server/index.node", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/server.js", 0x7ffeca72cad0)      = -1 ENOENT (No such file or directory)
stat("/server.json", 0x7ffeca72cad0)    = -1 ENOENT (No such file or directory)
stat("/server.node", 0x7ffeca72cad0)    = -1 ENOENT (No such file or directory)
stat("/server/index.js", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
stat("/server/index.json", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
stat("/server/index.node", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
internal/modules/cjs/loader.js:896
  throw err;
  ^

Error: Cannot find module '/server'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:893:15)
    at Function.Module._load (internal/modules/cjs/loader.js:743:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
+++ exited with 1 +++

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM