简体   繁体   English

使用SystemJS加载模块时如何摆脱“默认”属性?

[英]How to get rid off the “default” property when loading modules with SystemJS?

I have an AMD module which I want to load with SystemJS . 我有一个AMD模块 ,我想用SystemJS加载。 I am able to do this but unfortunately I have to call it like this: 我能够做到这一点,但不幸的是我必须这样称呼它:

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

I would like to skip making a call to .default , but I don't know how to get rid off this property. 我想跳过打电话给.default ,但我不知道如何摆脱这个属性。 I think that this default is somehow assigned by the SystemJS loader. 我认为这个default是由SystemJS加载器以某种方式分配的。

This is my module: 这是我的模块:

logdown.js logdown.js

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

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

  return Logdown;
});

And here is my SystemJS configuration: 这是我的SystemJS配置:

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

TL;DR TL; DR

Use the import ... from "..."; 使用import ... from "..."; syntax instead of import ... = require("..."); 语法而不是import ... = require("..."); when using named AMD modules in TypeScript code. 在TypeScript代码中使用命名的AMD模块时。

Explanation 说明

My main application (using the Logdown module) is written in TypeScript and compiled to ES5 code. 我的主应用程序(使用Logdown模块)是用TypeScript编写的,并编译为ES5代码。 With this setup I noticed that there is a difference in the output depending on the TypeScript import syntax used. 通过此设置,我注意到输出存在差异,具体取决于所使用的TypeScript导入语法。

Here are the differences: 以下是不同之处:

import Logdown from "logdown";

export default class Main {

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

Compiles to: 编译为:

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);
    }
  }
});

And: 和:

import Logdown = require("logdown");

export default class Main {

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

Compiles to: 编译为:

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);
        }
    }
});

The important part is that when using import Logdown from "logdown"; 重要的import Logdown from "logdown";使用import Logdown from "logdown";import Logdown from "logdown"; , the compiled TypeScript code will create new instances like this var logger = new logdown_1.default('Test'); ,编译后的TypeScript代码将创建新的实例,如var logger = new logdown_1.default('Test'); .

But when using import Logdown = require("logdown"); 但是当使用import Logdown = require("logdown"); , then the compiled TypeScript code does not add a default property but instead creates instances like this: var logger = new Logdown('Test'); ,然后编译的TypeScript代码不会添加default属性,而是创建如下的实例: var logger = new Logdown('Test'); .

So with the module type I have (a named AMD module ), I need to use the import ... from "..."; 因此,对于我所拥有的模块类型(一个名为AMD的模块 ),我需要使用import ... from "..."; synatx. synatx。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM