2013-01-14 50 views
2

我正在构建一个使用RequireJS模块化它的KnockoutJS Web应用程序。我试图在几个策略之间做出决定,将事情分解成模块。模块粒度策略

平方法
一种方法有更平坦的目录结构和较大的模块:

/webapp 
|-/scripts 
    |-/templates 
    | |-car_edit.html 
    | |-car-view.html 
    | |-person_edit.html 
    | |-person_view.html 
    |-main.js 
    |-person.js 
    |-car.js 

作为示例,人模块(person.js)被实现这样的:

define(['jquery', 'knockout', ...], function($, ko, ...) { 

    var PersonViewModel = function PersonViewModel() { ... }; 

    var load = function load(id) { ... }; 

    var create = function create() { ... }; 

    var view = function view(element, model) { ... }; 

    var edit = function edit(element, model) { ... }; 

    return { 
    Model : PersonViewModel, // exposes ViewModel for testing 
    create : create,   // reserve id on server, return new empty Person 
    load : load,    // get data from server, return new Person w/ data 
    view : view,    // load view template, bind Person 
    edit : edit    // load edit template, bind Person 
    }; 
}); 

深层结构的方法:
另一个approa CH,就可以使用更深的目录结构用较小的模块:

/webapp 
|-/scripts 
    |-/car 
    | |-/templates 
    | | |-edit.html 
    | | |-view.html 
    | |- Model.js 
    | |- view.js 
    | |- edit.js 
    | |- create.js 
    | |- load.js 
    |-/person 
    | |-/templates 
    | | |-edit.html 
    | | |-view.html 
    | |- Model.js 
    | |- view.js 
    | |- edit.js 
    | |- create.js 
    | |- load.js 
    |-main.js 

的代码是类似于示例之前,除了现在该模块的各部分是它自己的模块:

// /person/Model.js 
define(['jquery', 'knockout', ...], function($, ko, ...) { 

    return function Model() { ... }; 

}); 


// /person/view.js: 
define(['jquery', 'knockout', ...], function($, ko, ...) { 

    return function view(element, model) { ... }; 

}); 

等等。

两种方法都是首选吗?我错过了更好的方法吗?

+1

我倾向于接近你的第一种方法。然而。我还有一个viewmodel子文件夹,以及main.js,person.js和car.js会存在的地方。显然这两种方式工作。它只是保持所有编码器始终如一地创建文件 – Anton

回答

-1

随着骨干/要求我们使用this Boilerplate,我认为你可以使用它与另一个框架与小调整。

它非常完整,即使您第一次找到代码,也很容易找到模块。