TL; DR
使用當在TypeScript代碼中使用named AMD modules時,使用語法代替import ... = require("...");
。
說明
我的主應用程序(使用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');
。
因此,隨着模塊類型我有(一個named AMD module),我需要使用import ... from "...";
synatx。
您在logdown.js中所擁有的內容在您鏈接的[AMD規格](http://requirejs.org/docs/whyamd.html#namedmodules)中稱爲'命名模塊',並且該文檔顯示「您應該避免自己命名模塊,並且在開發過程中只將一個模塊放在一個文件中,但對於工具和性能,模塊解決方案需要一種方法來識別構建資源中的模塊。對於SystemJS,在'logdown.js'中命名模塊將該文件轉換爲一個包,而不是一個模塊。如果沒有看到導入該模塊的完整源代碼,您的問題就無法回答。 – artem
感謝您的澄清,artem。☺ –
'default'不是由模塊加載器創建的,而是由導出聲明創建的。 – Bergi