mecanografiado node.js rutas expresas mejores prácticas de archivos separados

usando Express en un proyecto Node junto con Typecript, cuáles serían las "mejores prácticas" para express.Router.

ejemplo de estructura de directorios

|directory_name
  ---server.js
  |--node_modules
  |--routes
     ---index.ts
     |--admin
        ---admin.ts
     |--products
        ---products.ts
     |--authentication
        ---authentication.ts

así que dentro de index.ts encapsularía y administraría todos los subenrutadores



<pre class="snippet-code-js lang-js prettyprint-override"><code>    //admin.ts (nested inside of index.ts)
    import * as express from "express";

    export = (() => {
        
        let router = express.Router();
              
        router.get('/admin', (req, res) => {
            res.json({success: true});
        });
        
        return router;
    })();</code></pre>



    //index.ts (master file for express.Router)

    import * as express from "express";

    //import sub-routers
    import * as adminRouter from "./admin/admin";
    import * as productRouter from "./products/products";

    export = (() => {

      let router = express.Router();

      // mount express paths, any addition middleware can be added as well.
      // ex. router.use('/pathway', middleware_function, sub-router);

      router.use('/products', productRouter);
      router.use('/admin', adminRouter);

      //return for revealing module pattern
      return router;
    })(); //<--- this is where I don't understand something....

Por último, configuraríamos nuestro server.js



<pre class="snippet-code-js lang-js prettyprint-override"><code>    //the usual node setup
    //import * as *** http, body-parser, morgan, mongoose, express <-- psudocode

    import * as masterRouter from './routes/index'

    var app = express();
    //set-up all app.use()

    app.use('/api', masterRouter);

    http.createServer(app).listen(8080, () => {
          console.log('listening on port 8080')
        };</code></pre>



mi pregunta principal es realmente index.ts (archivo masterRouter) y sus rutas anidadas son IIFe

export = (function () {}) ();

¿debería ser esa la forma correcta / mejor de escribir módulos de mecanografía para enrutadores?

o sería mejor usar otro patrón, quizás uno que utilice el patrón

función de exportación fnName () {} - exportar clase cName {} - exportar por defecto.

La razón del IIFe es que cuando los importe en otro archivo no necesitaré inicializar el módulo y solo habrá una instancia de cada tipo de enrutador.

Respuestas a la pregunta(1)

Su respuesta a la pregunta