将 NPM 包拼接成一个 JS 文件
Posted
技术标签:
【中文标题】将 NPM 包拼接成一个 JS 文件【英文标题】:Concatenate NPM package into one JS file 【发布时间】:2014-05-16 02:42:34 【问题描述】:我正在尝试让 Swig(模板语言)使用 Express 处理 Parse Cloud Code。 Parse Cloud Code 是一个不允许 NPM 的 Node/Express 主机。可笑,我知道。但是,我仍然可以使用 requires 语句将外部文件加载到代码中,所以我认为我可以让它工作。
所以我的问题是如何将整个 Swig 包放入一个 JS 文件中,我可以像这样从我的 Parse Express 应用程序中包含该文件:
var swig = require("./cloud/swig.js");
值得注意的是 Parse 破坏了正常的 require 语句,因此如果不修改 node_modules 文件夹中的每个文件以在其路径中包含 cloud
(这就是我上面的路径有cloud
在里面)。 Parse 在上传大量小文件时也会阻塞。在这个平台上需要串联。
我已经尝试使用 browserify 几个小时了,但是当我使用 require 语句加载 browserified 文件时,我所做的任何组合都不会暴露 Swig 对象。我认为这可能是正确的选择,因为 Browserified 文件包含来自 Swig 的所有文件,但它不会将它们暴露在外部。
我的问题是这是否可以在 browserify 中完成,如果可以,怎么做?或者是否有另一种方法可以将 NPM 存储库连接到一个文件,以便可以更轻松地从该平台包含它?
非常感谢。
【问题讨论】:
或许你可以尝试使用浏览器版本的swig。 swig.js、swig.min.js 和 document。 您是否尝试使用index.js 作为您的 BFy 入口点?输出文件 - 你应该能够在 ParseCloud 项目中要求它。 更改主机?或者如果出于某种原因它不是一个选项,请压缩/解压缩? browserify 无法解决问题 - 您需要文件夹结构,而不是单个文件。 【参考方案1】:最终,您正在尝试在 Parse Cloud 代码中使用 npm 模块,但目前这是不可能的:
https://parse.com/questions/using-npm-modules-in-cloud-code
但是,如果您只是尝试使用 Swig,那么作为一种变通方法,您可以考虑改用 underscore template。 Parse 已经包含下划线:
https://parse.com/docs/cloud_modules_guide#underscore
【讨论】:
您在发布答案之前未能阅读作者的问题,因为他指出他无法在 Parse Cloud 中使用 NPM。他没有尝试使用 npm 模块。他试图将一个 npm 模块连接到一个文件中,以便他可能需要它。要求文件确实有效。失败。【参考方案2】:Browserify 不是适合这项工作的工具。
顾名思义,browserify 旨在用于生成要在浏览器中执行的文件。它从入口点(即您传递给 browserify 的一些 JS 文件)遍历 require 调用,并将它们捆绑在一个对象中,该对象将它们的名称映射到包装模块的函数。它不希望 require
函数已经存在并且不使用它。它替换了自己的require
实现,它只做一件事:从包中查找名称,执行匹配函数并返回其exports
。
理论上你可以require
一个browserify 包,但它只会返回一个空对象(尽管它可能会与全局变量混淆)。并且很可能它可能会中断,因为捆绑的模块认为它们正在浏览器中执行。这不会有任何好处。
如果您想坚持使用主机,唯一明智的选择是从本地项目文件夹中复制 node_modules
文件夹。如果您的计算机和服务器不是 100% 兼容(例如 32 位与 64 位、Debian 与 RedHat、OSX/Windows 与 Linux),这可能不起作用,但这主要取决于您的确切依赖关系(基本上任何使用node-gyp
可能是个问题)。
Node.js 在require
调用中自动查找依赖项时使用node_modules
文件夹。如果你能以某种方式在服务器上获得一个包含正确内容的node_modules
文件夹,那么只要node_modules
包含一个模块foo
,require("foo")
就可以工作。
【讨论】:
以上是关于将 NPM 包拼接成一个 JS 文件的主要内容,如果未能解决你的问题,请参考以下文章