2013-05-13 63 views
26

我有一个正在使用grunt进行构建和部署的工作requirejs项目。如果完全不使用优化,构建可以毫无问题地工作,并且我会得到一个大的js文件将其部署到生产环境中。如何从uglifying /优化中排除某些requireJS文件

我的问题是,我有一些外部框架(如angularJS),我已经有一个最小化/优化版本,不想再次优化它。

目前没有优化,我通过我的gruntfile中的单独路径配置包含此框架的缩小版本。而在我的正常main.js中,我有用于开发的非缩小版本。

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

我可以这样做吗?

我只找到一个全局排除选项,因此一些模块根本不包含在所得优化的js中。

这是我的咕噜配置:

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' } 
     } 
    }); 

感谢您的帮助。

回答

19

只是有些建议使用空白:表示不是将模块包含在优化中。

在require.config中将指出min文件的用法。

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

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

请注意,这是 “空:” 与冒号末,而不是 “空”。如果你省略冒号,你会得到这样的错误:

"No such file or directory [...]/empty.js" 

希望这会有所帮助。

+2

该解决方案是不适合我使用0.4.1咕噜咕噜和-contrib请-requirejs 0.4.1 当我指定的“空”的工作文件仍然被列入丑化过程(使用丑化/ uglify2)。无论是优化单个文件还是整个应用程序目录,我都可以得到相同的结果。 – 2013-11-03 14:37:31

+1

不适用于我。 – kaiser 2013-12-12 18:03:10

+0

Grunt 0.4.5,requirejs 2.1.9。奇迹般有效 ! – 2015-03-04 14:40:39

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' 
     } 
    } 
} 
+0

我无法使'fileExclusionRegExp'属性工作,但使用不同'baseUrl'和'dir'运行两个连续的requirejs任务是让我的工作成功的关键!谢谢! – kevnk 2015-03-31 19:03:13

相关问题