来自grunt-contrib-requirejs的Shim不包装库

时间:2013-10-22 14:58:37

标签: angularjs requirejs gruntjs angular-ui grunt-contrib-requirejs

我正在使用requirejs并配置我的产品工件,因此组合我的库并在它们之间设置模块依赖关系以使用requirejs的grunt任务获得适当的加载序列。在我的livereload服务器中使用运行时模块注入时没有问题,该服务器可以访问非组合库。为了清楚起见,我禁用了所有的缩小/丑化并开启了js-beautify。

    requirejs: {
        dist: {
            // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
            options: {
                // `name` and `out` is set by grunt-usemin
                // name: 'App',
                baseUrl: yeomanConfig.app + '/scripts',
                mainConfigFile: yeomanConfig.app + '/scripts/config.js',
                out: yeomanConfig.dist + '/scripts/main.js',
                optimize: 'none',
                // TODO: Figure out how to make sourcemaps work with grunt-usemin
                // https://github.com/yeoman/grunt-usemin/issues/30
                //generateSourceMaps: true,
                // required to support SourceMaps
                // http://requirejs.org/docs/errors.html#sourcemapcomments
                beautify: false,
                removeCombined: false,
                generateSourceMaps: false,
                preserveLicenseComments: false,
                useStrict: true,
                mangle: false,
                compress: false,
                // wrap: true,
                // https://github.com/mishoo/UglifyJS2
            }
        }
    },

我正在使用Kendo,Angular和Angular-Keno-UI。我知道Kendo是AMD模块就绪,但它看起来不像Angular-Keno-UI。我期望创建一个垫片并将其包装在相应的requirejs define函数中,但是我发现这不会发生。

    require.config({
        cjsTranslate: true,
        paths: {
            jquery: 'vendor/jquery/jquery',
            'angular-kendo-ui': 'vendor/angular-kendo-ui/build/angular-kendo',
            kendo: 'vendor/kendoui.complete.2013.2.918.trial/js/kendo.all.min',
            angular: 'vendor/angular/angular',
            requirejs: 'vendor/requirejs/require',
            'angular-animate': 'vendor/angular-animate/angular-animate',
            'angular-ui-router': 'vendor/angular-ui-router/release/angular-ui-router.min',
            'angular-resource': 'vendor/angular-resource/angular-resource'
        },
        shim: {
            jquery: {
                exports: '$'
            },
            angular: {
                deps: [
                    'jquery'
                ],
                exports: 'angular'
            },
            'angular-resource': {
                deps: [
                    'angular'
                ]
            },
            'angular-kendo-ui': {
                deps: [
                    'angular',
                    'kendo'
                ]
            },
            'angular-ui-router': {
                deps: [
                    'angular'
                ]
            }
        }
    });

为了解决模块准备不足的问题,我自己将其包装起来:

    define('angular-kendo-ui', [
        'angular', 
        'kendo'
      ], function (
        angular,
        kendo
      ) {
        < original angular-kendo-ui source >
    });

我是否误解了垫片的应用?它似乎是我的,它实际上并没有包装定义的路径,而是只是指向它,如果请求模块(这在动态模块加载中很好)

在我最初审查这些技术的过程中,我注意到有一种方法可以让requirejs(或我管道中的一个资产变换器)自动为我包装模块。任何人都有我的提示,我认为这是requirejs将配置中定义的模块包装为路径,但也许我错了。下面是正在运行的任务的打印输出:

    Done, without errors.

    Elapsed time
    build                          887ms
    useminPrepare:html             22ms
    concurrent:dist                8s
    autoprefixer:dist              174ms
    requirejs:dist                 19s
    jsbeautifier:dist              2s
    concat:public/styles/main.css  46ms
    concat:public/scripts/main.js  56ms
    cssmin:public/styles/main.css  81ms
    copy:dist                      26ms
    usemin:html                    5s
    usemin:css                     24s

1 个答案:

答案 0 :(得分:2)

这只是一个疯狂的猜测(取决于你的优化器版本)但是 - 不是很酷 - 配置文档在这里说明:

  

从2.1.11开始,shimmed依赖项可以包装在define()包装器中       当中间依赖关系是AMD有他们的依赖时帮助       拥有。规范示例是使用Backbone的项目,它取决于       jQuery和下划线。希望Backbone可用的Shimmed依赖项       立即不会在构建中看到它,因为AMD兼容版本       在依赖关系之前,Backbone不会执行define()函数       准备。通过包装那些shimmed依赖项,可以避免这种情况,但是       如果那些填充的依赖项使用了它,它可能会引入其他错误       全局范围以奇怪的方式,因此它不是包装的默认行为。

所以也许可以使用:

wrapShim: true

https://github.com/jrburke/r.js/blob/master/build/example.build.js

因为使用“mainConfigFile”,shim配置应该已经在优化器中,这通常是另一个故障点。