Ứng dụng web Javascript và máy chủ Java, xây dựng tất cả trong Maven hay sử dụng Grunt cho ứng dụng web?


97

Chúng tôi đang làm một ứng dụng web với AngularJS và chúng tôi thích ý tưởng sử dụng Bower để quản lý phụ thuộc và Grunt để xây dựng, chạy thử nghiệm, v.v. ( Yeoman )

Máy chủ được thực hiện với Java bằng Maven, vì vậy tất nhiên chúng tôi muốn mvn installxây dựng mọi thứ đơn giản (ứng dụng web + máy chủ)

Vậy bạn đã thực hiện cách tiếp cận nào và tại sao?

1) Coi chúng như hai ứng dụng khác nhau, thực tế là chúng là như vậy. Vì vậy việc sử dụng các phương pháp / công cụ xây dựng khác nhau là có thể chấp nhận được.

2) Quên Grunt Bower, sử dụng các plugin Maven để xây dựng, chạy thử nghiệm, quản lý các phần phụ thuộc cho ứng dụng web. Nếu đó là trường hợp, những người nào?

3) Sử dụng plugin thực thi Maven để gọi Grunt để xây dựng ứng dụng web giao diện người dùng. Tôi xem đây là một vụ hack hơn là một giải pháp.

4) Khác.

Tiếp cận dễ dàng hơn để tích hợp với Jenkins là một điểm cộng.

Cảm ơn trước!


2
3 năm trôi qua, việc tích hợp công cụ rõ ràng đã được cải thiện. Plugin maven này dường như có hầu hết mọi thứ được đề cập: github.com/eirslett/frontend-maven-plugin
earcam

Câu trả lời:


73

Sau một thời gian làm việc với mọi công cụ đường ống nội dung trong bộ công cụ Java, tôi đã đưa ra một vài kết luận:

Công cụ dựa trên Java

Có một số công cụ trên mạng nhưng phổ biến nhất là JAWR và Wro4J. Vấn đề lớn nhất với cả hai là chúng hầu hết dựa trên Rhino (WRO4J hiện đã có một số hỗ trợ Node) và Rhino khá chậm so với các công cụ dựa trên Node. Bạn cũng phải xem xét rằng công cụ JavaScript đang nhanh chóng hoàn thiện, vì vậy bạn nên tìm kiếm các công cụ có thể di chuyển nhanh chóng.

  • WRO4J - Hỗ trợ rất tốt, tích hợp Maven VÀ Eclipse là rất tốt, danh sách các plugin rất phong phú và khuôn khổ đủ linh hoạt để bạn có thể viết plugin cho bất cứ thứ gì bạn cần. Nếu bạn bị giới hạn trong một đường dẫn nội dung dựa trên Java, đây chắc chắn là con đường để đi. Vấn đề với Wro4j là nó chậm (ngay cả khi nó khởi động các quy trình Node) so với các công cụ dựa trên Node.
    Để cung cấp một số con số trong thế giới thực, việc biên dịch và ghép 25 gói nội dung chứa LESS, CSS CoffeeScript và JavaScript mất khoảng ~ 35 giây khi sử dụng Rhino và ~ 15 giây khi sử dụng hỗ trợ Node của Wro4j trên iMac 2013 với 16G RAM. Sử dụng Grunt + Node mất khoảng 2 giây trên chiếc MacBook Air nhỏ bé của tôi.

  • JAWR - Các tích hợp và danh sách tính năng khá tốt nhưng tài liệu không tuyệt vời và việc viết các plugin của riêng bạn có thể hơi phức tạp. Khi tôi viết bài này ban đầu, JAWR đã ở giữa 4 năm gián đoạn nhưng hiện đã trở lại trong quá trình phát triển tích cực kể từ tháng 1 năm 2014. Nếu bạn chọn điều tra Công cụ Java, điều này đáng để điều tra.

Công cụ dựa trên nút (tích hợp với Kiến / Maven Builds)

  • Grunt - Thật dễ dàng, có một hệ sinh thái plugin tuyệt vời và cộng đồng rất lớn. Nếu có điều gì đó bạn cần làm, bạn có thể đặt cược rằng có một plugin dành cho nó - thậm chí có thể là một plugin được viết bởi những người tạo ra grunt. Những lời chỉ trích chính đối với Grunt là nó được điều khiển bởi cấu hình giúp cho việc thiết lập rất dễ dàng nhưng không phải là "Node Way". Cũng cần nhắc lại rằng các tác vụ Grunt không dễ dàng kết hợp nên đối với một đường ống xây dựng JavaScript phức tạp, Grunt có thể không lý tưởng.

  • Gulp - Gulp là sự thay thế phát triển nhanh chóng cho Grunt. Nó đồng thời theo mặc định và sử dụng các luồng để tránh ghi tạm thời vào hệ thống tệp, điều này có thể tăng tốc đáng kể cho bản dựng của bạn. Gulp rất dễ hiểu và nhấn mạnh vào mã> cấu hình và mặc dù điều này mang lại cho bạn rất nhiều sức mạnh, nhưng nó không lý tưởng cho các nhóm không có năng lực cốt lõi về JavaScript.

