我问过this关于在昨天没有答案的节点应用之间共享代码的问题,所以现在我有一个更具体的问题,而不是漫长的问题。
向NODE_PATH添加需求路径是不是一种坏习惯?
正如我在之前的问题中所提到的,我正在努力寻找在两个节点应用程序之间共享公共资产的方法,而我能想到的唯一明智的解决方案是使用git子模块。我将这个包含Mongoose模式等公共资产的子模块放到两个应用程序的根目录中,在必要时更新文件,然后将其拉到另一个应用程序。这是一个非常简单的过程,与应用程序自己的文件没有严重的合并问题,就像我在原始问题中想到的第三个解决方案一样。
这种结构的优点在于,我可以通过向Node的require路径添加子模块路径,仅需要folder/file.js
而不是submodule/folder/file.js
的公共资源。这也意味着我可以通过将子模块路径进一步放在路径堆栈上来覆盖子模块的公共文件与应用程序自己的相应文件(如果它们存在),这样如果找到本地文件,节点将需要而不是子模块的等价物。
但是有一个小问题。 Node的文档有the following statement关于向NODE_PATH添加需求路径:
强烈建议您将依赖项本地放在node_modules文件夹中。它们的加载速度更快,更可靠。
所以基本上这意味着它被认为是一种不好的做法并且减慢了应用程序的速度,这是我真的不想要的。或者这仅适用于全局路径,因此子模块(在应用程序的根目录中)不会出现问题?
答案 0 :(得分:2)
我不建议添加NODE_PATH
的路径。
在 package.json 中,您可以将模块直接链接到存储库网址:
"dependencies": {
"myModels": "git+https://user:pass@github.com/myAccount/my-models.git#v0.6"
"myTemplates": "git+ssh://github.com/myAccount/my-templates.git#v0.2"
}
如您所见,您可以引用标签,分支或任何您想要的内容。您可以为每个应用程序使用不同的版本。只需更新您的代码,分支和npm install
。
恕我直言,我不会使用 git子模块你可以把事搞得一团糟。您可以(意外地)在实际推送子模块之前使用对子模块的引用推送外部模块,而其他任何人都无法工作,因为他们不会只在您的机器中进行这些提交。 此外,submodules are always checked out in detached HEAD mode还有a few more issue regarding branching and merging。
如果我的论点不够好,不能使用子模块而你继续,而不是更新NODE_PATH
,你可以只添加一个代理文件到node_modules以避免相对路径:
在 node_modules / models.js :
中module.exports = require('../lib/models');
这可能不是最好的办法,但你可以避免整个应用程序中该模块的相对路径。
如果 .gitignore 下有 node_modules ,则必须省略这一个文件:
node_modules/*
!node_modules/models.js
您可能希望将其添加到 package.json 中的bundledDendencies
。是的,它有点乱,但你会避免相对的路径,并能够移动文件夹乱搞(太多)。
长话短说:将您的业务依赖关系添加到 package.json 可能就是您要找的。 p>
答案 1 :(得分:0)
所以基本上这意味着它被认为是一种不好的做法并且会降低应用程序的速度
是的,这被认为是一种不好的做法。它有时很有用,但你最好有充分的理由。
不,它不会减慢应用程序的速度。