2012-05-01 35 views
14

Tôi muốn sử dụng trình biên dịch đóng cửa của google trên nguồn javascript mà chúng tôi đang sử dụng. Trong chế độ phát triển, chúng tôi có xu hướng phá vỡ chức năng cho nhiều tệp nhưng để sản xuất muốn kết hợp chúng thành các mô-đun.Làm cách nào để chia javascript của tôi thành các mô-đun bằng Trình biên dịch đóng cửa của Google?

Khi gọi trình biên dịch, tôi có thể cung cấp cho nó danh sách tệp để bao gồm để biên dịch, nhưng đầu ra cho thấy trình biên dịch không lưu thứ tự của danh sách tệp.

Tôi đã tìm kiếm về nó và thấy rằng tôi có thể sử dụng goog.provide/good.require để kiểm soát sự phụ thuộc giữa các tệp js khác nhau. Vấn đề với đó là nó cho biết thêm mã để js của tôi mà tôi chỉ không cần hoặc muốn, ví dụ:

goog.provide("mainFile") 

sẽ thêm này:

var mainFile = {}; 

tới file biên soạn js, một cái gì đó mà tôi không muốn. Chúng tôi không sử dụng thư viện đóng cửa google, tất cả những gì tôi muốn sử dụng là trình biên dịch.

Có cách nào để thông báo cho trình biên dịch thứ tự của các tệp mà không cần thêm chức năng "thư viện đóng cửa" mà tôi không cần? Dĩ nhiên tôi có thể tạo một công cụ của riêng mình, đầu tiên sẽ lấy tất cả các tệp, kết hợp chúng thành một trong đó sẽ là đầu vào của trình biên dịch, nhưng tôi muốn bỏ sót nếu nó có thể được thực hiện bởi trình biên dịch.


Sửa

Mục đích là để có thể sản xuất mô-đun như câu trả lời trong chủ đề này: Using the --module option in Closure Compiler to create multiple output files

Và vì vậy tôi muốn thêm vào đó là khả năng kiểm soát các tập tin đi vào mà mô-đun trong khi cũng có quyền kiểm soát theo thứ tự của họ. Hiện tại tôi không sử dụng các ký tự đại diện, nhưng tôi định làm như vậy trong tương lai (nếu có thể).

đơn giản là "cat file1.js file2.js> combined.js & & biên dịch ..." là tốt, nhưng trong trường hợp của chúng tôi phức tạp hơn một chút và chúng tôi sẽ phải viết một chương trình/tập lệnh thực hiện điều đó dựa trên một số logic. Nếu chúng ta bằng cách nào đó có thể nói cho trình biên dịch thứ tự của các tệp trong nâng cao nó có thể chỉ tiết kiệm thời gian thực hiện một chương trình như vậy.

Cảm ơn.

+1

Làm thế nào về 'mèo file1 file2> tạm && biên dịch -js temp'? – georg

+0

Bạn có sử dụng ký tự đại diện (* .js) hay bạn khai báo mỗi tệp theo thứ tự khi gọi trình biên dịch? – GillesC

+0

Tôi đã chỉnh sửa câu hỏi của mình vì nó quá lớn để nhận xét. Cảm ơn. –

Trả lời

28

Khả năng tạo trình mô-đun của trình biên dịch cung cấp công cụ mạnh mẽ để tách các tệp đầu vào thành các tệp đầu ra riêng biệt. Nó được thiết kế sao cho các mô-đun khác nhau có thể được nạp vào các thời điểm khác nhau tùy thuộc vào các tính năng cần thiết. Có nhiều cờ trình biên dịch liên quan đến các mô-đun.

Mỗi lần sử dụng cờ --module mô tả tệp đầu ra và phụ thuộc của nó. Mỗi cờ mô-đun tuân thủ cú pháp sau:

--js inputfile.js 
--module name:num_files:dependency 

Tệp kết quả đầu ra sẽ là name.js và bao gồm các tệp được chỉ định bởi cờ --js trước đó.

Tùy chọn phụ thuộc là những gì bạn sẽ quan tâm nhất. Nó chỉ định mô-đun chính là gì.Các tùy chọn mô-đun phải mô tả một cây phụ thuộc hợp lệ (bạn phải có một mô-đun cơ bản).

Dưới đây là một ví dụ:

--js commonfunctions.js 
--module common:1 
--js page1functions.js 
--js page1events.js 
--module page1:2:common 
--js page2function.js 
--module page2:1:common 
--js page1addons.js 
--module page1addons:1:page1 

Trong trường hợp này, bạn đang nói với trình biên dịch rằng page1 và các module page2 phụ thuộc vào mô-đun thông thường và các mô-đun page1addons phụ thuộc vào mô-đun page1.

Hãy nhớ rằng trình biên dịch có thể và di chuyển mã từ tệp nguồn mô-đun vào các tệp đầu ra mô-đun khác nếu nó xác định rằng nó chỉ được sử dụng bởi mô-đun đó.

Không điều nào trong số này yêu cầu thư viện đóng cửa hoặc việc sử dụng goog.require/cung cấp cuộc gọi cũng như không thêm bất kỳ mã nào vào đầu ra của bạn. Nếu bạn muốn trình biên dịch tự động xác định các phụ thuộc hoặc để có thể quản lý các phụ thuộc đó cho bạn, bạn sẽ cần goog.require/cung cấp các cuộc gọi.

+3

Bỏ phiếu. Đây là một câu trả lời ngắn gọn với một ví dụ tuyệt vời. Hoàn hảo. Khi kiểm tra câu trả lời của bạn, tôi không thể tạo các mô-đun có chứa dấu chấm hoặc dấu gạch ngang trong tên của chúng. Điều đó có thể, hay tôi đang làm điều gì đó sai? Ví dụ: '--module common.min: 1' không hoạt động đối với tôi. (Khi tôi nói không làm việc, tôi có nghĩa là không có mô-đun được tạo ra.) – Karl

+0

Tôi đã viết một ví dụ đơn giản trong blog của tôi về cách thực hiện điều này. Chia sẻ trong trường hợp những người khác quan tâm: http://www.syntaxsuccess.com/viewarticle/lazy-loading-with-the-closure-compiler – TGH

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