TL; DR
Используйте import ... from "...";
вместо import ... = require("...");
при использовании named AMD modules в коде типа TypeScript.
Объяснение
Мое главное приложение (с использованием Logdown
модуля) записывается в машинописном и компилируется ES5 кода. С помощью этой установки я заметил, что разница в выходе зависит от используемого синтаксиса импорта TypeScript.
Вот различия:
import Logdown from "logdown";
export default class Main {
constructor(message: string) {
let logger: Logdown = new Logdown('Test');
logger.log();
}
}
компилирует:
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);
}
}
});
И:
import Logdown = require("logdown");
export default class Main {
constructor(message: string) {
let logger: Logdown = new Logdown('Test');
logger.log();
}
}
компилирует:
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);
}
}
});
Важная часть заключается в том, что при использовании import Logdown from "logdown";
скомпилированный код типа TypeScript создаст новые экземпляры, подобные этому var logger = new logdown_1.default('Test');
.
Но при использовании import Logdown = require("logdown");
, скомпилированный код типа TypeScript не добавляет свойство default
, а вместо этого создает такие экземпляры: var logger = new Logdown('Test');
.
Итак, с модулем типа I (named AMD module), мне нужно использовать синтаксис import ... from "...";
.
Что вы имеете в logdown.js, называется «named module» в [spec] (http://requirejs.org/docs/whyamd.html#namedmodules), с которым вы связались, и этот документ гласит: «Вы должны избегайте именования модулей самостоятельно, и только размещайте один модуль в файле во время разработки. Однако для инструментария и производительности решение для модуля нуждается в способе идентификации модулей в встроенных ресурсах ». Для SystemJS, назвав модуль в 'logdown.js', этот файл превращается в пакет, а не в модуль. И ваш вопрос невозможно ответить, не видя полного исходного кода, который импортирует этот модуль. – artem
Спасибо за разъяснение, artem.☺ –
'default' не создается загрузчиком модуля, а скорее декларацией экспорта. – Bergi