Cách tốt nhất để tổ chức mã jQuery / JavaScript (2013) [đã đóng]


104

Vấn đề

Câu trả lời này đã được trả lời trước đây nhưng đã cũ và không cập nhật. Tôi có hơn 2000 dòng mã trong một tệp và như tất cả chúng ta đều biết đây là một thực tiễn không tốt, đặc biệt khi tôi đang xem qua mã hoặc thêm các tính năng mới. Tôi muốn tổ chức tốt hơn mã của mình, cho hiện tại và cho tương lai.

Tôi nên đề cập rằng tôi đang xây dựng một công cụ (không phải là một trang web đơn giản) với rất nhiều nút, phần tử giao diện người dùng, kéo, thả, trình nghe / xử lý hành động và hoạt động trong phạm vi toàn cầu nơi một số người nghe có thể sử dụng cùng một chức năng.

Mã mẫu

$('#button1').on('click', function(e){
    // Determined action.
    update_html();
});

... // Around 75 more of this

function update_html(){ .... }

...

Thêm mã mẫu

Phần kết luận

Tôi thực sự cần tổ chức mã này để sử dụng tốt nhất và không lặp lại chính mình và có thể thêm các tính năng mới và cập nhật các tính năng cũ. Tôi sẽ làm việc này một mình. Một số bộ chọn có thể là 100 dòng mã, số khác là 1. Tôi đã xem xét một chút require.jsvà thấy nó hơi lặp lại và thực sự viết nhiều mã hơn mức cần thiết. Tôi sẵn sàng đón nhận bất kỳ giải pháp khả thi nào phù hợp với tiêu chí này và liên kết đến tài nguyên / ví dụ luôn là một điểm cộng.

Cảm ơn.


Nếu bạn muốn thêm backbone.js và request.js thì sẽ rất nhiều việc.
jantimon

1
Bạn thấy mình phải làm đi làm lại những công việc gì khi viết bài này?
Mike Samuel

4
Bạn đã truy cập codereview.stackexchange.com chưa?
Antony

4
Tìm hiểu Angular! Đó là tương lai.
Onur Yıldırım,

2
Mã của bạn không nên ở một liên kết bên ngoài, nó phải ở đây. Ngoài ra, @codereview là một nơi tốt hơn cho các loại câu hỏi tehse.
George Stocker

Câu trả lời:


98

Tôi sẽ điểm qua một số điều đơn giản có thể giúp bạn hoặc có thể không. Một số có thể rõ ràng, một số có thể cực kỳ phức tạp.

Bước 1: Chia nhỏ mã của bạn

Tách mã của bạn thành nhiều đơn vị mô-đun là bước đầu tiên rất tốt. Làm tròn những gì hoạt động "cùng nhau" và đặt chúng trong đơn vị nhỏ được bọc của riêng chúng. đừng lo lắng về định dạng ngay bây giờ, hãy giữ nó nội tuyến. Cấu trúc là một điểm sau.

Vì vậy, giả sử bạn có một trang như thế này:

nhập mô tả hình ảnh ở đây

Sẽ rất hợp lý khi phân chia ngăn để tất cả các trình xử lý / liên kết sự kiện liên quan đến tiêu đề đều ở trong đó, để dễ bảo trì (và không phải sàng lọc qua 1000 dòng).

Sau đó, bạn có thể sử dụng một công cụ như Grunt để xây dựng lại JS của bạn trở lại thành một đơn vị duy nhất.

Bước 1a: Quản lý sự phụ thuộc

Sử dụng thư viện như RequestJS hoặc CommonJS để triển khai một thứ gọi là AMD . Tải mô-đun không đồng bộ cho phép bạn trình bày rõ ràng mã của bạn phụ thuộc vào điều gì, sau đó cho phép bạn giảm tải việc gọi thư viện tới mã. Bạn chỉ có thể nói "Cái này cần jQuery" theo nghĩa đen và AMD sẽ tải nó và thực thi mã của bạn khi có jQuery .

