在为VSCode开发扩展时。我们可以看到这样的导入:
import * as vscode from 'vscode';在package.json中,我们有
"engines": {
"vscode": "*"
}在依赖中,我们没有“vscode”。但是,看起来它是可以扩展的。任何解释都将不胜感激。
发布于 2018-01-17 19:40:23
导入由主机环境解析,在本例中是VSCode可能修改过的Electron版本。因此,当它看到对vscode模块的请求时,它(在内部)提供该模块,而不是寻找外部依赖项。
FWIW,一个事实标准正在出现,“原始”模块名称,如'vscode',倾向于由主机环境直接提供,而带有路径('./foo')的模块名称是外部的。(这就是为什么script type="module"标记上的src需要有一个路径,至少现在是这样。)
发布于 2018-08-30 00:46:22
package.json中的engines部分与模块导入系统无关。
这是为了让一些本机模块知道如何在npm install时编译。
并且可以检查引擎版本。例如:你可以设置engines: {node: >=8},然后节点v7将拒绝运行你的代码,但这不是强制的。
VS代码使用vscode-loader作为模块加载器,它非常类似于require.js,但是VS代码有许多其他功能。
您调用“全局”函数"require“被vscode-loader覆盖,而不是节点的本机"require”。
与任何其他模块加载器系统一样,vscode-loader允许您修改"require“函数。
vscode变化如此之快,你可以用nodeRequire('module')做一个简单的搜索。
目前相关代码在src/vs/workbench/api/node/extHost.api.impl.ts文件中:
const node_module = <any>require.__$__nodeRequire('module');
const original = node_module._load;
node_module._load = function load(request: string, parent: any, isMain: any) {
if (request !== 'vscode') {
return original.apply(this, arguments);
}
.....
.....
// and finally, return apiImpl, the "vscode" object
}require()将调用module._load(),但此module._load已被vscode-loader覆盖。
您也可以像这样再次覆盖它。
这就是所谓的“猴子补丁”。
https://stackoverflow.com/questions/48300198
复制相似问题