2013-05-17 32 views
8

tôi phá vỡ ứng dụng võ đường sau khi xây dựng, trong quá trình tải ứng dụng, ném 'multipleDefine' và đưa ra lỗi này:Dojo 1.9 build lỗi 'multipleDefine' khi tải locale

Error {src: "dojoLoader", info: Object}

nhắn: multipleDefine

info: Object {pid: "dojo", mid: "dojo/nls/dojo_en-us", pack: Object, url: "dojo/nls/dojo_en-us.js", executed: 5…}

Dưới đây là hồ sơ của tôi:

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 
} 

}

và đây là index.html bên trong src/

NOTE: build.sh is responsible for removing the "isDebug" flag when deploying to production. If you modify this flag at all, you will break the build!

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

này là tạo ra index.html trong 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> 

Tôi đã kiểm tra để đảm bảo rằng võ đường/nls/dojo_en-us.js tồn tại và nó là tốt. Tôi bị mắc kẹt vào thời điểm này, không có đầu mối!

Bất kỳ trợ giúp nào để khắc phục vấn đề này đều được đánh giá cao.

+0

Không chắc chắn nếu bạn quản lý để khắc phục điều này nhưng multipleDefine có thể do trình tạo mô đun chèn trình tạo. Xem: http://stackoverflow.com/questions/10897480/dojo-build-1-7-built-packages-does-not-work/13136546#13136546 –

Trả lời

0

Bạn có thể đăng yêu cầu của mình trong run.js không? Bạn có yêu cầu "dojo/_base/config" ở đó không?

[chỉ nhận ra lỗi tương tự vì tôi quên nó;)]

từ các tài liệu:

It is important to note the distinction between dojoConfig and dojo/_base/config. dojoConfig is purely for input purposes—this is how we communicate configuration parameters to the loader and modules. During the bootstrap process, dojo/_base/config is populated from these parameters for later lookup by module code.

0

Tôi đã có một vấn đề tương tự với lỗi

multipleDefine

khi cố gắng để đưa thư viện greensock vào dự án dojo của tôi.

Sự cố xuất hiện khi một thư viện khác bên ngoài dojo khai báo hàm define riêng của mình (trong trường hợp của tôi là TweenMax) khi chúng xung đột với trình tải dojo.

Giải pháp là đảm bảo bộ tải dojo được gọi sau khi thư viện hoặc tập lệnh sử dụng hàm define của bạn đã được tải.

Vì vậy, võ đường phải là mới nhất trong kịch bản của bạn để tải trong html head:

<head> 
    <script src="yourLibrary.js"></script> 
    <script src="dojo/dojo.js"></script> 
</head> 

Vấn đề này cũng có thể nhìn thấy bằng jQuery UI và các thư viện khác.

0

Có ghi chú về điều này trong tài liệu trình tải (tại thời điểm phản hồi này).

multipleDefine
AMD define was called referencing a module that has already been defined. The most common cause of this problem is loading modules via elements in the HTML document. Use the loader; don't use elements. The second most common cause is passing explicit module identifiers to define; don't do this either.

https://dojotoolkit.org/reference-guide/1.10/loader/amd.html

Nhiều thư viện hiện triển khai UMD mà về cơ bản sẽ cố gắng để tự động phát hiện sự tồn tại của một bộ nạp AMD. Ví dụ, Bootstrap - khung công tác front-end phổ biến - triển khai UMD.

Vì vậy, ví dụ sau sẽ làm việc (lưu ý bootstrap đó sẽ được tải toàn cầu):

<script src="path/to/bootstrap.js"></script><!--UMD packaged library--> 
<script src="path/to/dojo/dojo.js"></script><!--then dojo loader--> 

nhưng ví dụ thứ hai dưới đây sẽ không làm việc, kể từ khi mã UMD sẽ phát hiện các bộ nạp AMD và sử dụng để tự đăng ký . Điều này sẽ kích hoạt lỗi multipleDefine theo tài liệu.

<script src="path/to/dojo/dojo.js"></script><!--dojo loader first--> 
<script src="path/to/bootstrap.js"></script><!--then UMD library--> 

Nếu bạn muốn tải thư viện trên toàn cầu sử dụng ví dụ đầu tiên ở trên và tải nó qua bộ tải dojo. Nếu bạn muốn tải thư viện dưới dạng mô-đun AMD, hãy sử dụng trình tải.