当前位置: 首页 > 面试题库 >

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

夹谷浩宕
2023-03-14
问题内容

以前我可以做:

import foo = require('foo');

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


问题答案:

正确的方法是继续使用旧的导入语法。新的导入语法仅适用于ES模块,而旧的导入语法仅适用于ES6之前的模块。两者是截然不同的,有意如此。 import * as foo from 'foo' 导入模块’foo’的所有 属性而不导入默认值foo

来自功能的设计者:

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

更新: TypeScript编译器在某个时候开始允许import * as foo from 'legacy-module- foo'在某些情况下获取旧版模块的默认导入。 这违反了ES6规范 (第15.2.1.16节,
“值“ *”表示导入请求是针对目标模块的 名称空间对象。“)。

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

因此,您可能更希望继续使用上述的旧版导入语法来加载旧版模块,以避免使您自己和其他开发人员就您的代码对ES6名称空间导入的工作方式感到困惑,并避免使变更令人困惑。



 类似资料:
  • 长话短说,我试图在CommonJS模块中使用一个只有ES6模块入口点的npm包,即(GitHub),因为我的整个50多个模块的应用程序都是在CommonJS中构建的。根据节点文档,这样做的标准方法是使用函数。我使用以下代码尝试了这种方法: 但是,这会导致包出错,而不一定是上面的导入函数: 有没有一种方法可以绕过这个问题,这样我就可以在CommonJS模块中使用这个包了?

  • 问题内容: 通过使用,我可以在 文件名 内包含并执行代码,而无需在 文件名 内定义任何导出。 ES6中使用的等效项是什么? 谢谢 问题答案: 等效的就是: 以下是一些可能的语法变体: 消息来源: MDN

  • 本文向大家介绍详谈commonjs模块与es6模块的区别,包括了详谈commonjs模块与es6模块的区别的使用技巧和注意事项,需要的朋友参考一下 到目前为止,已经实习了3个月的时间了。最近在面试,在面试题里面有题目涉及到模块循环加载的知识。趁着这个机会,将commonjs模块与es6模块之间一些重要的的区别做个总结。语法上有什么区别就不具体说了,主要谈谈引用的区别。 commonjs 对于基本数

  • 问题内容: 这有效: 但这不是: 我越来越: 是否可以(和/或如何)使用“动态”路径?(不对路径进行硬编码或依靠相对路径)。 问题答案: 不,这是不可能的。ES6模块需要能够静态解析其依赖关系,而无需执行模块代码,以便语句能够可靠地工作。模块说明符必须是字符串文字。 但是,您选择的模块加载器应支持使用变量名动态加载模块。但是,您将无法在模块范围中获得绑定标识符(并且无法重新导出它),通常只能在回调

  • 问题内容: 在我正在合作的项目中,关于可以使用哪种模块系统,我们有两个选择: 导入使用的模块,并使用导出和。 使用ES6导入模块,并使用ES6导出 相互使用是否对性能有好处?如果要在Node模块上使用ES6模块,还有其他什么应该知道的吗? 问题答案: 相互使用是否对性能有好处? 请记住,还没有JavaScript引擎本身支持ES6模块。您说自己正在使用Babel。无论如何,Babel都会默认将其转

  • 所以我有一个项目看起来是这样的: 这些都没用。的相对路径确实可以工作,但是公共模块的相对路径是维护的噩梦。 值得注意的是,我刚刚从TS 1.5更新到1.6:使用已经在1.5中工作过。不过,我在1.6音符中找不到任何关于这方面的突破性改变的提及。 >