2013-04-11 39 views
33

Tôi hoàn toàn là người mới sử dụng AngularJ và mặc dù tôi đã trải qua các hướng dẫn, tôi vẫn có vô số câu hỏi chưa được trả lời trong đầu. Mối quan tâm chính của tôi bây giờ là làm thế nào tôi nên chia ứng dụng của tôi thành các mô-đun? Về cơ bản tôi cần xây dựng một ứng dụng sẽ đóng vai trò như một cổng thông tin cho các ứng dụng khác nhau, mỗi ứng dụng đại diện cho một chức năng kinh doanh (đôi khi ít hoặc không có mối quan hệ với nhau).Cấu trúc ứng dụng AngularJS của tôi

Trong hướng dẫn, chúng hiển thị cách tạo một ứng dụng có nhiều chế độ xem. Những gì tôi cần, là một ứng dụng với nhiều mô-đun, mỗi mô-đun có quan điểm riêng của mình (và có lẽ tôi cũng sẽ có lượt xem được chia sẻ).

Có ai đã làm việc trên một ứng dụng có loại cấu trúc đó không? Bạn có thể chia sẻ trải nghiệm của mình và cách bạn tổ chức mọi thứ không?

Dự án AngularJS Seed (https://github.com/angular/angular-seed) là tốt nhưng nó không thực sự cho thấy cách xây dựng một ứng dụng phức tạp.

+0

bạn không cần phải tạo một ứng dụng lớn nếu bạn có nhiều ứng dụng không liên quan, chỉ cần tạo một ứng dụng cho mỗi doanh nghiệp. Ứng dụng có thể sử dụng lại các dịch vụ, bộ điều khiển và chỉ thị khác của ứng dụng. Hãy nhớ rằng một "ứng dụng web" vẫn là một trang web, không có vấn đề gì, nó không giống như một phần mềm máy tính để bàn. – mpm

+1

Tôi có thể thể hiện bản thân mình không chính xác. Tôi chỉ có một ứng dụng, nhưng đó là BIG. Và tôi muốn chia nó thành nhiều mô-đun kinh doanh khác nhau. Mỗi mô-đun kinh doanh sẽ chứa tập hợp các chế độ xem, chỉ thị, bộ điều khiển riêng của nó, v.v. Nhưng cuối cùng, đó là cùng một ứng dụng web, chỉ với một điểm vào. Đó có phải là cách tiếp cận tốt hay không và tôi nên tổ chức mã của mình như thế nào? – Sam

+0

không quan trọng, bạn có thể chia các tệp theo ý muốn. Một số người sử dụng 1 tập tin cho mỗi dịch vụ, bộ điều khiển hoặc chỉ thị, một số người chia nó cho mỗi 'tính năng', không thực sự quan trọng vì tiêm phụ thuộc. bạn có thể mở lại một mô-đun qua nhiều tệp, v.v ... thực sự nó là vấn đề về hương vị. Bạn chỉ cần tất cả các tập tin js của bạn trong html của bạn ở cuối. Cá nhân tôi có 1 tệp cho mỗi loại (1 tệp cho dịch vụ, 1 tệp cho chỉ thị, 1 cho bộ điều khiển) ngay cả đối với các ứng dụng lớn. – mpm

Trả lời

31

[EDIT] tôi đã viết một bài báo trên blog của tôi để giải thích mọi thứ chi tiết hơn:

read it on sam-dev.net và bạn có thể bây giờ read part II, với mẫu mã.

Tôi sẽ trả lời câu hỏi của riêng mình. Không phải vì tôi nghĩ đó là cách tiếp cận tốt nhất, nhưng chỉ vì đó là một trong những tôi đã quyết định đi cùng.

Đây là cách tôi đã chia module doanh nghiệp của tôi vào các thư mục

  • ứng dụng
    • businessModule
      • điều khiển
        • index.js
        • firstCtrl.js
        • secondCtrl.js
      • chỉ
      • dịch vụ
      • xem
      • lọc
    • anotherBusinessModule
    • chia sẻ
    • app.js
    • index.html

Mỗi module có cấu trúc thư mục riêng của mình để điều khiển, chỉ thị, vv ...

Mỗi thư mục có một tập tin index.js và sau đó các file khác để tách từng bộ điều khiển, mỗi chỉ thị, vv ..

Tệp index.js chứa định nghĩa của mô-đun. Ví dụ: đối với bộ điều khiển của businessModule ở trên:

angular.module('myCompany.businessModule.controllers', []); 

Không có phụ thuộc ở đây, nhưng có thể có bất kỳ phụ thuộc nào.

Sau đó, trong firstCtrl.js, tôi có thể tái sử dụng mô-đun đó và thêm bộ điều khiển để nó:

angular.module('myCompany.businessModule.controllers').controller('firstCtrl',  

     function(){ 
}); 

Sau đó app.js tập hợp tất cả các mô-đun mà tôi muốn cho các ứng dụng của mình bằng cách thêm chúng vào các phụ thuộc mảng.

angular.module('myApp', ['myCompany.businessModule', 'myCompany.anotherBusinessModule']); 

Thư mục được chia sẻ chứa chỉ thị và những thứ khác không cụ thể cho mô-đun kinh doanh và có thể được sử dụng lại ở mọi nơi.

Một lần nữa, tôi không biết đó có phải là cách tiếp cận tốt nhất, nhưng nó chắc chắn có hiệu quả đối với tôi hay không. Có lẽ nó có thể truyền cảm hứng cho người khác.

EDIT

Như các tập tin index.js chứa module khai báo, họ phải được tham chiếu trong trang html trước khi bất kỳ kịch bản ứng dụng khác. Để làm như vậy, tôi đã sử dụng IBundleOrderer của ASP.NET MVC 4:

var bundle = new ScriptBundle("~/bundles/app") { Orderer = new AsIsBundleOrderer() }; 
bundles.Add(bundle.IncludeDirectory("~/app", "*.js", true)); 

public class AsIsBundleOrderer : IBundleOrderer 
{ 
    public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files) 
    { 
     files = files.OrderBy(x => x.Name == "index.js" ? 0 : 1); 
     return files; 
    } 
} 
+0

