我可以将 npm node_modules 目录放在我的“webroot”之外吗

Posted

技术标签:

【中文标题】我可以将 npm node_modules 目录放在我的“webroot”之外吗【英文标题】:Can I put the npm node_modules directory outside of my 'webroot' 【发布时间】:2013-03-09 10:27:28 【问题描述】:

我是 Node 新手,但到目前为止我很享受。我试图将我的node_modules(库)目录移到公共“webroot”之外,需要建议和指导。

我已经设置了我的简单的基于 expressJS 的 Node 项目,如下所示:

/my_project
  /config
  /public          
     /node_modules
     server.js

我想知道是否有任何方法可以在我的 webroot 之外拥有 /node_modules 目录而不破坏我的应用程序。我只是习惯于在我公开暴露的 webroot 中保持最低限度,并且对那里的库感觉不正确。称我为老式的,但这就是我习惯在 php 和 C# 世界中做事的方式。

如果我按如下方式设置项目:

/my_project
  /config
  /node_modules
  /public          
     server.js

然后一切都变得不稳定,Node 的 require() 魔法中断。

我尝试了以下方法:

var express=require('../express'); 这也不起作用,给我“找不到模块”类型错误。

    我的问题是否可能,如果可能,那么如何? 将库放在 webroot 中是否存在重大风险,或者我错过了 Node 工作方式的一些基本内容。 你们是做什么的,生产应用程序的最佳实践是什么?我可以举一些关于你们的生产实践的例子以及为什么。

【问题讨论】:

var express = require('../node_modules/express'); 似乎确实有效。不过,它似乎有点笨拙。我仍然对您认为的最佳实践非常感兴趣。 require('express') 应该仍然有效。见this handy post。特别是这部分:“如果给定的模块不是核心模块,Node.js 将开始搜索名为'node_modules'的目录。它将从当前目录开始(相对于Node中当前正在执行的javascript文件) ) 然后在文件夹层次结构中向上工作,检查 node_modules 文件夹的每个级别。”所以看来你的问题出在其他地方。 附带说明,节点中的常见做法是将客户端可以访问的文件放在 /public 中。 server.js 应该不是。 你说得对,如果 node_modules 提升了一级,require() 仍然有效。原来我正在使用由于某种原因在 npm 上出现问题的配置库。不过,我仍然对最佳实践感兴趣,所以我会留下这个问题,看看会有什么回应。 问题 3 不适合 SO,因为它可能有几个正确答案。但是我已经找不到关于#2 的好答案了,所以我会在一分钟内发布一个主要的答案。 【参考方案1】:

1.是否可以在项目外部的文件夹中包含模块

是的。

2。在 webroot 中包含模块是否存在重大风险?

假设您所说的“webroot”是指服务器的根目录或项目之外的任何文件夹:是的。可以使用 g 标志使用 npm 全局安装模块:npm install -g express。这通常被认为是不好的做法,因为不同的项目可能依赖于同一模块的不同版本。本地安装允许不同的项目有不同的版本。

如果您使用版本控制并且不想签入外部模块,一个常见的(和 npm 中的标准)模式是忽略 ./node_modules 并在 package.json 文件中指定依赖项。

3. “生产应用的最佳做法是什么?”

不太适合 SO,但既然我在做,我还是会试一试。如果你使用grunt(一个非常流行的任务自动化工具),你通常会得到这样的结构:

/my_project
  /node_modules
  /lib
    # actual project files
    /public
      # files that are meant to be sent to clients
  /test
  package.json # specifies dependencies, main script, version etc
  README.md # optional

这种结构的优点是可以清楚地分离核心文件、依赖项和任何测试,同时将它们全部保存在同一个文件夹中。

【讨论】:

谢谢安德烈亚斯,我会试试的。 需要考虑的几点。如果将模块与单个项目一起存储,则文件路径最终可能会突破 Windows 上 255 个字符的限制。这是我将它们存储在更高目录级别的主要原因,请参见此处:***.com/questions/13318364/…。此外,不签入模块也有不利之处,imagemin 的更新曾经破坏了我的构建过程。 ***.com/questions/11459475/… @AdamMarshall 是的,我想使用npm shrinkwrap 是一个很好的做法,除了不检查 node_modules “我问的问题是否可能,如果可能,那怎么办?” “是”答案中没有“如何”

以上是关于我可以将 npm node_modules 目录放在我的“webroot”之外吗的主要内容,如果未能解决你的问题,请参考以下文章

npm install 后缀

“npm install” 将所有依赖项安装在 node_modules 目录中,而不是嵌套它们

在 AWS CodeBuild 期间使用 npm install 时未创建 node_modules 目录

安装我的 NPM 包时将文件移动到根目录

npm升级

npm install 不会创建 node_modules 目录