2015-03-24 82 views
3

我想移到Grunt来执行我的LESS编译。编译速度慢Grunt

我的LESS文件被分成大约117个文件。由于代码是在我的项目的管理员和成员区域之间共享的,因此总共约有170个导入。

我使用的是LiveReload,它在大约500-700ms内编译LESS。浏览器重新加载后,总共需要2秒才能看到结果。

Grunt需要1.8秒来编译,所以一旦浏览器重新加载,它总共需要4秒。

Grunt明显变慢。

我正在使用i7 CPU,SSD和16GB RAM在iMac上进行测试。我在本地运行Grunt,而不是在虚拟机内运行。

我的问题是这样的:

  1. 是否所有的减进口和文件减缓下来?
  2. Grunt一般情况下会慢一些吗?

我的package.json文件:

{ 
    "name": "Test Package", 
    "version": "1.0.0", 
    "devDependencies": { 
    "grunt": "~0.4.5", 
    "grunt-contrib-less": "*" 
    }, 
    "dependencies": { 
    "time-grunt": "*" 
    } 
} 

而且我Gruntfile.js:

module.exports = function(grunt) { 

    // Measures the time each task takes 
    require('time-grunt')(grunt); 

    // Project configuration. 
    grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    less: { 
     all: { 
      files: { 
       "css/style.css": "less/style.less", 
       "css/admin/style.css": "less/admin/style.less", 
       "css/admin/spectrum/spectrum.css": "less/plugins/spectrum/spectrum.less" 
      }, 
      } 
     } 
    }); 

    // Load the plugins 
    grunt.loadNpmTasks('grunt-contrib-less'); 

    // Default task(s). 
    grunt.registerTask('default', ['less']); 

}; 

我如何能格式化我的代码任何建议编译更快?或者这是目前这个图书馆的限制吗?

回答

8

我想500-700ms编译170个文件是相当合理的。

这个答案并不为你提供一个全功能的gruntfile但你应该能够把这些建议和改善工作流程。

第一件事:是否有必要编译所有的文件一次? 你可能想分割任务在2个部分,而不是全部:一个用于管理员和一个用于成员区(假设你没有同时在两个部分工作)。喜欢的东西:

less: { 
     members: { 
      options: { 
       compress: true //maybe 
      }, 
      files: { 
       "app/members.css": "members.less" 
      } 
     }, 
     admin: { 
      options: { 
       compress: true //maybe 
      }, 
      files: { 
       "app/admin.css": "admin.less" 
      } 
     }, 
    } 

当然,你可以根据你的项目结构更加分裂的部分。

然后创建2个或更多咕噜任务选择性编译:

grunt.registerTask('a', ['less:admin']); //let's call it 'a' - from admin 
grunt.registerTask('m', ['less:members']); // 'm' for members 

,并会根据您需要编译什么运行grunt agrunt m。 这应该加快整体编译时间。

我用了不同的方法,但是:

  • 我使用手表任务查找那些被修改的文件.LESS
  • 值班.LESS文件改变了,我只做编译和不是一个liveReload。在腕表配置我有这个节:

    less: { 
         options: { 
          livereload: false 
         }, 
         files: 'blah-blah.less', //use your paths here 
         tasks: ['less:dev'] //less:members or less:admin in your case 
         } 
    
  • 一旦少编译完成后我们有再次触发对CSS文件表更新.css文件。再次,在腕表配置我有这个节:

    css: { 
         files: ['blah-blah.css'], //the .css file resulted from compilation 
         options: { 
          livereload: true, //this is the most important 
          spawn: false //you may also need this 
         }, 
        } 
    
  • 我有一个咕噜手表的任务,寻找我指定的文件夹中的变化。事情是这样的:

    grunt.registerTask('watch', ['other tasks', 'connect', 'watch']); 
    

    注意,我还使用连接运行一个小型的http服务器,但它可能不会在这里如此。现在

,会发生什么情况是这样的:

  • 开始发展之前,我跑咕噜手表。它启动服务器,它看起来对.LESS文件
  • 文件的变化,每当.LESS文件被更改,被编译和.css文件被更新。需要注意的是,浏览器不会刷新尚未
  • 时.css文件被更改了浏览器不刷新,但没有加载整个HTML,仅应用导致样式表。

因此,如果您在任何时间任何.LESS文件进行更改,你会看到它反映在您的浏览器不重新加载整个页面,节省您的其它秒为好​​。

这样,当你想编译.LESS文件,因为呼噜声已经在运行,你也避免了2秒咕噜编译时间。

在我的案例汇编也是缓慢的,但我用定时器咕噜(像你这样做),并发现最浪费的时间是在加载的依赖,所以我用的JIT咕噜加载它们的需求,但这是另一回事。你可以在thread看到它。

现在,回到您的问题:

  1. 是否所有的减进口和文件减缓下来?

取决于有多少文件,他们是多么大,如果完全编译它们。如果你将它们分成几个较小的任务,我认为在这里不是这种情况。

  1. Grunt一般情况下会慢吗?

不是在这种情况下,我猜你没有使用最佳的工作流程。咕噜的速度与吞噬是另一场辩论,也许有一些啤酒。顺便说一句,这图书馆不像你想像的那样有限;)

无论如何,如果你按照上面的步骤,我想你会得到一个真棒速度提高。

希望这可以帮助别人!

如果有人有不同的意见或其他策略,请分享。我总是渴望改善我的工作流程。