Dojo构建1.7构建的软件包无法运行。

4
我正在构建我的项目,但是我遇到了一些错误,无法理解为什么会出现这些错误。
您可以在下面看到my app.profile.js文件的内容。我从命令提示符中执行"build profile=../../app.profile.js -r"这行代码,并且在完成后没有出现任何错误。我的问题是,如果我将这些软件包的发布(已构建)版本复制到未构建版本存在的位置,我就会遇到太多的JavaScript错误,例如"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个回答

5

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

根据构建器文档

insertAbsMids(默认值=未定义)

  • [真值] 使转换确保每个AMD define应用都包括模块标识符参数。
  • [假值] 转换不对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" }
    ]
}

2
如果您遇到的问题是在AMD模块定义(define(id, [deps], factory))中创建的id,则我曾经遇到过类似的问题,我不得不手动删除压缩文件中的所有id:
//built 
define([ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function()

或者,我必须使用id来要求模块。

例如,我正在要求一个模块:

require(["app/Dialog"])

这与添加的id不同。

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

这是我让它工作的唯一方法。还有其他人知道如何删除ID或者为什么我们应该始终拥有一个ID吗?不确定这是否与你的问题相关,但既然你已经展示了差异。


1

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

    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"
                    ]

尝试使用 layerDependencies 键代替 exclude - 我觉得 exclude 寻找的是在你的 dojo_source 树中 app/layers/core 而不是在 dojo_release 树中.. 因此在构建时,您将排除一个未知组件。

上面的示例是我用来覆盖其他地方被丢弃的 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)中,并确保完全声明它们,以提取要求。


请参见https://dev59.com/90nSa4cB1Zd3GeqPMkYs。 - mschr
谢谢您的回答,现在我正在根据您的回复更改我的层。但是另一件事是,当我从我的配置文件中删除整个层部分并构建它时,然后将构建版本的dojo、dojox和dijit替换为非构建版本,我仍然会收到js错误。所以我认为这不是关于层部分的错误,我想错了吗? - facot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接