在gruntjs中使用requirejs来构建库,并在其他项目中使用它

时间:2015-04-21 16:23:08

标签: javascript gruntjs requirejs grunt-contrib-requirejs requirejs-optimizer

我正在构建一个库,它是一组包含模型视图控制器Javascript文件的文件夹 每个文件都有使用require语法声明的依赖项:

define([
    'modules/moduleA/src/moduleAModel',
    'modules/moduleA/src/moduleAController',
], function(moduleAModel, moduleAController) {
    function moduleAView(param) {
        // ....
    }

我正在使用GruntJS和伟大的" grunt-contrib-requirejs"来编译这个库。
问题是,作为一个图书馆,没有入口点,没有主要的 我希望用户能够在需要时通过调用每个模块来使用它。

以下是我的问题:

首先
如何为包含所有模块的库构建一个javascript文件,而不是一个一个地声明它们?

其次
如何在以后的另一个项目中重用此库? 我试过这个:

define(function(require) {
    var myLibrary = require('js/external-libs/myMinifiedLibrary.min');
    var moduleAV = new moduleAView();

但当然第二行失败了,有类似require(myLibrary.moduleAView)吗?

你会建议什么?

更新
我发现当你在一个文件上缩小所有模块时,你在一个页面上有多个定义,这被解释为requirejs的脚本,你必须加载它两次! (第一次整个文件,第二次你的主要)。 然后我的主要'在入口答案上手动建立或进入点(这仍然是一个问题)。 因此,我的第二个问题的解决方案就是这篇文章:
http://jaketrent.com/post/dynamically-require-optimized-modules-requirejs/

1 个答案:

答案 0 :(得分:1)

我遇到了相反的问题:我希望用户拉出库,必须知道每个internal module

为实现这一目标,我创建了一个返回parent module的入口点。然后父母会根据需要处理推迟给孩子的事。

This file就是切入点。

如果我修改了该文件以返回一个对象,则每个内部模块都可以在加载的库中使用:

define(
    ["layout", "region"],
    function( Layout, Region ){
        return {
            "LayoutModule": Layout,
            "RegionModule": Region
        };
    }
);

我认为这就是你想要的:

  • r.js优化器将所有内容构建到一个文件中
  • 其他代码只包含库文件(require( "myLib" )
  • 响应对象(myLib.LayoutModulemyLib.RegionModule)上提供了每个单独的模块。