如何在NodeJS项目之间共享通用的客户端JavaScript?

3

我是一个Node新手,正在使用Express开发一些Web应用程序,并且我有一些常见的客户端库,希望在这两个项目之间共享。这似乎是一个非常普遍的问题,因此可能已经有几个解决方案可供选择。

我来自Java背景,而在Java中,我会创建一个独立的“common”项目,并在打包过程中“覆盖”公用的WAR文件到我的项目中。这还将允许在构建过程中进行r.js优化。

在Node中,我最好的猜测是需要创建一个私有NPM模块,并通过use()中间件插件将这些常见文件映射到express中。是这样吗?

那么,如何才能使用r.js将我的常规和项目特定的JavaScript打包成一个压缩文件呢?

或者版本控制是答案吗?每个项目中都检出我的“common”存储库?

非常感谢任何帮助。谢谢。


你提到了“客户端”JavaScript,但又谈到使用Express中间件,这是服务器端的。那到底是哪个呢? - Peter Lyons
中间件的作用是将node_modules中的js文件绑定到express中的"/js/mycode.js"路由上。也许我完全错了... - Erik R.
你可以使用符号链接和静态中间件,或者将静态中间件的实例指向node_modules/my_browser_code。 - Peter Lyons
是的,我知道。我希望有一个比符号链接更优雅的解决方案。 - Erik R.
还是源代码控制是答案?在每个项目中检出我的“公共”存储库?我会选择这个。在Node中永远不会有类似于WAR打包的东西,就像其他语言(如Ruby、Python或Perl)一样。主要区别在于Java是编译的,而所有其他语言都直接在源代码形式中执行。您会注意到,即使Java也没有这种类型的.java文件管理。就像Java、Perl或Ruby一样,您可以使用源代码控制工具来管理源文件。 - slebetman
1个回答

3

这似乎是一个非常普遍的问题,因此可能已经有了几种解决方案。

好消息:是的,这是个常见问题。是的,有几个“解决方案”可供选择。

坏消息:所有的“解决方案”都至少部分糟糕。

以下是我的建议:

1)单独的.js文件应编码为CommonJS 模块

2)相关的.js文件组应制作成npm包

3A)在node中使用常规的node.js/CommonJS require 函数使用它们,并使用browserify 在浏览器中使用它们

3B)或者使用像grunt这样的构建工具将commonjs包装成AMD格式,以便在浏览器中使用requireJS

3C)或考虑使用component.io组件


谢谢。看来我对 Node 和 Express 的成熟度可能有不合理的期望。 - Erik R.
嗯,我认为你的思维有些粗糙。根本问题在于JavaScript本身在基本语言层面上没有模块系统,只是在ECMAScript 6中添加了一个。这是一个JavaScript的事情,如果你正在构建一个Web应用程序,它将会影响你,无论你使用什么样的服务器端堆栈。这同样适用于例如Ruby on Rails,这就是为什么他们有一个巨大而复杂的东西叫做Asset Pipeline来解决它的原因。 - Peter Lyons
有点同意那个评估。Node已经为JavaScript提供了非常令人印象深刻的模块化,尽管只是针对服务器端。require.js在客户端方面也在努力。似乎不太可能出现一种解决方案,将npm和require.js结合起来,以允许Web应用程序指定它需要库A、B和C的X、Y和Z版本,并进行某些构建过程,获取这些库并将其与应用程序特定代码一起进行最小化处理。显然,这还没有发生。 - Erik R.
这正是Browserify所做的事情。但是再说一遍,我尝试过的每种方法都有很棒的部分和可怕的部分。目前没有清晰的胜利者。 - Peter Lyons
谢谢你的帮助。你帮了很多忙。 - Erik R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接