Điều này cũng có một viên ngọc ẩn: việc tải thư viện sẽ được thực hiện vào lần thứ hai DOM đã sẵn sàng, không phải trước đó. Điều này không còn tạm dừng tải trang của bạn nữa!

Bước 2: Modularize

Xem khung dây? Tôi có hai đơn vị quảng cáo. Rất có thể họ sẽ có những người nghe sự kiện được chia sẻ.

Nhiệm vụ của bạn trong bước này là xác định các điểm lặp lại trong mã của bạn và cố gắng tổng hợp tất cả những điều này thành các mô-đun . Các mô-đun, ngay bây giờ, sẽ bao gồm mọi thứ. Chúng tôi sẽ chia nhỏ mọi thứ khi chúng tôi tiếp tục.

Toàn bộ ý tưởng của bước này là đi từ bước 1 và xóa tất cả các copy-pasta, để thay thế chúng bằng các đơn vị được ghép nối lỏng lẻo. Vì vậy, thay vì có:

ad_unit1.js

 $("#au1").click(function() { ... });

ad_unit2.js

 $("#au2").click(function() { ... });

Tôi sẽ có:

ad_unit.js:

 var AdUnit = function(elem) {
     this.element = elem || new jQuery();
 }
 AdUnit.prototype.bindEvents = function() {
     ... Events go here
 }

page.js:

 var AUs = new AdUnit($("#au1,#au2"));
 AUs.bindEvents();

Điều này cho phép bạn phân chia giữa các sự kiệnđánh dấu của bạn ngoài việc loại bỏ sự lặp lại. Đây là một bước khá tốt và chúng tôi sẽ mở rộng thêm về sau.

Bước 3: Chọn một khuôn khổ!

Nếu bạn muốn mô-đun hóa và giảm số lần lặp lại hơn nữa, có một loạt các khuôn khổ tuyệt vời xung quanh việc triển khai các phương pháp tiếp cận MVC (Model - View - Controller). Tôi thích nhất là Backbone / Spine, tuy nhiên, cũng có Angular, Yii, ... Danh sách vẫn tiếp tục.

Một mẫu đại diện cho dữ liệu của bạn.

Một Xem đại diện mark-up của bạn và tất cả các sự kiện liên quan đến nó

Một điều khiển đại diện cho logic kinh doanh của bạn - nói cách khác, bộ điều khiển nói với trang gì xem để tải và những gì mô hình để sử dụng.

Đây sẽ là một bước học tập quan trọng, nhưng giải thưởng rất đáng giá: nó ủng hộ mã mô-đun sạch sẽ hơn mì spaghetti.

Có rất nhiều thứ khác bạn có thể làm, đó chỉ là những hướng dẫn và ý tưởng.

Các thay đổi dành riêng cho mã

Dưới đây là một số cải tiến cụ thể cho mã của bạn:

 $('.new_layer').click(function(){

    dialog("Create new layer","Enter your layer name","_input", {

            'OK' : function(){

                    var reply = $('.dialog_input').val();

                    if( reply != null && reply != "" ){

                            var name = "ln_"+reply.split(' ').join('_');
                            var parent = "";

                            if(selected_folder != "" ){
                            parent = selected_folder+" .content";
                            }

                            $R.find(".layer").clone()
                            .addClass(name).html(reply)
                            .appendTo("#layer_groups "+parent);

                            $R.find(".layers_group").clone()
                            .addClass(name).appendTo('#canvas '+selected_folder);

            }

        }

    });
 });

Điều này được viết tốt hơn là:

$("body").on("click",".new_layer", function() {
    dialog("Create new layer", "Enter your layer name", "_input", {
         OK: function() {
             // There must be a way to get the input from here using this, if it is a standard library. If you wrote your own, make the value retrievable using something other than a class selector (horrible performance + scoping +multiple instance issues)

             // This is where the view comes into play. Instead of cloning, bind the rendering into a JS prototype, and instantiate it. It means that you only have to modify stuff in one place, you don't risk cloning events with it, and you can test your Layer stand-alone
             var newLayer = new Layer();
             newLayer
               .setName(name)
               .bindToGroup(parent);
          }
     });
});

