【问题标题】:What's the purpose of gruntjs server task?gruntjs 服务器任务的目的是什么?
【发布时间】:2012-08-10 04:59:49
【问题描述】:

我正在学习如何推动使用 gruntjs。我找到了server task,但我不明白这一点。

我可以使用服务器任务映射连接/缩小文件来测试我的应用程序(使用backbone.js),而无需在Web 服务器根目录中移动或放置源文件吗?例如没有 apache。

如果不是,服务器任务的假设用途是什么?

【问题讨论】:

    标签: node.js gruntjs


    【解决方案1】:

    server 任务用于启动静态服务器,并将base 路径设置为 Web 根目录。

    示例:将./web-root 用作http://localhost:8080/

    grunt.initConfig({
      server: {
        port: 8080,
        base: './web-root'
      }
    });
    

    它的功能类似于 Apache 服务器,根据路径提供静态文件,但使用 http module 通过connect 进行设置 (source)。

    如果您需要它提供的不仅仅是静态文件,那么您可以考虑defining a custom server task

    grunt.registerTask('server', 'Start a custom web server.', function() {
      grunt.log.writeln('Starting web server on port 1234.');
      require('./server.js').listen(1234);
    });
    

    和自定义服务器实例:

    // server.js
    var http = require('http');
    module.exports = http.createServer(function (req, res) {
        // ...
    });
    

    我可以使用服务器任务映射连接/缩小文件来测试我的应用程序 [...]

    连接和缩小有自己的专用任务 -- concatmin -- 但可以与 server 任务一起使用以完成所有 3 个任务。


    编辑

    如果你想让它持久化服务器一段时间(以及咕噜声),你可以define the task as asynchronous(使用服务器的'close' event):

    grunt.registerTask('server', 'Start a custom web server.', function() {
      var done = this.async();
      grunt.log.writeln('Starting web server on port 1234.');
      require('./server.js').listen(1234).on('close', done);
    });
    

    【讨论】:

    • 谢谢。我已经有 concat/min/lint 任务,但是当我尝试使用文件和文件夹运行配置为 http://localhost:8080 的服务器(grunt server 命令)时,它很快就会退出并显示“任务完成”消息。
    • @Gremo 实际上是by design:“一旦 grunt 的任务完成,Web 服务器就会停止。”它不是为了无限期/生产使用而启动服务器;只是为了让它可用于其他任务,尤其是可以模仿 Web 客户端的测试(http.request()request)。
    • 也就是说,我不能只使用服务器来运行我的应用程序,对吧?
    • 只要 grunt 忙于任务,服务器就会运行。保持它打开的一种快速而肮脏的方法是使用 grunt.registerTask("run", "server watch");。取消手表将关闭浏览器。
    • 道具,@widged! grunt.registerTask("run", "server watch") 非常聪明。为什么不将此作为单独的答案,以便更明显?
    【解决方案2】:

    server 任务现在是 connect 任务,它包含在 grunt-contrib-connect 包中。

    connect 任务启动一个连接网络服务器。

    用这个命令安装这个插件:

    npm install grunt-contrib-connect --save-dev
    

    注意:--save-dev 包含您的devDependencies 中的包,请参阅https://npmjs.org/doc/install.html

    安装插件后,可以在 Gruntfile 中使用这行 JavaScript 启用它:

    grunt.loadNpmTasks('grunt-contrib-connect');
    

    使用grunt connect 命令运行此任务。

    请注意,此服务器仅在 grunt 运行时运行。一旦 grunt 的任务完成,Web 服务器就会停止。可以使用keepalive 选项更改此行为,并且可以通过运行grunt connect:targetname:keepalive 之类的任务来临时启用此行为。 targetname 等于下面代码示例中的“服务器”。

    在这个例子中,grunt connect(或者更详细一点,grunt connect:server)将在http://localhost:9001/ 启动一个静态 Web 服务器,其基本路径设置为相对于 Gruntfile 的 www-root 目录,并且任何任务都会运行之后就可以访问它了。

    // Project configuration.
    grunt.initConfig({
      connect: {
        server: {
          options: {
            port: 9001,
            base: 'www-root'
          }
        }
      }
    });
    

    【讨论】:

    • 这是一个非常有用的更新。完美运行。谢谢!
    【解决方案3】:

    服务器任务的重点是快速而肮脏地访问静态文件以进行测试。 grunt server 不是生产服务器环境。它真的应该只在 grunt 生命周期中用于将静态测试资产引入测试环境。在生产环境中使用可能由 NPM 生命周期脚本控制的成熟服务器。

    【讨论】: