htmlnode.jswebservernode-webkitembeddedwebserver

Package NodeWebkit and Web Server


My app is ready for distribution and I have decided I want to use NodeWebkit. Now, the problem is that my app loads local files and I need a web server for that. How can I package both NodeWebkit and some web server together? If it's impossible to add web server to NodeWebkit, how can I load my files(images,scripts,css) into html? Thanks! :)

setTimeout(function() {
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;

var server = http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));
}, 1000);

Solution

  • Node-webkit is basically a combination of node.js and chromium browser. If you want to have your server with your app, you can write a server in node.

    Check out Node main documentation

    In your package.json

    {
      "name": "nw-demo",
      "node-main": "index.js",
      "main": "index.html"
    }
    

    mode-main is basically a script that runs in node context and starts as the application starts.

    The script will be running in Node's context which won't be destroyed across page navigation in Webkit, so it can be used to write some 'background' or 'daemon' like code.

    So you can write and start your http server locally on 127.0.0.1 and communicate with it.


    If your concern is to load resources only, you can add them directly by providing absolute or relative paths.

    For Example:

    <link rel="stylesheet" type="text/css" href="/bower_components/angular-ui-grid/ui-grid.css"/>
    <script src="/bower_components/jquery/dist/jquery.min.js"></script>
    

    Use the app protocol

    Further more, there is an app:// protocol provided in nw.js which you can use to access files locally. See the documentation.

    Note:

    The root of path refers to the application's directory, which is the directory where the manifest file resides.