在多个项目之间共享 node_modules 目录

share node_modules directory between multiple projects

我是一名学习 EC6 的 java 开发人员。我使用 npm 下载 JavaScript 包和 webpack 来创建最终的 bundle.js 文件。

我有一个很好的项目文件夹,其中包含 java 个模块和 java 个文件,我想将 EC6 JavaScript 个文件添加到我的网络模块中。我使用 maven 来管理 java jar 依赖库。

这是我的文件夹结构:

my-project
  |-common-module
  |-ejb-module
  |-web-module-1
  |   |-src
  |       |-main
  |           |-java
  |               |-com.a.b
  |                   |-Hello.java
  |           |-webapp
  |               |-index.jsp
  |               |-bundle.js
  |               |-package.json
  |               |-webpack.config.js
  |               |-WEB-INF
  |               |-node_modules <-- I WANT THIS FOLDER TO BE MOVED AWAY FROM HERE 
  |               |-app          <-- react + ec6 javascript files
  |                   |-action
  |                   |-components
  |                   |-...
  |-web-module-2
      |-<same structure then under web-module-1>

当我在 my-project/web-module-1/src/main/webapp 文件夹中执行 npm install... 命令时,然后一个名为 node_modules 是 npm 在 webapp 目录下创建的。此文件夹包含大量文件。

我的问题是,当我处理我的第二个 Web 项目并执行相同的 npm install... 命令然后执行第二个 node_modules在my-project/web-module-2/src/main/webapp目录下创建目录,内容相同。

我可以使用一个公共的、分开的 node_modules 目录来避免重复文件并节省磁盘 space 吗? 我可以在ex下存储js依赖吗? /home/user/javascript/modules文件夹?

评论 1:我不想以 root 身份执行 npm 并使用 npm -g install!

评论 2:我也不想创建符号链接。

你能帮帮我吗?


编辑 我做了什么:

之后,必要的 JS 模块被复制到我的 javascript-modules/node-modules 目录中。不错!

但是当我尝试执行 webpack 时,我收到一个缺少模块的错误:

结果:

Hash: a6bf1a0d210729a54be9
Version: webpack 1.14.0
Time: 39ms

ERROR in Entry module not found: Error: Cannot resolve module 'babel-loader' in /home/user/java/intellijmy-project/web-module-1/src/main/webapp

评论:我的 webpack.config.js 文件包含一行内容如下:loader: 'babel-loader'

有什么方法可以为 webpack 指定 "classpath" 吗?我的意思是告诉 webpack 模块在哪里。


更新 正如您在评论中看到的那样,我尝试以多种不同方式解决我的问题,但均未成功。对我来说,webpack 似乎不支持我想做的事情。好伤心:(

就是这样。如果有人有任何有效的、好的和完整的解决方案,请与我们分享。谢谢

为了让 npm 安装在自定义位置的目录中,您需要 运行:

npm install --prefix path_to_node_modules_location

编辑:没有 package.json 的本地文件夹是不可能的。

所有项目中唯一的 'common location' 是全局项目。 全局位置包含所有常用包,本地包含项目的特定包。

但是,我不确定为不同的项目设置一个通用的 local node_modules 文件夹是否是个好主意,因为您最终必须确保他们的依赖关系不会因为包版本的不同而发生冲突。 这意味着要为多个项目维护 package.json。

为了配置 webpack 查看新位置检查 github link here

The loaders here are resolved relative to the resource which they are applied to. This means they are not resolved relative to the configuration file. If you have loaders installed from npm and your node_modules folder is not in a parent folder of all source files, webpack cannot find the loader. You need to add the node_modules folder as an absolute path to the resolveLoader.root option. (resolveLoader: { root: path.join(__dirname, "node_modules") })

使用 pnpm 代替 npm。

来自the pnpm project's website

pnpm uses hard links and symlinks to save one version of a module only ever once on a disk. When using npm or Yarn for example, if you have 100 projects using the same version of lodash, you will have 100 copies of lodash on disk. With pnpm, lodash will be saved in a single place on the disk and a hard link will put it into the node_modules where it should be installed.

  1. 要在命令中使用 npm 安装 window 使用:

     npm install -g pnpm
    
  2. 要更新现有的软件包安装(和所有子目录),请使用:

     pnpm install --recursive
    

或者,使用递归安装的快捷命令:

    pnpm i -r

在通常使用 npm 的任何地方使用 pnpm。 (当 pnpm 不支持时,此命令安全地回退到 npm 函数。