利用dojo打包web项目中的js和css文件

前端之家收集整理的这篇文章主要介绍了利用dojo打包web项目中的js和css文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

引子:

最近在做一个web项目的优化,遇到一个问题,就是在加载初始页面的时候会引用到很多js/css文件,每引用一个文件就会产生一个http请求,这样项目的性能就会受到很大影响。

所以我们决定将js/css文件打包成一个或者几个较大的文件,这样的话可以大量的减少http请求,从而在一定程度上提高系统的性能

dojo的optimize优化

我使用的dojo是1.6.1版本,在util/buildscripts目录下有一个build.js文件,主要用于release的时候定义一些操作。这个文件主要引用到了jslib下的buildUtil.js文件,查看该文件,可以看到在文件开头有一段DojoBuildOptions,其中包括profile,releaseName,optimize等,具体用法参照每个option中的helpText

其次我们需要用到util/shrinksafe文件夹下的js.jar和shrinksafe.jar,这两个文件分别用来优化和压缩js/css文件

最后需要一个profile文件,在buildscripts/profiles下新建一个xxx.profile.js文件,该文件用于定义所有需要打包的js文件,写法如下:

 
 
    @H_502_24@/*******************************************************************/
  1. /**/
  2. @H_502_24@/*IBMConfidential*/
  3. /**/
  4. @H_502_24@/*OCOSourceMaterials*/
  5. /**/
  6. @H_502_24@/*CopyrightIBMCorp.2010*/
  7. /**/
  8. @H_502_24@/*Thesourcecodeforthisprogramisnotpublishedorotherwise*/
  9. /*divestedofitstradesecrets,irrespectiveofwhathasbeen*/
  10. @H_502_24@/*depositedwiththeU.S.CopyrightOffice.*/
  11. /**/
  12. @H_502_24@/*******************************************************************/
  13. dependencies={
  14. @H_502_24@layers:[
  15. {
  16. @H_502_24@name:"../compressed/tms.js",
  17. resourceName:"tms",
  18. @H_502_24@layerDependencies:[
  19. ],
  20. @H_502_24@dependencies:[
  21. "dojo.cache",
  22. @H_502_24@"dojox.widget.TitleGroup",
  23. "dijit.Calendar",
  24. @H_502_24@"dijit.Dialog",
  25. "dijit.Menu",
  26. @H_502_24@"dijit.MenuBar",
  27. "dijit.MenuItem",
  28. @H_502_24@"dijit.PopupMenuBarItem",
  29. "dijit.TitlePane",
  30. @H_502_24@"dijit.Tooltip",
  31. "dijit.TooltipDialog",
  32. @H_502_24@"dijit._Templated",
  33. "dijit.dijit",
  34. @H_502_24@"dijit.form.Button",
  35. "dijit.form.CheckBox",
  36. @H_502_24@"dijit.form.ComboBox",
  37. "dijit.form.CurrencyTextBox",
  38. @H_502_24@"dijit.form.DateTextBox",
  39. "dijit.form.DropDownButton",
  40. @H_502_24@"dijit.form.Form",
  41. "dijit.form.NumberTextBox",
  42. @H_502_24@"dijit.form.RadioButton",
  43. "dijit.form.RangeBoundTextBox",
  44. @H_502_24@"dijit.form.Select",
  45. "dijit.form.TextBox",
  46. @H_502_24@"dijit.form.Textarea",
  47. "dijit.form.TimeTextBox",
  48. @H_502_24@"dijit.form.ValidationTextBox",
  49. "dijit.form._FormSelectWidget",
  50. @H_502_24@"dijit.layout.BorderContainer",
  51. "dijit.layout.ContentPane",
  52. @H_502_24@"dijit.layout.TabContainer",
  53. "dijit.layout._TabContainerBase",
  54. @H_502_24@"dojo.data.ItemFileReadStore",
  55. "dojo.data.ItemFileWriteStore",
  56. @H_502_24@"dojo.data.ObjectStore",
  57. "dojo.date.locale",
  58. @H_502_24@"dojo.dnd.Source",
  59. "dojo.fx",
  60. @H_502_24@"dojo.parser",
  61. "dojo.store.Memory",
  62. @H_502_24@"dojox.grid.DataGrid",
  63. "dojox.grid.EnhancedGrid",
  64. @H_502_24@"dojox.grid._EditManager",
  65. "dojox.grid._RowManager",
  66. @H_502_24@"dojox.grid._RowSelector",
  67. "dojox.grid.cells._base",
  68. @H_502_24@"dojox.grid.cells.dijit",
  69. "dojox.grid.enhanced._FocusManager",
  70. @H_502_24@"dojox.grid.enhanced.plugins.CellMerge",
  71. "dojox.grid.enhanced.plugins.Cookie",
  72. @H_502_24@"dojox.grid.enhanced.plugins.DnD",
  73. "dojox.grid.enhanced.plugins.Filter",
  74. @H_502_24@"dojox.grid.enhanced.plugins.GridSource",
  75. "dojox.grid.enhanced.plugins.IndirectSelection",
  76. @H_502_24@"dojox.grid.enhanced.plugins.Menu",
  77. "dojox.grid.enhanced.plugins.NestedSorting",
  78. @H_502_24@"dojox.grid.enhanced.plugins.Pagination",
  79. "dojox.grid.enhanced.plugins.Printer",
  80. @H_502_24@"dojox.grid.enhanced.plugins.Search",
  81. "dojox.grid.enhanced.plugins.Selector",
  82. @H_502_24@"dojox.grid.enhanced.plugins.exporter.CSVWriter",
  83. "dojox.json.query",
  84. @H_502_24@"dojox.layout.ContentPane",
  85. "dojox.widget.Standby",
  86. @H_502_24@"com.ibm.tms.Loader",
  87. "tms.screens.TMSBase",
  88. @H_502_24@"tms.screens.TMSScreen",
  89. "tms.screens.TMSTemplated",
  90. @H_502_24@"tms.screens.TMSNewScreen",
  91. "tms.screens.notesHistory.notesHistory",
  92. @H_502_24@"tms.screens.TMSTabContainer",
  93. "tms.common.tms",
  94. @H_502_24@"com.ibm.tms.BorderContainer",
  95. "com.ibm.tms.ButtonSelector",
  96. @H_502_24@"com.ibm.tms.Customizer",
  97. "com.ibm.tms.DropMultiSelect",
  98. @H_502_24@"com.ibm.tms.TMSCheckedMultiSelect",
  99. "com.ibm.tms.TMSComboBox",
  100. @H_502_24@"com.ibm.tms.TMSDropDownButton",
  101. "com.ibm.tms.TMSGrid",
  102. @H_502_24@"com.ibm.tms.TMSGridPagination",
  103. "com.ibm.tms.TMSIconTooltip",
  104. @H_502_24@"com.ibm.tms.TMSMessageBox",
  105. "com.ibm.tms.TMSTooltip",
  106. @H_502_24@"com.ibm.tms.TmsSelect",
  107. "com.ibm.tms.form.CarrierRefTextBox",
  108. @H_502_24@"com.ibm.tms.form.EmailTextBox",
  109. "com.ibm.tms.form.NumberTextBox",
  110. @H_502_24@"com.ibm.tms.form.ValidationTextBox",
  111. "com.ibm.tms.form.ZipCodeTextBox",
  112. @H_502_24@"com.ibm.tms.grid.Selection",
  113. "com.ibm.tms.grid._EditManager",
  114. @H_502_24@"com.ibm.tms.grid._FocusManager",
  115. "com.ibm.tms.grid._RowManager",
  116. @H_502_24@"com.ibm.tms.grid._RowSelector",
  117. "com.ibm.tms.grid.cells._base",
  118. @H_502_24@"com.ibm.tms.grid.enhanced.plugins.Selector",
  119. "tms.screens.utils.ScreenUtils",
  120. @H_502_24@"tms.screens.utils.TMSValidation"
  121. ]
  122. @H_502_24@}
  123. ],
  124. @H_502_24@
  125. prefixes:[
  126. @H_502_24@["dijit","../dijit"],
  127. ["dojox","../dojox"],
  128. @H_502_24@["com.ibm.tms","../com/ibm/tms"],
  129. ["tms.screens","../../../tms/screens"],
  130. @H_502_24@["tms.common","../../../tms/js/common"]
  131. ]
  132. @H_502_24@}
  133. @H_502_24@