Trước đó trong mã của bạn:

window.Layer = function() {
    this.instance = $("<div>");
    // Markup generated here
};
window.Layer.prototype = {
   setName: function(newName) {
   },
   bindToGroup: function(parentNode) {
   }
}

Đột nhiên, bạn có một cách để tạo một lớp tiêu chuẩn từ bất kỳ đâu trong mã của mình mà không cần sao chép dán. Bạn đang làm điều này ở năm nơi khác nhau. Tôi vừa lưu cho bạn năm bản sao chép.

Một lần nữa:

// Trình bao bọc bộ quy tắc cho các hành động

var PageElements = function(ruleSet) {
ruleSet = ruleSet || [];
this.rules = [];
for (var i = 0; i < ruleSet.length; i++) {
    if (ruleSet[i].target && ruleSet[i].action) {
        this.rules.push(ruleSet[i]);
    }
}
}
PageElements.prototype.run = function(elem) {
for (var i = 0; i < this.rules.length; i++) {
    this.rules[i].action.apply(elem.find(this.rules.target));
}
}

var GlobalRules = new PageElements([
{
    "target": ".draggable",
    "action": function() { this.draggable({
        cancel: "div#scrolling, .content",
        containment: "document"
        });
    }
},
{
    "target" :".resizable",
    "action": function() {
        this.resizable({
            handles: "all",
            zIndex: 0,
            containment: "document"
        });
    }
}

]);

GlobalRules.run($("body"));

// If you need to add elements later on, you can just call GlobalRules.run(yourNewElement);

Đây là một cách rất hiệu quả để đăng ký các quy tắc nếu bạn có các sự kiện không chuẩn hoặc các sự kiện tạo. Điều này cũng thực sự nghiêm túc khi được kết hợp với hệ thống thông báo pub / sub và khi bị ràng buộc với một sự kiện, bạn sẽ kích hoạt bất cứ khi nào bạn tạo các phần tử. Fire'n'forget sự kiện mô-đun ràng buộc!


2
@Jessica: tại sao một công cụ trực tuyến phải khác biệt? Cách tiếp cận vẫn giống nhau: phân chia / mô-đun hóa, thúc đẩy khớp nối lỏng lẻo giữa các thành phần bằng cách sử dụng một khuôn khổ (tất cả chúng đều đi kèm với ủy quyền sự kiện ngày nay), chia nhỏ mã của bạn. Điều gì ở đó không áp dụng cho công cụ của bạn ở đó? Thực tế là bạn có rất nhiều nút?
Sébastien Renauld

2
@Jessica: Đã cập nhật. Tôi đã đơn giản hóa và sắp xếp hợp lý việc tạo các Lớp bằng cách sử dụng một khái niệm tương tự như a View. Vì thế. Làm thế nào điều này không áp dụng cho mã của bạn?
Sébastien Renauld

10
@Jessica: Chia nhỏ thành các tệp mà không tối ưu hóa giống như mua thêm ngăn kéo để chứa rác. Một ngày nào đó, bạn phải dọn sạch sẽ, và việc dọn sạch sẽ dễ dàng hơn trước khi ngăn kéo đầy ắp. Tại sao không làm cả hai? Ngay bây giờ, trông giống như bạn sẽ muốn có một layers.js, sidebar.js, global_events.js, resources.js, files.js, dialog.jsnếu bạn chỉ cần đi để tách mã của bạn lên. Sử dụng gruntđể xây dựng lại chúng thành một và Google Closure Compilerđể biên dịch và thu nhỏ.
Sébastien Renauld

3
Khi sử dụng request.js, bạn cũng phải thực sự xem xét trình tối ưu hóa r.js, đây thực sự là điều làm cho request.js trở nên đáng sử dụng. Nó sẽ kết hợp và tối ưu hóa tất cả các tệp của bạn: Requijs.org/docs/optimization.html
Willem D'Haeseleer

