【问题标题】:grunt-contrib-sass causing Grunt to reload itselfgrunt-contrib-sass 导致 Grunt 重新加载自身
【发布时间】:2013-12-18 02:52:38
【问题描述】:

我已经设置了一个 Vagrant box (precise32) 来运行通常的 Grunt 东西,但是它花费的时间太长了。

Running "watch" task
Waiting...OK
>> File "../../home/vagrant/app/wp-content/themes/testcss/_vars.scss" changed.

Running "sass:dist" (sass) task
File "/home/vagrant/app/wp-content/themes/test/css/styles.css" created.

Done, without errors.
Completed in 40.392s at Mon Dec 02 2013 11:34:02 GMT+0000 (UTC) - Waiting...
OK
>> File "../../home/vagrant/app/wp-content/themes/test/css/styles.css" changed.

Completed in 0.000s at Mon Dec 02 2013 11:34:02 GMT+0000 (UTC) - Waiting...

我已经在虚拟机中的共享文件夹和本机文件夹上尝试过这个,没有任何变化。我正在使用 grunt-contrib-sass 插件,尽管我也尝试过 grunt-sass 并且它需要类似的时间。 watch 事件会快速触发,但随后 VM 会消耗所有空闲 CPU 利用率,直到 CSS 编译完成。

手动运行 sass 大约需要 2 秒

知道从这里到哪里去吗?

package.json

{
  "name": "www",
  "version": "0.0.0",
  "dependencies": {},
  "devDependencies": {
    "grunt": "~0.4.2",
    "grunt-autoprefixer": "~0.4.0",
    "grunt-concurrent": "~0.4.1",
    "grunt-contrib-clean": "~0.5.0",
    "grunt-contrib-coffee": "~0.7.0",
    "grunt-contrib-compass": "~0.6.0",
    "grunt-contrib-concat": "~0.3.0",
    "grunt-contrib-connect": "~0.5.0",
    "grunt-contrib-copy": "~0.4.1",
    "grunt-contrib-cssmin": "~0.7.0",
    "grunt-contrib-htmlmin": "~0.1.3",
    "grunt-contrib-imagemin": "~0.3.0",
    "grunt-contrib-jshint": "~0.7.1",
    "grunt-contrib-uglify": "~0.2.0",
    "grunt-contrib-watch": "~0.5.2",
    "grunt-google-cdn": "~0.2.0",
    "grunt-newer": "~0.5.4",
    "grunt-ngmin": "~0.0.2",
    "grunt-rev": "~0.1.0",
    "grunt-svgmin": "~0.2.0",
    "grunt-usemin": "~2.0.0",
    "jshint-stylish": "~0.1.3",
    "load-grunt-tasks": "~0.2.0",
    "time-grunt": "~0.2.1",
    "karma-ng-scenario": "~0.1.0",
    "grunt-karma": "~0.6.2",
    "karma-chrome-launcher": "~0.1.0",
    "karma-script-launcher": "~0.1.0",
    "karma-firefox-launcher": "~0.1.0",
    "karma-html2js-preprocessor": "~0.1.0",
    "karma-jasmine": "~0.1.3",
    "requirejs": "~2.1.9",
    "karma-requirejs": "~0.2.0",
    "karma-coffee-preprocessor": "~0.1.0",
    "karma-phantomjs-launcher": "~0.1.0",
    "karma": "~0.10.5",
    "karma-ng-html2js-preprocessor": "~0.1.0",
    "grunt-contrib-sass": "~0.5.1",
    "grunt-php": "~0.3.0"
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "scripts": {
    "test": "grunt test"
  }
}

编辑:

我大致发现了问题所在。就是每当我的 grint-contrib-sass 任务从 grunt-contrib-watch 触发时,它实际上会重新加载 Grunt 的所有模块。我看不出它为什么这样做,也看不出为什么有必要这样做。我已更改问题标题以反映这一点。

【问题讨论】:

    标签: sass gruntjs vagrant grunt-contrib-watch


    【解决方案1】:

    除非您为 vagrant 提供大量 cpu(我相信它通常使用 1 个 cpu 核心),否则我预计 grunt 的运行速度会比您的主机慢。如果您没有使用nfs,那么慢 IO 将是下一个嫌疑人。

    我们也在 vagrant 中使用 grunt,但只使用少量软件包(主要是 contrib 插件),在 iMac 上,vagrant 大约需要 2 秒,所以您的问题可能确实是缓慢的 IO 或某些软件包做很多文件操作。

    如果您将 grunt watch 单独隔离到 sass 插件,与手动运行 grunt sass 相比,它花费的时间是否相同?在你的主机上运行怎么样?

    要考虑的另一点是尽量不要监视将由 grunt 生成的文件,如果 grunt 任务触发另一个任务,您可能会遇到奇怪的问题。

    【讨论】:

    • 感谢您的指点。我一直在研究 CPU 内核和 NFS 选项,但这些没有任何区别。实际上,我已经将问题归结为模块的数量,因为启动 grunt 需要一段时间,但是当 watch 看到文件更改时,整个 grunt 会重新加载,这当然意味着它会再次重新加载所有模块。
    【解决方案2】:

    我发现这似乎是由于 spawn 选项。将此设置为 false 会停止整个重新加载。

    我现在遇到的问题是,当 sass 编译器任务运行时手表会重新加载,因此被监视的 css 文件上的 livereload 并不总是有效。

    【讨论】:

      【解决方案3】:

      我们使用jit-grunt 在这个问题上取得了平庸的成功。我们所做的是将load-grunt-tasks 替换为jit-gruntin Gruntfile.jsgrunt serve 的执行时间从 20-30 秒下降到不到 4 秒。现在的瓶颈可能是 compass:server 负载,这与慢速 Shared folder 有关。

      在没有 grunt 的情况下继续运行 Karma 测试(仅使用 karma-cli)——这样会快很多。

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 1970-01-01
        • 2014-04-25
        • 2017-10-15
        • 2023-03-12
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        相关资源
        最近更新 更多