好了,准备就绪,开始优化

打包js

我们将打包js作为一个任务集成到ant中:build.xml

 
 
    @H_502_24@<targetname="compressJS">
  1. <echomessage="CompressJavascriptcode..."/>
  2. @H_502_24@
  3. <execexecutable="java"dir="./webpages/tms/dojo/util/buildscripts"
  4. @H_502_24@resolveexecutable="true"failonerror="false">
  5. <argline="-classpath../shrinksafe/js.jar;../shrinksafe/shrinksafe.jarorg.mozilla.javascript.tools.shell.Mainbuild.jsaction=clean,releasecssOptimize=commentsprofile=TMSreleaseName=release"/>
  6. @H_502_24@</exec>
  7. </target>

BUILD SUCCESSFUL以后,在dojo下会生成一个release文件夹,将compressed目录下的tms.js文件和nls文件夹拷贝到根目录下,然后在初始页面中引用:

 
 
    @H_502_24@<scriptsrc="nls/tms_en-us.js"></script>

注意,dojo.js还是得继续引用

打包css

css文件不能在profile中自定义,所以我们直接使用命令行的方式处理,build.xml:

 
 
    @H_502_24@<targetname="compressCSS">
  1. <echomessage="CompressCSS..."/>
  2. @H_502_24@<execexecutable="java"dir="${src}/webpages/tms/dojo/util/buildscripts"
  3. resolveexecutable="true"failonerror="false">
  4. @H_502_24@<argline="-classpath../shrinksafe/js.jar${class_separatetoken}../shrinksafe/shrinksafe.jarorg.mozilla.javascript.tools.shell.Mainbuild_css.js"/>
  5. </exec>
  6. </target>

BUILD SUCCESSFUL以后,/css文件夹下有几个文件会变大(几十k或者一百多k),他们包含了所有你需要的css文件(打包原理就是所有被import的css文件全部被完全拷贝进来),我们只需要在页面中引用这几个css文件

 
 
    @H_502_24@<linktype="text/css"href="css/dojoStyle.css"rel="stylesheet"/>
  1. <linktype="text/css"href="css/tms.css"rel="stylesheet"/>

结束语

至此,打包的工作算是圆满结束。总结一下,我们利用dojo提供的工具来进行js/css文件的压缩,主要用到js.jar和shrinksafe.jar两个文件。打包原理是将所有引用的文件全部去掉注释后整体引用进来,变成一个大的文件,最后在页面中引用这些打包后的文件

打包以后http请求数量减少了3/4左右。css的http请求只剩下两个,js的请求数有十几个,主要是_base下的js。

总算是解决这个问题了,Mark一下,实习第三周。

猜你在找的Dojo相关文章