Búsqueda de sitios web

javascript - ¿Cómo deshacerse de la propiedad "default" al cargar módulos con SystemJS?


Tengo un módulo AMD que quiero cargar con SystemJS. Puedo hacerlo, pero desafortunadamente tengo que llamarlo así:

var Logdown = module.default;
var instance = new Logdown('Test');

Me gustaría omitir hacer una llamada a .default, pero no sé cómo deshacerme de esta propiedad. Creo que este default está de alguna manera asignado por el cargador SystemJS.

Este es mi módulo:

logdown.js

define('Logdown', function() {
  function Logdown(name) {
    this.name = name;
  }

  Logdown.prototype.log = function() {
    console.log(this.name);
  };

  return Logdown;
});

Y aquí está mi configuración de SystemJS:

SystemJS.config({
  baseURL: '/dist',
  map: {
    'logdown': 'lib/dynamic/logdown/logdown.js'
  }
});

Respuesta #1

Resumen

Usa la sintaxis import ... from "..."; en lugar de import ...=require("..."); al usar módulos AMD nombrados en código TypeScript.

Explicación

Mi aplicación principal (que utiliza el módulo Logdown) está escrita en TypeScript y compilada a código ES5. Con esta configuración, noté que hay una diferencia en la salida dependiendo de la sintaxis de importación de TypeScript utilizada.

Aquí están las diferencias:

import Logdown from "logdown";

export default class Main {

  constructor(message: string) {
    let logger: Logdown = new Logdown('Test');
    logger.log();
  }
}

Compila a:

System.register(["logdown"], function(exports_1, context_1) {
  "use strict";
  var __moduleName = context_1 && context_1.id;
  var logdown_1;
  var Main;
  return {
    setters: [
      function(logdown_1_1) {
        logdown_1 = logdown_1_1;
      }],
    execute: function() {
      Main = (function() {
        function Main(message) {
          var logger = new logdown_1.default('Test');
          logger.log();
        }

        return Main;
      }());
      exports_1("default", Main);
    }
  }
});

Y :

import Logdown = require("logdown");

export default class Main {

  constructor(message: string) {
    let logger: Logdown = new Logdown('Test');
    logger.log();
  }
}

Compila a:

System.register(["logdown"], function(exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    var Logdown;
    var Main;
    return {
        setters:[
            function (Logdown_1) {
                Logdown = Logdown_1;
            }],
        execute: function() {
            Main = (function () {
                function Main(message) {
                    var logger = new Logdown('Test');
                    logger.log();
                }
                return Main;
            }());
            exports_1("default", Main);
        }
    }
});

La parte importante es que al usar import Logdown from "logdown";, el código TypeScript compilado creará nuevas instancias así var logger=new logdown_1.default('Test');.

Pero al usar import Logdown=require("logdown");, el código TypeScript compilado no agrega una propiedad default, sino que en su lugar crea instancias así: var logger=new Logdown('Test');.

Entonces, con el tipo de módulo que tengo (un módulo AMD con nombre), necesito usar la sintaxis import ... from "...";.

Respuesta #2

Cuando se hacía el empaquetado con webpack antes, solo podías añadir la propiedad esModule con el valor de false a la configuración de los loaders (si se soportaba).

Por ejemplo, con el html-loader, sigue: https://webpack.js.org/loaders/html-loader/#esmodule