【问题标题】:Change node_modules location更改 node_modules 位置
【发布时间】:2013-09-29 05:53:51
【问题描述】:

有没有办法改变 node_modules 文件夹的位置?

例如:

- dir1
- dir2
- node_modules

到:

- dir1
- dir2
    - node_modules

【问题讨论】:

  • 我猜您正在寻找一种将依赖项安装在不同文件夹中的方法,对吧?如果是这样,您只需将package.json 文件移动到dir2 中,然后从dir2 运行npm install
  • @Kamrul 但是我必须从 dir2 运行应用程序?
  • @Kamrul 它对我有用!只需要使用 shell 脚本来启动服务器,而不是默认的 npm start。请将其发布为答案,以便我接受。
  • @AmolMKulkarni 抱歉,我一定错过了。谢谢! :)
  • @AmolMKulkarni 耶!我爱上了节点!如此强大和灵活——太棒了!

标签: node.js npm


【解决方案1】:

以下是默认进入node_modules文件夹的代码

Module.prototype.load = function(filename) {
  debug('load ' + JSON.stringify(filename) +
        ' for module ' + JSON.stringify(this.id));

  assert(!this.loaded);
  this.filename = filename;
  this.paths = Module._nodeModulePaths(path.dirname(filename));

  var extension = path.extname(filename) || '.js';
  if (!Module._extensions[extension]) extension = '.js';
  Module._extensions[extension](this, filename);
  this.loaded = true;
};

因此,以下是确切的搜索模式:

  1. Node.JS 查看给定模块是否为核心模块。 (例如httpfs等)总是优先加载 模块。

  2. 如果给定模块不是核心模块(例如httpfs 等),Node.js 将开始搜索名为node_modules的目录。

    它将从当前目录开始(相对于Node.JS 中的当前执行文件),然后沿着文件夹层次结构向上移动,检查每个级别的 node_modules 文件夹。 一旦Node.JS 找到node_modules 文件夹,它将尝试将给定的模块加载为(.js)JavaScript 文件或命名的子目录;如果找到命名的子目录,它将尝试以各种方式加载文件。所以,例如

  3. 如果您请求加载模块,“utils”及其目录不是 .js 文件,则:
    Node.JS 将通过以下方式在分层目录中搜索 node_modulesutils

    ./node_modules/utils.js
    ./node_modules/utils/index.js
    ./node_modules/utils/package.json
    
  4. 如果Node.JS 在上述步骤中仍然找不到文件,Node.js 将开始从环境变量中查找目录路径,即 NODE_PATH 设置在您的机器(如果您在 Windows 上,显然由 Node.JS 安装程序文件设置) 然后在上述所有步骤中未找到,将堆栈跟踪打印到 stder
    例如Error:Cannot find module 'yourfile'
    更多信息:链接是here 甚至循环的require()也解释得很好..

【讨论】:

  • 非常感谢您的精彩解释。因此,将它们放在一起 - 由于与其他模块的兼容性,没有简单的方法可以做到/或者根本不应该这样做?
  • 您可以使用 require('./pathFolder/PathFile'); 获取相对路径
  • 我来这里是为了寻找一种更简单的方法来更改node_modules 文件夹的位置或名称,而我找到的唯一(并且被接受的)答案是How to find out where npm is looking for node_modules。你能看出这两个问题的区别吗?你的答案是一个答案,但不是这个问题的答案。
  • @randunel 请看这个npm FAQs,然后你就会明白这样做有多少障碍(如你所愿)。
  • @randunel 您的问题实际上并未包含在这个特定问题中,因为他想在不同的位置保留相同的命名文件夹(即node_modules)。所以,让他了解所有节点在哪里以及在哪里寻找node_modules 文件夹。您的问题的答案是“永远不会像 my/custom/path 那样发生。该文件夹被命名为 node_modules。它以 Node 方式不可磨灭地书写,从 Node 0.3 的远古时代流传下来。”
【解决方案2】:

其实我们甚至可以编辑nodevars.bat文件,其中最后一行是:

if "%CD%\"=="%~dp0" cd /d "%HOMEDRIVE%%HOMEPATH%"

我们可以指定自己的目录,而不是照看用户的主目录:

%HOMEDRIVE%%HOMEPATH%

这样 node-modules-location 会自动得到照顾。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多