我有一个简单的Dojo应用程序,它只进行一次require
调用,加载所有依赖项。问题是,虽然它非常简单,但最终仍然从服务器加载~100个文件。我尝试使用Dojo构建系统来解决这个问题,但似乎我没有足够的理解。
所以我的问题是 - 给出一个依赖项列表,如下所示:
["dojo/parser",
"dijit/registry",
"dojo/dom",
"dojo/on",
"dojo/query",
"dojo/dom-class",
"dojo/request",
"dijit/form/ValidationTextBox",
"dijit/form/Select",
"dijit/form/NumberSpinner",
"dijit/form/CheckBox",
"dijit/layout/ContentPane",
"dijit/Dialog",
"dojo/NodeList-traverse",
"dojo/domReady"]
如何设置构建以创建单个文件(或多个文件,只是不是100个文件)的dojo文件?
答案 0 :(得分:5)
如果您正在使用Dojo的require()
加载程序,则可以使用build tools来合并文件并缩小。根据该网站的说法,构建工具不包含在正式版本中,因此您必须从development version获取它们(具体来说,请查看buildscripts
目录)。
Dojo文档包含有关build system的一些您可能会觉得有用的信息。
作为概念验证,以下是我采取的步骤:
转到download page,下载Source Dojo Toolkit SDK(它是唯一一个包含构建所需的util脚本的人)。
提取到某个位置(为了这篇文章,我们说它是/opt/dojo-toolkit
)。
从Dojo工具包目录(即/opt/dojo-toolkit
),运行build util:./util/buildscripts/build.sh action=release htmlFiles=/path/to/my/index.html
(小心,这减慢了我5岁的双重 - 爬行的核心)
index.html
的示例(这个正好在dojo-toolkit
目录中):
...
<head>
<script src="dojo/dojo.js"></script>
<script>
dojo.require("my.test");
</script>
</head>
...
require()
调用查找嵌套模块(我无法使其与顶级模块一起使用),所以在这种情况下,我在my
目录中有一个dojo-toolkit
目录{1}}包含test.js
个文件。该文件是主要的“引导程序”文件,它加载所有依赖项。我只是将随机require()
电话放入我的电话:
dojo.require('dijit.ProgressBar');
dojo.require('dijit.Tree');
那应该这样做。基本上,对HTML文件(包含对dojo.js的引用的文件)运行构建实用程序可以确保从顶部开始找到所有依赖项。
注意:构建系统使用内置输出创建一个release
目录,但它起初看起来有点误导 - 它似乎已经缩小了每个单独的文件,但如果你看起来在你的实际引导程序文件(my/test.js
,在这种情况下),它将是一个组合的,缩小的文件(我假设)你运行你的应用程序所需的一切。
否则,如果您使用AMD样式require()
(如require.js),则可以使用其optimization tool。根据该网站,它将:
将所有相关文件(包括require.js本身)合并到一个文件中。它分析require()
调用以确定需要合并的文件。
使用UglifyJS(默认)或Closure Compiler缩小您的JavaScript。
答案 1 :(得分:3)
我需要做同样的事情,这就是我解决它的方法。
如果您阅读了有关如何创建自定义版本(http://dojotoolkit.org/documentation/tutorials/1.8/build/)的文档,则可以在“图层”部分中讨论如何创建自定义图层。您可以添加所需的所有模块。以下是我的自定义图层文件的示例:
layers : {
"dojo/dojo" : {
include : [
"dojo/dojo",
"dojo/_base/window",//
"dojo/dom",//
"dojo/dom-class",//
"dojo/ready",//
"dojo/store/Memory"
],
customBase : true,
boot : true
}
}
这样做只会将这些模块与引导加载程序一起构建到dojo.js中,以便您可以动态加载其他模块。