Django + Django-Pipeline与Javascript "Require

5 投票
3 回答
1227 浏览
提问于 2025-04-18 11:39

我有一个模块,它会用 require 来调用一个JavaScript库。我想用Django-Pipeline来压缩我的.js文件,但在执行 collectstatic 后,网页出现了错误:

UncaughtReferenceError: require is not Defined

如果我不使用Django-Pipeline来压缩文件,正常的测试和部署在执行collect-static时都没问题。那么,怎样才能正确设置来压缩我的.js文件而不破坏依赖关系呢?文档里的信息有点少。Django-Pipeline是个合适的选择吗?

补充:我已经尝试确保在管道中先压缩“需要的”模块,但我似乎根本无法压缩调用 require 的模块,因为这样会返回错误。

3 个回答

1

可能是 PIPELINE_DISABLE_WRAPPER 这个设置。试着把它设置为 True

可以查看这个链接了解更多信息:https://django-pipeline.readthedocs.org/en/latest/configuration.html#wrapped-javascript-output

2

这是因为你的JavaScript压缩工具(比如YUGLIFY)也在压缩JavaScript的变量名,所以像require这样的名字可能被改成了xy之类的简单名字。

要解决这个问题,你需要在你的JavaScript压缩工具中设置正确的选项,以避免压缩变量名。

http://django-pipeline.readthedocs.org/en/latest/compressors.html#pipeline-yui-js-arguments

对于Yuglify来说,这个选项是mangle:False,这样就可以停止对名字的压缩了。

4

根据我的经验,把 require.js 和 django-pipeline 结合在一起是挺困难的,尽管它们都是很不错的项目。

我曾经参与过一个项目,里面用 require.js 来处理所有的 JavaScript。我尝试使用 django-pipeline,但发现它和 require.js 配合不好,没法正常工作。最后我们选择了使用 https://github.com/etianen/django-require 来处理 JavaScript,同时用 django-pipeline 来压缩 CSS。

我建议你可以试着去掉 require.js,手动把它引入的库用 pipeline 加入,或者用 require.js 来构建和压缩所有的 JavaScript 文件。你可以增加一个步骤,先把所有的 JavaScript 文件构建好,然后在模板中直接链接这些文件,或者通过 pipeline 来链接。

抱歉,这可能不是一个真正的“解决方案”,但你确实问了“django-pipeline 是正确的选择吗?” :)

撰写回答