奇怪的打字稿/angular2 导入行为
Strange typescript / angular2 import behavior
我正在尝试为另一个 SO 问题创建演示,首先使用 angular-cli,然后使用 punker。
我在两个版本的 import
中遇到了一个奇怪的行为差异。
问题出在以下代码的第二个 import
中:
moment.service.ts
import { Injectable } from '@angular/core';
// Following work in plunker setup
import m from 'moment';
// Following work in angular-cli setup
//import * as m from 'moment';
@Injectable()
export class MomentService {
moment = m;
}
在angular-cli代码中,我必须使用:
import * as m from 'moment';
如果我使用 punker 设置,无论是在 punker 还是 运行 本地服务器,我都必须关注,否则它不会 运行 在浏览器中:
import m from 'moment';
谁能解释一下行为上的差异??
笨蛋:Link
Github:plunker code local version(包括 server.js 在本地服务)
Github: angular-cli version
TL:DR 每个演示都使用不同的模块格式。在 plunker 中,整个模块被视为默认导出。在cli项目中,没有默认导出。
每个演示都使用不同的模块格式。 plunker 没有指定格式,我不确定 systemjs 默认使用什么格式,但我不相信它是 ES6。 CLI 项目正在使用 ES6 模块格式。
如果你看一下 here,你会看到当模块格式为 AMD、commonjs 或 global 时,它将导出整个模块作为默认导出。 ES6 模块不会发生这种情况,您需要显式定义默认导出,而 momentjs 不会。
因此,在 plunker 演示中,import m from 'moment'
有效,因为您的配置告诉 systemjs 和 typescript 在存在 none 时将整个模块视为默认导出。由于 CLI 项目中的配置,该模块未被视为默认导出,因此您必须使用 import * as m from 'moment'
表示从命名空间 'm'.
下的时刻导入所有命名导出
我正在尝试为另一个 SO 问题创建演示,首先使用 angular-cli,然后使用 punker。
我在两个版本的 import
中遇到了一个奇怪的行为差异。
问题出在以下代码的第二个 import
中:
moment.service.ts
import { Injectable } from '@angular/core';
// Following work in plunker setup
import m from 'moment';
// Following work in angular-cli setup
//import * as m from 'moment';
@Injectable()
export class MomentService {
moment = m;
}
在angular-cli代码中,我必须使用:
import * as m from 'moment';
如果我使用 punker 设置,无论是在 punker 还是 运行 本地服务器,我都必须关注,否则它不会 运行 在浏览器中:
import m from 'moment';
谁能解释一下行为上的差异??
笨蛋:Link
Github:plunker code local version(包括 server.js 在本地服务)
Github: angular-cli version
TL:DR 每个演示都使用不同的模块格式。在 plunker 中,整个模块被视为默认导出。在cli项目中,没有默认导出。
每个演示都使用不同的模块格式。 plunker 没有指定格式,我不确定 systemjs 默认使用什么格式,但我不相信它是 ES6。 CLI 项目正在使用 ES6 模块格式。
如果你看一下 here,你会看到当模块格式为 AMD、commonjs 或 global 时,它将导出整个模块作为默认导出。 ES6 模块不会发生这种情况,您需要显式定义默认导出,而 momentjs 不会。
因此,在 plunker 演示中,import m from 'moment'
有效,因为您的配置告诉 systemjs 和 typescript 在存在 none 时将整个模块视为默认导出。由于 CLI 项目中的配置,该模块未被视为默认导出,因此您必须使用 import * as m from 'moment'
表示从命名空间 'm'.