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

Javascript 在给定依赖项列表的情况下,如何将Dojo构建到单个文件中?,javascript,build,dojo,Javascript,Build,Dojo,我有一个简单的Dojo应用程序,它只执行一个require调用,加载所有依赖项。问题是,虽然它非常简单,但最终还是从服务器加载了约100个文件。我试图用Dojo构建系统解决这个问题,但似乎我没有足够深入的理解 所以我的问题是-给出一个依赖项列表,如下所示: ["dojo/parser", "dijit/registry", "dojo/dom", "dojo/on", "dojo/query", "dojo/dom-class", "dojo/request", "dijit/fo

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

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

Dojo文档包含一些关于它的信息,您可能也会发现这些信息很有用

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

  • 转到,下载源DojoToolkit SDK(它是唯一一个包含构建所需的util脚本的工具)

  • 提取到一个位置(为了这篇文章,假设它是
    /opt/dojotoolkit

  • 从Dojo toolkit目录(即
    /opt/Dojo toolkit
    )运行build-util:
    /util/buildscripts/build.sh action=release-htmlFiles=/path/to/my/index.html
    (小心,这会让我5岁的双核变得缓慢)

  • index.html
    示例(此示例正好位于
    dojo toolkit
    目录中):

    这应该可以做到。基本上,对HTML文件(包含对dojo.js的引用的文件)运行构建实用程序可以确保从顶部开始找到所有依赖项

    注意:构建系统使用构建的输出创建一个
    release
    目录,但一开始看起来有点误导-它似乎已经缩小了每个单独的文件,但是如果您查看实际的引导文件(
    my/test.js
    ,在本例中),它将是一个组合的、缩小的文件(我假定)运行应用程序所需的一切


    否则,如果您使用的是AMD样式
    require()
    (如require.js中所示),那么您可以使用它的。根据该网站,它将:

  • 将所有依赖文件(包括require.js本身)合并到一个文件中。它分析
    require()
    调用以确定需要合并哪些文件

  • 使用UglifyJS(默认)或闭包编译器缩小JavaScript


  • 我需要做同样的事情,我就是这样解决的

    如果您阅读了有关如何创建自定义构建()的文档,那么在“层”部分中,他们将讨论如何创建自定义层。您可以在那里添加所需的所有模块。以下是我的自定义图层文件的示例:

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

    我使用的是dojo的require,而其构建系统的文档无法帮助我:(我得到了神秘的错误和奇怪的输出。你能给我一个小片段,说明构建概要文件应该是什么样子以及我应该如何调用它吗?@Rogach:用一个小指南更新了答案。我完全按照你的指南做了尝试,它给了我这个错误:
    error(349)缺少顶级模块的前缀。顶级模块:fulmar
    (我怀疑
    fulmar
    是我的主.js文件,里面有
    require()
    )。你能把
    index.html
    放在什么地方吗?也许我做错了什么。@Rogach:更新了答案。
    dojo.require('dijit.ProgressBar');
    dojo.require('dijit.Tree');
    
    layers : {
    "dojo/dojo" : {
        include : [
                "dojo/dojo",
                "dojo/_base/window",//
                "dojo/dom",//
                "dojo/dom-class",//
                "dojo/ready",//
                "dojo/store/Memory"
        ],
        customBase : true,
        boot : true
    }
    }