Javascript VSCode如何注入;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,一个事实上的标准正在出现,即“原始”
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是开源的。。。但我都不知道。