我试图为另一个so问题创建一个演示,首先使用angular cli,然后使用punker。
我在两个版本之间的import
中遇到了一个奇怪的行为差异。
问题出现在以下代码的第二个import
中:
力矩服务
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(包括一个服务器.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,如果没有,就将整个模块视为默认导出。由于cli项目中的配置,该模块不被视为默认导出,因此您必须使用import * as m from 'moment'
,它表示从名称空间“m”下的moment导入所有命名导出。
Here is a discussion on TypeScript's repo regarding this
关于angular - 奇怪的 typescript /angular2导入行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40054623/