Javascript VSCode如何注入;vscode";引擎进入扩展?

Javascript VSCode如何注入;vscode";引擎进入扩展?,javascript,visual-studio-code,vscode-extensions,Javascript,Visual Studio Code,Vscode Extensions,为VSCode开发扩展时。我们看到这一点: import * as vscode from 'vscode'; 在package.json中,我们有 "engines": { "vscode": "*" } 在依赖项中没有“vscode”。但是,看起来它可以扩展。任何解释都将不胜感激。导入由主机环境解决,在本例中,VSCode可能是Electron的修改版本。因此,当它看到对vscode模块的请求时,它(在内部)提供它,而不是寻找外部依赖项 FWIW,一个事实上的标准正在出现,即“原始”

为VSCode开发扩展时。我们看到这一点:

import * as vscode from 'vscode';
package.json
中,我们有

"engines": {
  "vscode": "*"
}

在依赖项中没有“vscode”。但是,看起来它可以扩展。任何解释都将不胜感激。

导入由主机环境解决,在本例中,VSCode可能是Electron的修改版本。因此,当它看到对
vscode
模块的请求时,它(在内部)提供它,而不是寻找外部依赖项

FWIW,一个事实上的标准正在出现,即“原始”模块名称,如
'vscode'
,倾向于由主机环境直接提供,而带有路径(
'./foo'
)的模块名称是外部的。(这就是为什么
script type=“module”
标签上的
src
至少目前需要有一个路径。)

包.json中的“引擎”部分与模块导入系统无关。
一些本机模块需要知道如何在
npm安装时编译

并且可以检查引擎版本。例如:您可以设置
引擎:{node:>=8}
,然后node v7将拒绝运行您的代码,但这不是强制的

VS代码使用vscode加载器作为模块加载器,它非常类似于require.js,但对vscode有许多其他功能。
您调用的“全局”函数“require”由vscode loader覆盖,而不是节点的本机“require”。
与任何其他模块加载器系统一样,vscode加载器允许您修改“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
}
const node_module=require.uu$uu nodererequire('module');
const original=节点\模块。\加载;
节点\模块。\加载=函数加载(请求:字符串,父级:任意,isMain:任意){
如果(请求!=“vscode”){
返回原件。应用(此,参数);
}
.....
.....
//最后,返回apimpl,“vscode”对象
}
require()
将调用
模块。_load()
,但此
模块。_load
已被vscode加载器覆盖。
您也可以像这样再次覆盖它。

这就是所谓的“猴子补丁”

谢谢!所以,我发现了这个:你认为他们正在使用这个吗?完全可能,VSCode是开源的。。。但我都不知道。