如何将多文件node.js应用程序转换为单个文件?

如果我有一个node.js应用程序充满了许多require语句,我怎么能编译成一个单一的.js文件? 我将不得不手动解决require语句,并确保类按正确的顺序加载。 有没有这样的工具?

让我澄清一下。

在node.js上运行的代码不是特定于节点的。 我做的唯一没有一个直接的浏览器等价物是使用require ,这就是为什么我问。 它没有使用任何节点库。

你可以使用webpack的target:'node',它将内联所有必需的模块,并将所有内容作为单独的,独立的,一个文件,nodejs模块

http://webpack.github.io/docs/configuration.html#target

如果你想发送通用的代码到浏览器,我个人会推荐一些像brequire或者requireJS这样可以“编译”你的nodeJS源码到asynchronous加载代码,同时维持顺序。

对于一个真正的编译器放到单个文件中,你可能会忽略requireJS的一个,但是我不会相信它是用高复杂性和边缘情况的大型项目。

编写一个像package.json这样的文件不应该太难,npm用这个文件来说明文件在你的包装中应该以什么顺序出现。 通过这种方式,您有责任确保所有内容都按正确的顺序压缩,然后可以编写一个简单的节点应用程序来读取您的package.json文件,并使用文件IO创build编译的脚本。

自动生成打包文件的顺序需要构build一个依赖树并进行大量的文件parsing。 这应该是可能的,但它可能会崩溃的循环依赖。 我不知道有任何图书馆为你做这个。

如果你重视你的理智, 不要使用requireJS 。 我已经看到它在一个大型项目中使用,这是一个绝对的灾难…也许是该公司最糟糕的技术select。 RequireJS被devise为在浏览器中运行,并以asynchronous方式recursion加载JS依赖关系。 这是一个可怕的想法。 浏览器吸收在networking上加载很多很多小文件; 每 一个 Webperformance的文档都会告诉你这个。 所以你很快就会很快需要一个解决scheme来一起打碎你的JS文件……在这一点上,有一个浏览器内的依赖parsing机制有什么意义呢? 即使你的生产网站被砸成一个单一的JS文件,requireJS,你的代码必须不断假设,任何依赖可能或可能不会被加载; 在一个复杂的项目中,这会导致成千上万的asynchronous加载障碍包装模块之间的每个交互点。 在我的最后一个公司,我们有一些地方的closures堆栈是12层以上的深度。 所有这些“如果加载”的逻辑,使你的代码更复杂,更难以处理。 它也膨胀的代码增加了发送到客户端的字节数。 此外,客户端必须加载requireJS库本身,这又烧了14.4k。 单独的大小应该告诉你一些关于requireJS项目中的特性蠕变的级别。 为了比较,整个underscore.js工具包只有4k。

你想要的是一个捣毁JS的编译时间步骤,而不是一个重量级的框架,将在浏览器中运行….

你应该检查出https://github.com/substack/node-browserify

Browserify正是你要求….将多个NPM模块组合成一个单一的JS文件分发给浏览器。 合并后的代码在function上与原始代码相同,开销很低(每个附加文件大约4k + 140字节,包括“require('file')”行)。 如果你挑剔的话,你可以删除大部分的4k,它提供了在浏览器中模拟常见node.js全局variables的包装(例如“process.nextTick()”)。