简化django应用中JS文件的管理
项目描述
© 2014-2015 Thomas Khyn, MIT许可证
关于
当您的项目紧密依赖于相对大量的JavaScript代码时,处理它的自然方式是将JavaScript代码分解成几个子脚本。这既提高了可读性,也便于调试。
然而,有时您可能只希望有一个文件(例如在生产中)或者不需要在开发中为每个独立的js文件在模板中建立链接。
django-jsdir通过提供一种方法来自动链接目录树中的js文件,以及包含、排除或排序规则来解决这个问题。在这方面,它比django-pipeline要灵活得多。
django-jsdir已与Django 1.8+和最新兼容的次要Python版本(2.7和3.5)进行了测试。它可能在早期的Django版本中工作,但不保证。
如果您喜欢django-jsdir并希望感谢我/鼓励未来的开发,您可以发送一些mBTC到以下比特币地址:1EwENyR8RV6tMc1hsLTkPURtn5wJgaBfG9。
设置
使用您喜欢的安装方法,例如 pip install django-jsdir
您需要在您的 INSTALLED_APPS 中同时包含 'jsdir' 和 'django.contrib.staticfiles'。请确保将 'jsdir' 放置在 'django.contrib.staticfiles' 之前。
如果您使用的是 Jinja2,请将 'jsdir.jinja2.ext' 添加到您的 Jinja2 扩展列表中
它是如何工作的
目录连接
一个简短的实际例子比冗长的解释更好。假设您有以下 JS 文件布局
static/js/ big_script/ 00_init.js 10_helpers.js 50_core.js 99_onload.js
big_script 中的所有文件都是格式良好并带有注释的 JavaScript 文件,非常适合调试。但您必须在模板中包含 big_script 中的每个 js 文件。更糟糕的是,当部署应用程序时,您需要连接/压缩 big_script 目录并相应地更新模板。所有这些都需要完全手动完成。
直到现在。
通过使用 django-jsdir 和一些最小限度的修改,您将不再需要担心这个问题。唯一要做的就是从模板中删除所有指向 big_script/*.js 文件的 <script> 标签,并用以下内容替换
{% jsdir 'big_script' %}
django-jsdir 将处理以下操作
在开发模式下,从应用程序的静态目录提供文件时,将连接 big_script 目录树下的所有脚本。从开发者的角度来看,这不会带来任何变化,除了他不再需要更新脚本列表。
将所有嵌套的子脚本连接(可能压缩,在 django-compressor 的帮助下)到一个名为 big_script.dir.js 的文件中,这取决于文件是否已经存在,是在首次请求时或在您运行 manage.py collectstatic 时
在生产模式下连接生成的 big_script.dir.js
换句话说,您不需要更改生产模板(或费尽心思寻找一种方法以条件扩展或包含的方式编程实现)并且您不再需要手动连接和/或压缩您的 JS 文件。
include 和 exclude 关键字
django-jsdir 有方法来细化您想要显式包含或排除的目录中的哪些文件。
请按照如下方式使用它们
{% jsdir 'libs' expand=True include='jquery/jquery.js; jquery-ui/ui/*.js' exclude='effect-*.js' %}
这将加载 jquery.js 和所有 jquery-ui 文件,但不会加载效果文件。
模式
是类似 Unix 的。请参阅 fnmatch。
应提供为分号分隔的字符串(每个模式的开始和结尾处的空格都被删除)或,对于 jinja2 模板,作为列表或元组
‘file.js’ 将匹配 ‘file.js’ 和 ‘file.min.js’
name 关键字
name 关键字仅在您多次加载目录时使用,以避免连接时的名称冲突。
例如
{% jsdir 'libs' exclude='jquery-ui/**' %} {% jsdir 'libs' name='jquery-ui' include='jquery-ui/**' %}
在生产模式下,将创建2个文件 libs.dir.js 和 libs.jquery-ui.dir.js。 libs.dir.js 将包含所有库除了 jquery-ui,而 libs.jquery-ui.dir.js 将只包含 jquery-ui。
这在需要生成两个包含不同库且位于同一目录中的文件时尤其有用(例如,当使用 bower 管理JavaScript库时)。
包含目录中的所有文件
有时,您可能希望从目录中导入JavaScript文件,而无需看到它们被完全连接。如果您有一个包含JavaScript库的 'lib' 文件夹,这种情况就适用。在这种情况下,您可以使用标签参数 expand
{% jsdir 'lib/' expand=True %}
在生产(即 DEBUG = False)时,jsdir 会查找脚本的最小化版本(文件名为 *.min.js)并返回相应的HTML标签。如果您不希望这种行为,可以使用标签参数 minified 并将其设置为 False
{% jsdir 'lib' expand=True minified=False %}
请记住,HTML标签在文档中出现的顺序,以及因此JS文件将被加载的顺序仍然是字母顺序。但是,您可以要求 django-jsdir 首先或最后加载某些文件。
first 和 last 关键字
如果您想在包含的展开目录中首先加载某些文件,django-jsdir 提供了 first 和 last 关键字。
请按照如下方式使用它们
{% jsdir 'lib' expand=True first='1st_pattern; 2nd_pattern' last='verylast_parttern; 2ndtolast_pattern' %}
任何名称与glob模式 '1st_pattern' 匹配的文件都将先于任何名称与 '2nd_pattern' 匹配的文件加载,这些文件将先于任何其他文件加载,这些文件将先于任何名称与 '2ndtolast_pattern' 匹配的文件加载,这些文件将先于任何名称与 'verylast_pattern' 匹配的文件加载。
压缩
如果您希望压缩 big_script.dir.js,django-jsdir 可以轻松地与 django-compressor 集成。在生产中,脚本会像其他JS文件一样被压缩。只需使用
{% compress %} {% jsdir 'big_script' %} {% endcompress %}
设置
- JSDIR_JSURL
访问JavaScript文件目录的默认URL,相对于静态文件根目录。默认为 'js'。此前缀可以使用 'absolute' 路径绕过(例如 {% jsdir '/path/to/dir' %})。