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

时间:2016-12-31 11:53:49

标签: javascript java npm npm-install node-modules

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

我有一个很好的项目文件夹,其中包含带有java文件的java模块,我想将EC6 JavaScript文件添加到我的web模块中。我使用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 目录来避免重复文件并节省磁盘空间吗? 我可以在ex下存储js依赖项。 / home / user / javascript / modules 文件夹?

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

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

你能帮我吗?

修改 我做了什么:

  • 我为JS包创建了一个新文件夹: /家庭/用户/ JavaScript的模块
  • package.json 文件复制到 / home / user / javascript-modules
  • npm install --prefix / home / user / javascript-modules

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

但是当我尝试执行webpack时,我得到一个丢失的模块错误:

  • cd my-project / web-module-1 / src / main / webapp
  • ./家/用户/ JavaScript的模块/ node_modules /的.bin /的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似乎不支持我想做的事情。那太伤心了:(

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

2 个答案:

答案 0 :(得分:3)

使用pnpm而不是npm。

来自the pnpm project's website

  

pnpm使用硬链接和符号链接在磁盘上只保存一次模块版本。例如,当使用npm或Yarn时,如果你有100个项目使用相同版本的lodash,你将在磁盘上有100个lodash副本。使用pnpm,lodash将保存在磁盘上的一个位置,硬链接将把它放入应安装它的node_modules中。

安装使用:

npm install -g pnpm

要更新现有的软件包安装(以及所有子目录),请使用:

pnpm recursive install

在通常使用pnmp的任何地方使用npm。 (npm不支持此命令安全地返回pnpm个函数。

答案 1 :(得分:1)

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

npm install --prefix path_to_node_modules_location

编辑:如果没有带有package.json的本地文件夹,则无法使用它。

所有项目唯一的“共同位置”是全球项目。 全局位置包含所有常用包,本地包含项目的特定包。

但是,我不确定为不同的项目设置一个共同的本地 node_modules文件夹是个好主意,因为最终必须确保它们的依赖项不会因为包中的不同而发生冲突版本。 这意味着尝试为多个项目维护package.json。

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

  

此处的加载器相对于它们应用的资源进行了解析。这意味着它们无法相对于配置文件进行解析。如果您从npm安装了加载器并且您的node_modules文件夹不在所有源文件的父文件夹中,则webpack无法找到加载器。您需要将node_modules文件夹添加为resolveLoader.root选项的绝对路径。 (resolveLoader:{root:path.join(__ dirname,“node_modules”)})