首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VSCode如何将"vscode“引擎注入到扩展中?

VSCode如何将"vscode“引擎注入到扩展中?
EN

Stack Overflow用户
提问于 2018-01-17 19:35:23
回答 2查看 404关注 0票数 1

在为VSCode开发扩展时。我们可以看到这样的导入:

代码语言:javascript
复制
import * as vscode from 'vscode';

package.json中,我们有

代码语言:javascript
复制
"engines": {
  "vscode": "*"
}

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

EN

回答 2

Stack Overflow用户

发布于 2018-01-17 19:40:23

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

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

票数 2
EN

Stack Overflow用户

发布于 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文件中:

代码语言:javascript
复制
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覆盖。

您也可以像这样再次覆盖它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48300198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档