2
@ SébastienVì câu trả lời và nhận xét của bạn vẫn được những người dùng khác đánh giá cao. Nếu điều đó có thể làm cho bạn cảm thấy tốt hơn;)
Adrien Be

13

Đây là một cách đơn giản để chia cơ sở mã hiện tại của bạn thành nhiều tệp, bằng cách sử dụng request.js. Tôi sẽ chỉ cho bạn cách tách mã của bạn thành hai tệp. Việc thêm các tệp khác sẽ dễ dàng sau đó.

Bước 1) Ở đầu mã của bạn, tạo một đối tượng Ứng dụng (hoặc bất kỳ tên nào bạn thích, như MyGame):

var App = {}

Bước 2) Chuyển đổi tất cả các biến và hàm cấp cao nhất của bạn thành thuộc đối tượng Ứng dụng.

Thay vì:

var selected_layer = "";

Bạn muốn:

App.selected_layer = "";

Thay vì:

function getModified(){
...
}

Bạn muốn:

App.getModified = function() {

}

Lưu ý rằng tại thời điểm này, mã của bạn sẽ không hoạt động cho đến khi bạn hoàn thành bước tiếp theo.

Bước 3) Chuyển đổi tất cả các tham chiếu hàm và biến toàn cục để chuyển qua Ứng dụng.

Thay đổi những thứ như:

selected_layer = "."+classes[1];

đến:

App.selected_layer = "."+classes[1];

và:

getModified()

đến:

App.GetModified()

Bước 4) Kiểm tra mã của bạn ở giai đoạn này - tất cả sẽ hoạt động. Bạn có thể sẽ gặp một vài lỗi lúc đầu vì bạn đã bỏ sót điều gì đó, vì vậy hãy sửa những lỗi đó trước khi tiếp tục.

Bước 5) Thiết lập requestjs. Tôi giả sử bạn có một trang web, được cung cấp từ một máy chủ web, có mã là:

www/page.html

và jquery trong

www/js/jquery.js

Nếu những đường dẫn này không chính xác như thế này, thì bên dưới sẽ không hoạt động và bạn sẽ phải sửa đổi các đường dẫn.

Tải xuống requestjs và đặt request.js vào www/jsthư mục của bạn .

trong của bạn page.html, hãy xóa tất cả các thẻ tập lệnh và chèn một thẻ tập lệnh như:

<script data-main="js/main" src="js/require.js"></script>

tạo www/js/main.jsvới nội dung:

require.config({
 "shim": {
   'jquery': { exports: '$' }
 }
})

require(['jquery', 'app']);

sau đó đặt tất cả mã bạn vừa sửa ở Bước 1-3 (có biến toàn cục duy nhất phải là Ứng dụng) trong:

www/js/app.js

Ở đầu tệp đó, hãy đặt:

require(['jquery'], function($) {

Ở dưới cùng đặt:

})

Sau đó tải page.html trong trình duyệt của bạn. Ứng dụng của bạn sẽ hoạt động!

Bước 6) Tạo một tệp khác

Đây là nơi công việc của bạn được đền đáp, bạn có thể làm điều này nhiều lần.

Rút ra một số mã từ www/js/app.jsđó tham chiếu đến $ và Ứng dụng.

ví dụ

