2013-10-03 9 views
8

Hầu hết các ví dụ về thiết lập RequireJS, đặt các đối tượng cấu hình trong điểm main.js nhập cảnh, một cái gì đó như thế này:Tôi có thể đặt cấu hình RequireJS trong tệp riêng biệt như thế nào và làm cho Trình tối ưu hóa r.js hoạt động?

//main.js 
require.config({ 
"paths": { 
    //libs 
    "lib1": "assets/js/lib/lib1", 
    "lib2": "assets/js/lib/lib2", 
    "lib3": "assets/js/lib/lib3", 
    "lib4": "assets/js/lib/lib4" 
    } 
}); 
//start the app 
define(["lib1"], function(lib1){/*start the app*/}); 

tôi thích để đặt các đối tượng cấu hình trong một file riêng biệt, bởi vì như nó phát triển, đó là khó khăn để duy trì trong cùng một tệp.

Các thiết lập sau đây hoạt động khi tôi chạy nó trong trình duyệt, nhưng đối với một số lý do tôi nhận được một lỗi khi chạy r.js ưu:

//config.js 
define({/*all configuration here*/}); 

//main.js 
define(["config", "require"], function(config, require){ 
    requirejs.config(config); //set configuration 
    require(["app"]); //launch app, where "app" path is defined in config.js 
}); 

Khi tôi chạy r.js, tôi nhận được sau lỗi:

*Tracing dependencies for: main

Error: ENOENT, no such file or directory 'C:\Work\project\target\app.js*

vì vậy, có vẻ như r.js không nhận các thiết lập cấu hình, bởi vì nó đang tìm kiếm app.js như một kịch bản tương đối, không phải là một mô-đun với một con đường được xác định.

Đây là tập tin build.js tôi (appDir, dir và mainConfigFile có liên quan đến các tập tin build.js):

({ 
    appDir: "../src", 
    baseUrl: ".", 
    dir: "../target", 
    mainConfigFile: "../src/main.js", 
    findNestedDependencies: true, 
    modules: [ 
     { 
      name: "main" 
     } 
    ] 
}) 

Trả lời

7

Đây là cách tôi làm việc đó. Tôi thích có tập tin cấu hình riêng biệt bởi vì tôi đang tái sử dụng nó trong các bài kiểm tra.

cấu trúc thư mục:

PROJECT 
| 
+- build (build output directory) 
| 
+- build-scripts (contains r.js, build.js) 
| 
+- WebContent 
    | 
    +- index.html (application main file) 
    | 
    +- scripts 
     | 
     +- require-cfg.js 
     | 
     +- main.js 
     | 
     +- ... 

Các tập tin cấu hình (require-cfg.js - chỉ hiển thị những thứ liên quan):

var require = { 
    baseUrl: "scripts", 
    paths: ... 
    ... 
}; 

Việc xây dựng tập tin (build.js): Mã

({ 
    appDir: "../WebContent/", 
    baseUrl: "scripts/", 
    mainConfigFile: "../WebContent/scripts/require-cfg.js", 
    paths: { 
     /* repeated from require-cfg.js */ 
    }, 
    dir: "../build", 
    optimize: "uglify2", 
    inlineText: true, 
    removeCombined: true, 

    name: "main" 
}) 

Bootstraping (index.html):

<script src="scripts/require-cfg.js"></script> 
<script src="scripts/lib/require-2.0.2-jquery-1.10.2.js"></script> 
<script src="scripts/main.js"></script> 

Tôi thực hiện r.js với cấu hình build.js bên trong thư mục build-scripts. Tối ưu hóa và kết hợp đầu ra đi đến thư mục build. Bạn có thể điều chỉnh đường dẫn cho phù hợp với nhu cầu của mình.

+0

Cảm ơn, có vẻ tốt. Về cơ bản nó giống như tôi đang làm, nhưng tôi đang cố giữ 1 thẻ script trong index.html của tôi - cụ thể là require.js. Tôi thấy bạn không sử dụng dữ liệu chính, thay vì bạn đang tải tất cả các kịch bản một cách riêng biệt. Có cách nào để tải require-config từ main.js bằng cách sử dụng yêu cầu không? Bằng cách đó bạn vẫn có thể giữ nó riêng biệt cho các bài kiểm tra – elanh

+0

Tôi nghĩ rằng việc sử dụng yêu cầu để tải require-cfg là một vấn đề về thịt gà và trứng. Tôi thích tải yêu cầu-cfg trong một bước riêng biệt, bởi vì nó cho phép tôi để cusomize nó (ví dụ: i18n) tại chỗ. Và có, 3 tập lệnh kém hơn 1 tập lệnh, nhưng đối với tôi, đó là thứ tôi có thể sống cùng. –

+0

Điều kỳ lạ là nó hoạt động đối với tôi khi tôi chạy cục bộ trong trình duyệt. Nhưng khi tôi chạy r.js thì không. Tôi dường như không hiểu tại sao. Tôi vẫn có thể tải các mô-đun với yêu cầu, không có đường dẫn được xác định, đây là lý do tại sao tôi mong đợi nó hoạt động. – elanh

Các vấn đề liên quan