Nguy cơ tiềm ẩn duy nhất đối với công cụ dựa trên JavaScript là bạn sẽ phải có Node , npmgrunt-cli / gulp trên bất kỳ máy nào cần thực hiện biên dịch. Nếu bạn không có quyền truy cập vào các máy CI của mình hoặc không sử dụng triển khai dựa trên tạo tác, đây có thể là một đợt bán khó.

Tích hợp điều này vào dự án Maven của bạn khá dễ dàng và bạn có khá nhiều lựa chọn. Bạn có thể sử dụng plugin Maven ant-run , bạn có thể chạy một tác vụ kiến ​​thực thi và gọi nó từ Maven hoặc tốt nhất là bạn chỉ có thể sử dụng tác vụ thực thi maven .
Dưới đây là mã để tích hợp điều này vào vòng đời của Maven bằng cách sử dụng plugin thực thi nếu điều này hữu ích cho bất kỳ ai.

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <executions>
        <execution>
          <phase>prepare-package</phase>
          <goals>
            <goal>exec</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <executable>grunt</executable>
      </configuration>
    </plugin>

1
Cảm ơn các câu trả lời chi tiết. Tôi nghĩ tôi sẽ chọn tùy chọn Node Based Tooling. Mới đối với Grunt Tôi thích những gì tôi đã thấy cho đến nay, và sẽ thật tuyệt nếu tôi có thể có những gì tốt nhất của hai thế giới. Tôi không biết về sự tồn tại của WRO4J và JAWR. Cảm ơn một lần nữa.
void

wro4j tích hợp bộ xử lý less4j là bộ xử lý less.js dựa trên java có hiệu suất tương đương với bộ xử lý gốc node.js.
Alex Objelean,

1
Lý do tại sao wro4j không nhanh như vậy với node.js, chủ yếu là vì nó yêu cầu các hoạt động IO trên đĩa cho mỗi lần thực thi. Điều này chỉ có thể được cải thiện nếu các quy trình dựa trên node.js (chẳng hạn như lessc) cho phép biên dịch tài nguyên trong bộ nhớ.
Alex Objelean,

12
Quy trình này có hỗ trợ việc Mavenxây gruntdựng không thành công nếu quá trình xây dựng bị lỗi không?
Snekse

6
Bất kỳ tác vụ thực thi nào không trả về đúng cách sẽ làm hỏng quá trình xây dựng. stackoverflow.com/questions/3480162/…
Baer

24

Đối với bất kỳ ai vẫn đang tìm kiếm thêm thông tin về chủ đề này, một trong những người tạo ra Yeoman có một bài viết hay (được viết vài tháng sau khi câu hỏi này ban đầu được hỏi) mở rộng câu trả lời ban đầu với một chút chi tiết hơn:


Cảm ơn gấp đôi! Tôi thấy bài này là cực kỳ hữu ích và nó đã được hơn những gì tôi đang tìm kiếm,
Ryan J. McDonough

13

Sau đó, còn có frontend-maven-plugin: https://stackoverflow.com/a/19600777/320399 Nó tải xuống Node và NPM cho bạn (cục bộ cho dự án của bạn), tải Grunt qua NPM đó (chạy bởi Node đó) và sau đó chạy Grunt (thông qua Node đó). Nó tự khởi động và bạn không cần cài đặt Node trên máy để xây dựng dự án. Chỉ một lệnh; mvn cài đặt.


13

Bạn có thể muốn xem http://jhipster.github.io/ : đó là một trình tạo Yeoman, tạo ra một ứng dụng có Maven, Grunt và Bower đều hoạt động cùng nhau.

Nó hơi giống tùy chọn thứ ba của bạn, nhưng mọi thứ đều được định cấu hình cho bạn, điều này không dễ dàng. Nó cũng tạo ra các dịch vụ AngularJS và Java REST cơ bản cho bạn.


1
Đã quá muộn để dự án của tôi bắt đầu với một ứng dụng mới được tạo. Nhưng điều này rất hay và rất hữu ích, tôi sẽ cho mượn một số giải pháp từ ứng dụng đã tạo và sử dụng trong dự án của mình. Cảm ơn!
Matsemann

2
Trên thực tế, bạn chỉ cần bao gồm plugin yeoman-maven-plugin và điều này cho phép bạn đặt tất cả các công cụ cấu hình JavaScript (bower, npm, grunt) như là anh chị em vào pom.xml (chính xác nơi các tệp này nên thuộc về IMO) và mvn cài đặt nó sẽ xây dựng mọi thứ - bao gồm cả ứng dụng web của bạn trong src / main / webapp. Tôi chỉ mất chưa đầy nửa giờ để chuyển một dự án hiện có vào cấu trúc đó. Tất nhiên bạn nên có một cái nhìn tại các ứng dụng ví dụ tại github.com/jhipster/jhipster-sample-app
raven_arkadon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.