我还没有能够找到一个带有Typescript教程的有价值的NodeJS,所以我在没有指导的情况下潜水,当然我有一个问题。
我不明白这两行之间的区别:
import * as http from 'http';
// and
import http = require('http');
他们似乎以同样的方式运作,但我想他们的行为可能有一些细微差别,否则他们中的一个可能不会存在。
我确实理解第一种方法可以让我有选择地从一个模块导入但是如果我导入所有模块那么两者之间有区别吗?有首选方式吗?如果我从我自己的文件导入,这会改变什么吗?
答案 0 :(得分:7)
在第一种形式中,您在代码中创建了一个 http 对象(完全干净),然后,解释器将在 http 模块中查找每个可能的导入并追加它,一个接一个地到你代码中的 http 对象,这比你得到 module.exports 对象的第二个形式慢一点(不多)在 http 模块中定义,然后将此引用复制到代码中的新 http 对象,这是具有特定上下文的节点特殊函数中的对象,而不仅仅是对象在代码中使用模块的内容创建。
答案 1 :(得分:2)
在节点环境中,您已将模块类型配置为通用JS,输出将是相同的。其他模块框架将使用不同的语法,并且通过使用第一种方法,您可以随意灵活地更改它。
关于import * as http from 'http';
方法的另一个值得注意的是它是ES6模块的导入语法,因此一旦你处于完全支持ES6的环境中,你的导入就会起作用。
答案 2 :(得分:1)
import http = require('http') //Common JS
这是Common JS模块。在版本12.2之前,这是在节点JS中使用模块的唯一方法。
import * as http from 'http'; //ES 6
这是ES6模块。在ECMAScript 6标准中,JavaScript本身支持模块。 Node JS在版本12.2中实现了此功能。
在这两个中,我总是更喜欢ES6模块,因为它是javascript实现的一部分。浏览器也支持ES6模块。但是浏览器不支持Common JS,因为它是同步的。在ES 6之前的浏览器中使用了AMD模块,因为它与CommonJS不同,它是异步的