Sistema de rutas solo con Javascript

Router simple con Javascript

He creado una pequeña librería para poder crear rutas y poder cargar html y/o templates.

El sistema es muy sencillo pero permite tener un sistema de rutas sin tener que usar ningún framework.

Tienes el código directamente o puedes bajarte el código desde su Github y puedes probar el sistema de rutas en Javascript desde aquí

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Router nativo</title>
</head>

<body>
    <main>

    </main>
    <ul>
        <li><a href="#list">List</a></li>
        <li><a href="#edit">Edit</a></li>
        <li><a href="#templateA">TemplateA</a></li>
        <li><a href="#templateB">TemplateB</a></li>
    </ul>
    <data-route-view></data-route-view>
    <template id="list">
        <h1>LISTADO</h1>
        <ul>
            <li>A</li>
            <li>B</li>
            <li>C</li>
            <li>D</li>
        </ul>
    </template>
    <template id="edit">
        <h1>LISTADO</h1>
        <ul>
            <li><input type="text" value="A"></li>
            <li><input type="text" value="B"></li>
            <li><input type="text" value="C"></li>
            <li><input type="text" value="D"></li>
        </ul>
    </template>

    <script src="./simpleRotuer.js"></script>
    <script>
        window.onload = function() {
            window.router.init([{
                path: "/list",
                view: "<h1>Listado</h1>"
            }, {
                path: "/edit",
                view: "<h1>Edición</h1>"
            }, {
                path: "/templateA",
                view: "#list"
            }, {
                path: "/templateB",
                view: "#edit"
            }]);
        };
    </script>
</body>

</html>

simpleRouter.js

window.router = ((win, doc) => {
    if ("onhashchange" in window) {
        let configRouter = {
            supportTemplate: false,
            route: []
        };
        const errors = {
            notSupportTemplates: "NO TIENES SOPORTE PARA TEMPLATE, USA HTML DIRECTAMENTE EN LA PROPIEDAD 'VIEW'",
            notPathConfigure: "COMPRUEBA QUE ESTÁ DEFINIA LA RUTA Y/O LA PROPIEDAD 'PATH' DENTRO DE LA CONFIGURACIÓN DE RUTAS"
        };
        const info = {
            loadTemplate: "CARGANDO TEMPLATE",
            loadHTML: "CARGANDO HTML",
            routerOK: "DEFINIDO ROUTER DENTRO DE WINDOW"
        };
        let setSupportTemplate = estado => configRouter.supportTemplate = estado;
        let loadView = () => doc.querySelector("data-route-view");
        let renderTemplate = (template, dest) => {
            let clone = doc.importNode(doc.querySelector(template).content, true);
            dest.appendChild(clone);
        };
        let render = (type, destino, contenido) => {
            if (type.toUpperCase() === "TEMPLATE") {
                cleanRouterView();
                renderTemplate(destino, contenido);
            }
            if (type.toUpperCase() === "HTML") {
                cleanRouterView();
                contenido.innerHTML = destino;
            }
        };
        let cleanRouterView = () => doc.querySelector("data-route-view").innerHTML = "";
        let init = (rutas) => {
            configRouter.route = rutas;
            win.addEventListener("hashchange", () => {
                let _notDefinedPath = true;
                for (_index in configRouter.route) {
                    if (location.hash.replace("#", "/") === configRouter.route[_index].path) {
                        _notDefinedPath = true;
                        let _view = loadView();
                        if (configRouter.route[_index].view.indexOf("#") >= 0) {
                            if (!configRouter.supportTemplate) {
                                console.log(errors.notSupportTemplates);
                                return false;
                            }
                            render("TEMPLATE", configRouter.route[_index].view, _view);
                        } else {
                            render("HTML", configRouter.route[_index].view, _view);
                        }
                        return false;
                    }
                }
                if (!_notDefinedPath) {
                    console.log(errors.notPathConfigure);
                }
            });
            console.log(info.routerOK);
        };
        return {
            init: function (rutas) {
                if ('content' in document.createElement('template')) {
                    console.log("TIENES SOPORTE PARA TEMPLATE");
                    setSupportTemplate(true);
                } else {
                    console.log("NO TIENES SOPORTE PARA TEMPLATE");
                    setSupportTemplate(false);
                }
                init(rutas);
            }
        }
    } else {
        console.log("NO TIENES SOPORTE PARA EL EVENTO HASHCHANGE");
    }
})(window, document);