Javascript 用于导入commonjs/amd模块的新es6语法,即`import foo=require(';foo';)`

Javascript 用于导入commonjs/amd模块的新es6语法,即`import foo=require(';foo';)`,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,以前我可以做: import foo = require('foo'); 但是既然TypeScript(1.5)支持es6模块语法,那么在es6模块语法中实现相同功能的正确方法是什么。es6模块语法的对应语法是: import * as foo from 'foo'; 基本上,将foo模块中的所有内容以foo的名称导入到局部变量中。正确的方法是继续使用旧的导入语法。新的导入语法仅适用于ES模块,旧的导入语法适用于ES6之前的模块。这两者是截然不同的,故意如此import*作为foo从“foo

以前我可以做:

import foo = require('foo');

但是既然TypeScript(1.5)支持es6模块语法,那么在es6模块语法中实现相同功能的正确方法是什么。

es6模块语法的对应语法是:

import * as foo from 'foo';

基本上,将
foo
模块中的所有内容以
foo
的名称导入到局部变量中。正确的方法是继续使用旧的导入语法。新的导入语法仅适用于ES模块,旧的导入语法适用于ES6之前的模块。这两者是截然不同的,故意如此
import*作为foo从“foo”导入模块“foo”的所有属性,它不会作为
foo导入默认值

:

  • 导出默认声明始终声明名为default的导出成员,并始终作为exports.default的赋值发出。换句话说,
    export default
    始终具有ES模块语义。为了与Babel兼容,当模块具有默认导出时,我们可以选择发出一个
    \uu esModule
    标记,但实际上我们不会将该标记用于任何事情
  • export=
    声明总是作为分配发送给
    module.exports
    ,该声明替换要导出的不同实体来代替模块本身。在使用
    export=
    的模块中有其他导出是错误的。这是现有的TypeScript行为
  • 使用
    export=
    导出另一个模块(内部或外部模块)的模块可以使用新的ES6结构导入。特别是,方便的解构导入可以与此类模块一起使用。使用
    export=
    导出另一个模块的模式在.d.ts文件中很常见,该文件提供内部模块(例如angular.d.ts)的CommonJS/AMD视图
  • 使用
    export=
    导出非模块实体而不是模块本身的模块必须使用现有的
    import x=require(“foo”)
    语法导入,就像今天的情况一样。

2016更新:TypeScript编译器在某个时候开始允许从“遗留模块foo”以foo形式导入
import*
以在某些情况下获取遗留模块的默认导入这违反了ES6规范(,“值”*“表示导入请求是针对目标模块的。”)

当以这种方式导入的旧模块更新为ES6模块时,这些模块的“默认”导入将停止工作(因为
*as foo
导入应该是导入命名空间对象),如果您不知道这样做是一种TypeScript/SystemJS攻击,那么这可能会非常混乱。将来对ES规范的TypeScript重新调整也可能导致它们中断

因此,您可能更愿意继续使用上面描述的遗留导入语法来加载遗留模块,以避免让您自己和其他开发人员对ES6名称空间导入的工作方式感到困惑,并避免让破坏性的更改感到困惑

ES6模块是有效的TypeScript外部模块,具有新的 语法:ES6模块是单独加载的源文件,可能 导入其他模块并提供大量外部可访问的 出口。ES6模块具有几个新的导出和导入功能 声明。建议使用TypeScript库和 应用程序将更新为使用新语法,但这不是 要求

据我所知,这意味着鼓励您将自己的TypeScript模块迁移到新语法,但继续使用
import foo=require('foo')
来导入实际的AMD/CommonJS模块。

截至,有一个新的
esModuleInterop
标志可用于启用CommonJS/AMD/UMD的默认导入。通过在
tsconfig.json
中将该标志设置为
true
,应该可以按预期工作:

import foo from 'foo';

另一个选项是使用CommonJS语法导入它:

const foo = require("foo");
TypeScript和Babel都同意如何处理这个问题。另外,如果您要编译到ES5或更低版本,那么它的最终形式不会太远。

要导入所有

const foo = require("foo");
这将从包“foo”中导入所有实例(如果它是文件)

const foo = require("./foo");
因此,您可以通过调用,
foo.InstanceName

如果要导入特定实例

import MyInstance from "foo";
因此,这将从“foo”导入特定实例(Myinstance) 您仍然可以使用上述方法导入所有

import * as ReferenceName from "foo";
相当于,

const ReferenceName = require("foo");

这里有相当详细的讨论,谢谢。我要求澄清:这已经过时了,对吗?如果我以ES6为目标,它会告诉我不允许
import x=require('foo')
,不,它没有过时。在真正的ES6模块中,如果不违反EcmaScript规范,则无法使用ES6
import
导入非ES6模块的默认值。如果您想使用传统模块,就不能针对ES6环境,因为TypeScript编译器会像在这种情况下一样发出
import
语句,并且ES规范没有为带有默认导出的CJS/AMD模块提供任何规定。这会更让人困惑,因为对于从ES6/Babel编译的CJS模块,新的
import*as from
语法仍然有效works@CSnover“如果您想使用遗留模块,就不能针对ES6环境”-现在这真的很荒谬。。。谁不需要使用第三方遗留模块?!Babel以一种更理智的方式处理它。与此相关的导出语法是什么?当我尝试导出{Output}时,
解析为非模块实体,无法使用此构造导入
在我的旧fi的底部