0

我正在使用 Node.js 作为一些构建时 javascript 优化的驱动程序。

我有以下杰克文件:

fs = require("fs")
uglify = require("uglify-js")
desc "Uglify JS"

bundles =
    edit: [ "jquery",.... ]
    login: [ ... ]
    directory: [ .... ]

all = {}
task "minify", [], (params) ->
  files = bundles.edit
  for name,files of bundles
    all[name] = ""
    files.forEach (file, i) ->
        file = file + ".js"
        all[name] += fs.readFileSync("Src/Scripts/" + file).toString()  if file.match(/^.*js$/)
        cbgen = (data) -> 
            (err, out) ->
                    ast = uglify.parser.parse(data)
                    ast = uglify.uglify.ast_mangle(ast)
                    ast = uglify.uglify.ast_squeeze(ast)
                    fs.write out, uglify.uglify.gen_code(ast), 0, null, null, (e,w) ->
        cb = cbgen all[name]
        fs.open "Src/Scripts/" + name + ".min.js", "w+", 0666, cb # async methods

你可以在最后一行看到,我已经将脚本中昂贵的部分异步化了。

但是当我运行它时,它只使用了 12% 的可用 CPU 容量,所以有两个问题:

  1. 我做错了吗
  2. 如果不是,那么好处在哪里?
4

1 回答 1

1

我不认为你的理解是错误的,这个例子没有太大的好处。Uglify/js 缩小对 CPU 的限制很大(解析、ast 操作等),所以我希望节点能够有效地连续运行这些操作。

如果不等待,Node 将使用 100% 的已分配 CPU。如果你看到它使用了大约 12%,那么你的机器可能有 8 个内核,而 Node 占用了其中一个。

构建脚本可能没什么意义,但如果你真的想以最佳方式运行它,你可以确保所有 IO(在这种情况下读取文件)都是异步完成的,并产生一个单独的进程来进行 uglification,以便每个包都可以完成在平行下。

于 2011-10-23T19:46:00.190 回答