如何从uglify/optimize中排除特定的requireJS文件。

27

我有一个使用grunt进行构建和部署的requirejs项目。如果完全不使用优化,构建过程没有问题,并且我会得到一个大的JS文件来将其部署到生产环境。

我的问题是,我有一些外部框架(如angularJS),我已经有了一个经过缩小/优化的版本,并且不想再次进行优化。

目前,在没有优化的情况下,我通过gruntfile中的单独路径配置包含这个框架的缩小版。而在我的常规main.js中,我拥有未缩小的版本以供开发使用。

现在我想使用optimizer来优化我的代码,但是不要优化外部框架。但是外部框架应该被包括在生成的大型JavaScript文件中。基本上,我想告诉optimizer在某些情况下应该使用原始文件。

我可以像这样做吗?

我只找到了全局排除选项,因此某些模块根本不会包含在最终优化后的js中。

这是我的grunt配置:

requirejs: {
            compile: {
                options: {
                    baseUrl: "<%= pkg.folders.jsSource %>",
                    name: "../external-libs/almond-0.1.1",
                    include: "main",
                    mainConfigFile: "<%= pkg.folders.jsSource %>/main.js",
                    out: "<%= pkg.folders.build + pkg.name + '-' + pkg.version %>/js/main.js",
                    //logLevel: 0,
                    optimize: "uglify2",
                    //optimize: "none",
                    paths: {
                        'angular':'../external-libs/min/angular-1.0.4',
                        'jquery':'../external-libs/min/jquery-1.7.2',
                        'jquery.mobile':'../external-libs/min/jquery.mobile-1.2.0',
                        'adapter': '../external-libs/min/jquery-mobile-angular-adapter-1.2.0',
                        'moment': '../external-libs/moment-1.6.2.min',
                        'iscroll': '../external-libs/min/iscroll-4.2.5',
                        'iscrollview': '../external-libs/min/jquery.mobile.iscrollview-1.2.6',
                        'add2Home': '../external-libs/min/add2home',
                        'config/config': "config/<%=configDatei%>"
                    }
                }
            }
        },

而这是 main.js 的相关部分:

require.config({
        paths:{
            'angular':'../external-libs/angular-1.0.4',
            'jquery':'../external-libs/jquery-1.7.2',
            'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
            'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
            'moment': '../external-libs/moment-1.6.2.min',
            'iscroll': '../external-libs/iscroll-4.2.5',
            'iscrollview': '../external-libs/jquery.mobile.iscrollview-1.2.6',
            'add2Home': '../external-libs/add2home'
        },
        shim:{
            'angular':{ deps:['jquery'], exports:'angular' },
            'iscroll':{ deps:['jquery'], exports:'iscroll' },
            'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' }
        }
    });

感谢任何帮助。

2个回答

19

只是一些建议:使用"empty"来表示将模块包含在优化中。

在require.config中,这将指示使用min文件。

requirejs: {
            compile: {
                options: {
                    {{ all other settings }}
                    paths: {
                        'angular':'empty:',
                    }
                }
            }
        },

   require.config:{  
              paths:{
              'angular':'../external-libs/min/angular-1.0.4',
        },
   }

请注意,这里的“empty:”是以冒号结尾的,不是“empty”。如果您省略了冒号,将会出现以下错误:

请注意,“empty:”是以冒号结尾的,不是“empty”。如果您省略了冒号,将会出现以下错误:

"No such file or directory [...]/empty.js" 
希望这能帮到您。

2
这个解决方案在使用grunt 0.4.1和grunt-contrib-requirejs 0.4.1时对我不起作用。当我指定"empty:"时,该文件仍然被包含在uglify过程中(无论是使用uglify还是uglify2)。无论我是优化单个文件还是整个应用程序目录,都得到相同的结果。 - Chris Goodchild
Grunt 0.4.5,requirejs 2.1.9。运行得非常顺畅! - Gabriel Lupu
获取一个错误,寻找 'empty.js' — Grunt v0.4.5,requirejs 2.1.15 - kevnk

5

我曾经遇到过外部库始终被重新压缩的同样问题,这是我用来规避这个问题的方法。我有两个任务,一个是针对我的代码,另一个是针对外部库。实际上只是复制文件,所以只需要一个复制任务即可。我还使用"empty:"关键字来排除外部库在我的代码压缩中的包含。

requirejs: {
    options: {
        mainConfigFile: '...',
        fileExclusionRegExp '...common things to exclude...'
    },
    main: {
        options: {
            baseUrl: '.../js',
            dir: '.../js-built',
            fileExclusionRegExp: /^external$/,
            ... etc ...
        }
    },
    external: {
        options: {
            baseUrl: '.../js/external',
            dir: '.../js-built/external',
            optimize: 'none'
        }
    }
}

我无法让fileExclusionRegExp属性起作用,但是连续运行两个具有不同baseUrldir的requirejs任务是让我的工作正常的关键!谢谢! - kevnk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接