Dojo 1.9 создает ошибку "множественного определения" при загрузке локали
Мое приложение dojo ломается после сборки, во время загрузки приложения, выбрасывая 'multipleDefine' и выдавая эту ошибку:
Ошибка {src: "dojoLoader", info: Object}
Сообщение: множественное определение
info: Object {pid: "dojo", mid: "dojo/nls/dojo_en-us", pack: Object, url: "dojo/nls/dojo_en-us.js", выполнено: 5…}
Вот мой профиль:
var profile = {
// `basePath` is relative to the directory containing this profile file; in this case, it is being set to the
// src/ directory, which is the same place as the `baseUrl` directory in the loader configuration. (If you change
// this, you will also need to update run.js.)
basePath: '../src/',
// This is the directory within the release directory where built packages will be placed. The release directory
// itself is defined by `build.sh`. You should probably not use this; it is a legacy option dating back to Dojo
// 0.4.
// If you do use this, you will need to update build.sh, too.
// releaseName: '',
// Builds a new release.
action: 'release',
// Strips all comments and whitespace from CSS files and inlines @imports where possible.
//cssOptimize: 'comments',
// Excludes tests, demos, and original template files from being included in the built version.
mini: true,
// Uses Closure Compiler as the JavaScript minifier. This can also be set to "shrinksafe" to use ShrinkSafe,
// though ShrinkSafe is deprecated and not recommended.
// This option defaults to "" (no compression) if not provided.
optimize: '',
// We're building layers, so we need to set the minifier to use for those, too.
// This defaults to "shrinksafe" if not provided.
//layerOptimize: 'closure',
layerOptimize: '',
// Strips all calls to console functions within the code. You can also set this to "warn" to strip everything
// but console.error, and any other truthy value to strip everything but console.warn and console.error.
// This defaults to "normal" (strip all but warn and error) if not provided.
stripConsole: 'all',
// The default selector engine is not included by default in a dojo.js build in order to make mobile builds
// smaller. We add it back here to avoid that extra HTTP request. There is also a "lite" selector available; if
// you use that, you will need to set the `selectorEngine` property in `app/run.js`, too. (The "lite" engine is
// only suitable if you are not supporting IE7 and earlier.)
selectorEngine: 'acme',
//localeList:"en-gb,en-us,de-de,es-es,fr-fr,it-it,pt-br,ko-kr,zh-tw,zh-cn,ja-jp",
// Builds can be split into multiple different JavaScript files called "layers". This allows applications to
// defer loading large sections of code until they are actually required while still allowing multiple modules to
// be compiled into a single file.
layers: {
// This is the main loader module. It is a little special because it is treated like an AMD module even though
// it is actually just plain JavaScript. There is some extra magic in the build system specifically for this
// module ID.
'dojo/dojo': {
// In addition to the loader `dojo/dojo` and the loader configuration file `app/run`, we are also including
// the main application `app/main` and the `dojo/i18n` and `dojo/domReady` modules because, while they are
// all conditional dependencies in `app/main`, we do not want to have to make extra HTTP requests for such
// tiny files.
include: [ 'dojo/i18n', 'dojo/domReady', 'app/main', 'app/run' ],
// By default, the build system will try to include `dojo/main` in the built `dojo/dojo` layer, which adds
// a bunch of stuff we do not want or need. We want the initial script load to be as small and quick to
// load as possible, so we configure it as a custom, bootable base.
boot: true,
customBase: true
},
},
// Providing hints to the build system allows code to be conditionally removed on a more granular level than
// simple module dependencies can allow. This is especially useful for creating tiny mobile builds.
// Keep in mind that dead code removal only happens in minifiers that support it! Currently, only Closure Compiler
// to the Dojo build system with dead code removal.
// A documented list of has-flags in use within the toolkit can be found at
// <http://dojotoolkit.org/reference-guide/dojo/has.html>.
staticHasFeatures: {
// The trace & log APIs are used for debugging the loader, so we do not need them in the build.
'dojo-trace-api': 0,
'dojo-log-api': 0,
// This causes normally private loader data to be exposed for debugging. In a release build, we do not need
// that either.
'dojo-publish-privates': 0,
// This application is pure AMD, so get rid of the legacy loader.
'dojo-sync-loader': 0,
// `dojo-xhr-factory` relies on `dojo-sync-loader`, which we have removed.
'dojo-xhr-factory': 0,
// We are not loading tests in production, so we can get rid of some test sniffing code.
'dojo-test-sniff': 0
}
}
а вот index.html внутри src /
НОТА:
build.sh
отвечает за удаление флага "isDebug" при развертывании в производство. Если вы вообще измените этот флаг, вы нарушите сборку!
<script data-dojo-config="async: 1, tlmSiblingOfDojo: 0, locale:'en_US', isDebug: 1" src="dojo/dojo.js"></script>
<!-- Load the loader configuration script. Note that this module ID is hard-coded in build.sh in order to provide
an optimised build that loads as few as one script for the entire application. If you change the name or
location of this module, you will need to update build.sh too. -->
<script src="app/run.js"></script>
это сгенерированный index.html в dist /
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="app/resources/app.css">
</head>
<body class="claro">
<script data-dojo-config=
"async: 1, tlmSiblingOfDojo: 0, locale:'en_US', deps:['app/run']"
src="dojo/dojo.js"></script>
</body>
</html>
Я проверил, чтобы убедиться, что dojo / nls / dojo_en-us.js существует и это нормально. Я застрял в этой точке, не имея понятия!
Любая помощь, чтобы решить эту проблему приветствуется.
3 ответа
У меня была похожая проблема с ошибкой
multipleDefine
при попытке включить библиотеку greensock в мой проект dojo.
Эта проблема появляется, когда другая библиотека за пределами додзё объявляет свою собственную define
функция (в моем случае это TweenMax), поскольку они конфликтуют с загрузчиком Dojo.
Решение состоит в том, чтобы удостовериться, что загрузчик dojo вызывается после вашей библиотеки или скрипта, которые используют define
Функция загрузилась.
Так что dojo должен быть последним в вашем скрипте для загрузки в html head
:
<head>
<script src="yourLibrary.js"></script>
<script src="dojo/dojo.js"></script>
</head>
Эта проблема также видна при использовании пользовательского интерфейса jQuery и других библиотек.
Можете ли вы опубликовать ваши требования в run.js? Вам потребовалось "dojo/_base/config" там?
[просто заметил ту же ошибку, потому что я забыл ее;) ]
из документов:
Важно отметить различие между dojoConfig и dojo/_base/config. dojoConfig предназначен исключительно для целей ввода - именно так мы передаем параметры конфигурации загрузчику и модулям. Во время процесса начальной загрузки dojo / _base / config заполняется из этих параметров для последующего поиска по коду модуля.
Об этом есть примечание в документации к загрузчику (во всяком случае, во время этого ответа).
multipleDefine
AMD define была названа ссылкой на модуль, который уже был определен. Наиболее распространенной причиной этой проблемы является загрузка модулей через элементы в HTML-документе. Используйте загрузчик; не используйте элементы. Второй наиболее распространенной причиной является передача явных идентификаторов модуля для определения; не делай этого тоже.
https://dojotoolkit.org/reference-guide/1.10/loader/amd.html
Многие библиотеки теперь используют UMD, который в основном пытается автоматически определить наличие загрузчика AMD. Например, Bootstrap - популярный интерфейсный фреймворк - реализует UMD.
Так что следующий пример будет работать (обратите внимание, что bootstrap будет загружаться глобально):
<script src="path/to/bootstrap.js"></script><!--UMD packaged library-->
<script src="path/to/dojo/dojo.js"></script><!--then dojo loader-->
но второй пример ниже не будет работать, так как код UMD обнаружит загрузчик AMD и использует его для регистрации. Это вызовет ошибку множественного определения согласно документации.
<script src="path/to/dojo/dojo.js"></script><!--dojo loader first-->
<script src="path/to/bootstrap.js"></script><!--then UMD library-->
Если вы хотите загрузить библиотеку глобально, используйте первый пример выше и загрузите ее до загрузчика dojo. Если вы хотите загрузить библиотеку как модуль AMD, используйте загрузчик.