Tôi hiện đang đóng gói ứng dụng Angular 2 của mình với WebPack. Chúng tôi vẫn đang quay vòng nhanh chóng, vì vậy thay vì thêm sự chậm trễ quá trình tải xây dựng và ứng dụng của chúng tôi, chúng tôi muốn bao gồm hiếm khi thay đổi góc 2 UMD CDN được điều chế bó, ví dụ:Gói ứng dụng Góc 2 sử dụng gói UMD (không xây dựng gói nhà cung cấp)
<script src="https://npmcdn.com/@angular/[email protected]/bundles/core.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/common.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/compiler.umd.min.js"></script>
- Khi tôi chỉ cho WebPack làm điều của nó, các gói chạy tốt nhưng là một vài MB, bởi vì nó không tận dụng các gói được xây dựng sẵn hoặc tách ra Angular 2 "nhà cung cấp" mã.
- Khi tôi sử dụng Angular 2 WebPack Recommendations, ví dụ:
plugins: [ new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js") ]
, gói ứng dụng của tôi nhỏ, nhưng tôi xây dựng một gói 1MB độc đáo riêng biệt chứa hầu hết khung công tác Angular 2 trong đó, mọi bản dựng. Tệp này thay đổi một chút mỗi bản dựng tùy thuộc vào ứng dụng của tôi và không di chuyển giữa các phiên bản ứng dụng của tôi hoặc các ứng dụng khác nhau và không có lợi ích của "CDN". Tất nhiên tôi phải bao gồm tệp này để ứng dụng của tôi chạy. - Khi tôi sử dụng IgnorePlugin để lọc
@angular|rxjs
, ví dụ:plugins: [ new webpack.IgnorePlugin(/\@angular|rxjs/) ]
, nó loại trừ các tệp của nhà cung cấp, nhưng chèn các ngoại lệ mã hóa cứng/ném lỗi ở đầu gói ứng dụng của tôi. - Khi tôi sử dụng WebPack externals, ví dụ:
externals: ['@angular/core', ...
, tôi nhận được sản lượngfunction(module, exports) { module.exports = @angular/core; },
trong gói ứng dụng của mình, rõ ràng là không hoạt động. Các tài liệu WebPack không phải là terribly sắp tới, nhưng tôi nghĩ rằng tôi có thể có thể chỉ định một chức năng giải quyếtlibraryTarget
hoặc trích dẫn, mà sẽ hướng dẫn WebPack để biên dịch trong tải mô-đun. - Khi tôi bỏ WebPack hoàn toàn và sử dụng trình biên dịch trình biên dịch TypeScript (theo this guide, sử dụng gói UMD), tôi nhận được các cuộc gọi
System.register()
đề cập đến không gian tên NPM mà tôi mong đợi, ví dụ:System.register("myapp/boot", ['@angular/core', ...
, nhưng tôi vẫn đang làm việc trên cấu hình SystemJS để gọi UMD. Lưu ý phụ, tệp này có kích thước thêm 25% so với kích thước của WebPack. - Nếu tôi sử dụng SystemJS như trong mục trước, tôi muốn biên dịch này xảy ra trong khi xây dựng, hoặc như một quá trình song song, thay vì là một phần của lưu tệp. Tôi đoán SystemJS-Builder (xem câu hỏi liên quan here và here) sẽ là cách để làm điều này? Có lẽ điều này cũng sẽ tạo ra các kích thước tệp nhỏ hơn mà gói "tích hợp" của Typecript.
Làm cách nào để tạo gói ứng dụng không phụ thuộc vào gói Angular 2 được đóng gói lại độc đáo?
Tôi hiện đang xây dựng dựa trên RC3. Quá trình của tôi hiện là WebPack, như đã đề cập ở trên, nhưng tôi sẽ chuyển sang một bộ công cụ khác nếu điều đó giúp dễ dàng hơn.
Làm một số nghiên cứu khác, tôi nghĩ rằng tôi đã bị lừa bởi thuật ngữ "Loader" của WebPack. Tôi phải sử dụng một bộ nạp mô-đun, và nó không giống như WebPack có một mà sẽ làm việc cho việc này.
Để gán UMD gói không gian tên mô-đun (và dây phụ thuộc), chúng không thể được tải trong thẻ tập lệnh. Thay vào đó, chúng phải được đánh giá với bối cảnh this
nhất định để hoạt động như tham chiếu mô-đun. Điều đó có nghĩa rằng ngay cả khi tôi muốn tất cả chúng được tải đồng bộ, tôi vẫn phải cấu hình một cái gì đó khác như SystemJS để tải chúng qua dây, vì vậy ngữ cảnh của chúng được điều khiển/bọc.
Điều này Angular 2 plunker là gần những gì tôi đang tìm kiếm. Nó sử dụng các gói Angular 2 UMD, nhưng không sử dụng một gói RxJs, mặc dù có vẻ dễ dàng, đủ để thay đổi nếu tôi muốn toàn bộ thư viện RxJs.
Vâng, hiện giờ tôi cũng đang hoạt động với các gói SystemJS, mặc dù tôi vẫn đang sử dụng 'không dùng nữa bộ định tuyến', vì vậy không có nhận xét nào về vấn đề đó, bằng cách sử dụng SystemJS-Builder. Đó có phải là cách bạn đang làm điều này? Bằng cách nào đó bạn vẫn cần phải tiêu thụ các gói UMD, mã SystemJS bạn chỉ hiển thị cấu hình chúng. Bạn cũng có thể ánh xạ chúng thành các hình cầu, và ánh xạ theo cách thủ công thành các hình cầu trong cấu hình webpack "Externals", tương tự như những gì tôi đang cố gắng (sử dụng require.js chỉ vì nó nhỏ hơn). – shannon
Bạn muốn trò chuyện về điều này? – shannon
Lưu ý rằng tôi đã thường xuyên cập nhật những khám phá của mình trong câu hỏi của tôi ở trên. Tất nhiên tôi sẽ cung cấp một câu trả lời nếu tôi tìm thấy một giải pháp phù hợp trước khi một được đăng. – shannon