使用 Grunt 编译速度变慢

Less compiling slow with Grunt

我想转到 Grunt 来执行我的 LESS 编译。

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

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

Grunt 编译需要 1.8 秒,所以一旦浏览器实时重新加载,总共大约需要 4 秒。

Grunt 明显更慢。

我正在配备 i7 CPU、SSD 和 16GB RAM 的 iMac 上进行测试。我在本地 运行 Grunt,而不是在 VM 中。

我的问题是:

  1. 是否所有 LESS 导入和文件都减慢了速度?
  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']);

};

关于如何格式化我的代码以更快地编译的任何建议?或者这是目前这个库的限制?

我想编译 170 个文件需要 500-700 毫秒是很合理的。

此答案并未为您提供功能齐全的 g运行tfile,但您应该能够采纳这些建议并改进您的工作流程。

第一件事:是否需要一次编译所有文件? 您可能希望将 less 任务分成 2 个部分而不是 all:一个用于管理员区域,一个用于成员区域(假设您不是同时处理这两个部分)。类似于:

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

当然,你还可以根据你的项目结构来划分更多的部分。

然后你创建2个或更多g运行t任务来选择性编译:

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

和你运行grunt agrunt m根据你需要编译。 这应该会加快整体编译时间。

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

  • 我使用 watch 任务来查找修改过的 .less 文件
  • 注意 .less 文件已更改,我只进行编译, 进行 liveReload。在 watch config 我有这个部分:

    less: {
            options: {
                livereload: false
            },
            files: 'blah-blah.less', //use your paths here
            tasks: ['less:dev'] //less:members or less:admin in your case
          }
    
  • 一旦 less 编译完成,我们就有了一个更新的 .css 文件,它会再次触发对 css 文件的监视。同样,在 watch config 我有这个部分:

    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
            },
        }
    
  • 我有一个 g运行t watch 任务,它在我指定的文件夹中查找更改。像这样:

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

    请注意,我还使用 connect 连接到 运行 小型 http 服务器,但这里可能不是这种情况。

现在,发生的事情是这样的:

  • 在开始开发之前我运行g运行t watch。它启动服务器并查找 .less 文件上的文件更改
  • 只要 .less 文件发生变化,它就会被编译,并且 .css 文件也会被更新。请注意,浏览器尚未刷新
  • 当 .css 文件被更改时,浏览器会刷新但不会加载整个 html,仅应用生成的样式表。

因此,如果您立即对任何 .less 文件进行更改,您将看到它反映在您的浏览器中 而无需重新加载整个页面,也为您节省了其他时间.

这样当你想编译 .less 文件时你也可以避免 2 秒的 g运行t 编译时间,因为 g运行t 已经是 运行ning.

在我的例子中,编译也很慢,但我使用了 timer-g运行t(就像你一样),发现大部分时间浪费在加载上依赖项,所以我使用 jit-g运行t 按需加载它们,但这是另一回事了。你可以在这个thread.

中看到

现在,回到您的问题:

  1. Are all the LESS imports and files slowing it down?

要看文件有多少,文件有多大,如果全部编译的话。如果您将它们分成几个较小的任务,我认为这里不是这种情况。

  1. Is Grunt just slower in general?

在这种情况下不是,我猜你没有使用最佳工作流程。 G运行t 的速度 vs. gulp 是另一场辩论,也许是在喝几杯啤酒的时候。顺便说一句,这个 并不像你想象的那么有限 ;)

无论如何,如果您按照上述步骤操作,我认为您的速度会得到很大的提高。

希望这对其他人也有帮助!

如有不同意见或其他攻略,欢迎交流。我总是渴望改进我的工作流程。