npm start与node app.js区别

104

我对Node非常陌生,正在努力理解应用程序的基础知识。我好奇为什么这两个命令:

node app.js

--vs--

npm start

在控制台输出相同的内容并继续“监听”,但为什么当我尝试访问http://localhost:3000时,只有在运行第一个命令时才会出现404错误。

我看到Express 4似乎具有不同的应用程序结构,但是为什么其中一个成功侦听而另一个却没有,尽管控制台中表现相同?

任何解释都有帮助。谢谢!


5
npm start 会查找你的 package.json 文件中的 start 脚本。它可能是一个不同的脚本,而不仅仅是 app.js。请尝试查看 package.json 文件。 - hassansin
你能发布你的app.js和package.json中相关的部分吗? - K. P. MacGregor
请参考以下链接:https://docs.npmjs.com/misc/scripts - E net4
3个回答

95
这两个命令并不一定相同。npm start会运行在你的'package.json'文件中所定义的'start'脚本配置要运行的内容,node app.js会执行'node'中的'app.js'文件。欲了解更多信息,请参见http://browsenpm.org/package.json。因此,如果你的'package.json'文件如下,则这两个命令是完全不同的。
{
    "name": "my cool node project",
    ....
    "scripts": {
        "start": "node index.js"
    }
    ....
}
以下是你需要的 package.json,它将使它们完全相同。
{
    "name": "my cool node project",
    ....
    "scripts": {
        "start": "node app.js"
    }
    ....
}

我建议您先检查“start”脚本设置运行的内容,并尝试直接在CLI中运行相同的命令,而不是通过NPM运行,以便查看差异所在。

但为什么其中一个可以成功监听,而另一个却不能呢?

如果服务器返回404,则说明服务器正在侦听,但文档根或访问权限未正确设置,因此返回“文件未找到”的响应。


4
知道吗,你是对的。我最后弄明白了,我有点迷惑是因为我来自于使用grunt进行FE自动化的世界。 基本上,./bin/www文件现在是服务器的引导程序,在旧版本的express中不是这样。谢谢你帮助我理解。基本上我理解app.js并没有完全引导应用程序,但它确实在执行像mongodb连接之类的操作,这就是为什么我看到控制台日志。新的express规范是使用./bin/www来执行所有引导操作(我喜欢这种方式,感觉更清晰)。+1 谢谢你! - dudewad
@dudewad “启动脚本”和“main”字段在任何形式上是否不同?因为根据npm文档,它们似乎都可以实现相同的功能。 - Nuwan Jayawardene
我不确定主字段的作用。我所了解到的是,当您键入“npm run [somescript]”时,package.json文件中的“scripts”部分会被搜索。在这种情况下,我认为“start”是一个别名。 - dudewad

35

除了上面的回答之外,我想补充一点:

如果在您的 package.json 文件中没有 scripts 部分,则执行 npm start 将导致 npm 在该目录中查找 server.js,如果找到则使用 node server.js 运行它,否则会抛出npm ERR! missing script: start 作为错误消息。

文档:npm-start


2
太完美了,正是我想要的! - Atul

13

我想补充一些内容,这可能有助于未来的受众。

首先

Node - 是任何JavaScript代码的运行时

NPM是包管理器,可用于下载/更新/运行软件包等等,包括3个组成部分

  1. 网站
  2. npm CLI(命令行界面)
  3. 注册表

此处阅读有关它为您完成的所有操作。

node any.js - 这将简单地运行名为"any.js"的JavaScript文件。因此,如果其中没有启动服务器的代码,则会出现错误

npm start - 将运行package.json中的start命令。对于非常基本的示例,如果以下是package.json中的start脚本

enter image description here

它将在控制台上简单地打印“Hello”

如果使用CRA创建React应用程序,则通常会在此部分中使用"react-scripts start"。 它设置开发环境并启动服务器,以及热模块重新加载

这就是在这种情况下为什么您不会出现错误的原因。


如果any.js中没有代码启动服务器,您将不会收到错误。Node是一个JavaScript解释器,只要在脚本中放置的JS有效,就不会出现错误。相反,您将得到它产生的任何输出。在any.js的情况下,如果它是空的,您将得不到任何输出。这是非常重要的区别。我觉得你把JavaScript框架/库和Node.js混淆了,它们是两个完全不同的东西。Node运行JavaScript代码,React是一个在JavaScript中执行操作的库。对于寻找信息的人来说,这是一个重要的区别。 - dudewad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接