我正在构建我的项目的开始,我得到一些错误,无法理解为什么他们正在发生。
您可以在下面看到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"
]
}
}
};
答案 0 :(得分:5)
Dojo构建器将为每个模块定义添加模块标识符,除非您不告诉它。这可能会产生 multipleDefine错误。
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)中并确保它们被完全声明,然后引入需求。