Thú vị ... bạn có thể vui lòng chỉ cho tôi cách bạn đã sắp xếp các thẻ "tập lệnh" không? – daveoncode

+0

xem EDIT trong bài đăng của tôi. Bạn phải chèn các kịch bản lệnh index.js trước các kịch bản ứng dụng khác. – Sam

+0

Làm thế nào để bạn tiêm dịch vụ mô-đun vào bộ điều khiển ứng dụng? Tôi đã thử một cái gì đó tương tự và sửa đổi mã của tôi để làm theo cách tiếp cận của bạn, nhưng tôi nhận được sợ hãi "không rõ nhà cung cấp: xProvider" lỗi khi tôi cố gắng tiêm dịch vụ "myModule.x" vào bộ điều khiển của tôi. – jdp

3

bạn nên truy cập vào cấu trúc máy phát điện https://github.com/yeoman/yeoman và yeoman: https://github.com/yeoman/generator-angular, nó trở thành giải pháp tốt hơn để thiết lập ứng dụng hơn so với hạt góc. Đối với các mô-đun kinh doanh khác nhau, bạn nên tạo các ứng dụng khác nhau và chia sẻ các dịch vụ và chỉ thị

+1

Vâng, từ trang web yeoman: 'Bản beta này chưa hoạt động trên Windows. Chúng tôi sẽ làm việc chăm chỉ để khắc phục điều này đối với bản phát hành cuối cùng. ' Tôi không thể sử dụng nó sau đó :) – Sam

+0

Máy phát điện Yeoman cung cấp cho bạn cấu trúc "theo loại tệp", phù hợp cho các ứng dụng nhỏ nhưng không thực sự tuyệt vời khi ứng dụng của bạn phát triển IMO. – Mat

1

Việc vẽ lại tôi đã tìm thấy cách tiếp cận máy phát điện yeoman là nó không thực sự xếp hàng với các mô-đun góc để nó không cảm thấy rất gắn kết với tôi. Vì vậy, như dự án được lớn hơn và bạn đang làm việc trên một thành phần cụ thể tôi thấy mình flipping xung quanh rất nhiều trong cây nguồn.

Gần đây, tôi đã xem một cách tiếp cận khác nhau here. Cách tiếp cận này nhóm các tệp theo mô-đun góc và cảm thấy gắn kết hơn với tôi. Một nhược điểm có thể xảy ra với điều này là thực tế bạn được yêu cầu xây dựng trang web mà bạn không thể chạy nó tại chỗ. Các nhiệm vụ xem grunt trong dự án đó giúp với điều này mặc dù.

+0

Đây là cấu trúc "đi tới" được đề xuất cho hầu hết các ứng dụng góc cạnh. – dmackerman

11

Phương pháp của Sam dường như là cách để đi trong hầu hết các trường hợp. Các tài liệu hiện tại Angular có nó thiết lập như là một mô-đun cho mỗi bộ điều khiển, dịch vụ, vv, nhưng điều này đã được mâu thuẫn bởi Miško mình từ google.

Trong một video gần đây Angularjs Best Practices bởi Miško, ông cho biết cấu trúc của mô-đun có thể được đặt ra để dễ dàng kiểm tra cũng như dễ dàng mở rộng quy mô. Hãy ghi nhớ cách bạn cấu trúc các mô-đun không phải là ảnh hưởng đến hiệu suất trong một ứng dụng góc.

Từ khi phát triển các ứng dụng góc cạnh, tôi khuyên bạn nên sử dụng phương pháp thực hành tốt nhất cho các lý do đã nêu ở trên. Bạn có thể muốn tạo tập lệnh nút của riêng bạn để tạo bộ điều khiển, vv trong thời gian có thể bao gồm nói mô-đun bạn muốn tạo bộ điều khiển và tên, sau đó sẽ tự động tạo bộ điều khiển và tạo thông số thử nghiệm thích hợp.

Nếu bạn muốn đọc kỹ về thiết lập, hãy an excellent post here về việc thiết lập dự án dựa trên nơi bạn nghĩ rằng nó sẽ được nhóm.

+4

Thực tiễn tốt nhất của AngularJS vid là GOLD. – MFB

+0

Câu trả lời rất ngắn từ video: chia mô-đun theo FEATURE. Hãy ghi nhớ rằng một mô-đun nhất định (hay còn gọi là tính năng) có thể phụ thuộc vào nhiều bộ điều khiển, dịch vụ, vv, do đó, nó có ý nghĩa để giữ tất cả các mô-đun đó trong cùng một mô-đun. Bằng cách đó, nếu bạn cần một số tính năng từ một phần khác của ứng dụng, chỉ cần có được một tham chiếu cho các mô-đun tương ứng và bạn tốt để đi. – rmpt

2

Đối với những người quan tâm, tôi đã thực hiện một phiên bản "module" của Seed góc phù hợp hơn với thông lệ tốt nhất Misko của: https://github.com/sanfordredlich/angular-brunch-seed-modularized

Nó thiết lập với Brunch vì vậy bạn rất nhanh chóng có được nạp lại trang, chạy thử và nhiều hơn hơn. Bạn có thể phát triển nhanh chóng và nếu bạn làm theo các mẫu trong mã, ứng dụng của bạn nên mở rộng hợp lý. Thưởng thức!

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