$('a').click(function() { App.foo() }

Đặt nó trong www/js/foo.js

Ở đầu tệp đó, hãy đặt:

require(['jquery', 'app'], function($, App) {

Ở dưới cùng đặt:

})

Sau đó, thay đổi dòng cuối cùng của www / js / main.js thành:

require(['jquery', 'app', 'foo']);

Đó là nó! Làm điều này mỗi khi bạn muốn đặt mã vào tệp của chính nó!


Điều này có nhiều vấn đề - một vấn đề rõ ràng là bạn đang phân mảnh tất cả các tệp của mình ở cuối và buộc 400 byte dữ liệu lãng phí cho mỗi người dùng trên mỗi tập lệnh mỗi lần tải trang bằng cách không sử dụng r.jsbộ xử lý trước. Hơn nữa, bạn chưa thực sự giải quyết vấn đề của OP - chỉ cung cấp một cách chung chung require.js.
Sébastien Renauld

7
Huh? Câu trả lời của tôi là cụ thể cho câu hỏi này. Và r.js rõ ràng là bước tiếp theo nhưng vấn đề ở đây là tổ chức chứ không phải tối ưu hóa.
Lyn Headley

Tôi thích câu trả lời này, tôi chưa bao giờ sử dụng request.js nên tôi sẽ phải xem liệu tôi có thể sử dụng nó và nhận được lợi ích nào từ nó hay không. Tôi sử dụng kiểu mô-đun nặng nề nhưng có lẽ điều này sẽ cho phép tôi tóm tắt một số điều ra và sau đó yêu cầu họ ở.
Tony

1
@ SébastienRenauld: câu trả lời này không chỉ đơn thuần là về request.js. Nó chủ yếu nói về việc có một không gian tên cho mã bạn đang xây dựng. Tôi nghĩ bạn nên đánh giá cao những phần tốt và thực hiện chỉnh sửa mà bạn tìm thấy bất kỳ vấn đề nào với nó. :)
mithunsatheesh

10

Đối với câu hỏi và nhận xét của bạn, tôi sẽ cho rằng bạn không sẵn sàng chuyển mã của mình sang một khuôn khổ như Backbone hoặc sử dụng một thư viện trình tải như Yêu cầu. Bạn chỉ muốn một cách tốt hơn để tổ chức mã mà bạn đã có, theo cách đơn giản nhất có thể.

Tôi hiểu thật khó chịu khi cuộn qua hơn 2000 dòng mã để tìm phần mà bạn muốn làm việc. Giải pháp là chia mã của bạn thành các tệp khác nhau, một tệp cho mỗi chức năng. Ví dụ sidebar.js, canvas.jsv.v. Sau đó, bạn có thể kết hợp chúng với nhau để sản xuất bằng Grunt, cùng với Usemin, bạn có thể có một cái gì đó như sau:

Trong html của bạn:

<!-- build:js scripts/app.js -->
<script src="scripts/sidebar.js"></script>
<script src="scripts/canvas.js"></script>
<!-- endbuild -->

Trong Gruntfile của bạn:

useminPrepare: {
  html: 'app/index.html',
  options: {
    dest: 'dist'
  }
},
usemin: {
  html: ['dist/{,*/}*.html'],
  css: ['dist/styles/{,*/}*.css'],
  options: {
    dirs: ['dist']
  }
}

Nếu bạn muốn sử dụng Yeoman, nó sẽ cung cấp cho bạn một mã soạn sẵn cho tất cả những điều này.

Sau đó, đối với bản thân mỗi tệp, bạn cần đảm bảo rằng bạn tuân theo các phương pháp hay nhất và tất cả mã và biến đều nằm trong tệp đó và không phụ thuộc vào các tệp khác. Điều này không có nghĩa là bạn không thể gọi các hàm của một tệp này từ tệp khác, vấn đề là phải có các biến và hàm được đóng gói. Một cái gì đó tương tự như không gian tên. Tôi giả sử bạn không muốn chuyển tất cả mã của mình thành Hướng đối tượng, nhưng nếu bạn không ngại cấu trúc lại một chút, tôi khuyên bạn nên thêm thứ gì đó tương đương với cái được gọi là Mô-đun mẫu. Nó trông giống như sau:

sidebar.js

var Sidebar = (function(){
// functions and vars here are private
var init = function(){
  $("#sidebar #sortable").sortable({
            forceHelperSize: true,
            forcePlaceholderSize: true,
            revert: true,
            revert: 150,
            placeholder: "highlight panel",
            axis: "y",
            tolerance: "pointer",
            cancel: ".content"
       }).disableSelection();
  } 
  return {
   // here your can put your "public" functions
   init : init
  }
})();

Sau đó, bạn có thể tải đoạn mã này như sau:

