4

我刚开始构建我的项目,我遇到了一些无法理解为什么会发生的错误。

您可以在下面看到my app.profile.js文件的内容。我从命令提示符执行 "build profile=../../app.profile.js -r"此行,并且在该过程完成后我没有收到任何错误。我的问题是,如果我将这些包的发布(构建)版本复制到未构建版本存在的地方,我会收到太多诸如“ Error: multipleDefine”之类的 javascript 错误。即使我只复制 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" 
            ] 

        } 

    } 
};
4

3 回答 3

5

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

构建器文档中:

insertAbsMids(默认 = 未定义)

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

在我将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" }
    ]
}
于 2012-10-30T09:59:53.810 回答
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 的原因吗?不确定这是否与您的问题相关,但因为您显示了差异。

于 2012-06-08T01:49:41.363 回答
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密钥 - 我认为排除在您的 dojo_source 树中而不是在 dojo_release 树中查找 app/layers/core。所以在构建时排除未知组件。

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

您需要为您的核心层设置设置,而只需将其设置为依赖项(这将排除所有已构建的层的所有依赖项)。discard

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

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

于 2012-06-06T14:46:37.353 回答