Dojo构建1.7内置包不起作用

时间:2012-06-05 12:39:52

标签: javascript build dojo

我正在构建我的项目的开始,我得到一些错误,无法理解为什么他们正在发生。

您可以在下面看到my app.profile.js文件的内容。我执行 来自命令提示符的"build profile=../../app.profile.js -r"这一行,在完成该过程后我没有收到任何错误。我的问题是,如果我将这些软件包的发布(内置)版本复制到存在未构建版本的地方,我会收到太多的错误,例如“Error: multipleDefine”。即使我只复制dojo,dojox和dijit文件夹,也会出现相同的错误。

当我看到两个js文件的构建和未构建之间的差异时(例如dojo / Deferred),我意识到的唯一区别是:

//built 
define("dojo/Deferred", [ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function( 

define([ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function( 

所以我开始时有点卡住了。我想尽快使用图层来减少http请求,但我需要一些关于我提到的情况的帮助。任何帮助将不胜感激,谢谢。

app.profile.js:

var profile = { 
    basePath: "..", 
    layerOptimize: "shrinksafe.keepLines", 
    optimize: "shrinksafe", 
    releaseDir: "./release", 
    hasReport: true, 

    packages: [ 
        { 
            name: "dojo", 
            location: "./dojo" 
        }, 

        { 
            name: "dijit", 
            location: "./dijit" 
        }, 

        { 
            name: "app", 
            location: "./app" 
        }, 
        { 
            name: "dtk", 
            location: "./dtk" 
        }, 
        { 
            name: "dojox", 
            location: "./dojox" 
        } 
    ], 

    layers: { 
        "app/layers/core": { 
            include: [ 
                        "dojo/_base/declare", 
                        "dtk/core/ILifeCycle", 
                        "dtk/core/AppConfig", 
                        "dtk/core/TopicContext", 
                        "dtk/core/NavigationContext", 
                        "dojo/require", 
                        "dojo/_base/Deferred", 
                  "dojo/DeferredList", 
                        "dojo/_base/lang" 
            ] 
        }, 
        "app/layers/appcontext": { 
            include: [ 
                "dtk/core/AppContext" 
            ], 
            exclude: [ 
                "app/layers/core" 
            ] 

        } 

    } 
};

3 个答案:

答案 0 :(得分:5)

Dojo构建器将为每个模块定义添加模块标识符,除非您不告诉它。这可能会产生 multipleDefine错误

来自builder documentation

  

insertAbsMids(默认=未定义)

     
      
  • [truthy] 导致转换以确保每个AMD都定义   应用程序包含模块标识符参数。
  •   
  • [falsy]   transform对define中的模块标识符参数没有任何作用   应用。特别是,虚假值不会导致   转换以删除模块中存在的模块标识符参数   源代码。
  •   

在将 insertAbsMids :false 添加到我的个人资料中之前,我遇到了完全相同的问题。

例如:

var profile = {
    basePath: "./",
    releaseDir: "release",
    action: "release",

    layerOptimize: "shrinksafe",
    optimize: "shrinksafe",
    cssOptimize: "comments",
    mini: false,
    insertAbsMids: false,

    packages: [
        { name: "dijit", location :"dijit" },
        { name: "dojox", location :"dojox" },
        { name: "dojo", location :"dojo" }
    ]
}

答案 1 :(得分:2)

如果你的问题是在AMD模块中创建的id定义(id,[deps],factory).. 我有一个类似的问题,我不得不手动删除压缩文件上的所有id:

//built 
define([ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function()

或者,我不得不要求使用id的模块。

例如,我需要一个模块:

require(["app/Dialog"])

与添加的ID不同。

require(["demo/app/Dialog"])

这是我开始工作的唯一方式。其他人都知道如何删除我们应该永远拥有ID的id或原因?不确定这是否与您的问题相关,但是因为您展示了差异。

答案 2 :(得分:1)

这将构建一个图层,除了 discardLayer中提到的组件之外,还需要创建dojox.image.Gallery 所需的所有模块。

    layers: [ {
                    name: "../dojox/discardLayer.js",
                    discard: true,
                    dependencies: [
                            "dojox.image.Gallery",
                            "dojox.image.SlideShow",
                            "dojox.image.ThumbnailPicker"
                    ]
            },{
                    name: "../drops/layer.js",
                    layerDependencies:  [ "../dojox/discardLayer.js" ],
                    dependencies: [
                            "dojox.image.Gallery"
                    ]

尝试代替exclude,使用layerDependencies密钥 - 我认为exlude在使用dojo_source树而不是在dojo_release树中查找app / layers / core。所以在构建时你是排除未知组件。

以上示例是我曾经能够在其他地方覆盖3个丢弃的组件,但它不适合您的需要。

您需要为核心层 设置discard,而只需将其设置为依赖项(这将排除对图层的所有依赖关系,已经建成了)。

然后,根据您使用的dojo版本 - 您应该调用dojo.require("layers.core"); dojo.require("layers.appcontext")require(["layers/core", "layers/appcontext"], function() { });来声明这些图层存在。

在使用其依赖项中的任何内容之前,请使用其他需求调用来引入需求,例如: dojo.require("dijit.form.Button"); new dijit.form.Button({ ... });。该层将组件填充到缓存的哈希(dojo.cache)中并确保它们被完全声明,然后引入需求。