2013-02-26 3 views
4

Я работаю над проектом, в котором основной код должен использоваться кучей разных клиентов. Таким образом, у нас есть проект requirejs, и моя первоначальная идея состоит в том, чтобы иметь простой файл bootstrap.js, который потребует файлов app.js, которые отличаются для каждого клиента.Создайте проект с несколькими клиентами с requirejs и grunt

bootstrap.js

requirejs(['app'],function(app){ 
    //some initial code here 
    app.start(); 
} 

Так структура проекта будет выглядеть следующим образом:

|_bootstrap.js 
|_commonModules 
    |_someModule.js 
|_client1 
    |_app.js 
    |_modules 
    |_module.js 
|_client2 
    |_app.js 
    |_modules 
    |_module.js 

Так что мои идеи является скомпилировать приложение для каждого клиента, используя г компилятор requirejs' и задайте путь к приложению в каждой компиляции для clientX/app.js, создав новый файл build.js для каждого следующего шага:

({  
    paths: { 
    "app": "client1/app" 
    } 
}) 

Итак, на данный момент у меня есть задача создания грубой сборки, в которой используется множество других задач, таких как uglify, usemin, md5 и т. Д. Можно ли создать новую задачу, использующую эту задачу, но изменив параметры requireJs для каждого клиента? Или есть лучший способ достичь моих целей?

ответ

6

Так ведь все было не так сложно. Самое приятное в том, что вы можете изменить конфигурацию для текущей запущенной задачи и вы можете вызвать предыдущую заданную задачу в текущей задаче.

//this was the old task to build one distribution 
grunt.registerTask('build', ['clean:build', 'copy:build', 'useminPrepare', 'usemin', 'requirejs', 'concat', 'uglify', 'mincss', 'md5', 'manifest', 'copy:toClientFolder']); 

grunt.registerTask('buildAll', function() { 
    ['client1', 'client2'].forEach(function(client) { 
    //before every build task run a task to change the config 
    grunt.task.run('updateConfig:' + client, 'build'); 
    }); 
}); 

    //we need to change the config in a separate task, 
    //otherwise, change the config just in the forEach, would result in the same 
    //config for both task, using the client2 settings 
    grunt.registerTask('updateConfig', function(client) { 
    var requireJsName = 'requirejs.compile.options.name'; 
    var clientFolder = 'copy.toClientFolder.files'; 
    grunt.config(requireJsName, 'clients/' + client + '/Bootstrap'); 
    grunt.config(clientFolder, [ 
     {expand: true, cwd: 'dist', src: '**', dest: 'dist_' + client} 
    ]); 
    }); 

И app.js файл для клиента выглядит следующим образом:

requirejs.config({ 
    paths: { 
    'commonModules/someModule': 'clients1/modules/module' 
    } 
}); 

requirejs(['boootstrap', 
    'commonModules/someModule1'], 

    function(boootstrap, someModule1) { 
    $(function() { 
     boootstrap(); 
     someModule1(); 
    }); 
    }); 
Смежные вопросы