threejs のソースを自前で、minimize する環境を模索する。

なんとなく webpack をメインに据えてみたい。 npm install -g xxx は適宜やるとして省略。 es2015 メモ

const, let 無名関数はアロー形式で()=>{} もしくは()=>expression 文字テンプレート${expression} promise, await

Project 作成 $ mkdir app $ cd app app$ npm init

とりあえず git に登録しよう。 .gitignore は、

https://github.com/github/gitignore/blob/master/Node.gitignore https://raw.githubusercontent.com/github/gitignore/master/Node.gitignore

をそのまま採用させていただきます。 app$ git init app$ git add . app$ git commit -m init

WebSocketServer app$ npm install websocket --save

server.js

"use strict";

const http = require("http");
const WSServer = require("websocket").server;
const url = require("url");
const fs = require("fs");

const port = 8888;

function onHttpRequest(req, res) {
  fs.readFile("client.html", "utf8", (err, text) => {
    res.writeHead(200, { "Content-Type": "text/html" });
    res.end(text);
  });
}
const plainHttpServer = http.createServer(onHttpRequest).listen(port);
const webSocketServer = new WSServer({ httpServer: plainHttpServer });

let clients = [];
function broadcast(message) {
  clients.forEach((con, i) => {
    con.send(message);
  });
}

function onRequest(req) {
  const websocket = req.accept(null, req.origin || "*");

  clients.push(websocket);

  websocket.send("welcome to this server");
  broadcast(
    `clients: [${clients.map((v, i) => v.remoteAddress[0]).join(", ")}]`
  );

  websocket.on("message", (msg) => {
    console.log(`"${msg.utf8Data}" is recieved from ${req.origin} !`);
    websocket.send(msg.utf8Data);
  });

  websocket.on("close", (code, desc) => {
    console.log(`connection released!: ${code} - ${desc}`);

    clients = clients.filter((v, i) => v != websocket);
    broadcast(
      `clients: [${clients.map((v, i) => v.remoteAddress[0]).join(", ")}]`
    );
  });
}

webSocketServer.on("request", onRequest);

console.log(`server start: ${port}`);

client.html

<html>
  <head> </head>
  <body>
    <input id="message" type="text" /><button id="send">send</button>
    <div id="output"></div>

    <script>
      "use strict";
      let attempts = 1;
      let ws = null;

      const output = document.getElementById("output");
      const sendmessage = document.getElementById("message");
      sendmessage.addEventListener("keydown", (e) => {
        if (e.keyCode == 13) {
          send(sendmessage.value);
        }
      });
      document
        .getElementById("send")
        .addEventListener("click", () => send(sendmessage.value));

      function logger(msg) {
        output.innerHTML += `<div>${msg}</div>`;
      }
      function send(msg) {
        ws.send(msg);
        logger(`send: ${msg}`);
      }

      function createWebSocket() {
        logger(`connecting... ${attempts++}`);

        ws = new WebSocket(`ws://${location.host}`);

        ws.onopen = (e) => {
          logger(`${e.type}: ${e.code || ""}`);

          // reset the tries back to 1 since we have a new ws opened.
          attempts = 1;

          // ...Your app's logic...
        };

        ws.onclose = (e) => {
          logger(`${e.type}: ${e.code || ""}`);
          ws = null;

          const time = generateInterval(attempts);

          setTimeout(() => {
            // Connection has closed so try to reconnect every 10 seconds.
            createWebSocket();
          }, time);
        };

        ws.onmessage = (e) => {
          logger(`${e.type}: ${e.data}`);
        };
      }

      function generateInterval(k) {
        let maxInterval = (Math.pow(2, k) - 1) * 1000;

        if (maxInterval > 30 * 1000) {
          maxInterval = 30 * 1000; // If the generated interval is more than 30 seconds, truncate it down to 30 seconds.
        }

        // generate the interval to a random number between 0 and the maxInterval determined from above
        return Math.random() * maxInterval;
      }

      window.addEventListener("DOMContentLoaded", () => createWebSocket());
    </script>
  </body>
</html>

WebSocket を再接続するアルゴリズムの工夫

webpack

http://webpack.github.io/docs/tutorials/getting-started/

threejs