2012-06-05 4 views
4

Я нахожусь в начале моего проекта и получаю некоторые ошибки, которые не могут понять, почему они происходят.Dojo build 1.7 встроенных пакетов не работает

Ниже вы можете найти информацию о файле my app.profile.js. Я выполняю "build profile=../../app.profile.js -r" эту строку из командной строки, и после завершения процесса я не получаю никаких ошибок. Моя проблема в том, что если я скопирую (построенную) версию этих пакетов на место, где существуют незастроенные версии, я получаю слишком много ошибок javascript, таких как «Error: multipleDefine». Даже если я копирую только доджо, доджокс и папки dijit, те же ошибки сохраняются.

Когда я смотрю различия между встроенными и незастроенных двух JS-файлов (например, додзё/Отложенный) с той лишь разницей, я понимаю, это:

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

     } 

    } 
}; 

ответ

1

Это создаст слой, requiering все модули, необходимые для создания 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" 
        ] 

Попробуйте вместо exclude используйте клавишу layerDependencies - я думаю, что Exlude ищет приложение/слои/ядро ​​из жгутов вашего dojo_source дерева, а не в dojo_release дерева .. Так что во время создания Youre исключая неизвестный компонент ,

Приведенный выше пример - это то, что я использовал, чтобы переопределить 3 отброшенных компонентов в другом месте, однако он не подходит для ваших нужд.

Вы должны были бы Не установить discard для основного слоя и вместо того, чтобы просто установить его в качестве зависимости (что исключит все зависимости в слоях, который Allready был построен).

Затем, в зависимости от используемой версии dojo youre, вы должны позвонить 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) и, чтобы убедиться, что theyre объявлено полностью, нужно выполнить требование.

+0

см http://stackoverflow.com/questions/1400194/dojo-build-dojo-require-still-needed – mschr

+0

Спасибо за ваш ответ, теперь я меняю слой с учетом ваш ответ. Но другое дело, когда я удаляю весь раздел слоев из своего профиля и строю его, а затем заменяю встроенную версию dojo, dojox и dijit на нестрочные, я все равно получаю js-ошибки. Поэтому я думаю, что речь идет не о ошибках в разделе слоев, я думаю неправильно? – facot

2

Если ваша проблема связана с идентификатором, который создается в модуле AMD, определите (id, [deps], factory). У меня была аналогичная проблема, мне пришлось вручную удалить все идентификаторы в сжатых файлах :

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

ИЛИ, вместо этого мне потребовался модуль с использованием идентификатора.

Например, я требую модуля:

require(["app/Dialog"]) 

, которая отличалась добавлен идентификатор.

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

Это был единственный способ заставить меня работать. Кто-нибудь еще знает, как удалить идентификатор или причину, по которой у нас всегда должен быть идентификатор? Не уверен, что это связано с вашим вопросом, но так как вы показали различия.

5

Конструктор Dojo добавит идентификатор модуля для каждого определения модуля, если вы его не скажете. Это может привести к ошибке multipleDefine.

От builder documentation:

insertAbsMids (по умолчанию = не определено)

  • [truthy] Причины преобразования для того, чтобы каждый AMD определить приложение включает в себя аргумент идентификатор модуля.
  • [falsy] Преобразование ничего не делает для аргумента идентификатора модуля в определении приложений. В частности, значение фальшивки не приводит к преобразованию для удаления аргумента идентификатора модуля, который существует в исходном коде .

У меня была точно такая же проблема, пока я не добавил insertAbsMids: ложные в моем профиле.

например:

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" } 
    ] 
} 
Смежные вопросы