收集多个RequireJS依赖项

时间:2014-06-14 09:30:32

标签: javascript requirejs

有一组代表类似OOP类的JS模块:想到例如不同类型的后端任务(SendEmailTaskWriteToDbTaskWriteToDiskTask),或绘图画布上的不同操作(DrawArcDrawLineDrawBezier )。这只是一些例子。

每个文件都是一个JS文件,它有自己的define,它们都位于一个公共目录中。在依赖于所有这些的客户端模块中,依赖性列表和参数列表必须分别包括这些中的每一个,例如,类似的东西:

define([
  'tasks/sendEmailTask', 'tasks/writeToDbTask', 'tasks/writeToDiskTask', ...
  ], function (SendEmailTask, WriteToDbTask, WriteToDiskTask, ...) { 
    /* ... */ 
    /* ... new SendEmailTask(); */ 
    /* ... new WriteToDbTask(); */ 
    /* ... new WriteToDiskTask(); */ 
  });

并且每次将新模块添加到集合时都必须更新它们,例如MakeCoffeeTask,在我看来是BadThing™。

有没有办法避免这些最后的问题?我想到了几种可能的方法,但我不知道如何让它们发挥作用:

  1. 创建一种名称空间模块。每个子模块都依赖于命名空间1并将其定义添加到其中。但是,如果客户端也只依赖于命名空间,那么如何确保在所有子模块之后加载客户端?
  2. 使用某种通配符表示依赖项和参数,例如'tasks/*'表示依赖项和<不知道> 的参数。

2 个答案:

答案 0 :(得分:0)

您可以为每个部分制作不同的模块。例如:'tasks / main' 在Task main中,您可以包含所需的所有文件。在任务主体中,将分配任务的所有功能。并且你调用高级功能。看看:

define(['tasks/main'], function(task){

   task.add('Project Status meeting');
   task.SendEmailNotification('tAll');

});

在task / main.js中:

define(['tasks/sendEmailTask', 'tasks/writeToDbTask', 'tasks/writeToDiskTask',], function(sendEmailTask, writeToDbTask, writeToDiskTask){
  var task = {
        add = function(taskObj){
             // write your code using writeToDbTask, writeToDiskTask 
        }, 
        SendEmailNotification =  function(whom){
               // write your code using sendEmailTask, writeToDbTask, writeToDiskTask    
        };

   return task;           

});

对你有帮助吗?

答案 1 :(得分:0)

我无法找到任何其他解决方案。这就是我在此期间提出的......这只是对当前形势的一种改进,但我认为它不能解决所提出的问题。

// in tasks/taskNamespace.js or in any client code

define (function(require) {

  var _taskArray = [
    require('tasks/sendEmailTask'),
    require('tasks/writeToDbTask'),
    require('tasks/writeToDiskTask'),
    /* ... , */
  ];

  var TaskNamespace = {};

  _taskArray.forEach(function (taskClass) {
    TaskNamespace[taskClass.name] = taskClass;
  });

  return TaskNamespace;

});

它利用了RequireJS Sugar语法和JS Function.name即将推出的新功能,在ES6中提出。

最终结果是什么?您仍然需要手动将每个 Class 添加到列表中,但它只是一个列表而不是两个。 WHOA