2012-04-17 43 views
20

tl; dr: Làm cách nào để giữ plugin text.js ra khỏi tệp được tối ưu hóa của tôi khi tất cả các phụ thuộc văn bản của tôi được gạch chân?Làm cách nào để ngăn trình tối ưu hóa Require.js đưa plugin văn bản vào tệp được tối ưu hóa?

Tôi đang sử dụng Require.js optimizer (qua Nút) để tối ưu hóa một số tệp JS trong dự án của mình. Tôi đang sử dụng text plugin để tải phụ thuộc văn bản (HTML templates, CSS). Tôi đã có một mô-đun Tôi muốn tối ưu hóa, trong đó có phụ thuộc của nó, như thế này:

define(['text!core/core.css'], function(styles) { 
    // do setup stuff, return an object 
}); 

Các Require.js tài liệu nói rằng các tập tin core/core.css sẽ được inlined khi tôi chạy r.js tôi ưu hoa, mà tôi gọi như thế này:

$ r.js -o baseUrl=./src name=core out=release/test.js 

Tracing dependencies for: core 
Uglifying file: c:/path/release/test.js 

c:/path/release/test.js 
---------------- 
c:/path/src/text.js 
text!core/core.css 
c:/path/src/core.js 

Tin vui là, nó hoạt động. Khi tôi nhìn vào các tập tin được tối ưu hóa, tôi có thể thấy văn bản inlined, một cái gì đó như thế này:

define("text!core/core.css",[],function(){return"some CSS text"}), 
define("core",["text!core/core.css"],function(a){ ... }) 

Tin xấu là, các plugin text.js cũng được bao gồm - nó bổ sung thêm khoảng 3K, và bao gồm (như như tôi có thể nói) bây giờ hoàn toàn không cần thiết mã để tải các tập tin văn bản bên ngoài. Tôi biết 3K không nhiều, nhưng tôi đang cố gắng giữ mã của mình được tối ưu hóa cao, và theo như tôi hiểu được mã cho plugin văn bản thì không cần thiết nếu các phụ thuộc văn bản của tôi được inlined. Tôi có thể giữ plugin văn bản bằng cách thêm exclude=text vào cuộc gọi r.js của mình, nhưng nếu có, tôi gặp lỗi khi cố gắng sử dụng mã được tối ưu hóa trong trình duyệt cho biết không thể tải plugin text.js.

Vì vậy:

  1. Có bất kỳ lý do plugin text.js được thực sự cần thiết đây?

  2. Nếu không, là có một tùy chọn cấu hình cho r.js có thể khắc phục hành vi này, hoặc

  3. Có một dễ shim cho text.js cắm mà tôi có thể bao gồm thuyết phục Yêu cầu. js rằng plugin không cần thiết được tải?

Trả lời

15

Plugin văn bản thực sự cần thiết vì RequireJS cần kiểm tra xem plugin có triển khai phương pháp normalize trước khi truy xuất ID mô-đun thích hợp không.

Cách để loại bỏ các plugin văn bản từ xây dựng là sử dụng các thiết lập onBuildWrite để tạo ra một mô-đun Plugin rỗng như mô tả về vấn đề nhận xét này: https://github.com/jrburke/r.js/issues/116#issuecomment-4185237 - Tính năng này phải hạ cánh trên một phiên bản tương lai của r.js

Edit:

r.js bây giờ có một thiết lập gọi là stubModules thực hiện chính xác rằng:

//Specify modules to stub out in the optimized file. The optimizer will 
//use the source version of these modules for dependency tracing and for 
//plugin use, but when writing the text into an optimized layer, these 
//modules will get the following text instead: 
//If the module is used as a plugin: 
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}}); 
//If just a plain module: 
// define({}); 
//This is useful particularly for plugins that inline all their resources 
//and use the default module resolution behavior (do *not* implement the 
//normalize() method). In those cases, an AMD loader just needs to know 
//that the module has a definition. These small stubs can be used instead of 
//including the full source for a plugin. 
stubModules : ['text'] 

Đối với op hơn r.js tions kiểm tra các tập tin example.build.js.

+0

OK, cảm ơn - Tôi sẽ dùng thử.Về cơ bản câu trả lời là (3) tạo ra một shim, mà tôi có thể làm việc trong quá trình xây dựng của tôi. – nrabinowitz

+1

Đối với hậu thế - tôi đã thực hiện một shim như thế này: 'define (" text ", {load: function() {}});' và gắn nó vào đầu của tập tin tối ưu hóa của tôi. Dường như làm việc tốt – nrabinowitz

+1

Đã tự hỏi điều tương tự. 'stubModules: ['text']' thực hiện thủ thuật trong các phiên bản mới hơn của RequireJS. – superlukas