2016-05-02 51 views
1

我正試圖縮小我應用中的所有js文件。我正在使用gradle-js-plugin。我能夠使用它來縮小單個文件。但我希望我的所有js文件都被縮小。這是我的嘗試。最終看起來很愚蠢,但我是用gradle寫一些東西的新手。Gradle全部縮小javascript

plugins { 
id "com.eriwen.gradle.js" version "2.12.0" 
} 

task minifyAll << { 

FileTree tree = fileTree('src/main/webapp/resourcesMinified') { 
    include '**/*.js' 
    exclude '**/*.css' 
    exclude '**/*.less' 
    exclude '**/*.sass' 
} 

tree.each { file -> 
    def path = file.path 

    minifyJs { 
    println path 
    source = path 
    dest = path 
    closure { 
    warningLevel = 'QUIET' 
    } 
} 
} 

問題是我無法從內部minifyAll調用minifyJs任務。我嘗試了幾件東西,包括execute。先謝謝了。

回答

3

編輯:現在生產的src/main/webapp/resources

每個JS文件

我使用的搖籃2.12與幾個JS文件最小化的文件,鑑於這種build.gradle文件:

plugins { 
    id "com.eriwen.gradle.js" version "2.12.0" 
} 

import com.eriwen.gradle.js.tasks.MinifyJsTask 

def srcDir = "src/main/webapp/resources" 
def dynamicTaskNames = [] 
def dynamicTaskIndex = 1 

new File(srcDir).eachFile { def file -> 
    def dynamicTaskName = "taskMinify${dynamicTaskIndex}" 

    task "${dynamicTaskName}"(type: MinifyJsTask) { 
     source = file.absolutePath 
     dest = "${buildDir}/min.${file.name}" 
     closure { warningLevel = 'QUIET' } 
    } 

    dynamicTaskNames << dynamicTaskName 
    dynamicTaskIndex++  
} 

task myMinify(dependsOn: dynamicTaskNames) << { 
    println ("done.") 
} 

的以下作品適合我:

$ gradle myMinify 

myMinify任務依賴於幾個動態任務,它們爲每個文件執行minifyJs任務。例如StringUtils.js將生成build/min.StringUtils.js

我想搖籃時使用ICE規則:初始化階段,配置階段,執行階段。在這種情況下,動態任務是在配置階段定義的(即在任務定義之外自由浮動的代碼)。在執行階段,myMinify調用執行工作的依賴關係。

+0

謝謝邁克爾。但是我希望所有文件都被分別縮小。由於我的應用程序不是一個單一的頁面應用程序,所有縮小到一個單一的文件對我來說是無效的。 –

+0

我的錯誤...我今天會看看,如果可能的話更新我的答案。 –

+0

我已經更改了原始源文件夾中每個文件產生最小化文件的答案(它應該確實檢查文件擴展名以確保它是JS,CSS等)。 –

2

以上Michael的回答幫助我們解決了這個問題。我們想出了稍微不同的方法。如果我發佈它,我認爲它會對一些人有所幫助。

def dynamicTaskNames = [] 
def dynamicTaskIndex = 1 

FileTree tree = fileTree('/home/path/to/app/src/main/webapp/resources') { 
    include '**/*.js' 
    exclude '**/*.css' 
    exclude '**/*.less' 
    exclude '**/*.sass' 
} 

tree.each{file -> def dynamicTaskName = "taskMinify${dynamicTaskIndex}" 

    task "${dynamicTaskName}"(type: MinifyJsTask){ 
     source = file.absolutePath; 
     dest = "${buildDir}/min.${file.name}" 
     closure.compilationLevel='ADVANCED_OPTIMIZATIONS' 
     closure { 
      warningLevel = "QUIET" 
      compilerOptions.languageIn = "ECMASCRIPT5" 
      } 
    } 

    dynamicTaskNames << dynamicTaskName 
    dynamicTaskIndex++ 
} 



task callMinify(dependsOn: dynamicTaskNames) <<{ 
    println("done.") 
} 

注意:如果這不起作用,請嘗試手動添加谷歌封閉插件到您的腳本。

3

這可能是簡單的:

plugins { 
    id 'com.eriwen.gradle.js' version '2.14.1' 
} 

import com.eriwen.gradle.js.tasks.MinifyJsTask 
task minifyJS 
minifyJS.doLast { 
    fileTree('your files dir').eachWithIndex { file, index -> 
    def dynamicTask = "minify$index" 
    task "${dynamicTask}" (type: MinifyJsTask) { 
     source = file 
     dest = file 
    } 
    tasks."$dynamicTask".execute() 
    } 
} 
  • 使用eachWithIndex而不是反
  • 執行動態任務裏面的任務

備選答案

您還可以使用uglifyjs爲這個任務。 (我正在使用這種方式來處理我的腳本,因爲這種方式比gradle-js-plugin更容易處理更復雜的情況。)

先決條件:

  • 的NodeJS
  • uglifyjs
plugins { 
    id 'com.github.jlouns.cpe' version '0.5.0' 
} 

task minifyJS 
minifyJS.doLast { 
    fileTree('your files dir').include('**/*.js').eachWithIndex { file, index -> 
    def dynamicTask = 'minify' + index 
    task "${dynamicTask}" (type: CrossPlatformExec) { 
     commandLine uglifyjs, file, '-c', '-m', '-o', file 
    } 
    tasks."${dynamicTask}".execute() 
    } 
} 
  • CrossPlatformExec有助於獨立執行這一任務的平臺。如果您只使用一個平臺,則可以將其更改爲Exec任務類型,並刪除plugins塊。
  • -c選項使壓縮
  • -m選項可以重整
  • -o選項指定輸出文件。本示例覆蓋現有文件。如果你想改變輸出文件名.min.js,取代在命令行的最後filefile - '.js' + '.min.js'
-2

的重要組成部分是創建的每一個文件一個單獨的任務。這就是這個插件的工作原理。現在,你不知道你有多少文件,所以你必須編寫一個小代碼來創建與文件一樣多的任務。例如: -

javascript.source { 
custom { 
    js { 
    srcDir "" 
    include "**/*.js" 
    exclude "**/*.min.js" 
    } 
} 
} 


javascript.source.custom.js.files.eachWithIndex {fileSrc, idx -> 
def dynName = "jsMinifyTask_${idx}" 

task "${dynName}"(type:MinifyJsTask) { 

dependsOn createdir 

def name = fileSrc.name.replace(".js", "") 

source = fileSrc.absolutePath 
dest = fileSrc.getParentFile().absolutePath + "/" + name + ".min.js" 
closure { 
    warningLevel = 'QUIET' 
    compilationLevel = 'WHITESPACE_ONLY' 
    compilerOptions.languageIn = "ECMASCRIPT5" 
    } 
} 
} 

一旦你完成了這個,寫一個包裝任務來執行所有這些。例如: -

task minify() { 
    tasks.findAll {Task task -> 
    if(task.name.startsWith("jsMinifyTask_")) { 
     task.execute() 
     } 
    } 
} 

而你完成了。

我寫了一個Gradle腳本在ThreadPoolExecutor上執行此操作,以獲得更快的響應。檢查出來: -

https://www.concurrenthashmap.com/blog/2017/10/08/gradle-tasks-for-javascript-and-css-minification-and-combination-using-threadpoolexecutor-for-parallel-execution/

+1

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/17562553) –

+0

MD。 Khairul:道歉。現在好多了 ? – user3279692