2013-05-13 102 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

相關問題