nodejs模块名称中的“!”字符是做什么的?

我已经开始使用实习库来编写functiontesting,我意识到我不明白这个语法:

var assert = require('intern/chai!assert'); var registerSuite = require('intern!object'); 

这是什么目的! require()方法的参数中的字符?

简短的回答

它标识一个插件的一部分的资源。
标识符的结构是: [plugin]![resource]

长答案

在文档中 ,您可以find:

Intern是build立在一个标准的amd加载器之上的,这意味着它的模块通常也是以AMD模块格式编写的。

这就是为什么以及如何实际注入require函数,所以很明显,您没有使用与Node.JS一起提供的require模块。

它还指出:

[AMD格式]允许通过编写简单的加载程序插件asynchronous或有条件地解决模块和其他资产

如果您在引用装载程序时按照文档提供的链接进行操作,则会发现:

Loader插件通过允许加载非传统JavaScript依赖的资源来扩展AMD实现。

特别是,你可以发现一个依赖有如下forms:

 [Plugin Module ID]![resource ID] 

不言而喻,通过使用实习生获得的加载器的默认实现符合上述标准。

这就是说,如果我们考虑:

 intern/chai!assert 

你可以读取它作为inter/chai作为插件模块,并作为实际需要的资源assert

的目的 require()方法的参数中的字符是为了满足用于标识本身是插件一部分的资源的语法的要求。

我从这个类似的问题中得到了这个答案,并通过explunit很好地解释:

感叹号语法是为插件保留的。 通常在感叹号之后会有其他内容,表示插件将加载的资源,例如text!myTemplate.html,但在domReady的情况下! 这个插件只是在调用你的callback函数之前等待DOM加载的方式,所以没有什么需要遵循感叹号。