在给定依赖项列表的情况下,如何将Dojo构建到单个文件中?

时间:2012-12-13 06:00:20

标签: javascript build dojo

我有一个简单的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文件?

2 个答案:

答案 0 :(得分:5)

如果您正在使用Dojo的require()加载程序,则可以使用build tools来合并文件并缩小。根据该网站的说法,构建工具不包含在正式版本中,因此您必须从development version获取它们(具体来说,请查看buildscripts目录)。

Dojo文档包含有关build system的一些您可能会觉得有用的信息。

作为概念验证,以下是我采取的步骤:

  1. 转到download page,下载Source Dojo Toolkit SDK(它是唯一一个包含构建所需的util脚本的人)。

  2. 提取到某个位置(为了这篇文章,我们说它是/opt/dojo-toolkit)。

  3. 从Dojo工具包目录(即/opt/dojo-toolkit),运行build util:./util/buildscripts/build.sh action=release htmlFiles=/path/to/my/index.html(小心,这减慢了我5岁的双重 - 爬行的核心)

  4. 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。根据该网站,它将:

    1. 将所有相关文件(包括require.js本身)合并到一个文件中。它分析require()调用以确定需要合并的文件。

    2. 使用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中,以便您可以动态加载其他模块。