Tôi đã sử dụng Typecript trong 3 tháng qua để tạo các ứng dụng CRUD rất phức tạp. Sự an toàn thời gian biên dịch được cung cấp bởi Typecript đã cung cấp các tăng tốc đáng kể trong công việc của tôi - việc ghi lại các lỗi trong thời gian biên dịch là một Godsend, so với việc nhìn thấy chúng như là ngoại lệ và hành vi sai trái trong thời gian chạy.Tốc độ biên dịch các loại - cố gắng giải quyết nhưng bị kẹt khi hợp nhất
Có một điểm bắt.
Tôi phải xử lý hàng trăm bảng, vì vậy tôi đang sử dụng trình tạo mã tùy chỉnh được xây dựng bắt đầu từ lược đồ DB và tự động tạo nhiều tệp Typecript. Chừng nào lược đồ còn nhỏ, nó hoạt động hoàn hảo - nhưng đối với một lược đồ rất lớn chứa hàng trăm bảng, thời gian biên dịch của tsc đang trở thành vấn đề - Tôi thấy thời gian biên dịch là 15 phút cho một tập hợp 400 tệp. (cũng như lỗi biên dịch đáng sợ của "CALL_AND_RETRY_2 Phân bổ không thành công" - nghĩa là, hết các vấn đề bộ nhớ ...)
Cho đến nay, tôi đã sử dụng tsc trong một Makefile, gọi nó bằng "tsc --out ... "cú pháp, tạo ra một .js duy nhất từ tất cả các tệp .ts của tôi. Do đó, tôi nghĩ rằng tôi có thể giải quyết vấn đề này bằng cách thực hiện việc xây dựng theo kiểu tăng dần: biên dịch từng bản. (Nghĩa là, chỉ truyền một tệp .ts tới tsc tại thời điểm đó) và cuối cùng, nối tất cả các tệp được tạo .js trong một cái duy nhất. Điều này thực sự xuất hiện để làm việc - chỉ có các tập tin thay đổi cần phải được biên dịch lại trong quá trình phát triển bình thường (và chỉ biên dịch ban đầu đi qua tất cả chúng, và do đó mất rất nhiều thời gian).
Nhưng nó bật ra rằng đây cũng vậy, có một vấn đề: để làm cho mỗi .ts "độc-lập-thể", tôi đã thêm tất cả các phụ thuộc có liên quan trên đỉnh - có nghĩa là, những câu nói như
/// <reference path=...
... trên đầu mỗi tệp .ts.
Và hóa ra là do các tham chiếu này, các tệp .js được tạo ra chứa các phần giống nhau, được lặp lại trên nhiều phần ... Vì vậy, khi tôi nối các tệp .js, tôi nhận được nhiều định nghĩa cho cùng một hàm , và tệ hơn, các câu lệnh phạm vi toàn cầu (var global = new ...) lặp đi lặp lại!
Vì vậy, tôi cần một cách để bằng cách nào đó một cách thông minh "hợp nhất" các tập tin được tạo .js, để tránh nhìn thấy định nghĩa chức năng nhân rộng ...
Có một số cách để làm điều đó kết hợp một cách thông minh, tránh lặp lại? Hoặc có thể một số cách khác để đẩy nhanh quá trình biên dịch?
Bất kỳ đề xuất nào được hoan nghênh ... Tốc độ biên dịch tsc chậm hơn 30-100x so với các trình biên dịch thông thường - nó thực sự là điểm chặn ngay bây giờ.
UPDATE, 2 ngày sau
Basarat (xem câu trả lời của ông dưới đây) đã giúp tôi áp dụng giải pháp của mình trong dự án của tôi. Nó chỉ ra rằng mặc dù giải pháp của mình hoạt động hoàn hảo với các dự án có quy mô nhỏ và trung bình, với tôi, tôi đã gặp phải lỗi "FATAL ERROR: CALL_AND_RETRY_2 Phân bổ không thành công - xử lý hết bộ nhớ" - đó là lỗi tương tự khi tôi sử dụng "tsc --ngoài ...".
Cuối cùng, giải pháp Makefile của tôi dựa trên là điều duy nhất mà làm việc - làm việc đó như thế này:
%.js: %.ts
@UPTODATE=0 ; \
if [ -f "$<".md5 ] ; then \
md5sum -c "$<".md5 >/dev/null 2>&1 && { \
UPTODATE=1 ; \
} ; \
fi ; \
if [ $$UPTODATE -eq 0 ] ; then \
echo Compiling $< ; \
tsc --sourcemap --sourceRoot /RevExp/src/ --target ES5 $< || { \
rm [email protected] "$<".md5 ; \
exit 1 ; \
} ; \
md5sum "$<" > "$<".md5 ; \
fi
...có hai điều: nó sử dụng MD5 checksums để tìm ra khi nào thực sự thực hiện một trình biên dịch, và nó thực hiện việc biên dịch theo cách "độc lập" (tức là không có tùy chọn "--out" của tsc).
Trong quy tắc đích thực tế, tôi đã sử dụng để hợp nhất các tệp .js được tạo ... nhưng điều này đã để lại cho tôi mà không cần làm việc .map tệp (để gỡ lỗi) - vì vậy bây giờ tôi tạo trực tiếp bao gồm trong index.html:
${WEBFOLDER}/index.html: $(patsubst %.ts,%.js,${CONTROLLERS_SOURCES}) ${WEBFOLDER}/index.html.template
cat ${WEBFOLDER}/index.html.template > [email protected] || exit 1
REV=$$(cat revision) ; \
for i in $(patsubst %.ts,%.js,${CONTROLLERS_SOURCES}) ; do \
BASE=$$(basename $$i) ; \
echo " <script type='text/javascript' src='js/$${BASE}?rev=$$REV'></script>" >> [email protected] ; \
done || exit 1
cat RevExp/templates/index.html.parallel.footer >> [email protected] || exit 1
cp $(patsubst %.ts,%.js,${CONTROLLERS_SOURCES}) ${WEBFOLDER}/js/ || exit 1
tôi sẽ rời khỏi câu hỏi mở cho những đóng góp trong tương lai ...
Điều này có vẻ như là một lựa chọn tốt –
Basarat giúp tôi áp dụng giải pháp của mình trong dự án của tôi - nhưng nó chỉ ra rằng mặc dù nó hoạt động hoàn hảo với các dự án có kích thước nhỏ/trung bình, tôi đã nhận được thông báo "FATAL ERROR: CALL_AND_RETRY_2 Allocation failed" - quá trình hết bộ nhớ "khi tôi thử nó với dự án của mình. Cuối cùng, giải pháp dựa trên Makefile của tôi là thứ duy nhất hoạt động - tôi sẽ sửa đổi câu hỏi với giải pháp của tôi, và để nó mở cho những đóng góp trong tương lai ... – ttsiodras
@ttsiodras bạn có thể thử phiên bản mới nhất không? TS 1.0 + mặc định biên dịch nhanh mới đã được thêm – basarat