$(document).ready(function(){
   Sidebar.init();
   ...

Điều này sẽ cho phép bạn có một đoạn mã dễ bảo trì hơn mà không cần phải viết lại mã của mình quá nhiều.


1
Bạn có thể muốn nghiêm túc xem xét lại đoạn mã thứ hai đến đoạn cuối cùng, không gì tốt hơn việc viết mã nội tuyến: mô-đun của bạn yêu cầu #sidebar #sortable. Bạn cũng có thể tiết kiệm bộ nhớ của mình bằng cách chỉ nội dòng mã và lưu hai IETF.
Sébastien Renauld

Vấn đề ở đây là bạn có thể sử dụng bất kỳ mã nào bạn cần. Tôi chỉ đang sử dụng một ví dụ từ mã gốc
Jesús Carrera

Tôi đồng ý với Chúa Giêsu đây chỉ là một ví dụ, OP có thể dễ dàng thêm một "đối tượng" tùy chọn cho phép họ chỉ định bộ chọn của phần tử thay vì mã hóa nó nhưng đây chỉ là một ví dụ nhanh. Tôi muốn nói rằng tôi thích mẫu mô-đun, nó là mẫu chính mà tôi sử dụng nhưng ngay cả với điều đó, tôi vẫn đang cố gắng tổ chức mã của mình tốt hơn. Tôi sử dụng C # bình thường nên việc đặt tên và tạo hàm có vẻ chung chung. Tôi cố gắng giữ một "mẫu" như dấu gạch dưới là cục bộ và riêng tư, các biến chỉ là "đối tượng" và sau đó tôi tham chiếu hàm trong kết quả trả về là công khai.
Tony

Tuy nhiên, tôi vẫn thấy những thách thức với cách tiếp cận này và mong muốn có một cách tốt hơn để thực hiện điều này. Nhưng nó hoạt động tốt hơn rất nhiều so với chỉ cần khai báo các biến và chức năng của mình trong không gian toàn cầu để gây xung đột với js khác .... lol
Tony

6

Sử dụng javascript MVC Framework để tổ chức mã javascript theo cách chuẩn.

Các khung JavaScript MVC tốt nhất hiện có là:

Việc chọn một khung JavaScript MVC đòi hỏi rất nhiều yếu tố cần xem xét. Đọc bài viết so sánh sau đây sẽ giúp bạn chọn khung công tác tốt nhất dựa trên các yếu tố quan trọng cho dự án của bạn: http://sporto.github.io/blog/2013/04/12/comparison-angular-backbone-can-ember/

Bạn cũng có thể sử dụng RequestJS với khuôn khổ để hỗ trợ tải tệp & mô-đun js không đồng bộ.
Xem phần bên dưới để bắt đầu tải Mô-đun JS: http://www.sitepoint.com/und hieu-requirejs-for-effective-javascript-module-loading/


4

Phân loại mã của bạn. Phương pháp này đang giúp tôi rất nhiều và hoạt động với bất kỳ khung js nào:

(function(){//HEADER: menu
    //your code for your header
})();
(function(){//HEADER: location bar
    //your code for your location
})();
(function(){//FOOTER
    //your code for your footer
})();
(function(){//PANEL: interactive links. e.g:
    var crr = null;
    $('::section.panel a').addEvent('click', function(E){
        if ( crr) {
            crr.hide();
        }
        crr = this.show();
    });
})();

Trong trình soạn thảo ưa thích của bạn (tốt nhất là Komodo Edit), bạn có thể vào bằng cách thu gọn tất cả các mục và bạn sẽ chỉ thấy các tiêu đề:

(function(){//HEADER: menu_____________________________________
(function(){//HEADER: location bar_____________________________
(function(){//FOOTER___________________________________________
(function(){//PANEL: interactive links. e.g:___________________

2
+1 cho giải pháp JS tiêu chuẩn không dựa vào thư viện.
hobberwickey

-1 vì nhiều lý do. Mã tương đương của bạn hoàn toàn giống với ... + một IETF của OP trên mỗi "phần". Hơn nữa, bạn đang sử dụng các bộ chọn quá rộng mà không cho phép các nhà phát triển mô-đun ghi đè việc tạo / xóa chúng hoặc để mở rộng hành vi. Cuối cùng, IETF không miễn phí.
Sébastien Renauld,

@hobberwickey: Không biết về bạn, nhưng tôi muốn dựa vào một cái gì đó hướng đến cộng đồng và nơi lỗi sẽ được tìm thấy nhanh chóng nếu tôi có thể. Đặc biệt là nếu làm khác đi sẽ lên án tôi phát minh lại bánh xe.
Sébastien Renauld,

2
Tất cả những gì đang làm là tổ chức mã thành các phần rời rạc. Lần trước, tôi đã kiểm tra đó là A: thực tiễn tốt và B: không phải là thứ bạn thực sự cần một thư viện được cộng đồng hỗ trợ. Không phải tất cả các dự án đều phù hợp với Backbone, Angular, v.v. và mã mô-đun hóa bằng cách gói nó trong các hàm là một giải pháp chung tốt.
hobberwickey

Có thể bất cứ lúc nào bạn muốn dựa vào bất kỳ thư viện yêu thích nào để sử dụng phương pháp này. Nhưng giải pháp trên làm việc với javascript tinh khiết, thư viện tùy chỉnh hoặc bất kỳ js nổi tiếng khuôn khổ

3

Tôi sẽ đề nghị:

  1. mẫu nhà xuất bản / người đăng ký để quản lý sự kiện.
  2. hướng đối tượng
  3. không gian tên

Trong trường hợp của bạn Jessica, hãy chia giao diện thành các trang hoặc màn hình. Các trang hoặc màn hình có thể là các đối tượng và được mở rộng từ một số lớp cha. Quản lý tương tác giữa các trang bằng lớp PageManager.


Bạn có thể mở rộng điều này với các ví dụ / tài nguyên không?
Kivylius

1
Bạn có nghĩa là gì bởi "hướng đối tượng"? Gần như mọi thứ trong JS đều là một đối tượng. Và không có lớp nào trong JS.
Bergi

2

Tôi đề nghị bạn sử dụng một cái gì đó như Backbone. Backbone là một thư viện javascript được hỗ trợ RESTFUL. Ik làm cho mã của bạn sạch hơn và dễ đọc hơn và mạnh mẽ khi được sử dụng cùng với các requestj.

http://backbonejs.org/

http://requirejs.org/

Backbone không phải là một thư viện thực sự. Nó có nghĩa là cung cấp cấu trúc cho mã javascript của bạn. Nó có thể bao gồm các thư viện khác như jquery, jquery-ui, google-maps, v.v. Theo tôi, Backbone là cách tiếp cận javascript gần nhất với các cấu trúc Bộ điều khiển Chế độ xem Hướng đối tượng và Chế độ xem Mô hình.

Cũng liên quan đến quy trình làm việc của bạn .. Nếu bạn xây dựng các ứng dụng của mình bằng PHP, hãy sử dụng thư viện Laravel. Nó sẽ hoạt động hoàn hảo với Backbone khi được sử dụng với nguyên tắc RESTfull. Bên dưới liên kết đến Laravel Framework và hướng dẫn về cách xây dựng các API RESTfull:

http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/

http://laravel.com/

Dưới đây là hướng dẫn từ nettuts. Nettuts có rất nhiều hướng dẫn Chất lượng cao:

http://net.tutsplus.com/tutorials/javascript-ajax/und hieu-backbone-js-and-the-server/


0

Có thể đã đến lúc bạn bắt đầu triển khai toàn bộ quy trình phát triển bằng cách sử dụng các công cụ như yeoman http://yeoman.io/ . Điều này sẽ giúp kiểm soát tất cả các phụ thuộc của bạn, xây dựng quy trình và nếu bạn muốn, kiểm tra tự động. Rất nhiều công việc để bắt đầu nhưng một khi được thực hiện sẽ làm cho những thay đổi trong tương lai dễ dàng hơn rất nhiều.

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.